優化方法總結以及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=\bigtriangledown 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=α⋅gt\eta_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=\beta m_{t-1}+(1-\beta)g_tmt=βmt−1+(1−β)gt
一階動量指的是各個時刻梯度的指數加權平均,約等於11−β1\frac{1}{1-\beta_1}1−β11個歷史時刻的梯度向量和的平均值,也就是t時刻的下降方向,不僅由當前點的梯度方向決定,還由此前的累積的梯度來決定,β\betaβ的經驗值一般為0.9,也就是意味着下降方向主要是此前累積的下降方向,並略微偏向當前時刻的下降方向。並利用當前batch微調最終的更新方向。如果當前梯度方向與歷史梯度一致,會增強該方向的梯度。如果不一致,能夠減少更新。
優點:
- 增加了穩定性;
- 收斂速度更快;
- 還有一定擺脫局部最優的能力。
1.2.1 理解指數加權平均
使得β=0.9\beta=0.9β=0.9
m100=0.9m99+0.1θ100m_{100}=0.9m_{99}+0.1\theta_{100}m100=0.9m99+0.1θ100
m99=0.9m98+0.1θ99m_{99}=0.9m_{98}+0.1\theta_{99}m99=0.9m98+0.1θ99
m98=0.9m97+0.1θ98m_{98}=0.9m_{97}+0.1\theta_{98}m98=0.9m97+0.1θ98
把公式帶入會得到:
m