SGD
SGD是深度學習中最常見的優化方法之一,雖然是最常使用的優化方法,但是卻有不少常見的問題。
learning rate不易確定,如果選擇過小的話,收斂速度會很慢,如果太大,loss function就會在極小值處不停的震盪甚至偏離。每個參數的learning rate都是相同的,如果數據是稀疏的,則希望出現頻率低的特征進行大一點的更新。深度神經網絡之所以比較難訓練,並不是因為容易進入局部最小,而是因為學習過程容易進入馬鞍面中,在這種區域中,所有方向的梯度值幾乎都是0。
Momentum(動量)
Momentum借助了物理中的動量的概念,即前幾次的梯度也會參與計算。為了表示動量,引入一個新的變量V,V是之前的梯度的累加,但是在每個回合都會有一定的衰減。它的特點是當前后梯度方向不一致時,能夠加速學習,前后梯度方向一致時,能夠抑制震盪。
其中,v就體現了累加的梯度,表示學習率,當前后梯度一致時,v的值就越來越大,因而加速訓練,當出現震盪時,v能夠起到緩沖震盪的作用。
Nesterov Momentum
對Momentum的一種改進:先對參數進行估計,然后使用估計估計后的參數來計算誤差。
先通過沖量對參數進行更新,相當於向前邁了一步,在計算出這時的梯度,利用這時的梯度進行更新參數。
區別於momentum的地方在於先進行了參數的更新。
Adagrad
在上述的優化算法中,參數的步長都是相的,那么能否為不同的常數設置不同的步長呢,對於梯度大的參數設置小的步長,對於梯度小的參數,設置大的步長。類比於在緩坡上面,我們可以大步長的前進,在陡坡上面,這需要小步長的前進。adagrad則是參考了這個思路。
上述的式子中,對梯度的平方進行了累加,所以r值一直都是遞增的,故梯度的改變量會越來越小。對於較小的梯度,r的開方若小於1的,故梯度的改變量則較大,對於較大的梯度,r的開放較大,所以梯度改變量則較小。該優化方法的問題是,r的值一直是遞增的,導致梯度梯度改變量會一直減小。
RMSprop
RMSprop是對Adagrad的改進,通過引入一個衰減系數,讓r每回合都衰減一定的比例。這種方法能夠很好的解決Adagrad的過早結束的問題,適合處理非平衡的目標,對於RNN 的效果很好。
該算法的做法是通過一個參數來控制r的值。
Adam
Adam的名稱是adaptive moment estimation,自適應矩估計。它的本質上是帶有動量的RMSprop,利用梯度的一階矩估計和二階矩估計調整每個參數的學習率。
其中,s是一階矩估計,r是二階矩估計 ,一階矩部分中就是帶有沖量的部分,二階矩中就是使得各個參數有不同的梯度。
優化算法的選擇
如果數據是稀疏的,就用自適應方法,即adagrad,adadelte,RMSprop,Adam。這幾種算法在很多的情況下都是相似的,通過Adam是比較好的選擇。如果需要快速的驗證新模型可以使用Adam;當模型上線發布時,可以使用SGD進行模型的極致優化。