优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)
优化方法概述
模型优化方法的选择直接关系到最终模型的性能。有时候效果不好,未必是特征的问题或者模型设计的问题,很可能是优化算法的问题,而且好的优化算法还能够帮助加速训练模型。
深度学习模型的发展进程:
SGD -> SGDM ->NAG -> AdaGrad -> AdaDelta -> Adam -> Nadam
1.整体框架
首先定义:
待优化参数www, 目标函数:f(w)f(w)f(w),学习率αalphaα
每次迭代:
- 计算目标函数关于参数的梯度:gt=▽f(wt)g_t=igtriangledown f(w_t)gt=▽f(wt)
- 根据历史梯度计算一阶动量和二阶动量:mt=ϕ(g1,g2,...,gt),Vt=ψ(g1,g2,...,gt)m_t=phi(g_1, g_2, ..., g_t), V_t=psi(g_1, g_2,...,g_t)mt=ϕ(g1,g2,...,gt),Vt=ψ(g1,g2,...,gt)
- 计算当前时刻的下降梯度:ηt=α⋅mt/Vt−−√eta_t= alpha cdot m_t/ sqrt{V_t}ηt=α⋅mt/Vt
- 根据下降梯度对参数进行更新:wt+1=wt−ηtw_{t+1}=w_t-eta_twt+1=wt−ηt
步骤3、4对于各个算法都是一致的,主要的差别就体现在1和2上。
1.1 SGD
没有动量的概念,第三步中 ηt=α⋅gteta_t=alpha cdot g_tηt=α⋅gt
其中batch_size是一个重要的变量,需要做一个快速尝试,才能够找到能够最有效地减少成本函数的那个,一般是2n2^n2n。
缺点:
- 有可能会陷入局部最小值;
- 不会收敛,最终会一直在最小值附近波动,并不会达到最小值并停留在此;
- 下降速度慢;
- 选择合适的learning rate比较困难;
- 在所有方向上统一的缩放梯度,不适用于稀疏数据
1.2 Momentum
SGD下降方法的缺点是参数更新方向只依赖于当前batch计算出的梯度,因此十分的不稳定。为了抑制SGD的震荡,动量认为梯度下降的过程中可以加入惯性。动量梯度下降法运行速度总是快于标准的梯度下降法,其基本思想是在SGD的基础上引入了一阶动量:
mt=βmt−1+(1−β)gtm_t=eta m_{t-1}+(1-eta)g_tmt=βmt−1+(1−β)gt
一阶动量指的是各个时刻梯度的指数加权平均,约等于11−β1frac{1}{1-eta_1}1−β11个历史时刻的梯度向量和的平均值,也就是t时刻的下降方向,不仅由当前点的梯度方向决定,还由此前的累积的梯度来决定,βetaβ的经验值一般为0.9,也就是意味着下降方向主要是此前累积的下降方向,并略微偏向当前时刻的下降方向。并利用当前batch微调最终的更新方向。如果当前梯度方向与历史梯度一致,会增强该方向的梯度。如果不一致,能够减少更新。
优点:
- 增加了稳定性;
- 收敛速度更快;
- 还有一定摆脱局部最优的能力。
1.2.1 理解指数加权平均
使得β=0.9eta=0.9β=0.9
m100=0.9m99+0.1θ100m_{100}=0.9m_{99}+0.1 heta_{100}m100=0.9m99+0.1θ100
m99=0.9m98+0.1θ99m_{99}=0.9m_{98}+0.1 heta_{99}m99=0.9m98+0.1θ99
m98=0.9m97+0.1θ98m_{98}=0.9m_{97}+0.1 heta_{98}m98=0.9m97+0.1θ98
把公式带入会得到: