深度學習超參數介紹及調參

超參數概念

什麼是超參數,參數和超參數的區別?

​ 區分兩者最大的一點就是是否通過數據來進行調整,模型參數通常是有數據來驅動調整,超參數則不需要數據來驅動,而是在訓練前或者訓練中人爲的進行調整的參數。例如卷積核的具體核參數就是指模型參數,這是有數據驅動的。而學習率則是人爲來進行調整的超參數。這裏需要注意的是,通常情況下卷積核數量、卷積核尺寸這些也是超參數,注意與卷積核的核參數區分。

神經網絡中包含哪些超參數?

通常可以將超參數分爲三類:網絡參數、優化參數、正則化參數。

​ 網絡參數:可指網絡層與層之間的交互方式(相加、相乘或者串接等)、卷積核數量和卷積核尺寸、網絡層數(也稱深度)和激活函數等。

​ 優化參數:一般指學習率(learning rate)、批樣本數量(batch size)、不同優化器的參數以及部分損失函數的可調參數。

​ 正則化:權重衰減係數,丟棄法比率(dropout)

爲什麼要進行超參數調優?

​ 本質上,這是模型優化尋找最優解和正則項之間的關係。網絡模型優化調整的目的是爲了尋找到全局最優解(或者相比更好的局部最優解),而正則項又希望模型儘量擬合到最優。兩者通常情況下,存在一定的對立,但兩者的目標是一致的,即最小化期望風險。模型優化希望最小化經驗風險,而容易陷入過擬合,正則項用來約束模型複雜度。所以如何平衡兩者之間的關係,得到最優或者較優的解就是超參數調整優化的目的。

超參數的重要性順序

  • 首先, 學習率,損失函數上的可調參數。在網絡參數、優化參數、正則化參數中最重要的超參數可能就是學習率了。學習率直接控制着訓練中網絡梯度更新的量級,直接影響着模型的有效容限能力;損失函數上的可調參數,這些參數通常情況下需要結合實際的損失函數來調整,大部分情況下這些參數也能很直接的影響到模型的的有效容限能力。這些損失一般可分成三類,第一類輔助損失結合常見的損失函數,起到輔助優化特徵表達的作用。例如度量學習中的Center loss,通常結合交叉熵損失伴隨一個權重完成一些特定的任務。這種情況下一般建議輔助損失值不高於或者不低於交叉熵損失值的兩個數量級;第二類,多任務模型的多個損失函數,每個損失函數之間或獨立或相關,用於各自任務,這種情況取決於任務之間本身的相關性,目前筆者並沒有一個普適的經驗由於提供參考;第三類,獨立損失函數,這類損失通常會在特定的任務有顯著性的效果。例如RetinaNet中的focal loss,其中的參數γ,α,對最終的效果會產生較大的影響。這類損失通常論文中會給出特定的建議值。

  • 其次,批樣本數量,動量優化器(Gradient Descent with Momentum)的動量參數β。批樣本決定了數量梯度下降的方向。過小的批數量,極端情況下,例如batch size爲1,即每個樣本都去修正一次梯度方向,樣本之間的差異越大越難以收斂。若網絡中存在批歸一化(batchnorm),batch size過小則更難以收斂,甚至垮掉。這是因爲數據樣本越少,統計量越不具有代表性,噪聲也相應的增加。而過大的batch size,會使得梯度方向基本穩定,容易陷入局部最優解,降低精度。一般參考範圍會取在[1:1024]之間,當然這個不是絕對的,需要結合具體場景和樣本情況;動量衰減參數β是計算梯度的指數加權平均數,並利用該值來更新參數,設置爲 0.9 是一個常見且效果不錯的選擇;

  • 最後,Adam優化器的超參數、權重衰減係數、丟棄法比率(dropout)和網絡參數。在這裏說明下,這些參數重要性放在最後並不等價於這些參數不重要。而是表示這些參數在大部分實踐中不建議過多嘗試,例如Adam優化器中的β1,β2,ϵ,常設爲 0.9、0.999、10−8就會有不錯的表現。權重衰減係數通常會有個建議值,例如0.0005 ,使用建議值即可,不必過多嘗試。dropout通常會在全連接層之間使用防止過擬合,建議比率控制在[0.2,0.5]之間。使用dropout時需要特別注意兩點:一、在RNN中,如果直接放在memory cell中,循環會放大噪聲,擾亂學習。一般會建議放在輸入和輸出層;二、不建議dropout後直接跟上batchnorm,dropout很可能影響batchnorm計算統計量,導致方差偏移,這種情況下會使得推理階段出現模型完全垮掉的極端情況;網絡參數通常也屬於超參數的範圍內,通常情況下增加網絡層數能增加模型的容限能力,但模型真正有效的容限能力還和樣本數量和質量、層之間的關係等有關,所以一般情況下會選擇先固定網絡層數,調優到一定階段或者有大量的硬件資源支持可以在網絡深度上進行進一步調整。

部分超參數如何影響模型性能?

超參數 如何影響模型容量 原因 注意事項
學習率 調至最優,提升有效容量 過高或者過低的學習率,都會由於優化失敗而導致降低模型有效容限 學習率最優點,在訓練的不同時間點都可能變化,所以需要一套有效的學習率衰減策略
損失函數部分超參數 調至最優,提升有效容量 損失函數超參數大部分情況都會可能影響優化,不合適的超參數會使即便是對目標優化非常合適的損失函數同樣難以優化模型,降低模型有效容限。 對於部分損失函數超參數其變化會對結果十分敏感,而有些則並不會太影響。在調整時,建議參考論文的推薦值,並在該推薦值數量級上進行最大最小值調試該參數對結果的影響。
批樣本數量 過大過小,容易降低有效容量 大部分情況下,選擇適合自身硬件容量的批樣本數量,並不會對模型容限造成。 在一些特殊的目標函數的設計中,如何選擇樣本是很可能影響到模型的有效容限的,例如度量學習(metric learning)中的N-pair loss。這類損失因爲需要樣本的多樣性,可能會依賴於批樣本數量。
丟棄法 比率降低會提升模型的容量 較少的丟棄參數意味着模型參數量的提升,參數間適應性提升,模型容量提升,但不一定能提升模型有效容限
權重衰減係數 調至最優,提升有效容量 權重衰減可以有效的起到限制參數變化的幅度,起到一定的正則作用
優化器動量 調至最優,可能提升有效容量 動量參數通常用來加快訓練,同時更容易跳出極值點,避免陷入局部最優解。
模型深度 同條件下,深度增加,模型容量提升 同條件,下增加深度意味着模型具有更多的參數,更強的擬合能力。 同條件下,深度越深意味着參數越多,需要的時間和硬件資源也越高。
卷積核尺寸 尺寸增加,模型容量提升 增加捲積核尺寸意味着參數量的增加,同條件下,模型參數也相應的增加。

部分超參數合適的範圍

超參數 建議範圍 注意事項
初始學習率 SGD: [1e-2, 1e-1]<br />momentum: [1e-3, 1e-2]<br />Adagrad: [1e-3, 1e-2]<br />Adadelta: [1e-2, 1e-1]<br />RMSprop: [1e-3, 1e-2]<br />Adam: [1e-3, 1e-2]<br />Adamax: [1e-3, 1e-2]<br />Nadam: [1e-3, 1e-2] 這些範圍通常是指從頭開始訓練的情況。若是微調,初始學習率可在降低一到兩個數量級。
損失函數部分超參數 多個損失函數之間,損失值之間儘量相近,不建議超過或者低於兩個數量級 這是指多個損失組合的情況,不一定完全正確。單個損失超參數需結合實際情況。
批樣本數量 [1:1024] 當批樣本數量過大(大於6000)或者等於1時,需要注意學習策略或者內部歸一化方式的調整。
丟棄法比率 [0, 0.5]
權重衰減係數 [0, 1e-4]
卷積核尺寸 [7x7],[5x5],[3x3],[1x1], [7x1,1x7]

網絡訓練中的超參調整策略

如何調試模型?

在討論如何調試模型之前,我們先來糾正一個誤區。通常理解如何調試模型的時候,我們想到一系列優秀的神經網絡模型以及調試技巧。但這裏需要指出的是數據纔是模型的根本,如果有一批質量優秀的數據,或者說你能將數據質量處理的很好的時候,往往比挑選或者設計模型的收益來的更大。那在這之後纔是模型的設計和挑選以及訓練技巧上的事情。

1、探索和清洗數據。探索數據集是設計算法之前最爲重要的一步,以圖像分類爲例,我們需要重點知道給定的數據集樣本類別和各類別樣本數量是否平衡,圖像之間是否存在跨域問題(例如網上爬取的圖像通常質量各異,存在噪聲)。若是類別數遠遠超過類別樣本數(比如類別10000,每個類別卻只有10張圖像),那通常的方法可能效果並不顯著,這時候few-shot learning或者對數據集做進一步增強可能是你比較不錯的選擇。再如目標檢測,待檢測目標在數據集中的尺度範圍是對檢測器的性能有很大影響的部分。因此重點是檢測大目標還是小目標、目標是否密集完全取決於數據集本身。所以,探索和進一步清洗數據集一直都是深度學習中最重要的一步。這是很多新手通常會忽略的一點。

2、探索模型結果。探索模型的結果,通常是需要對模型在驗證集上的性能進行進一步的分析,這是如何進一步提升模型性能很重要的步驟。將模型在訓練集和驗證集都進行結果的驗證和可視化,可直觀的分析出模型是否存在較大偏差以及結果的正確性。以圖像分類爲例,若類別間樣本數量很不平衡時,我們需要重點關注少樣本類別在驗證集的結果是否和訓練集的出入較大,對出錯類別可進一步進行模型數值分析以及可視化結果分析,進一步確認模型的行爲。

3、監控訓練和驗證誤差。首先很多情況下,我們忽略代碼的規範性和算法撰寫正確性驗證,這點上容易產生致命的影響。在訓練和驗證都存在問題時,首先請確認自己的代碼是否正確。其次,根據訓練和驗證誤差進一步追蹤模型的擬合狀態。若訓練數據集很小,此時監控誤差則顯得格外重要。確定了模型的擬合狀態對進一步調整學習率的策略的選擇或者其他有效超參數的選擇則會更得心應手。

爲什麼要做學習率調整?

​ 學習率可以說是模型訓練最爲重要的超參數。通常情況下,一個或者一組優秀的學習率既能加速模型的訓練,又能得到一個較優甚至最優的精度。過大或者過小的學習率會直接影響到模型的收斂。我們知道,當模型訓練到一定程度的時候,損失將不再減少,這時候模型的一階梯度接近零,對應Hessian 矩陣通常是兩種情況,一、正定,即所有特徵值均爲正,此時通常可以得到一個局部極小值,若這個局部極小值接近全局最小則模型已經能得到不錯的性能了,但若差距很大,則模型性能還有待於提升,通常情況下後者在訓練初最常見。二,特徵值有正有負,此時模型很可能陷入了鞍點,若陷入鞍點,模型性能表現就很差。以上兩種情況在訓練初期以及中期,此時若仍然以固定的學習率,會使模型陷入左右來回的震盪或者鞍點,無法繼續優化。所以,學習率衰減或者增大能幫助模型有效的減少震盪或者逃離鞍點。

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