天桥调参师秘籍:一份深度学习超参微调技术指南
隨著深度學習的興起,越來越多的人從事算法工程師這一崗位。有時候他們自嘲自己為“天橋調參師”。當然,算法工程師的工作內容并沒有那么簡單,因為設置超參數的過程需要專業知識和廣泛的試驗和試錯過程。尤其是針對學習率(learning rate)、批量大小(batch size)、動量(?momentum)和權重衰減(weight decay)這些超參數而言,沒有簡單易行的方法來設置。
深度學習模型充滿了超參數,在如此高維空間中找到這些參數的最佳值并不是一項容易的挑戰。在討論找到最佳超參數的方法之前,首先了解這些超參數:學習率、批量大小、動量和權重衰減。這些超參數類似于開關旋鈕,可以在模型訓練期間進行調整。為了使得模型能夠獲得最佳結果,需要找到這些超參數的最佳值。
梯度下降
梯度下降是訓練機器學習算法中常用的優化技術。訓練機器學習算法的主要目的是調整權重w以最小化損失函數或成本函數。通過最小化成本函數,就可以找到產生最佳模型性能的參數[1]。
回歸問題的典型損失函數圖類似于碗的形狀,如下所示。
在梯度下降算法中,首先隨機模型參數,并計算每次學習迭代的誤差,不斷更新模型參數以更接近導致最小成本的值。梯度下降算法將梯度乘以一個標量(學習率),以確定下一個點。
如果用dW和db作為更新參數W和b的梯度,梯度下降算法如下:
如果學習率很小,那么訓練會更加可靠,但花費的時間也更多,因為每次移動的步長很小。
如果學習率很大,那么訓練可能不收斂。權重變化可能很大,以至于優化器錯失最優化并使得損失變大。因此,最終目標是找到可以快速獲得最小損失的最佳學習率。
一般而言,可以將梯度下降視為在山谷中滾動的球。希望它能夠在停留山脈的最深處,但有時可能會出錯。
根據球開始滾動的位置,它可能會停留在山谷的底部。但不是最低的一個,這稱為局部最小值。初始化模型權重的方式可能會導致局部最小值。為了避免這種情況,可以隨機始化權重向量。
用2-D表示損失面,如下所示:
紅點是全局最小值,希望能夠達到這一點。使用梯度下降方法,更新將如下所示:
隨著梯度下降的每次迭代,向上和向下振蕩移動到局部最優。如果使用更大的學習率,那么垂直振蕩將具有更高的幅度。這種垂直振蕩會減慢梯度下降過程,并阻止設置更大的學習率,而學習速率太小會使梯度下降變慢。
目標是希望在垂直方向上學習更慢,在水平方向上學習更快,這將有助于更快地達到全局最小值。
為了實現這一點,可以使用具有動量的梯度下降 [2]。
梯度下降:
在動量方面,采用dW和db的指數加權平均值,而不是每個時期單獨使用dW和db。
其中β是另一個稱為動量的超參數,取值范圍從0到1。它設置先前值的平均值與當前值之間的權重,以計算新的加權平均值。
計算指數加權平均值后更新參數。
通過使用dW和db的指數加權平均值,將垂直方向上的振蕩平均化為接近零。然而,在水平方向上,所有導數都指向水平方向的右側,因此水平方向上的平均值仍然相當大。它允許算法采用更直接的路徑朝向局部最優并阻尼垂直振蕩。基于此,算法最終會在局部最優處進行幾次迭代。
有三種梯度下降的方法:
批量梯度下降(Batch gradient descent:?)
- 使用所有的訓練實例來更新每次迭代中的模型參數;
- 通過準確估計誤差梯度來緩慢收斂;
隨機梯度下降(Stochastic Gradient Descent)
- 在每次迭代中僅使用單個訓練實例更新參數。訓練實例通常是隨機選擇的;
- 通過估計錯誤梯度快速收斂;
小批量梯度下降(Mini-batch Gradient Descent)
- 一次取b個示例:訓練時不是使用所有的示例,而是將訓練集劃分為稱為批處理的較小尺寸,每次取b個示例用來更新模型參數;
- 小批量梯度下降試圖在隨機梯度下降的穩健性和批量梯度下降的效率之間找到平衡;
- 小批量梯度下降是深度學習領域中最常用的梯度下降方法。缺點是它引入了額外的超參數'b';
搜索最佳配置的方法:網格搜索和隨機搜索
網格搜索
在網格搜索[3]中,嘗試每個可能的參數配置。
步驟:
- 定義一個n維網格,其中每個都為超參數映射。例如n =(learning_rate, batch_size);
- 對于每個維度,定義可能值的范圍:例如batch_size = [4,8,16,32],learning_rate = [0.1,0.01,0.0001];
- 搜索所有可能的配置并等待結果建立最佳配置:例如C1 =(0.1,4) - > acc = 92%,C2 =(0.01,4) - > acc = 92.3%等;
隨著維度的增多,搜索將在時間復雜度上發生爆炸。當維度小于或等于4時,通常使用這種方法。雖然它最終能保證找到最佳配置,但它仍然不是優選的,最好是使用隨機搜索。
隨機搜索
隨機搜索[4]首先從配置空間中隨機選取一個點,使用隨機搜索更廣泛地探索超參數空間。這可以在更少的迭代次數中找到最佳配置。例如:
在網格布局中,很容易注意到,即使已經訓練了9個模型,而每個變量只使用了3個值。然而,使用隨機搜索,我們不太可能不止一次地選擇相同的變量,將使用9個不同的值為每個變量訓練9個模型。更多詳細分析,請參閱該文。
盡管隨機搜索比網格搜索表現更好,但這兩種方法在計算上仍然是昂貴且耗時的。在2018年,Leslie在其經典論文中提出了關于識別最佳超參數的各種方法的詳細報告[5]。其中最好的方法是基于通過檢查測試/驗證損失以尋找欠擬合和過擬合的曲線來找到二者之間的平衡,以便爭取最佳的超參數集合。
超參數調整過程無異于在鋼絲上走路,以實現欠擬合和過擬合之間的平衡。
方法
- 1.通過在訓練早期監控驗證/測試損失,觀察分析訓練曲線,通過幾個時期來調整模型結構和超參數;
- 2.在訓練過程早期測試或驗證損失的欠擬合或過擬合對于調整超參數是有用的;
?
尋找最佳超參數
學習率(LR)
如果學習率太小,則可能發生過擬合。較高的學習率有助于正則訓練,但如果學習率過大,訓練就會出現誤差。因此,可以進行短距離網格搜索以找到收斂或發散的學習率,但還有另一種方法稱為“周期性學習率(CLR)”。
實驗表明,訓練期間使用不同的學習率總體上是有益的,因此建議在一個取值范圍內周期性地改變學習率,而不是將其設定為固定值。讓學習率在一定范圍內變化,而不是采用逐步、固定或指數級減少學習率值。即設置好最小和最大邊界,學習率在這些邊界之間循環變化。
如何估算合理的最小和最大邊界值?
LR范圍測試:運行模型幾個epoch,同時讓學習率在高低學習率值之間線性增加。對于淺層的3層架構,最大設置為0.01,而對于resnet這樣的網絡,學習率最大可以設置為3.0。
從一輪循環確定最大學習速率,并將最大值的十分之一作為最小學習率的表現也不錯[6]。
批量大小(Batch size)
與學習率不同,其值不影響計算訓練時間。批量大小受硬件內存的限制,而學習率則不然。建議使用適合硬件內存的較大批量大小,并使用更大的學習速率。
如果服務器有多個GPU,則總批量大小是單個GPU上的批量大小乘以GPU的數量。
周期性動量(Cyclical Momentum)
動量和學習率密切相關。最佳學習率取決于動量,而動量又取決于學習率。與學習率一樣,在不引起訓練不穩定的情況下盡可能設置大的動量值是很有價值的。
查找學習率和動量組合的步驟
使用循環學習率:最佳訓練步驟是循環增加學習率,初始化一個小的學習率,使其開始收斂,并減少周期動量。當學習率增加時,使用遞減的循環動量加快收斂并且當穩定訓練后,并設置更大的學習率;
使用恒定學習率:如果使用恒定的學習率,那么大的恒定動量(即0.9-0.99)將起到偽增加學習率的作用并加速訓練。但是,使用過大的動量值會導致訓練結果很差。
無論是循環學習速率還是恒定學習速率,可以嘗試在0.9到0.99范圍內設定動量值,并從中選擇一個表現最佳值。
權重衰減
體重衰減是正則化的一種形式,它在訓練中起著重要作用,因此需要適當設定[7]。權重衰減被定義為將每個時期的梯度下降中的每個權重乘以因子λ(0 <λ<1)。
一般而言,可以測試權重衰減值為1 /103、1 /10?、1 /10?和0。較小的數據集和模型結構設置較大的權重衰減值,而較大的數據集和更深的模型結構設置較小的值。
如果使用恒定的學習率而不是使用學習率范圍進行搜索,則最佳權重衰減會有所不同。由于較大的學習率提供正則化,因此較小的權重衰減值是最佳的。
總結
學習率:
- 執行學習率范圍測試以確定“大”的學習率。
*一輪測試確定最大學習速率,將最小學習速率設置為最大學習速率的十分之一。
動量:
- 用短期動量值0.99、0.97、0.95和0.9進行測試,以獲得動量的最佳值;
- 如果使用周期學習率計劃,最好從該最大動量值開始循環設置動量,并隨著學習率的增加而減小到0.8或0.85;
批量大小:
- 根據硬件條件使用盡可能大的批量大小,然后比較不同批量大小的性能;
- 小批量添加正規化的效果大,而大批量添加的正則化效果小,因此在適當平衡正規化效果的同時利用好它;
- 使用更大的批量通常會更好,這樣就可以使用更大的學習率;
權重衰減:
- 網格搜索以確定適當的幅度,但通常不需要超過一個有效數字精度;
- 更復雜的數據集需要較少的正則化,因此設置為較小的權重衰減值,例如10^-4、10^-5、10^-6、0;
- 淺層結構需要更多的正則化,因此設置更大的權重衰減值,例如10^-2、10^-3、10^-4;
?
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的天桥调参师秘籍:一份深度学习超参微调技术指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 探索Java日志的奥秘:底层日志系统-l
- 下一篇: 年度大盘点:机器学习开源项目及框架