訓練深度神經網絡的時候需要注意的一些小技巧

翻譯網上的哈,我覺得有很大一部分從沒看到過,所以就翻譯了下,如有不對的地方,歡迎指正:

1、準備數據:務必保證有大量、高質量並且帶有乾淨標籤的數據,沒有如此的數據,學習是不可能的

2、預處理:這個不多說,就是0均值和1方差化

3、minibatch:建議值128,1最好,但是效率不高,但是千萬不要用過大的數值,否則很容易過擬合

4、梯度歸一化:其實就是計算出來梯度之後,要除以minibatch的數量。這個不多解釋

5、下面主要集中說下學習率

  • 總的來說是用一個一般的學習率開始,然後逐漸的減小它
  • 一個建議值是0.1,適用於很多NN的問題,一般傾向於小一點。
  • 一個對於調度學習率的建議:如果在驗證集上性能不再增加就讓學習率除以2或者5,然後繼續,學習率會一直變得很小,到最後就可以停止訓練了。
  • 很多人用的一個設計學習率的原則就是監測一個比率(每次更新梯度的norm除以當前weight的norm),如果這個比率在10-3附近,如果小於這個值,學習會很慢,如果大於這個值,那麼學習很不穩定,由此會帶來失敗。

6、使用驗證集,可以知道什麼時候開始降低學習率,和什麼時候停止訓練。

7、關於對weight初始化的選擇的一些建議:

  • 如果你很懶,直接用0.02*randn(num_params)來初始化,當然別的值你也可以去嘗試
  • 如果上面那個不太好使,那麼久依次初始化每一個weight矩陣用init_scale / sqrt(layer_width) * randn,init_scale可以被設置爲0.1或者1
  • 初始化參數對結果的影響至關重要,要引起重視。
  • 在深度網絡中,隨機初始化權重,使用SGD的話一般處理的都不好,這是因爲初始化的權重太小了。這種情況下對於淺層網絡有效,但是當足夠深的時候就不行了,因爲weight更新的時候,是靠很多weight相乘的,越乘越小,有點類似梯度消失的意思(這句話是我加的)

8、如果訓練RNN或者LSTM,務必保證gradient的norm被約束在15或者5(前提還是要先歸一化gradient),這一點在RNN和LSTM中很重要。

9、檢查下梯度,如果是你自己計算的梯度。

10、如果使用LSTM來解決長時依賴的問題,記得初始化bias的時候要大一點

12、儘可能想辦法多的擴增訓練數據,如果使用的是圖像數據,不妨對圖像做一點扭轉啊之類的,來擴充數據訓練集合。

13、使用dropout

14、評價最終結果的時候,多做幾次,然後平均一下他們的結果。

via:@kevin好好學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章