深度学习框架(例如:TensorFlow,Keras,PyTorch)中使用的常见梯度下降优化算法。梯度下降是一种用于寻找函数最小值的优化方法。 它通常在深度学习模型中用于通过反向传播来更新神经网络的权重。
Vanilla SGD
朴素随机梯度下降(Vanilla SGD)通过将当前权重减去其梯度的因子(即,学习率)来更新权重。
该方程式的变化通常被称为随机梯度下降优化器。 它们有3种主要区别方式:
- 调整“梯度分量”()
代替像在随机梯度下降中那样仅使用单个梯度来更新权重,而是采用多个梯度的集合。 具体而言,这些优化器使用梯度的指数移动平均值。 - 调整“学习率”()
根据梯度的大小来调整学习速率,代替保持恒定的学习速率。 - (1)和(2)
调整梯度分量和学习率分量。
SGD 的缺点在于收敛速度慢,可能在鞍点处震荡。并且,如何合理的选择学习率是 SGD 的一大难点。
Momentum
引入动量的梯度下降算法,梯度累积是指数移动平均值。
其中,
初始化为0,一般
这使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛和减小震荡的效果。
AdaGrad
对于更新频繁的参数,我们则希望步长较小,使得学习到的参数更稳定,不至于被单个样本影响太多。通过将学习率除以的平方根来作用于学习率分量, 的平方根是当前梯度与过去平方梯度(即 )的累加和 。像SGD一样,梯度分量保持不变。
其中,
初始化为0。注意,被添加到分母。 Keras将此称为模糊因素,这是一个小的浮点值,可确保分母永远不必除以零。
此方法在稀疏数据的场景下表现很好。
RMSprop
均方根prop或RMSprop是另一种尝试提高AdaGrad的自适应学习率。 而不是像AdaGrad取平方梯度的累加总和,取这些梯度的指数移动平均值。 与动量类似,此更新成为大多数优化程序的学习率组件的标准更新。
其中,
,,,
二阶动量采用指数移动平均公式计算,即可避免二阶动量持续累积的问题。
Adadelta
与RMSprop一样,Adadelta也是AdaGrad的另一项改进,重点是学习率分量。 Adadelta可能是“adaptive delta”的缩写,此处的delta是指当前权重和新更新的权重之间的差。
Adadelta和RMSprop之间的区别在于,Adadelta通过将其替换为(平方增量的指数移动平均值)来完全消除了学习速率参数的使用。
其中
,
NAG
投影梯度的指数移动平均值
其中
,
是投影梯度。 该值必须执行一次正向传播,然后才能最终执行反向传播。
- 更新当前到投影权重:
- 执行正向传播,要用投影权重
- 获得投影梯度
- 计算和
Adam
自适应矩估计或Adam只是动量和RMSprop的结合:梯度分量用指数移动平均值和学习率除以的平方根(平方梯度的指数移动平均值)(如RMSprop)来获得学习率分量
其中,
是偏差校正
和初始化为0
AdaMax
使用无穷范数(因此称为“ max”)对Adam优化器的改进。 用梯度范数的指数移动平均值,近似于最大函数。
其中
是偏差矫正
和初始化为0
Nadam
Nadam使用Nesterov通过将上述等式中的上一个替换为来提前更新梯度:
其中,
是偏差校正
和初始化为0
AMSGrad
重新更改Adam中的自适应学习率分量,并确保当前始终大于上一个时间步长中的
其中