我们已经知道梯度下降法,需要沿着整个训练集的梯度反向下降。使用随机梯度下降方法,选取小批量数据的梯度下降方向,可以在很大程度上进行加速。SGD及其变种可能是机器学习中应用最多的优化算法。我们按照下面的顺序一一理解一下这些算法。
SGD->SGDM->NAG->AdaGrad->RMSProp->Adam->Nadam
1、随机梯度下降(SGD)
核心是按照数据生成分布抽取m个小批量样本,通过计算它们的梯度均值,来得到整体梯度的无偏估计。
- 需要:学习率 , 初始参数
- 迭代过程:
while 未满足停止准则 do
从训练集中采样m个样本 的小批量, 对应
计算梯度估计:
应用更新:
end while
SGD最大的缺点是下降速度慢,而且可能在沟壑的两边持续震荡,停留在一个局部最优点。
2、使用动量的随机梯度下降(SGDM)
动量方法旨在加速学习,特别是处理高曲率、小但一致的梯度,或带噪音的梯度。动量积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。可以这么理解:为了避免SGD震荡,SGDM认为梯度下降过程可以加入惯性,下坡的时候如果发现是陡坡,就利用惯性跑的远一点。也就是说梯度下降的方法不仅由当前的梯度方向决定,还由此前积累的下降方向决定。
这里用速度变量
来表示负梯度的指数衰减平均,超参数
决定了之前梯度的贡献衰减得有多快。更新规则如下:
- 需要:学习率 , 初始参数 , 动量参数 , 初始速度
- 迭代过程:
while 未满足停止准则 do
从训练集中采样m个样本 的小批量, 对应
计算梯度估计:
计算速度更新:
应用更新:
end while
3、使用Nesterov动量的随机梯度下降(NAG)
这是SGD-M的一种变体,用于解决SGD容易陷入局部最优的问题。通俗的理解是:但陷入局部最优时,我们不妨向前多走一步,看更远一些。我们知道动量方法中梯度方向由积累的动量和当前梯度方法共同决定,与其看当前梯度方向,不妨先看看跟着积累的动量走一步是什么情况,再决定怎么走。更新规则如下:
- 需要:学习率 , 初始参数 , 动量参数 , 初始速度
- 迭代过程:
while 未满足停止准则 do
从训练集中采样m个样本 的小批量, 对应
应用临时更新:
计算梯度估计(在临时点):
计算速度更新:
应用更新:
end while
4、AdaGrad
我们知道SGD算法中的一个重要参数是学习率,它对模型的性能有着显著的影响。那么在整个学习过程中自动适应这个学习率才是正确的做法。
AdaGrad算法的做法是:缩放每个参数反比于其所有梯度历史平方值总和的平方根。具有损失最大偏导的参数相应的有个快速下降的学习率,小偏导的参数具有较小的学习率。效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。
通俗的理解是:对于经常更新的参数,我们已经积累的大量关于它的知识,不希望被单个样本影响太大,所以学习率慢一点;对于偶尔更新的参数了解信息少,希望从样本中多学习点,即学习率大一点。我们用积累的所有梯度值的平方和来度量历史更新频率。
5、AdaDelta/RMSProp
AdaGrad单调递减的学习率边化过于激进,RMSProp通过:不积累全部历史梯度,而引入指数衰减平均来只关注过去一段时间的下降梯度,丢弃遥远过去的历史梯度。
6、Adam
我们总结上面的算法可以发现:SGD作为最初的算法,SGDM在其基础上加入了一阶动量(历史梯度的累计),AdaGrad和RMSProp在其基础上加入了二阶动量(历史梯度的平方累计),那么Adam就是自适应➕动量了,其在SGD基础上加入了一、二阶动量。
7、最后Nadam就是Adam基础上按照NAG计算梯度的变体。