目录
1、ReLU(Rectified Linear Unit )
一、深度学习的方法
首先,我们在之前提到过深度学习的基本步骤:
经过这三个步骤训练出一个神经网络,如果该神经网络无法在训练集上得到好的结果,那么需要重新返回到这三个步骤,如果可以得到好的结果,那么观察该神经网络能否在测试集上得到好的结果,如果不行,那么称之为过度拟合,需要回到上述的三个基本步骤,如果可以,那么结束整个过程。
二、训练阶段的优化策略
深度学习的深度并不代表模型效果更好:
随着模型层数的增加, 模型的准确率越来越低。但这并不是因为模型过拟合了,上图只意味着模型在训练的时候都没有达到好的效果。
出现这种情况的原因是参数变化对Cost的变化减小。即在靠近模型输入层的梯度比较小,参数更新较慢;靠近输出层的梯度较大,参数更新较快。因此,在模型训练的时候,当模型靠近输出层的参数训练得差不多的时候,靠近输入层的参数还是混乱的:
如果激活函数使用的是sigmoid函数,在经过sigmoid函数之后,参数的变化会被削减。因此,当神经网络模型越深,削减的次数越多,参数变化对模型的loss影响越小。因此,越靠近输入层的梯度是越小的:
接下来,我们探讨一下解决这个问题的方法。
三、新的激活函数
1、ReLU(Rectified Linear Unit )
其优点在于: 线性,计算更快;生物学理由(使得一部分的神经元不被激活);可以解决梯度消失的问题。
因为ReLU输出的值就等于输入的值(输入值大于0的时候),另一部分是0(输入值小于0的时候)。因此,输入在通过ReLU之后,没有进行压缩,多大值就是多少值:
2、Leaky Relu和Parametric ReLU
Parametric ReLU是Leaky Relu的变种,唯一的不同就是,当 小于0时,Leaky Relu的输出 =0.01 ,但是Parametric ReLU = 模型自己学到的:
3、MaxOUT
基本思想:输入层输入 和
之后,加权再加上
之后,得到5、7、-1、1;然后人工设定规则,将5、7、-1、1进行分组,每组中取max值,得到7、1;以此类推......:
假设下图中红色框框的部分是更大的那一项:
那么就意味着不带红色框的项 就不被计算在模型中,因此,模型的训练可以简化为下图:
四、自适应的学习率
1、Adagrad
Adagrad表示的是,每一次参数迭代,不只是减去梯度,而是要先除以过去梯度和的平方开根号:
但是,在实际的深度学习任务中,我们需要的是在不同的区域有也不同的学习率,而不是在同一个方向上学习率是差不多的:
2、RMSProp
相比而言,Adagrad只是除上之前的梯度的平方的和。差别在于多了一个来调整学习率。若较小,则1- 较大,意味着你倾向于使得新的梯度对参数的影响更大一些,若较大,则意味着倾向于旧的梯度对参数的影响更大:
3、Momentum
深度学习的问题在于,难以找到真正的最优解,如下图,可能会在斜率较低的时候更新缓慢;可能会停留在鞍点(saddle point);更有可能会陷入局部最优解(local minima):
在梯度下降的基础上,加上Momentum的概念。简单来说,就是结合梯度和前一个步骤移动的方向(增加了惯性的思想)。
原来的梯度下降:
加上Momentum后的梯度下降:
五、测试阶段的优化策略
1、early stopping
模型不应该在training error最小的时候停止,而是应该在training error 和 testing error都最小,取得平衡的时候停止迭代:
2、regularization正则化
在Loss Function上增加一个正则项,使得模型找到一组参数使得损失函数最小,同时参数是接近于0 的:
使用增加正则项的损失函数进行参数更新后:
在深度学习中,正则化对模型的作用,会比对SVM更小一些。
L1正则:
L2正则:
一般来说,使用L1正则训练出来的参数,会存在一部分参数很小,但是一部分参数依然很大的情况;使用L2训练出来的参数,一般都会比较小。
3、dropout
我们知道,每一次迭代,神经网络模型的结构是不一样的。
假设在训练的时候,dropout rate=p,那么在测试的时候,需要将学习到的权重乘上(1-p)。
假设我们训练的时候,每次都丢失一般的神经元。但是在测试的时候,使用的参数是全部神经元的参数,因此,就要在原有的参数上×(1-p)。
实际上,dropout是一种ensemble的方法。因为每一次训练,使用一个batch的样本进行神经网络的训练,dropout之后,每一次都会有不同的神经元被丢弃,因此每次迭代的神经网络结构是不同的,等同于我们每次都训练一个不同结构的模型。因此,可以将dropout理解成是ensemble的一种方法:
但是在测试的时候,我们没有办法在这么多的不同的模型上进行y的预测再综合,因为太复杂啊,所以是将所有神经元的参数都综合起来,得到完整的模型结构,再进行预测:
左边是理想中,预测的时候,不同dropout得到不同模型结构,进行预测,得到不同的y,然后进行综合,但这种方法复杂度太高。
右边是将不同的神经元综合后,在原有的参数上乘上(1-p),一次性预测得到y。
经验证,左边和右边的方法效果是相同的。