机器学习问题总结(02)

1.stacking模型以及做模型融合的知识

模型融合常常是在使用机器学习方法解决问题过程中比较重要的一步,常常是在做完模型优化后面。顾名思义,模型融合就是综合考虑不同模型的情况,并将它们的结果融合在一起,从而提高模型的性能。

模型融合可以分为:从提交结果文件中融合,stacking和blending

1.1 从提交结果中融合

最简单的方法就是将不同模型预测的结果直接进行融合,因为这样做并不需要重新训练模型,只需要把不同模型的测试结果弄出来,然后采取某种措施得出一个最终结果就ok。
投票机制(voting)是集成学习里面针对分类问题的一种结合策略。基本思想是选择所有机器学习算法当中输出最多的那个类。机器学习分类算法的输出有两种类型:一种是直接输出类标签,另外一种是输出类概率,使用前者进行投票叫做硬投票(Majority/Hard voting),使用后者进行分类叫做软投票(Soft voting)。
1).硬投票方法
当多个不同模型直接输出的是类别的标签的时候,使用硬投票,直接选择投票数最多的那个类作为最终的分类结果。
2).软投票(加权表决融合)
当多个不同模型输出的是属于某个类别的概率的时候,就使用软投票的方法,对相同的类别概率进行叠加,最终选出概率值最大的那个类别为分类的结果。
3). 对结果取平均
当我们面对的问题是回归问题的时候,我们就通过对不同模型的预测结果求平均当做融合模型的结果。

1.2 stacking

Stacking的基本思想是用一些基分类器进行分类,然后使用另一个分类器对结果进行整合。
例子:2-fold stacking
1.将训练集分成两个不相交的集合
2.使用第一个集合训练基分类器
3.在训练好的基分类器上对第二个集合做预测
4.将第三步得到的预测结果作为高层(融合分类器)分类器的输入,正确的标签作为输出,训练高层的分类器。

Stacking的模型可以在特征空间上获取更加多的信息,因为第二阶段模型是以第一阶段模型的预测值会作为特征。
这里写图片描述

这里写图片描述

相比于bagging和boosting方法,stacking方法的区别

  • bagging主要用于减少方差
  • boosting方法主要用于减少方差
  • stacking方法既可以减少方差也可以减少偏差

1.3 blending

Blending与Stacking大致相同,只是Blending的主要区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,

而是建立一个Holdout集,例如说10%的训练数据,第二阶段的stacker模型就基于第一阶段模型对这10%训练数据的预测值进行拟合。说白了,就是把Stacking流程中的K-Fold CV(相当于把样本全过了一遍) 改成 HoldOut CV(一开始就直接分好)。

优点

  • 比stacking简单(因为不用进行k次的交叉验证来获得stacker feature)
  • 避开了一个信息泄露问题:generlizers和stacker使用了不一样的数据集
  • 在团队建模过程中,不需要给队友分享自己的随机种子
    缺点
  • 使用了很少的数据(第二阶段的blender只使用training set10%的量)
  • blender可能会过拟合(其实大概率是第一点导致的)
  • stacking使用多次的CV会比较稳健

对于实践中的结果而言,stacking和blending的效果是差不多的,所以使用哪种方法都没什么所谓,完全取决于个人爱好。

2. 怎样去优化SVM算法模型的?

2.1 SMO优化算法

SMO算法是支持向量机的快速算法,不断的将原二次规划问题分解为只有两个变量的二次规划子问题求解,直到所有变量满足KTT条件,这样通过启发式的方法得到原二次规划问题的最优解。

2.2 libsvm 和 Liblinear

LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。

LibsvmLiblinear都是国立台湾大学的Chih-Jen Lin博士开发的,Libsvm主要是用来进行非线性svm 分类器的生成,提出有一段时间了,而Liblinear则是去年才创建的,主要是应对large-scale的data classification,因为linear分类器的训练比非线性分类器的训练计算复杂度要低很多,时间也少很多,而且在large scale data上的性能和非线性的分类器性能相当,所以Liblinear是针对大数据而生的。

有关Liblinear和Libsvm各自的优势可以归纳如下:

1.libsvm用来就解决通用典型的分类问题

2.liblinear主要为大规模数据的线性模型设计

3.现有底层是tensorflow的keras框架,如果现在有一个tensorflow训练好的模型,keras怎么读取?

  • 直接通过API读取tensflow的模型文件
  • keras.models.load_model(‘my_model.h5’
  • 不同深度学习框架模型的转换可以使用微软的MMdnn。

3.1 tf模型的保存与导入

模型保存:
saver = tf.train.Saver()
saver.save(sess, 'my_test_model')

主要有2个文件

  • meta graph(.meta结尾)
    这是一个 protocol buffer,保存了完整的 Tensorflow 图,即所有变量、操作和集合等。拥有一个.meta的扩展名。

  • checkpoint file(.ckpt结尾)
    这是一个二进制文件包含了所有权重、偏置、梯度和其他变量的值。这个文件有一个.ckpt的扩展名。在0.11版本以前只有一个文件,现在有两个。

导入预训练好的模型

如果你想用别人预训练好的模型进行fine-tuning,有两件事情需要做。

  • 创造网络
    你可以通过python写好和原来模型一样的每一层代码来创造网络,可是,仔细一想,我们已经通过.metaa把网络存储起来,我们可以用来再创造网络使用tf.train.import()语句。
saver = tf.train.import_meta_graph('my_test_model-1000.meta')
  • 加载参数
    我们可以恢复网络的参数,通过使用saver,它是tf.train.Saver()类的一个实例。
with tf.Session() as sess:
  new_saver = tf.train.import_meta_graph('my_test_model-1000.meta')
  new_saver.restore(sess, tf.train.latest_checkpoint('./'))

4.卷积层为什么能抽取特征? Pool层的作用

4.1 激活函数的种类和特点?

  • sigmoid 、反正切tanh 都有梯度消失问题

  • relu 快,问题:负值0梯度
    1.sigmoid

  • Sigmoid(也叫逻辑激活函数) 非线性激活函数的形式是,其图形如上图左所示。之前我们说过,sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,大的正数被映射成1。sigmoid function在历史上流行过一段时间因为它能够很好的表达“激活”的意思,未激活就是0,完全饱和的激活则是1。而现在sigmoid已经不怎么常用了,主要是因为它有两个缺点:

  • Sigmoids saturate and kill gradients. Sigmoid容易饱和,并且当输入非常大或者非常小的时候,神经元的梯度就接近于0了,从图中可以看出梯度的趋势。这就使得我们在反向传播算法中反向传播接近于0的梯度,导致最终权重基本没什么更新,我们就无法递归地学习到输入数据了。另外,你需要尤其注意参数的初始值来尽量避免saturation的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradient kill掉,这会导致网络变的很难学习。

  • Sigmoid outputs are not zero-centered. Sigmoid 的输出不是0均值的,这是我们不希望的,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in ),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。

2.tanh


Tanh和Sigmoid是有异曲同工之妙的,它的图形如上图右所示,不同的是它把实值得输入压缩到-1~1的范围,因此它基本是0均值的,也就解决了上述Sigmoid缺点中的第二个,所以实际中tanh会比sigmoid更常用。但是它还是存在梯度饱和的问题。Tanh是sigmoid的变形.

3.relu: f(x)=max(0,x)
这里写图片描述

近年来,ReLU 变的越来越受欢迎。它的数学表达式是: f(x)=max(0,x)。很显然,从上图左可以看出,输入信号
<0时,输出为0,>0时,输出等于输入。ReLU的优缺点如下:

  • 优点1:Krizhevsky et al. 发现使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(如上图右)。有人说这是因为它是linear,而且梯度不会饱和
  • 优点2:相比于 sigmoid/tanh需要计算指数等,计算复杂度高,ReLU 只需要一个阈值就可以得到激活值。
  • 缺点1: ReLU在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都坏死了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
  1. Leaky ReLU
    这里写图片描述
    Leaky ReLUs 就是用来解决ReLU坏死的问题的。和ReLU不同,当x<0时,它的值不再是0,而是一个较小斜率(如0.01等)的函数。也就是说f(x)=1(x<0)(ax)+1(x>=0)(x),其中a是一个很小的常数。这样,既修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有些实验则证明并不是这样。

激活函数的作用:非线性。

4.2 卷积层为什么能抽取特征?

  • 卷积层负责提取特征,采样层负责特征选择,全连接层负责分类
  • 卷积神经网络的特点就是权重共享,利用不同的卷积核对输入的图像进行卷积,可以得到一张张特征图
    多种滤波器和对应的滤镜效果,比如边缘检测、锐化、均值模糊、高斯模糊
    这里写图片描述

4.3 Pool层的作用

  • pooling确实起到了整合特征的作用
  • pooling的结果是使得特征减少,参数减少,但pooling的目的并不仅在于此
  • pooling目的是为了保持某种不变性(旋转、平移、伸缩等),常用的有mean-pooling,max-pooling和Stochastic-pooling(随机池化)三种

5.LR模型

  • 在线性回归的基础上加了sigmoid函数,所以变成了分类模型,输出可以表示概率。

  • 采用似然估计构造目标函数,目标是优化最大似然估计,公式H(x)=-(ylogf(x)+(1-y)log(1-f(x)),一般优化方法采用的是梯度下降法

6.LR模型为什么采用似然估计损失函数

  • 最小二乘法反映的是线性空间上的线性投影的最短距离,在非线性空间上表现不如MLE。(MLE可以看作一种特殊情况下的Bayesian 估计)
  • 如果采用均方差损失函数的时候,梯度下降求偏导时会有一项导数项,这样会导致梯度在一定阶段会收敛的特别慢,而对数损失函数log正好能和sigmoid的exp抵消掉,会加快收敛速度。
  • 最小二乘法是高斯分布下最大似然估计的一般结果,LR是伯努利分布下最大似然估计的一般结果(交叉熵损失),所以两者本质上都是最大似然估计。

7.了解深度学习吗?能否讲下CNN的特点?

CNN,特点是局部感受和权值共享
通过卷积核扫描原始数据能够学习到不同的局部的特征,接着通过池化进一步提取特征,这些做的能够让参数数目有量级的减少,同时权值共享是同一层隐含层共享权值,这样也是减少了隐含层的参数,很多卷积核学习的到特征最后传递到下一层网络,到最后一层采用分类器分类

深度学习解决了以往神经网络深度网络很多问题,
梯度消失爆炸问题,几个方面:

  • 是激活函数不光是只用sigmoid函数,还有 ReLU函数
  • 是在参数并不是初始化的时候并不是随机选择的,而是在前面有自编码器做了预训练,这样避免了梯度下降法求解陷入局部最优解;
  • 深度学习一些手段,权值共享,卷积核,pooling等都能抑制梯度消失问题
  • 二次代价函数换成交叉熵损失函数或者选用softmax+对数似然代价函数的组合

8.说说RBM编码器

RBM包括隐层,可见层和偏置层。可见层和隐含层可以双向传播。标准的RBM,隐含层和可见层都是二进制表示,既激活函数的激活值服从二项分布。每一层的节点没有链接,如果假设所有的节点都只能取0或者1,同时全概率分布p(v,h)满足伯努利分布。

参数:

  • 可视层和隐含层之间的权重矩阵
  • 可视节点的偏移量
  • 隐含层的偏移量
    应用
  • 降维,类似稀疏自编码器
  • 用RBM训练得到的权重举证和偏移量作为BP神经网路的初始值,避免陷入局部极小值
  • 可以估计联合分布P(v,h),进而求出p(h|v)。生成式模型
  • 直接计算p(h|v)进行分类。判别式模型

9.进程和线程的区别

有一个是进程的开销比线程大,通信麻烦一些,但更安全,所以很多时候我们用多线程加速,但有时候线程用不了,只能用进程

python:为了加速尝试过很多方法,比如GPU加速、C++动态库调用、还有就是多进程。

为什么要用多进程加速。

  • 因为python这个语言是解释型语言,本来用来进行cpu密集型计算就不适合,
  • 还有就是python没有类型,因为全是用哈希表实现的动态内存分配方式,比如你定义a = 2 ,其实底层的实现是先分配一个内存块,在用一个指针指向这个内存块,最后返回的是这个指针
  • 最重要的一点是当初在设计python的时候,为了图简单,加了一个全局锁,也就是一个时刻只能使用一个线程,多核完全浪费了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值