1. 程式人生 > >神經網路學習:如何調參

神經網路學習:如何調參

如何調參是一個不斷深入的過程,本文會不定時的更新。

神經網路中需要調的引數很多,如何正確地調參至關重要,需要調節的引數大概有如下幾個:

  1. 神經網路的層數
  2. 每層神經元的個數
  3. 如何初始化Weights和biases
  4. loss函式選擇哪一個
  5. 選擇何種Regularization?L1,L2
  6. Regularization parameter lambda 選擇多大合適
  7. 激勵函式如何選擇
  8. 是否使用dropout
  9. 訓練集多大比較合適
  10. mini-batch選擇多大
  11. 學習率多少合適
  12. 選擇何種梯度下降演算法
  13. 何時停止Epoch訓練
前前後後有十幾個需要調節的引數,遵循一定的調參順序在一定程度上可以減少工作量,訓練一次神經網路需要挺長的時間,所以調參時要從最簡單的網路結果開始。 1.首先使用最簡單的網路結構:只包含輸入層、輸出層兩層的神經網路。 訓練集、驗證集的個數要比較小,這樣可以加快訓練的速度,其他的引數先隨便選擇一個固定值。 2.調節學習步長ang 如果ang太大,可能造成越走越高,跳過區域性最低點,但ang太小,學習的速度太慢。先不設定Regularization parameter lambda 的前提下,ang可以從0.001, 0.01, 0.1,1, 10開始嘗試,如果發現loss開始增大,停止,進行更小的微調。如何發現ang=0.1時效果最好,這是在嘗試ang=0.05和0.5兩個值。 先隨便選擇一個ang值,比如10,訓練得到最後的準確度,如果準確度不是很好,然後再使用ang=100,假如發現準確率不但每提高甚至下降了,可能就說明ang=10就有點大了,換成ang=1再訓練一遍,發現效果有了明顯提高,就說明ang=1比10更合適,用同樣的方法不斷的嘗試,就可以得到一個不錯的ang值。 3.選擇合適的Epoch訓練次數 如果隨著Epoch的次數增加,準確度在一定時間內(比如5到10次)變化很小,就可以停止Epoch。開始時可以把Epoch次數設定的大一些,觀察在哪個地方準確度變化很小,就把Epoch設定成幾。 4.調節Regularization parameter lambda 實驗lambda,從1.0,10,100…找到一個合適的。注意:lambda的大小是和樣本數成正比關係的,比如現在樣本數、lambda分別是1000、0.4,以後把樣本數擴大到10000時,對應的lambda也要擴大到4。 5.調節mini-batch size mini-batch選擇太小:沒有充分利用計算資源;太大:更新權重和偏向比較慢,mini-batch size和其他引數相對獨立,一旦找到一個合適的以後,就不需要再改了。 6.如何選擇梯度下降演算法 對於初學者,選擇SGD就可以, 7.如何選擇激勵函式 如何選擇激勵函式,沒有特別好的方法,只能靠實驗比較。常用的激勵函式有: 8.如何設定Weights和biases 最簡單的方法:讓W和b服從N(0, 1 / sqrt(n_in) ),n_in:輸入神經元的個數,設定合適的W和b可以加快學習的速率,在極個別的神經網路中,W和b甚至可以影響最後訓練的準確度。 9.選擇何種Regularization L1和L2是對cost函式後面增加一項。L1和L2都是為了減少連線對cost影響的權重,但是L1和L2又存在一定的區別。L1減少的是一個常量,L2減少權重的一個固定比例,如果權重本身很大,L1減少的比L2少很多,反之,如果權重本省很小,L1減少的更多。L1傾向於集中在少部分重要的連線上。 注意:對於L1,當W=0時,cost關於W的偏導沒有意義,因為在W=0時不可導,此時就使用un-regulazied表示式,sgn(0)=0,本來regularization的目的就是減少權重,到權重=0時,就沒有必要再減少。 10.是否使用dropout 和L1、L2 regularization不同,dropout並不對cost增加項,而是對神經網路本身的結果做改變。 11.訓練集多大比較合適 一句話,訓練集越大越好,增加訓練集在一定程度上也可以減少過擬合 12.未完待續,稍後補充……