調了快1年的rnn, 深刻的感受到,深度學習是一門實驗科學,下面是一些煉丹心得. 後面會不斷補充. 有問題的地方,也請大家指正.
引數初始化,下面幾種方式,隨便選乙個,結果基本都差不多.
uniform
w = np.random.uniform(low=-scale, high=scale, size=shape)
glorot_uniform
scale = np.sqrt(6. / (shape[0] + shape[1]))
np.random.uniform(low=-scale, high=scale, size=shape)
高斯初始化:
w = np.random.randn(n) / sqrt(n),n為引數數目
啟用函式為relu的話,推薦
w = np.random.randn(n) * sqrt(2.0/n)
svd ,對rnn效果比較好,可以有效提高收斂速度.
資料預處理方式
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的話,可以選擇從1.0或者0.1的學習率開始,隔一段時間,在驗證集上檢查一下,如果cost沒有下降,就對學習率減半. 我看過很多**都這麼搞,我自己實驗的結果也很好. 當然,也可以先用ada系列先跑,最後快收斂的時候,更換成sgd繼續訓練.同樣也會有提公升.
除了gate之類的地方,需要把輸出限制成0-1之外,盡量不要用sigmoid,可以用tanh或者relu之類的啟用函式.
rnn的dim和embdding size,一般從128上下開始調整. batch size,一般從128左右開始調整.batch size合適最重要,並不是越大越好.
word2vec初始化,在小資料上,不僅可以有效提高收斂速度,也可以可以提高結果.
盡量對資料做shuffle
lstm 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的結果,來自這篇**:http://
jmlr.org/proceedings/pa
pers/v37/jozefowicz15.pdf
, 我這裡實驗設成1.0,可以提高收斂速度.實際使用中,不同的任務,可能需要嘗試不同的值.
ensemble: **刷結果的終極核**,深度學習中一般有以下幾種方式
同樣的引數,不同的初始化方式
不同的引數,通過cross-validation,選取最好的幾組
同樣的引數,模型訓練的不同階段
不同的模型,進行線性融合. 例如rnn和傳統模型.
調參煉丹 深度學習訓練的小技巧,調參經驗。
經常會被問到你用深度學習訓練模型時怎麼樣改善你的結果呢?然後每次都懵逼了,一是自己懂的不多,二是實驗的不多,三是記性不行忘記了。所以寫這篇部落格,記錄下別人以及自己的一些經驗。ilya sutskever hinton的學生 講述了有關深度學習的見解及實用建議 獲取資料 確保要有高質量的輸入 輸出資...
深度學習總結 七 調參經驗
觀察loss勝於觀察準確率,loss設計要合理,對比訓練集和驗證集的loss relu可以很好的防止梯度瀰散問題,當然最後一層的啟用函式千萬慎用relu,如果是分類的用softmax batchnorm可以大大加快訓練速度和模型效能 dropout防止過擬合,可直接設定為0.5,即一半一半,測試的時...
關於神經網路的調參經驗技巧和調參順序
二 調參順序 三 一句總結 一 模型方面基本上都做得非常好了,因此真正需要調的引數其實並不多了,或者說調很多引數實際帶來的提公升都非常小了。二 在訓練乙個深度學習模型的過程中,超引數選擇什麼最優,這是乙個基於實驗和經驗的過程。需要不停的嘗試,直到找到合適的引數值。調參就是trial and erro...