1. 程式人生 > >深度學習網路調參技巧1

深度學習網路調參技巧1

好的實驗環境是成功的一半

由於深度學習實驗超參眾多,程式碼風格良好的實驗環境,可以讓你的人工或者自動調參更加省力,有以下幾點可能需要注意:

  • 將各個引數的設定部分集中在一起。如果引數的設定分佈在程式碼的各個地方,那麼修改的過程想必會非常痛苦。
  • 可以輸出模型的損失函式值以及訓練集和驗證集上的準確率。
  • 可以考慮設計一個子程式,可以根據給定的引數,啟動訓練並監控和週期性儲存評估結果。再由一個主程式,分配引數以及並行啟動一系列子程式。

畫圖

畫圖是一個很好的習慣,一般是訓練資料遍歷一輪以後,就輸出一下訓練集和驗證集準確率。同時畫到一張圖上。這樣訓練一段時間以後,如果模型一直沒有收斂,那麼就可以停止訓練,嘗試其他引數了,以節省時間。 
如果訓練到最後,訓練集,測試集準確率都很低,那麼說明模型有可能欠擬合。那麼後續調節引數方向,就是增強模型的擬合能力。例如增加網路層數,增加節點數,減少dropout值,減少L2正則值等等。 
如果訓練集準確率較高,測試集準確率比較低,那麼模型有可能過擬合,這個時候就需要向提高模型泛化能力的方向,調節引數。

從粗到細分階段調參

實踐中,一般先進行初步範圍搜尋,然後根據好結果出現的地方,再縮小範圍進行更精細的搜尋。

  1. 建議先參考相關論文,以論文中給出的引數作為初始引數。至少論文中的引數,是個不差的結果。
  2. 如果找不到參考,那麼只能自己嘗試了。可以先從比較重要,對實驗結果影響比較大的引數開始,同時固定其他引數,得到一個差不多的結果以後,在這個結果的基礎上,再調其他引數。例如學習率一般就比正則值,dropout值重要的話,學習率設定的不合適,不僅結果可能變差,模型甚至會無法收斂。
  3. 如果實在找不到一組引數,可以讓模型收斂。那麼就需要檢查,是不是其他地方出了問題,例如模型實現,資料等等。可以參考我寫的深度學習網路除錯技巧

提高速度

調參只是為了尋找合適的引數,而不是產出最終模型。一般在小資料集上合適的引數,在大資料集上效果也不會太差。因此可以嘗試對資料進行精簡,以提高速度,在有限的時間內可以嘗試更多引數。

  • 對訓練資料進行取樣。例如原來100W條資料,先採樣成1W,進行實驗看看。
  • 減少訓練類別。例如手寫數字識別任務,原來是10個類別,那麼我們可以先在2個類別上訓練,看看結果如何。

超引數範圍

建議優先在對數尺度上進行超引數搜尋。比較典型的是學習率和正則化項,我們可以從諸如0.001 0.01 0.1 1 10,以10為階數進行嘗試。因為他們對訓練的影響是相乘的效果。不過有些引數,還是建議在原始尺度上進行搜尋,例如dropout值: 0.3 0.5 0.7)。

經驗引數

這裡給出一些引數的經驗值,避免大家調參的時候,毫無頭緒。

  • learning rate: 1 0.1 0.01 0.001, 一般從1開始嘗試。很少見learning rate大於10的。學習率一般要隨著訓練進行衰減。衰減係數一般是0.5。 衰減時機,可以是驗證集準確率不再上升時,或固定訓練多少個週期以後。 
    不過更建議使用自適應梯度的辦法,例如adam,adadelta,rmsprop等,這些一般使用相關論文提供的預設值即可,可以避免再費勁調節學習率。對RNN來說,有個經驗,如果RNN要處理的序列比較長,或者RNN層數比較多,那麼learning rate一般小一些比較好,否則有可能出現結果不收斂,甚至Nan等問題。
  • 網路層數: 先從1層開始。
  • 每層結點數: 16 32 128,超過1000的情況比較少見。超過1W的從來沒有見過。
  • batch size: 128上下開始。batch size值增加,的確能提高訓練速度。但是有可能收斂結果變差。如果視訊記憶體大小允許,可以考慮從一個比較大的值開始嘗試。因為batch size太大,一般不會對結果有太大的影響,而batch size太小的話,結果有可能很差。
  • clip c(梯度裁剪): 限制最大梯度,其實是value = sqrt(w1^2+w2^2….),如果value超過了閾值,就算一個衰減繫系數,讓value的值等於閾值: 5,10,15
  • dropout: 0.5
  • L2正則:1.0,超過10的很少見。
  • 詞向量embedding大小:128,256
  • 正負樣本比例: 這個是非常忽視,但是在很多分類問題上,又非常重要的引數。很多人往往習慣使用訓練資料中預設的正負類別比例,當訓練資料非常不平衡的時候,模型很有可能會偏向數目較大的類別,從而影響最終訓練結果。除了嘗試訓練資料預設的正負類別比例之外,建議對數目較小的樣本做過取樣,例如進行復制。提高他們的比例,看看效果如何,這個對多分類問題同樣適用。 
    在使用mini-batch方法進行訓練的時候,儘量讓一個batch內,各類別的比例平衡,這個在影象識別等多分類任務上非常重要。

自動調參

人工一直盯著實驗,畢竟太累。自動調參當前也有不少研究。下面介紹幾種比較實用的辦法:

  • Gird Search. 這個是最常見的。具體說,就是每種引數確定好幾個要嘗試的值,然後像一個網格一樣,把所有引數值的組合遍歷一下。優點是實現簡單暴力,如果能全部遍歷的話,結果比較可靠。缺點是太費時間了,特別像神經網路,一般嘗試不了太多的引數組合。
  • Random Search。Bengio在Random Search for Hyper-Parameter Optimization中指出,Random Search比Gird Search更有效。實際操作的時候,一般也是先用Gird Search的方法,得到所有候選引數,然後每次從中隨機選擇進行訓練。

總結

  • 合理性檢查,確定模型,資料和其他地方沒有問題。
  • 訓練時跟蹤損失函式值,訓練集和驗證集準確率。
  • 使用Random Search來搜尋最優超引數,分階段從粗(較大超引數範圍訓練較少週期)到細(較小超引數範圍訓練較長週期)進行搜尋。

參考資料

轉載請註明:煉丹實驗室 https://zhuanlan.zhihu.com/p/24720954