Deep Learning 調參經驗
- 2019 年 11 月 30 日
- 筆記
本文轉自DataWhale
訓練技巧對深度學習來說是非常重要的,作為一門實驗性質很強的科學,同樣的網路結構使用不同的訓練方法訓練,結果可能會有很大的差異。這裡我總結了近一年來的煉丹心得,分享給大家,也歡迎大家補充指正。
參數初始化
下面幾種方式,隨便選一個,結果基本都差不多。但是一定要做。否則可能會減慢收斂速度,影響收斂結果,甚至造成Nan等一系列問題。
下面的n_in為網路的輸入大小,n_out為網路的輸出大小,n為n_in或(n_in+n_out)*0.5
- uniform均勻分布初始化: w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])
- Xavier初始法,適用於普通激活函數(tanh,sigmoid):scale = np.sqrt(3/n)
- He初始化,適用於ReLU:scale = np.sqrt(6/n)
- normal高斯分布初始化: w = np.random.randn(n_in,n_out) * stdev # stdev為高斯分布的標準差,均值設為0
- Xavier初始法,適用於普通激活函數 (tanh,sigmoid):stdev = np.sqrt(n)
- He初始化,適用於ReLU:stdev = np.sqrt(2/n)
- svd初始化:對RNN有比較好的效果。參考論文:https://arxiv.org/abs/1312.6120
數據預處理方式
- zero-center ,這個挺常用的. X -= np.mean(X, axis = 0) # zero-center X /= np.std(X, axis = 0) # normalize
- PCA whitening,這個用的比較少.
訓練技巧
- 要做梯度歸一化,即算出來的梯度除以minibatch size
- clip c(梯度裁剪): 限制最大梯度,其實是value = sqrt(w1^2+w2^2….),如果value超過了閾值,就算一個衰減系係數,讓value的值等於閾值: 5,10,15
- dropout對小數據防止過擬合有很好的效果,值一般設為0.5,小數據上dropout+sgd在我的大部分實驗中,效果提升都非常明顯.因此可能的話,建議一定要嘗試一下。dropout的位置比較有講究, 對於RNN,建議放到輸入->RNN與RNN->輸出的位置.關於RNN如何用dropout,可以參考這篇論文: http://arxiv.org/abs/1409.2329
- adam,adadelta等,在小數據上,我這裡實驗的效果不如sgd, sgd收斂速度會慢一些,但是最終收斂後的結果,一般都比較好。如果使用sgd的話,可以選擇從1.0或者0.1的學習率開始,隔一段時間,在驗證集上檢查一下,如果cost沒有下降,就對學習率減半. 我看過很多論文都這麼搞,我自己實驗的結果也很好. 當然,也可以先用ada系列先跑,最後快收斂的時候,更換成sgd繼續訓練.同樣也會有提升.據說adadelta一般在分類問題上效果比較好,adam在生成問題上效果比較好。
- 除了gate之類的地方,需要把輸出限制成0-1之外,盡量不要用sigmoid,可以用tanh或者relu之類的激活函數.1. sigmoid函數在-4到4的區間里,才有較大的梯度。之外的區間,梯度接近0,很容易造成梯度消失問題。2. 輸入0均值,sigmoid函數的輸出不是0均值的。
- rnn的dim和embdding size,一般從128上下開始調整. batch size,一般從128左右開始調整.batch size合適最重要,並不是越大越好.
- word2vec初始化,在小數據上,不僅可以有效提高收斂速度,也可以可以提高結果.
- 盡量對數據做shuffle
- LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的結果,來自這篇論文: http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我這裡實驗設成1.0,可以提高收斂速度.實際使用中,不同的任務,可能需要嘗試不同的值.
- Batch Normalization據說可以提升效果,不過我沒有嘗試過,建議作為最後提升模型的手段,參考論文:Accelerating Deep Network Training by Reducing Internal Covariate Shift
- 如果你的模型包含全連接層(MLP),並且輸入和輸出大小一樣,可以考慮將MLP替換成Highway Network,我嘗試對結果有一點提升,建議作為最後提升模型的手段,原理很簡單,就是給輸出加了一個gate來控制資訊的流動,詳細介紹請參考論文: http://arxiv.org/abs/1505.00387
- 來自@張馨宇的技巧:一輪加正則,一輪不加正則,反覆進行。
Ensemble
Ensemble是論文刷結果的終極核武器,深度學習中一般有以下幾種方式
- 同樣的參數,不同的初始化方式
- 不同的參數,通過cross-validation,選取最好的幾組
- 同樣的參數,模型訓練的不同階段,即不同迭代次數的模型。
- 不同的模型,進行線性融合. 例如RNN和傳統模型.

