常见的优化算法包括梯度下降法、牛顿法、Momentum、Adagrad、Adam等
SGD
是通过梯度方向和步长,直接求解目标函数的最小值时的参数。
越接近最优值时,步长应该不断减小,否则会在最优值附近来回震荡。
SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了。即:
优点:
由于每次迭代只使用了一个样本计算梯度,训练速度快;
包含一定随机性,每次计算的梯度基本是正确的导数的。
缺点:
选择合适的learning rate比较困难 - 对所有的参数更新使用同样的learning rate;
SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点;
带有随机性造成损失函数在收敛过程中严重震荡。
牛顿法
是通过求解目标函数的一阶导数为0时的参数,进而求出目标函数最小值时的参数。
优点:
收敛速度很快;
海森矩阵的逆在迭代过程中不断减小,可以起到逐步减小步长的效果;
缺点:
海森矩阵的逆计算复杂,代价比较大,因此有了拟牛顿法。
Momentum
momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度:
优点:
前后梯度一致的时候能够加速学习;
前后梯度不一致的时候能够抑制震荡,越过局部极小值。(加速收敛,减小震荡)
缺点:
增加了一个超参数。
Adagrad
Adagrad其实是对学习率进行了一个约束:
优点:
减少了学习率的手动调节;
前期gt较小的时候, regularizer较大,能够放大梯度;
后期gt较大的时候,regularizer较小,能够约束梯度;
适合处理稀疏梯度
缺点:
由公式可以看出,仍依赖于人工设置一个全局学习率;
设置过大的话,会使regularizer过于敏感,对梯度的调节太大;
分母上梯度平方的累加将会越来越大,使得训练提前结束
RMSProp
优点:
相比于AdaGrad,这种方法更好的解决了深度学习中过早的结束学习的问题;
适合处理非平稳目标,对RNN效果很好。
缺点:
依然依赖于全局学习速率。
Adam (Adaptive Moment Estimation)
本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。
Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
优点:
对内存需求较小
为不同的参数计算不同的自适应学习率
结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
也适用于大多非凸优化 - 适用于大数据集和高维空间
Adam 比其他适应性学习方法效果要好。适用于多数情况。
缺点:
复杂。
适用场景:
1 对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值。
2 SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下(很多论文都用SGD),结果更可靠。
3 如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
4 RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多 。Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,随着梯度变得稀疏,Adam 比 RMSprop 效果会好。整体来讲,Adam 是最好的选择。