另外,對于非凸函數,還要避免陷于局部極小值處,或者鞍點處,因為鞍點周圍的error 是一樣的,所有維度的梯度都接近于0,SGD 很容易被困在這里。
鞍點就是:一個光滑函數的鞍點鄰域的曲線,曲面,或超曲面,都位于這點的切線的不同邊。
例如這個二維圖形,像個馬鞍:在x-軸方向往上曲,在y-軸方向往下曲,鞍點就是(0,0)
為了應對上面的三點挑戰(zhàn)就有了下面這些算法。
[應對挑戰(zhàn) 1]
4. Momentum
SGD 在 ravines 的情況下容易被困住, ravines 就是曲面的一個方向比另一個方向更陡,這時 SGD 會發(fā)生震蕩而遲遲不能接近極小值:
梯度更新規(guī)則:
Momentum 通過加入 γv_t?1 ,可以加速 SGD, 并且抑制震蕩
當我們將一個小球從山上滾下來時,沒有阻力的話,它的動量會越來越大,但是如果遇到了阻力,速度就會變小。
加入的這一項,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂并減小震蕩。
超參數設定值:
一般 γ 取值 0.9 左右。
缺點:
這種情況相當于小球從山上滾下來時是在盲目地沿著坡滾,如果它能具備一些先知,例如快要上坡時,就知道需要減速了的話,適應性會更好。
5. Nesterov accelerated gradient
梯度更新規(guī)則:
用 θ?γv_t?1 來近似當做參數下一步會變成的值,則在計算梯度時,不是在當前位置,而是未來的位置上
超參數設定值:
γ 仍然取值 0.9 左右。
效果比較:
藍色是 Momentum 的過程,會先計算當前的梯度,然后在更新后的累積梯度后會有一個大的跳躍。
而 NAG 會先在前一步的累積梯度上(brown vector)有一個大的跳躍,然后衡量一下梯度做一下修正(red vector),這種預期的更新可以避免我們走的太快。
NAG 可以使 RNN 在很多任務上有更好的表現。
目前為止,我們可以做到,在更新梯度時順應 loss function 的梯度來調整速度,并且對 SGD 進行加速。
我們還希望可以根據參數的重要性而對不同的參數進行不同程度的更新。
[應對挑戰(zhàn) 2]
6. Adagrad
這個算法就可以對低頻的參數做較大的更新,對高頻的做較小的更新,也因此,對于稀疏的數據它的表現很好,很好地提高了 SGD 的魯棒性,例如識別 Youtube 視頻里面的貓,訓練 GloVe word embeddings,因為它們都是需要在低頻的特征上有更大的更新。
梯度更新規(guī)則:
其中 g 為:t 時刻參數 θ_i 的梯度
如果是普通的 SGD, 那么 θ_i 在每一時刻的梯度更新公式為:
但這里的 learning rate η 也隨 t 和 i 而變:
其中 G_t 是個對角矩陣, (i,i) 元素就是 t 時刻參數 θ_i 的梯度平方和。
Adagrad 的優(yōu)點是減少了學習率的手動調節(jié)
超參數設定值:
一般 η 就取 0.01。
缺點:
它的缺點是分母會不斷積累,這樣學習率就會收縮并最終會變得非常小。
7. Adadelta
這個算法是對 Adagrad 的改進,
和 Adagrad 相比,就是分母的 G 換成了過去的梯度平方的衰減平均值,
這個分母相當于梯度的均方根 root mean squared (RMS) ,所以可以用 RMS 簡寫:
評論
查看更多