機器學習31:深度學習模型調參技巧【轉載整理】

機器學習31:深度學習模型調參技巧【轉載整理】

       本文轉載自博客模型調參:分步驟的提升模型的精度(cnn)和知乎問題你有哪些deep learning(rnn、cnn)調參的經驗?的回答,主要整理博客和知乎問答中關於卷積神經網絡的調參技巧。

1.博客整理:

       鏈接:模型調參:分步驟的提升模型的精度(cnn)
       來源:CSDN

    (1)數據增強技術:

             使用數據增強技術主要是在訓練數據上增加微小的擾動或者變化,一方面可以增加訓練數據,從而提升模型的泛化能力,另一方面可以增加噪聲數據,從而增強模型的魯棒性。運行流程爲獲取一個 batch 的訓練數據,進行數據增強步驟之後再送入網絡進行訓練。

             主要的數據增強方法有:翻轉變換 、隨機修剪、色彩抖動、平移變換、尺度變換、對比度變換、噪聲擾動、旋轉變換 、反射變換等。

             比較常用的數據增強操作爲圖像切割、圖像翻轉以及圖像白化【將圖像歸一化成 Gaussian(0,1) 分佈】。

   (2)從模型角度改進:

             1)權重衰減:對於目標函數加入正則化項,限制權重參數的個數,這是一種防止過擬合的方式,這個方法就是機器學習中的l2正則化方法。

              2)Dropout:在每次訓練過程中,隨機讓一定概率的神經元不被激活,這樣可以防止過擬合,提高模型的泛化能力。

              3)批量正則化:BatchNormalization 對神經網絡的每一層的輸入數據都進行正則化處理,這樣有利於讓數據的分佈更加均勻,不會出現所有數據都會導致神經元的激活,或者所有數據都不會導致神經元的激活,這是一種數據標準化方法,能夠提升模型的擬合能力 。

               4)LRN: LRN 層模仿生物神經系統的側抑制機制,對局部神經元的活動創建競爭機制,使得響應比較大的值相對更大,提高模型泛化能力。

   (3)變化學習率技術:

             變化學習率技術的大致思路是首先使用較大的學習率進行訓練,觀察目標函數值和驗證集準確率的收斂曲線,當目標函數值下降速度和驗證集準確率上升速度出現減緩時,適當減小學習率;循環執行如上操作,直至減小學習率也不會影響目標函數下降或驗證集準確率上升爲止。

   (4)殘差結構的引入:

            當網絡層數加大時,由於梯度衰減的原因,導致網絡性能可能不升反降,而殘差網絡的技術可以解決深層網絡引入的梯度衰減問題,發揮深層網絡的特徵提取能力,使模型獲得很強的擬合能力和泛化能力。

            殘差網絡通過跨層的直連邊,可以使誤差在反傳的過程中減少衰減,使得深層次的網絡可以成功訓練。

2.知乎用戶京東白條回答整理:

         鏈接:https://www.zhihu.com/question/41631631/answer/776852832
         來源:知乎

         對於參數初始化,因爲我們學習的本來就是權重W與偏置b,如果初始化足夠好,直接就初始化到最優解,那麼就不用進行訓練了, 良好的初始化,可以讓參數更接近最優解,這可以大大提高收斂速度,也可以防止落入局部極小。對於學習率,學習率如果取太大,會使模型訓練非常震盪,可以想象我們最小化一個二次拋物線,選取一個很大的學習率,那麼迭代點會一直在拋物線的兩邊震盪,收斂不到最小值,甚至還有螺旋上升迭代點的可能。下面對深度學習調參技巧談些心得,可以爲讀者提供一些調參的思路。

   (1)激活函數選擇:

             常用的激活函數有relu、leaky-relu、sigmoid、tanh等。對於輸出層,多分類任務選用softmax輸出,二分類任務選用sigmoid輸出,迴歸任務選用線性輸出。而對於中間隱層,則優先選擇relu激活函數(relu激活函數可以有效的解決sigmoid和tanh出現的梯度彌散問題,多次實驗表明它會比其他激活函數以更快的速度收斂)。另外,構建序列神經網絡(RNN)時要優先選用tanh激活函數。

   (2)學習率設定:

             一般學習率從0.1或0.01開始嘗試,學習率設置太大會導致訓練十分不穩定,甚至出現Nan,設置太小會導致損失下降太慢。

            學習率一般要隨着訓練進行衰減,衰減係數設0.1,0.3,0.5均可,衰減時機可以是驗證集準確率不再上升時,或固定訓練多少個週期以後自動進行衰減。 

   (3)防止過擬合:

             一般常用的防止過擬合方法有使用L1正則項、L2正則項、dropout、提前終止、數據集擴充等。如果模型在訓練集上表現比較好但在測試集上表現欠佳可以選擇增大L1或L2正則的懲罰力度(L2正則經驗上首選1.0,超過10很少見),或增大dropout的隨機失活概率(經驗首選0.5);或者當隨着訓練的持續在測試集上不增反降時,使用提前終止訓練的方法。

             當然最有效的還是增大訓練集的規模,實在難以獲得新數據也可以使用數據集增強的方法,比如CV任務可以對數據集進行裁剪、翻轉、平移等方法進行數據集增強,這種方法往往都會提高最後模型的測試精度。

   (4)優化器選擇:

             如果數據是稀疏的,就用自適應方法,即 Adagrad, Adadelta, RMSprop, Adam。

             整體來講,Adam 是最好的選擇;SGD 雖然能達到極小值,但是比其它算法用的時間長,而且可能會被困在鞍點。如果需要更快的收斂,或者是訓練更深更復雜的神經網絡,需要用一種自適應的算法。

   (5)殘差塊與BN層:

             如果希望訓練一個更深更復雜的網絡,那麼殘差塊絕對是一個重要的組件,它可以讓你的網絡訓練的更深。 BN層具有加速訓練速度,有效防止梯度消失與梯度爆炸,具有防止過擬合的效果,所以構建網絡時最好要加上這個組件。

   (6)自動調參方法: 

             1)Grid Search:網格搜索,在所有候選的參數選擇中,通過循環遍歷,嘗試每一種可能性,表現最好的參數就是最終的結果。其原理就像是在數組裏找最大值,缺點是耗時太多,特別像神經網絡一般嘗試不了太多的參數組合。

             2)Random Search:經驗上Random Search比Gird Search更有效。實際操作的時候,一般也是先用Gird Search的方法,得到所有候選參數,然後每次從中隨機選擇進行訓練;另外Random Search往往會和由粗到細的調參策略結合使用,即在效果比較好的參數附近進行更加精細的搜索。

            3)Bayesian Optimization:貝葉斯優化,考慮到了不同參數對應的 實驗結果值,因此更節省時間,貝葉斯調參比Grid Search迭代次數少, 速度快,而且其針對非凸問題依然穩健。

   (7)參數隨機初始化與數據預處理:

             參數初始化很重要,它決定了模型的訓練速度與是否可以躲開局部極小,relu激活函數初始化推薦使用He normal,tanh初始化推薦使用Glorot normal,其中Glorot normal也稱作Xavier normal初始化;數據預處理方法一般也就採用數據歸一化即可。

3.知乎用戶陳運文回答整理:

     CNN的調參主要是在優化函數、embedding的維度和殘差網絡的層數幾個方面。

     (1)優化函數的選擇主要有Adam和sgd,Adam相對而言不需要設置參數並且簡單很多,效果不錯。

     (2)embedding隨着維度的增大會出現一個最大值點,也就是開始隨着維度增加效果逐漸變好,到達一個點後隨着維度增加效果逐漸變差。

     (3)殘差網絡的層數與embedding的維度有關,隨着層數的增加效果呈現爲凸函數。

     (4)激活函數推薦使用relu。

     (5)Dropout層數不宜設置過大,過大容易造成網絡不收斂,調節步長可以爲0.05,一般調整到0.4~0.5時會獲取到最佳值。

 

 

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