神經網絡調參經驗【多個大神的經驗整理】

1.基本概念

超參數: 如學習率αα、adam方法的β1β_1β2β_2參數、網絡層數、每層隱藏單元數、學習率衰減值、mini-batch大小等需要人工選取的參數

參數:權重,需要被訓練的參數。比如:WTX+bW^TX+b,這裏WWbb就是參數。

2.可調參數

  • 神經網絡的層數
  • 每層神經元的個數
  • 初始化Weights和biases
  • 激活函數
  • Loss函數
  • 梯度下降算法/優化器:Adam…
  • 學習率Learning rate
  • 訓練集大小
  • batch size或mini-batch size
  • Epoch
  • Regularization:L1,L2
  • Regularization parameter λ\lambda
  • Dropout
  • 自己模型的超參數(還有啥啊??)

3.調參技巧

3.1.Random Search代替Gird Search

網格搜索主要適合與超參數的數量較少時的情況。但是在深度學習等超參數較多的情況中,應該選用隨機實驗參數來效率更高。
Bengio參考文獻

3.2.搜索過程:粗調→細調

比如兩個參數的情況:
首先對整個由兩個隨機參數組成的多個點劃定的區域進行粗略搜索,然後不斷縮小搜索區域,再在這個區域中不斷精細調節參數。

3.3.超參數的選取尺度

3.3.1.對數尺度

學習率αα,因爲它的範圍是從10510^{-5}到0.1之間。

3.3.2.線性尺度

隱藏層數、隱藏層單元數

4.調參

4.1.學習率

嘗試不同的學習率來確定。可以畫出損失函數隨迭代次數的收斂圖,選取能使得代價函數收斂到最低的學習率。
學習率衰減(退火算法):在訓練初期,學習率偏大,這樣訓練模型的速度才能快。隨着迭代的不斷進行,學習率小一些,這樣才能達到一個良好的收斂效果。

4.2.Epoch

  1. 開始時可以把Epoch次數設置的大一些,觀察在Epoch=n時,準確度變化很小,就把Epoch設置成n。
  2. Early Stopping:如果隨着Epoch的次數增加,準確度在一定時間內(比如5到10次)變化很小,就可以停止了。可以防止過擬合

4.3.mini-batch size

  1. 常取2n2^n,一般就是16,32,64,128,256。
  2. 太小:沒有充分利用計算資源。
  3. 太大:更新權重和偏向比較慢。
  4. 會受到GPU顯存的限制,所以不能無限增大。
  5. 和其他參數相對獨立,一旦找到一個合適的以後,就不需要再改了。

Q1:Batch size和mini-batch size的區別?
batch_size:同時多張卡上訓的圖片數量。
minibatch_size:每張卡的訓練圖片數量。
網絡是用按照minibatch的大小的樣本來更新一次網絡參數的,跟batch沒多大關係。
參考博客
Q2:Gradient descent中的Batch和mini-batch?
Batch gradient descent,批梯度下降:遍歷全部數據集算一次損失函數,然後算函數對各個參數的梯度,更新梯度。這種方法每更新一次參數都要把數據集裏的所有樣本都看一遍,計算量開銷大,計算速度慢,不支持在線學習。
Stochastic gradient descent,隨機梯度下降:每看一個數據就算一下損失函數,然後求梯度更新參數。這個方法速度比較快,但是收斂性能不太好,可能在最優點附近晃來晃去,hit不到最優點。兩次參數的更新也有可能互相抵消掉,造成目標函數震盪的比較劇烈。
Mini-batch gradient decent,小批的梯度下降:上述兩方法的折中。這種方法把數據分爲若干個批,按批來更新參數,這樣,一個批中的數據共同決定了本次梯度的方向,下降起來就不容易跑偏,減少了隨機性。另一方面因爲批的樣本數與整個數據集相比小了很多,計算量也不是很大。
參考博客

4.4.激活函數

神經網絡目前效果隨着網絡的深度不斷增加,效果也不斷提升,一個重要原因就是通過非線性的變換。如果沒有非線性變換的激活函數,只是做多層的線性變換,實際上效果是跟單個函數是一樣的。

  • Sigmoid函數:
  1. 導數值∈[0, 0.25],易導致梯度消失
  2. 構造比較複雜,消耗系統資源大
  3. 輸出∈[0, 1],中心值爲0.5而非0,不利於下一層的學習
  • Tanh函數:sigmoid函數的改進版
  1. 輸出∈[-1, 1],中心值趨於0
  2. 導數值∈[0, 1],易導致梯度消失
  • ReLU系
  1. 相比sigmoid和tanh,收斂更快(CNN文章
  2. 導數值∈{0, 1},不易導致梯度消失

Leaky ReLU保留了ReLU的特性,並優化了ReLU函數,但並不一定任何時候比ReLU好,目前有爭議。

4.5.優化器

傳統梯度下降運算在大規模神經網絡學習過程中會很慢,爲了加快速度,目前有了很多優化的算法。如Momentum、Nesterov Momentum、Adagrad、RMSprop、Adam等。
其中,Adam優化算法將Momentum和RMSprop兩種優化算法結合到了一起。論文中實驗表明,Adam算法比其他優化算法,會使得代價函數收斂的更快

4.6.權重初始化

  1. 初始化不能爲0,否則用梯度下降算法,會失效。
    即:每個神經元將會輸出同樣的結果,BP時會計算出同樣的梯度,最後會得到完全相同的參數更新。
  2. 很小的隨機數值初始化。比如用高斯分佈乘以一個很小的常數進行初始化:
    W=0.01np.random.randn()W=0.01*np.random.randn()
    對於層數較少的神經網絡效果很好,但是隨着層數的增加,對於初始化更爲敏感。

實驗表明,隨着隱藏層的增加,前面的層還是服從高斯分佈的,但是越到後面的隱藏層輸出值的分佈圖會趨近於0。

  1. Glorot的文章推薦的初始化方式是W=2n1+n2W=\frac {2}{n_1+n_2},其中n1n_1是前一層的單元個數,n2n_2是後一層的單元個數。
    Tensorflow的tf.contrib.layers.xavier_initializer()函數就使用的該方法。
  2. Kai minghe的文章推薦的初始化方式是W=np.random.randn(n)sqrt(2.0n)W = np.random.randn(n) * sqrt(\frac {2.0}{n})

4.7.Batch Normalization批量歸一化

 在連接層和激活函數之間加入一個BatchNorm層,確保每個進入激活函數的分佈都成高斯分佈
 該方法一定程度上減輕了對權重初始化的依賴性和麻煩。實驗表明該方法有時候還有着防過擬合的作用。
原理

5.泛化

先保證模型的複雜度能夠充分擬合數據,代價函數能夠快速的下降,在訓練集上達到一個非常高的準確率
然後,再考慮泛化的問題

5.1.欠擬合

如果偏差高,甚至無法擬合訓練集,就需要增加神經網絡層數和大小,需要讓網絡更復雜來充分擬合現有的數據。

5.2.過擬合

如果方差高,最好的辦法是尋找更多的數據,或者使用正則化的方法。

正則化:

  1. 在損失函數中,增加L1、L2等懲罰項。
  2. Dropout層:隨機讓一些神經元失活,隨機保留部分神經元。類似於從總體神經元中隨機抽樣。因此,每次在訓練模型都會不一樣,這類似於集成思想。(RNN放置Dropout層方法

Dropout層:λ\lambda調參

  • λ\lambda一般設置爲0.5。
  • 對越大越複雜的隱藏層,過擬合的可能性越大,所以失活率設置越高,保留率要設置得越低。
  • 對於簡單的網絡層,保留率設置越高,或者不用dropout。

注意:算法沒有過擬合的話,最好不用dropout。因爲每一次迭代所用的網絡都不同,因此損失函數不再被明確定義。所以,不能繪製Epoch-Loss曲線圖來進行調試。在這種情況下,通常是先關閉dropout,並設定keep.prop=1,運行代碼確保損失函數單調遞減,然後再打開dropout功能。

參考

https://blog.csdn.net/sinat_34611224/article/details/84072205
https://blog.csdn.net/m0_37615398/article/details/85389038
https://blog.csdn.net/weixin_39502247/article/details/80032487
https://www.zhihu.com/question/29641737

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