機器學習2021 - 如何優化訓練
機器學習2021 - 如何優化訓練
類神經網路訓練不起來(Loss不再下降,或收斂效果不佳)是優化過程中最常見的挑戰之一。應對方法通常圍繞在優化器(Optimizer)的改進、損失函數(Loss Function)的選擇,以及網路結構或數據的標準化。
以下將介紹訓練類神經網路不順利時的應對方法與內容:
參考影片 4-8
一、 診斷訓練卡住的根本原因
當訓練損失(Loss)停止下降時,一般會猜測是卡在臨界點(Critical Point),即梯度(Gradient)為零的地方。但這背後的原因可能是多方面的:
- 鞍點(Saddle Point)比局部最小值(Local Minima)更常見 在深度學習的高維度誤差曲面中,雖然傳統上認為會卡在局部最小值,但經驗上發現,鞍點其實更為普遍。
◦ 局部最小值:四周的損失都比當前點高,參數無路可走。
◦ 鞍點:雖然梯度為零,但在某些方向上損失會變低,仍有路徑可以逃離。如果能找出負特徵值(Negative Eigen Value)對應的特徵向量(Eigen Vector),就能確定逃離鞍點的方向,使損失變小。
◦ 實際操作難度:儘管鞍點理論上有解,但在實務上,很少會實際計算黑塞矩陣(Hessian)的特徵值和特徵向量來逃離鞍點,因為運算量太大。
- 梯度震盪與平坦區域 訓練卡住並不總是臨界點所致。有時模型雖然損失不再下降,但梯度值仍然很大。這通常是因為參數在誤差曲面(Error Surface)的峽谷兩側來回震盪,導致損失無法繼續降低。這種情況通常發生在不同參數方向上斜率(坡度)差異極大的誤差曲面。
二、 優化演算法(Optimizer)的改進
為了解決梯度震盪和卡在平坦區域的問題,需要使用比標準梯度下降(Vanilla Gradient Descent)更進階的優化器。
- 動量(Momentum)
動量技術的靈感來自物理學中的慣性。
• 機制:參數更新時,不只考慮當前計算的梯度反方向,還會加入前一步移動的方向。
• 效益:這能讓參數在誤差曲面上如同球體滾下斜坡,即使走到梯度為零的鞍點或局部最小值,只要動量夠大,仍有機會繼續移動或翻越小坡。
• 數學解釋:Momentum是將過去所有算出的梯度方向進行加總。
- 自適應學習率(Adaptive Learning Rate)
當參數在不同方向上坡度差異很大時(一側陡峭,一側平坦),固定學習率會導致訓練非常困難。自適應學習率旨在為每個參數客製化學習率。
• 大原則:在坡度平坦(梯度小)的方向,應調大學習率;在坡度陡峭(梯度大)的方向,應調小學習率。
• Adagrad:通過計算該參數過去所有梯度平方和的平均值(Root Mean Square, $\sigma$)。如果梯度小,則 $\sigma$ 小,導致學習率變大;如果梯度大,則 $\sigma$ 大,導致學習率變小。
• RMS Prop:改進了 Adagrad 的缺點,不再平均所有歷史梯度,而是使用加權平均,讓近期梯度的影響力更大。這使得學習率可以根據時間動態調整,即使在同一參數上,也能對近期坡度變化做出快速反應(如在陡峭處快速「煞車」)。
• Adam:目前最常用的優化策略。它結合了 RMS Prop (控制步長大小) 和 Momentum (控制移動方向) 的優點。通常使用預設參數即可得到不錯的結果。
- 學習率排程(Learning Rate Scheduling)
• Learning Rate Decay (學習率衰減):隨著訓練時間的增加,讓學習率 $\eta$ 逐漸變小。這很合理,因為參數從距離終點很遠,到距離終點越來越近,應踩煞車,放慢更新速度。
• Warm Up (暖機):一個聽起來神奇的黑科技。Warm Up 的策略是讓學習率先變大後變小。一個可能的解釋是,優化器(如 Adam)的 $\sigma$ 參數需要收集足夠的數據才能精準,一開始學習率小是為了讓參數在初始位置做探索,收集誤差曲面情報;等統計數據精準後,再讓學習率爬升。
三、 調整網路架構:批次標準化(Batch Normalization)
這是一種直接改變誤差曲面(Error Surface)地貌的技巧,目標是讓崎嶇的曲面變得平滑,更容易訓練。
• 問題來源:如果網路輸入特徵(Feature)的不同維度之間數值範圍差距很大,會導致誤差曲面在不同方向上的斜率變化非常懸殊,造成訓練困難。
• Feature Normalization (特徵標準化):透過減去平均值(Mean, $\mu$)並除以標準差(Standard Deviation, $\Sigma$),將特徵的數值範圍標準化,使其平均值接近 0、變異數為 1。這能製造一個較好的誤差曲面。
• Batch Normalization (BN):深度網路中,不僅是輸入 $x$,隱藏層(Hidden Layer)的輸出 $z$ 或 $a$ 也可以視為下一層的輸入特徵。BN 選擇在中間層進行標準化,但它是針對單一個批次(Batch)的資料來計算 $\mu$ 和 $\Sigma$。
• 效益:BN 往往能讓訓練速度顯著加快,收斂至相同的準確率所需時間更短,並且由於誤差曲面更平滑,訓練時可以設定更大的學習率。
四、 損失函數(Loss Function)的選擇
在分類問題中,損失函數的選擇對訓練的難易度有重大影響。
• 交叉熵(Cross-Entropy):在分類任務中,交叉熵比均方誤差(Mean Square Error, MSE)更常用。
• MSE 的問題:如果使用 MSE 來計算分類問題的損失,當損失很大時(Model輸出與目標One-hot Vector相差很遠時),計算出來的梯度會變得非常平坦,趨近於零。這會導致訓練無法有效前進,造成訓練不起來。
• 交叉熵的優勢:相較之下,交叉熵在損失很大的地方仍然保有足夠的斜率,能讓梯度下降順利運作。
• 實作細節:在 PyTorch 等框架中,交叉熵損失函數通常會自動內建 Softmax 函數,因此在定義網路時不需重複添加 Softmax。
五、 批次大小(Batch Size)的選擇
批次大小 $B$ 是一個重要的超參數(Hyperparameter),影響訓練的穩定性、速度與最終結果。
• 小批次(Small Batch Size)
◦ 更新特性:每次更新參數只看少量資料,算出的梯度方向較為嘈雜(Noisy)。
◦ 優勢:這種嘈雜的更新方式,對優化結果反而有幫助。它傾向於讓模型走到盆地(Flat Minima)型的低點,具有更好的泛化能力(Testing Accuracy 較好),且能避免卡在狹窄的峽谷中。
◦ 劣勢:由於一個 Epoch 需要的更新次數多,總體耗時可能較長。
• 大批次(Large Batch Size)
◦ 更新特性:每次更新參數時,梯度方向較穩定。
◦ 優勢:由於 GPU 平行運算的能力,單次更新的時間與小批次相差不大,因此跑完一個 Epoch 所需的總時間較短,效率較高。
◦ 劣勢:大批次在訓練時往往會得到較差的結果,傾向於走到峽谷(Sharp Minima)型的低點,導致泛化能力較差(Testing Accuracy 較差)。
• 結論:若僅考慮效率,大批次有優勢;若考慮最終的準確性和泛化能力,小批次表現較好。
Comments
Loading comments…
Leave a Comment