2.1 深度学习的实践层面
(1)首先了解训练集、验证集、测试集的概念:
训练集:训练的样本;
开发集:训练之后的参数放到这些数据中做验证;
测试集:最终的测试的样本。
一般的划分比例:6:2:2,当数据量较大(上百万,上千万),验证集和测试集可缩减到0.5%-3%。另外,验证集和测试集的数据要来源相同,同分布,也就是同一类的数据。
(2)偏差和方差:
偏差:算法在训练集上面的错误率,偏差大表现为欠拟合。
方差:算法在开发集和训练集上的错误率差值,方差大表现为过拟合。
可用以下三幅图来形象地解释:图1的曲线拟合程度较差,即高偏差,但波动较小,接近线性,故低方差。图2的曲线拟合程度高,但波动大,所以是过拟合。图3介于两者之间,拟合较好,且波动小,是优秀的模型!
减小方差的方法主要有:
1.增加训练数据量(以图像识别为例,可以通过图片反转,放大增加数据量);
2.正则化;
3.提前终止等。
本文主要介绍正则化的原理和实现方法。
(3)正则化——避免过拟合
(3.1)L2正则
对损失函数加上一项,如下式:
由上图可知,权重W的L2范数的平方等于矩阵中所有元素的平方和,最后一项可理解为:对所有层的权重L2范数平方求和,再乘一个系数λ/2m。
反向传播还要对该项求导,即在原来的formbackprop基础上多加一项范数求导,如下式:
dW[l]=(formbackprop)+λ/m*W[l]
代入 W[l]=W[l]−α*dW[l],可得到下式:
(1−α*λ/m)<1,所以每一次都会让W变小,因此L2正则化也称为“权重衰减”。
直观理解:在代价函数加入正则项后,如果λ非常大,为了满足代价函数最小化,那么w[l]这一项必须非常接近于0,所以就等价于很多神经元都没有作用了,从原本的非线性结构变成了近似的线性结构,自然就不会过拟合了。如果是tanh函数,当w非常接近于0时,z也接近于0,该段接近于线性,那么整个神经网络也非常接近于线性的网络,那么就不会过拟合了。
(3.2)dropout(随机失活)正则
即让神经网络中的神经元按照一定的概率随机失活。
直观理解:因为神经元有可能会被随机清除,这样子在训练中,就不会过分依赖某一个神经元或者特征的权重。但是这个东西的一大缺点就是代价函数J不能再被明确定义,每次都会随机移除一些节点,所以很难进行复查。如果需要调试的话,通常会关闭dropout,设置为1,这样再来debug。需要注意的是:测试时,要把dropout关掉!
(4)归一化数据——提高训练速度
归一化数据可以加速神经网络的训练速度,一般分两步:零均值;归一化方差。
(5)初始化参数——避免梯度消失和梯度爆炸
直观理解:梯度消失和梯度爆炸是深层神经网络与生俱来的问题,为什么这么说?由于网络层数多,基于梯度下降法的原理,dw[i]会随着层数增加呈指数式的变化,导致不同的层学习的速度差异很大,有些层学习得很快,有些层几乎不变。
那如何解决?就需要对权重值W的初始参数动一下手脚啦,一般希望z不要太大也不要太小,所以呢,n越大,W越小才好。通常的做法就是让W的方差等于1/n,如果是relu函数,就等于2/n。
(6)检验梯度(双边梯度逼近)
2.2 优化算法
(1)Mini-batch 梯度下降法
简单而言,将大的训练集分割成一个个小的子集,每次迭代将这些子集的损失函数求平均值,这样便可以减小每次计算的向量大小,提高计算速度。另外,该方法的损失函数在迭代过程中会有波动,但总体是呈下降趋势。
(2) 动量(Momentum)梯度下降法
动量梯度下降的基本思想就是:计算梯度的指数加权平均数,并利用该梯度来更新权重。该方法可以减少损失函数下降时候的波动,以较快的速度达到最小值。
动量梯度下降法的算法如下图所示,其中β通常取0.9。可以形象地认为β给损失函数下降提供了一个阻力,在迭代过程中减小损失函数下降的加速度,从而使其下降地更加“平稳”。
(3) Adam 优化算法
Adam 算法就是在动量梯度下降法的基础上作了一点改进,算法如下图所示:
2.3 超参数调试 和 Batch Norm
(1)超参数的调试
1.超参重要程度:以采用Adam优化的深层神经网络为例,按照重要程度对超参数进行排序,最重要的是学习率,其次是各隐藏层的单元数和Mini-batch规模,然后是隐藏层层数,其他的超参数(如β1、β2、)都取默认值。
2.调试方法:超参数较少:网格点的方式来调试;超参数较多:随机选择点进行调试。(原因是:不知道哪个超参数是更重要的,随机的方式去测试超参数点的性能,更为合理。)
3.Scale均匀随机:超参数调试时,某些超参数是在一个范围内进行均匀随机取值,如果在 0.001~1 的范围内进行均匀随机取值,随机数会有90%的概率落在在0.1∼1 之间,这显然是不合理的。所以我们需要对随机数作一些处理,即将随机值变成指数,如学习率如果在~之间的范围内,则随机值r∈[a,b]。
在超参数调试的实际操作中,我们需要根据计算资源来决定的调试方式:计算资源有限,仅调试一个模型,每天不断优化;计算资源充足,同时并行调试多个模型,选取其中最好的模型。
(2)激活值的归一化——Batch Norm
在2.1节提及归一化可提高训练速度,对激活函数前的z[l]进行归一化可加速模型训练过程。
实现反向传播更新参数时,需要计算各个参数的梯度:dw[l]、dγ[l]、dβ[l]。这里不需要求db[l],因为Batch Norm将z[l]改成均值为0,标准差为1的分布,再由β和γ进行重新的分布缩放,那就是意味着,无论b[l]值为多少,在这个过程中都会被减去,b不再起作用。所以Batch Norm可以把b掉,或取零值。
Batch Norm的原理:
1.与输入层归一化的原理相同,即通过改变损失函数的形状,使得每一次梯度下降都可以更快的接近全局最优点,从而加快训练速度。不同的是,Batch Norm 将各个隐藏层的激活函数的激活值进行的归一化,并调整到另外的分布。
2.训练过程,w[l]不断变化,对于后面的网络,a[l]的值也在不断变化,所以就有了Covariate shift的问题(训练集和预测集样本分布不一致)。如果对z[l]使用了Batch Norm,那么即使其值不断的变化,但是其均值和方差却会保持,因此削弱了前层参数与后层参数之间的联系,使得网络的每层都可以自己进行学习。
Batch Norm还有轻微的正则化效果。这是因为在使用Mini-batch梯度下降的时候,每次计算均值和偏差都是在一个Mini-batch上进行计算,而不是在整个数据样集上。这样就在均值和偏差上带来一些比较小的噪声。因此,Mini-batch越大,噪声越小,正则化的效果越少。
在这里有个问题,Batch Norm是在Mini-batch中计算均值和方差的,但我们对单个测试集进行预测时,就无法计算均值和方差。一般的做法:对于训练集的Mini-batch,使用指数加权平均,当训练结束的时候,得到指数加权平均后的均值和方差,而这些值直接用于Batch Norm公式的计算,用以对测试样本进行预测。
(3)Softmax 回归
Softmax回归 将 logistic回归 从二分类问题推广到了多分类问题上,两者的不同点在于最后一层隐藏层的激活函数和损失函数。
Softmax回归的激活函数是一个概率计算函数,最后计算得到各个分类的概率大小。