深度學習-深度學習調參經驗

目錄

二、深度學習調參經驗

一、參數初始

二、數據預處理方式

三、訓練技巧

四、儘量對數據做shuffle

五、Ensemble


二、深度學習調參經驗

一、參數初始

權重W的:uniform均勻分佈初始化:

Xavier初始法,適用於普通激活函數(tanh,sigmoid):scale = np.sqrt(3/n)

二、數據預處理方式

zero-center :X -= np.mean(X, axis = 0) # zero-centerX /= np.std(X, axis = 0)

三、訓練技巧

要做梯度歸一化,即算出來的梯度除以minibatch size

1、clip c(梯度裁剪): 限制最大梯度,其實是value = sqrt(w1^2+w2^2….),如果value超過了閾值,就算一個衰減繫系數,讓value的值等於閾值: 5,10,15

2、dropout對小數據防止過擬合有很好的效果,值一般設爲0.5,小數據上dropout+sgd在我的大部分實驗中,效果提升都非常明顯.因此可能的話,建議一定要嘗試一下。 dropout的位置比較有講究, 對於RNN,建議放到輸入->RNN與RNN->輸出的位置.關於RNN如何用dropout,可以參考這篇論文:http://

3、adam,adadelta等,在小數據上,我這裏實驗的效果不如sgd, sgd收斂速度會慢一些,但是最終收斂後的結果,一般都比較好。如果使用sgd的話,可以選擇從1.0或者0.1的學習率開始,隔一段時間,在驗證集上檢查一下,如果cost沒有下降,就對學習率減半. 我看過很多論文都這麼搞,我自己實驗的結果也很好. 當然,也可以先用ada系列先跑,最後快收斂的時候,更換成sgd繼續訓練.同樣也會有提升.據說adadelta一般在分類問題上效果比較好,adam在生成問題上效果比較好。

4、除了gate之類的地方,需要把輸出限制成0-1之外,儘量不要用sigmoid,可以用tanh或者relu之類的激活函數.1. sigmoid函數在-4到4的區間裏,纔有較大的梯度。之外的區間,梯度接近0,很容易造成梯度消失問題。2. 輸入0均值,sigmoid函數的輸出不是0均值的。

5、rnn的dim和embdding size,一般從128上下開始調整. batch size,一般從128左右開始調整.batch size合適最重要,並不是越大越好。

6、word2vec初始化,在小數據上,不僅可以有效提高收斂速度,也可以可以提高結果。

四、儘量對數據做shuffle

1)LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的結果,我這裏實驗設成1.0,可以提高收斂速度.實際使用中,不同的任務,可能需要嘗試不同的值.

2)Batch Normalization據說可以提升效果,不過我沒有嘗試過,建議作爲最後提升模型的手段,參考論文:

3)如果你的模型包含全連接層(MLP),並且輸入和輸出大小一樣,可以考慮將MLP替換成Highway Network,我嘗試對結果有一點提升,建議作爲最後提升模型的手段,原理很簡單,就是給輸出加了一個gate來控制信息的流動,詳細介紹請參考論文:

五、Ensemble

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