您的位置:首页 > 理论基础 > 计算机网络

神经网络训练细节(二)

2017-10-03 09:29 337 查看

一、神经网络优化

 SGD的问题

随机梯度下降可能是在机器学习和深度学习中应用最为广泛的优化算法,但其有时学习会非常慢,特别是当梯度在水平和竖直方向上不均衡时,如下图所示:



在竖直方向上,梯度下降很快,而在水平方向上,梯度下降比较慢。这样,当采用随机梯度下降时,它会在竖直方向上下降的快而在水平方向上收敛的慢,这样优化路线就会如上如所示在窄轴上来回震荡。

动量

因为随机梯度下降算法所存在的问题,人们又引入了动量算法。带动量的SGD算法更新规则如下:



从形式上看,动量算法引入了变量v充当速度角色——它代表参数在参数空间移动的方向和速率。

为学习速率,

为超参数,取值范围在0,1之间,

的值决定了之前梯度贡献衰减的有多快(保留多少之前的梯度)

为梯度。动量算法在我看来或许可以理解为加速度和速度的关系,只使用随机梯度下降相当于只在加速度方向上降低,而引入速度概念后,加速度和速度之间一般会有一个夹角,实际的下降方向会在速度和加速度之间,如下图:



其中的

就相当于阻力或者摩擦力,如果不加

的话,速度一致不会衰减,后面的梯度相当于加速度。这样运用了动量后,优化过程中,梯度变化比加大的方向依旧会震荡(因为在梯度变化大的地方速度变化也快,所以很容易越过最低值),但是在梯度变化较小的方向,速度会不断增加,使收敛速度加快。使用动量算法可能会越过最低值,但它最终还是会收敛到最低值。



如上图所示,红色为动量学习规则所遵循的路径,黑色箭头表示使用随机梯度下降在该点下降的方向。

Nesterov动量

Nesterov动量是动量算法的一个变种,它的更新规则如下:



其中参数

和ε发挥了和标准动量方法中类似的作用。Nesterov动量和标准动量之间的区别体现在梯度计算上。Nesterov动量中,梯度计算在施加当前速度之后。因此,Nesterov动量可以解释为往标准动量方法中添加了一个校正因子。



根据Nesterov动量的更新规则,Nesterov动量是在知道动量方向(绿色的线)和实际要去的方向后(蓝色的线),再去更新的梯度。有点类似于后验分布,我先知道了结果(实际更新方向),再去推过程(梯度)。使用Nesterov动量的效果通常要比动量好一些。

三种优化方法的比较:

 


AdaGrad与与RMSProp

AdaGrad的更新规则如下:



其中dx代表梯度,learning_rate为学习率,1e-7是为了防止分母为0的情况。AdaGrad有点像在随机梯度的基础上做了标准化的工作,在每次更新过程中,都除以了梯度平方和的开方。这样,当某个方向上的梯度较大时,就会除以一个较大的数,这样在该方向上就不会更新非常快,在梯度小的方向上则会除以一个比较小的数。这样就会减轻震荡的幅度。但是使用AdaGrad的问题时,当神经网络比较大,训练时间比较长时,cache会比较大,这样学习速率就会很小,也就是收敛速度会变慢。可以对AdaGrad做一下微调:



使用上面的更新方式就是RMSProp。RMSProp对AdaGrad做了改进,每次更新cache时对其乘以一个衰减的系数,这样就不会使其一直变大了。

Adam

Adam是现在较为常用的一种优化算法,它将动量算法和AdaGrad/RMSProp两种方法结合了起来。

 


对比上面的RMSProp可以看出,Adam只是将更新过程中学习速率乘的梯度换成了一个梯度的表达式,类似动量(有一点的不同动量的更新公式中后面和梯度相乘的是学习速率,其他的不同基本都是符号的不同,这里符号用的比较混乱,因为是从不同地方截取的)。

下面是这几种优化方法的比较:



二、Dropout随机失活

dropout是神经网络中最为常用的一种防止过拟合的方法。dropout的原理非常简单,在进行前向传播和反向传播时,随机的将一些神经元进行失活,使其不起作用。这样可以简化神经网络,防止神经网络学的一些噪声特征。通常使神经元失活的比例为0.5,即每次训练时使一半 的神经元失活。使用dropout需要注意的是在测试时每个神经元要乘以这个神经元失活的概率,这样做是为了使的训练期望结果和测试期望结果是一致的,如下所示:



有两个神经元x,y,这两个神经元的失活概率都是0.5,那么训练时,期望的输出为



而在测试时其输出期望为:



所以在测试时每个神经元都要乘以1/2,否则测试结果和训练结果的误差可能会很大。

在初次接触Dropout时,你或许会有疑惑,既然Dropout是随机将一些神经元失活以防止过拟合,那么我为什么不能直接缩小神经网络的规模呢?使用dropout类似bagging的过程,每次使一些神经元随机失活,虽然会降低它过拟合的风险,但是也可能会降低它的分类能力。在多次训练过程中,每次随机失活一些,相当于一个比较弱的神经网络,但是最后会将这些子神经网络的结果综合起来得到最终的结果。这样分类能力比较弱的子神经网络经过一个类似bagging的过程后通常会比初始的神经网络效果要好。

参考:

斯坦福cs231n:深度学习与计算机视觉

《深度学习》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: