caffe里的clip gradient是什麼意思?

誰能簡單介紹下?沒設過這個東西


第一次回答問題,有點緊張。。。

clip_gradient 的引入是為了處理gradient explosion的問題。當在一次迭代中權重的更新過於迅猛的話,很容易導致loss divergence。clip_gradient 的直觀作用就是讓權重的更新限制在一個合適的範圍。

具體的細節是,

1.在solver中先設置一個clip_gradient

2.在前向傳播與反向傳播之後,我們會得到每個權重的梯度diff,這時不像通常那樣直接使用這些梯度進行權重更新,而是先求所有權重梯度的平方和sumsq_diff,如果sumsq_diff &> clip_gradient,則求縮放因子scale_factor = clip_gradient / sumsq_diff。這個scale_factor在(0,1)之間。如果權重梯度的平方和sumsq_diff越大,那縮放因子將越小。

3.最後將所有的權重梯度乘以這個縮放因子,這時得到的梯度才是最後的梯度信息。

這樣就保證了在一次迭代更新中,所有權重的梯度的平方和在一個設定範圍以內,這個範圍就是clip_gradient.

最後補充一點,這個參數多用於LSTM中,而我這個回答是基於jeffdonahue 在caffe Pull的RNN 代碼,你可以在 jeffdonahue/caffe at recurrent · GitHub 中的src/caffe/solver.cpp里看到具體的實現代碼。


SolverParameter中的clip_gradients,設置為一個大於0的值,作為一個閾值,在計算當前梯度的時候,如果該值超過了該閾值,則將梯度直接設置為該閾值。

增加這個設計的原因,應該是源於這個回答(Handle divergence/NaNs gracefully · Issue #1349 · BVLC/caffe · GitHub):

I"m encountering a problem I never had before. So usually the loss either diverge soon and generate NaNs or start converging and never diverges again. However, recently in some experiments I"m encountering the problem that the loss start converging, and after a while 45K iterations diverges.

We need to do something about this, in addition to stop, maybe we could log what caused the NaN to appear.

Also maybe adding gradient clipping could help, **** could you do a PR with the gradient clipping?


http://arxiv.org/abs/1211.5063

On the difficulty of training Recurrent Neural Networks

這篇文章最早提出了Gradient clipping這個優化,用於解決exploding gradients 問題.

-----

把關聯的問題也回答了吧

##Vanishing Gradients是什麼,如何解決這個問題

###如果一個神經網路有超過1層比如4層的話,bp演算法會使得四層學習的速度逐步遞減,layer4&>layer3&>layer2&>layer1,這意味著在前面的隱藏層中的神經元學習速度要慢於後面的隱藏層.

###BP的本質是對神經元的輸出z進行糾正,通過對他求梯度作一個反方向的偏移,這裡假設我們Layer1的b要進行反向傳播更新權值,那麼可以得出公式:"http://neuralnetworksanddeeplearning.com/images/tikz38.png", 這樣可以觀察到這個等式傳播的時候有兩個關鍵點,一個是w權值,一個是sigmoid"(z).sigmoid"(z)是一個max=0.25的正態分布圖,所以隨著Layers越多顯然這個學習的速度就會至少降低75%,所以會產生這個Vanishing Gradients問題.同理,如果這個w權值非常大的話,那麼理論上整個乘積也會放大,但是sigmoid"函數裡面的z是等於(wx + b),這個數值越大則sigmoid"越靠兩邊其實數值越小,所以其實最後的學習率通常來講都是越來越小的.

##Exploding gradient是什麼,如何解決這個問題

###梯度爆炸就是當上面的w控制在一個非常大的值,同時sigmoid"也非常大,兩個的乘積都大於1的時候,就有了梯度爆炸的問題.

###解決方法:通過對w進行pre-trained可以通過更改w權值來解決Vanishing Gradients,或者更改激活函數從sigmoid換成ReLU,這樣ReLU是1/0函數,不會使得傳播的時候持續縮小了

###解決方法:gradient clipping解決了Exploding gradient問題,把每次更新的gradient壓縮在clip範圍內,就不會無限制的連乘導致偏離了.

https://cs224d.stanford.edu/lecture_notes/LectureNotes4.pdf

[譯] 第五章 深度神經網路為何很難訓練

##是因為BP訓練才產生Exploding gradient和Vanishing Gradients的問題嗎

### 應該是的,因為BP訓練的過程才得到了上面的等式,才有了這麼一系列推論.

Neural networks and deep learning

修改了好幾次這個答案,有錯誤還請指正


推薦閱讀:

GPU對CNN計算的加速原理到底是怎樣的?
對深度學習的理解達到什麼水平才能應聘大型互聯網公司的機器學習相關崗位?
深度學習畢設有什麼好的題目?
什麼是稀疏特徵(Sparse Features)?
如何評價MSRA的新paper:Deep Image Analogy?

TAG:深度學習DeepLearning |