1、优化算法
- SGD:随机梯度下降
- SGD+Momentum: 基于动量的SGD(在SGD基础上做过优化)
- SGD+Nesterov+Momentum:基于动量,两步更新的SGD(在SGD+Momentum基础上做过优化)
- Adagrad:自适应地为各个参数分配不同学习速率
- Adadelta: 针对Adagrad问题,优化过的算法(在Adagrad基础上做过优化)
- RMSprop:对于循环神经网络(RNNs)是最好的优化器(在Adadelta基础上做过优化)
- Adam:对每个权值都计算自适应的学习速率(在RMSprop基础上做过优化)
- Adamax:针对Adam做过优化的算法(在Adam基础上做过优化)
(1)SGD:随机梯度下降
指mini-batch gradient descent,SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了
缺点:选择合适的learning rate比较困难 - 对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了;
SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点。
(2)momentum
是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛。
(3)Adam(Adaptive Moment Estimation)
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
优点:
- 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
- 对内存需求较小
- 为不同的参数计算不同的自适应学习率
- 也适用于大多非凸优化 - 适用于大数据集和高维空间
2、如何选择
整体来讲,Adam 是最好的选择。
很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。
如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。