梯度下降(Gradient descent)是最常用的优化算法之一。针对DNN的特点,改进迭代了多种优化器,在网络训练中,一般使用 $mini-batch gradient descent$,便是我们经常设置的参数batch-size。优化器就像一个导航仪,比如我们在山顶准备下山,它的作用便是如何让我们快速、准确地来到下山。在优化的过程中,我们会遇到下面困难:
- 选择合适的$learning rate$是非常困难的,过小则拟合缓慢,过大则可能不能拟合,在最低点附近来回打转
- $Learning\ rate\ schedules$的超参设定,它们和数据的特点紧密相关。
- 如果我们的数据非常稀疏,特征参数间更新有着非常不同的频率,我们并不希望特征参数的更新尺度是一致的,例如对不常出现的特征执行步长比较大的更新。
- 局部最优问题
这里总结下自己常用的:
SGD
最简单朴实的优化手段,缺点是不够灵活,不能根据数据特点自适应
Adagrad
- 可以看出Adagrad适合处理稀疏数据,它可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了SGD的鲁棒性。
- 缺点 在训练过程中,这个梯度的平方和累加会一直增大, 分母越来越大,导致最后梯度更新趋向于0
Wide & Deep使用的就是该优化器
RMSprop
- RMSprop对过往的梯度进行了指数衰减,很好的解决了Adagrad的问题,这里$\gamma$建议设置成0.9, $\eta$建议0.001
在Kaggle Quora比赛里,我们用RMSprop替换了Adam优化器,对RNN模型很友好,在训练速度和CV上均有提升
Adam
- Adam算是用的最多了,它号称是兼顾了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优势。其中推荐设定$\beta_1=0.9, \beta_2=0.999$
- 为不同的参数计算不同的自适应学习率,兼顾了稀疏特征
- 内存消耗少,不像Adagrad一样需要存储历史梯度
NN标配,用它的效果总不会差