深度学习中常见的优化方法及调参方法

深度学习中常见的优化方法

    • 基本算法
      • 随机梯度下降SGD
      • 带动量的SGD
      • Nesterov动量
    • 自适应学习率的算法
      • AdaGrad
      • RMSProp
      • Adam
    • 二阶近似方法
      • 牛顿法
    • 牛顿法比梯度下降法更快的原因
    • 工程调参方法及学习率设置问题

基本算法

随机梯度下降SGD

随机梯度下降及其变种是及其学习中应用最多的优化算法,特别是在深度学习中。SGD按照数据分布抽取m个小批量(独立同分布的)样本,通过计算它们的梯度均值,可以得到梯度的无偏估计。
深度学习中常见的优化方法及调参方法_第1张图片
SGD的关键参数是学习率,在实践中,有必要随着时间的推移逐渐降低学习率。实践中,学习率的更新如下式。
在这里插入图片描述
式中,e0为 初始学习率,et为最终学习率
在这里插入图片描述
学习率可通过实验和误差来选取,若太大,学习曲线将会剧烈振荡,若太小,学习过程很缓慢,那么学习可能会卡在一个相当高的代价值。对于足够大的数据集,SGD可能在处理整个训练集之前就收敛到最终测试集误差的某个固定容差范围内。

带动量的SGD

虽然随机梯度下降仍然是非常受欢迎的优化方法,但其学习过程有时会很慢。动量的方法旨在加速学习,特别是处理高曲率、小但一直的梯度,或是带噪声的梯度。动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿着该方向移动。更新规则如下:
在这里插入图片描述
带动量的SGD算法如下所示:
深度学习中常见的优化方法及调参方法_第2张图片
之前,步长只是梯度乘以学习率,现在,步长取决于梯度序列的大小和排列。当许多连续的梯度指向相同的方向时,步长最大,达到了加速的效果。
其中步长的大小为在这里插入图片描述。当α越小,步长越大。另外,当梯度方向不一致时,动量还有抑制振荡的作用。

Nesterov动量

Nesterov动量与普通动量的区别是梯度计算在施加当前速度之后,因此Nesterov动量可以解释为往标准动量方法中添加了一个校正因子。
深度学习中常见的优化方法及调参方法_第3张图片

自适应学习率的算法

AdaGrad

深度学习中常见的优化方法及调参方法_第4张图片
AdaGrad算法,独立地适应所有模型参数的学习率,缩放每个参数反比与其所有梯度历史平方值总和的平方根。具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。
但是从训练开始时积累梯度平方会导致有效学习率过早和过小的减小。

RMSProp

RMSProp算法修改AdaGrad以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。RMSProp使用指数衰减平均以丢弃遥远过去的历史。引入了超参数ρ,用于控制移动平均的长度范围。
深度学习中常见的优化方法及调参方法_第5张图片

Adam

Adam是另一种学习率自适应的优化算法,它可以看做是结合RMSProp和具有动量算法变种。首先,在Adam中, 动量直接并入了梯度一阶矩估计。将动量加入RMSProp最直观的方法是将动量应用于缩放后的梯度。结合缩放的动量使用没有明确的理论动机。其次,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和二阶矩(中心项)的估计。RMSProp也采用了(非中心的)二阶矩估计,然而缺失了修正因子。因此,不像Adam,RMSProp二阶矩估计在训练初期可能有很高的偏置。Adam通常被认为对超参数的选择相当鲁棒。

深度学习中常见的优化方法及调参方法_第6张图片
深度学习中常见的优化方法及调参方法_第7张图片

二阶近似方法

牛顿法

牛顿法是和梯度下降法地位相当的主要优化算法。牛顿法不仅可以用来求解函数的极值问题,还可以用来求解方程的根,二者在本质上是一个问题,因为求解函数极值的思路是寻找导数为0的点。和梯度下降法一样,牛顿法也是寻找导数为0的点,同样是一种迭代法。核心思想是在某点处用二次函数来近似目标函数,得到导数为0的方程,求解该方程,得到下一个迭代点。因为是用二次函数近似,因此可能会有误差,需要反复这样迭代,直到到达导数为0的点处。
首先介绍一下牛顿法的思想:
根据一元函数的泰勒展开公式,我们对目标函数在x0处做泰勒展开,有:
在这里插入图片描述
忽略二次以上的项,有:
在这里插入图片描述
现在我们在x0点处,想要找到导数为0的点。对上式两边同时求导,并令导数为0,可以得到下式:
在这里插入图片描述
解得,
在这里插入图片描述
这样我们就得到了下一个点的位置。通用的,可得递推公式为:
在这里插入图片描述
同样的,对于多元函数的情况,对目标函数进行x0处的泰勒展开:
在这里插入图片描述
同样忽略二次项,并求导,得下式:
在这里插入图片描述
其中在这里插入图片描述为Hessian矩阵,在后面记为H。令函数的导数为0.有下式:
在这里插入图片描述
解得递推公式为:

在这里插入图片描述
通用的:
在这里插入图片描述
有了上面的分析,牛顿法的步骤如下:
深度学习中常见的优化方法及调参方法_第8张图片
另外,牛顿法(1)只有在Hessian矩阵是正定的情况下才能迭代,并且其(2)迭代过程中需要不断更新Hessian矩阵的逆,因此牛顿法在实际过程中很少用到。
由于牛顿法存在上述两个问题,人们提出了拟牛顿法克服这两个问题,其基本思想是,不用二阶偏导数而构造出可以近似海森矩阵的正定举证没在拟牛顿的条件下优化目标函数。
由于时间有限,拟牛顿法相关的算法没有仔细看,等有时间再补上后面的内容。

牛顿法比梯度下降法更快的原因

牛顿法是二阶收敛,梯度下降是一阶收敛。通俗的讲,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。
从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

工程调参方法及学习率设置问题

Adam以其固有特点在所有的优化方法中,收敛速度是最快的(带动量+自适应),但是Adam容易收敛到局部极小值或者不收敛,因此工程中常见的方法是首先用Adam快速收敛,然后用SGD使loss收敛。
另外之前阅读了一篇文章,是关于如何设置学习率的,在这里和大家分享一下。
学习率的选取在神经网络的优化中一直是一个关键问题。学习率太小,优化速度会很慢,需要过多的迭代过程,学习率过大,Loss会不断地振荡,不能收敛。学习率的选取主要有以下几种方案:

  • 学习率衰减,随着迭代次数增加,学习率不断下降。
  • 采用周期性的学习率,如下图所示,这种学习率短期可能带来负面效果,但是从长期来看,其可以带来积极的效果,因为增大学习率可以跳出局部极小值点,并且增大学习率还可以让loss迅速跨过鞍点。另外还可以是周期性的衰减的学习率,如图所示
    深度学习中常见的优化方法及调参方法_第9张图片
    深度学习中常见的优化方法及调参方法_第10张图片
  • SGD with warm Restart,如下图所示,就是不断的重新设置原始学习率再衰减。
    深度学习中常见的优化方法及调参方法_第11张图片
  • 最后,再补充一下warm up的训练方法,所谓warm up,就是在正式训练之前先进行简单的“预热”训练。比如首先用lr=0.001训练100个epoch,然后用lr=0.01进行正式的训练。

参考:
1《深度学习》
2 牛顿法博客
3 拟牛顿法博客

你可能感兴趣的:(深度学习)