機器學習的常見優化方法在最近的學習中經常遇到,但是還是不夠精通.將自己的學習記錄下來,以備不時之需
基礎知識:
機器學習幾乎所有的算法都要利用損失函數 lossfunction 來檢驗算法模型的優劣,同時利用損失函數來提升算法模型.
這個提升的過程就叫做優化(Optimizer)
下面這個內容主要就是介紹可以用來優化損失函數的常用方法
常用的優化方法(Optimizer):
- 1.SGD&BGD&Mini-BGD:
SGD(stochastic gradient descent):隨機梯度下降,算法在每讀入一個數據都會立刻計算loss function的梯度來update參數.假設loss function為L(w),下同.$$w-=\eta \bigtriangledown_{w_{i}}L(w_{i}) $$
Pros:收斂的速度快;可以實現在線更新;能夠跳出局部最優
Cons:很容易陷入到局部最優,困在馬鞍點.
BGD(batch gradient descent):批量梯度下降,算法在讀取整個數據集后累加來計算損失函數的的梯度
\[w-=\eta \bigtriangledown_{w}L(w) \]
Pros:如果loss function為convex,則基本可以找到全局最優解
Cons:數據處理量大,導致梯度下降慢;不能實時增加實例,在線更新;訓練占內存
Mini-BGD(mini-batch gradient descent):顧名思義,選擇小批量數據進行梯度下降,這是一個折中的方法.采用訓練集的子集(mini-batch)來計算loss function的梯度.$$w-=\eta \bigtriangledown_{w_{i:i+n}}L(w_{i:i+n})$$
這個優化方法用的也是比較多的,計算效率高而且收斂穩定,是現在深度學習的主流方法.
上面的方法都存在一個問題,就是update更新的方向完全依賴於計算出來的梯度.很容易陷入局部最優的馬鞍點.能不能改變其走向,又保證原來的梯度方向.就像向量變換一樣,我們模擬物理中物體流動的動量概念(慣性).引入Momentum的概念.
- 2.Momentum
在更新方向的時候保留之前的方向,增加穩定性而且還有擺脫局部最優的能力$$\Delta w=\alpha \Delta w- \eta \bigtriangledown L(w)$$ $$w=w+\Delta w$$
若當前梯度的方向與歷史梯度一致(表明當前樣本不太可能為異常點),則會增強這個方向的梯度,若當前梯度與歷史梯方向不一致,則梯度會衰減。一種形象的解釋是:我們把一個球推下山,球在下坡時積聚動量,在途中變得越來越快,\(\eta\)可視為空氣阻力,若球的方向發生變化,則動量會衰減。 - 3.Adagrad:(adaptive gradient)自適應梯度算法,是一種改進的隨機梯度下降算法.
以前的算法中,每一個參數都使用相同的學習率\(\alpha\). Adagrad算法能夠在訓練中自動對learning_rate進行調整,出現頻率較低參數采用較大的\(\alpha\)更新.出現頻率較高的參數采用較小的\(\alpha\)更新.根據描述這個優化方法很適合處理稀疏數據.$$G=\sum ^{t}{\tau=1}g{\tau} g_{\tau}^{T} 其中 s.t. g_{\tau}=\bigtriangledown L(w_{i})$$ 對角線矩陣$$G_{j,j}=\sum {\tau=1}^{t} g{\tau,j\cdot}^{2}$$ 這個對角線矩陣的元素代表的是參數的出現頻率.每個參數的更新$$w_{j}=w_{j}-\frac{\eta}{\sqrt{G_{j,j}}}g_{j}$$ - 4.RMSprop:(root mean square propagation)也是一種自適應學習率方法.不同之處在於,Adagrad會累加之前所有的梯度平方,RMProp僅僅是計算對應的平均值.可以緩解Adagrad算法學習率下降較快的問題.$$v(w,t)=\gamma v(w,t-1)+(1-\gamma)(\bigtriangledown L(w_{i}))^{2} ,其中 \gamma 是遺忘因子$$ 參數更新$$w=w-\frac{\eta}{\sqrt{v(w,t)}}\bigtriangledown L(w_{i})$$
- 5.Adam:(adaptive moment estimation)是對RMSProp優化器的更新.利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率.
優點:每一次迭代學習率都有一個明確的范圍,使得參數變化很平穩.
\[m_{w}^{t+1}=\beta_{1}m_{w}^{t}+(1-\beta_{1}) \bigtriangledown L^{t} ,m為一階矩估計 \]
\[v_{w}^{t+1}=\beta_{2}m_{w}^{t}+(1-\beta_{2}) (\bigtriangledown L^{t})^{2},v為二階矩估計 \]
\[\hat{m}_{w}=\frac{m_{w}^{t+1}}{1-\beta_{1}^{t+1}},估計校正,實現無偏估計 \]
\[\hat{v}_{w}=\frac{v_{w}^{t+1}}{1-\beta_{2}^{t+1}} \]
\[w^{t+1} \leftarrow=w^{t}-\eta \frac{\hat{m}_{w}}{\sqrt{\hat{v}_{w}}+\epsilon} \]
Adam是實際學習中最常用的算法