如何改進梯度下降演算法?
編者按:梯度下降兩大痛點:陷入局部極小值和過擬合。Towards Data Science博主Devin Soni簡要介紹了緩解這兩個問題的常用方法。
介紹基於梯度下降訓練神經網路時,我們將冒網路落入局部極小值的風險,
有一些手段有助於緩解這些問題,不過並沒有絕對地預防這些問題產生的方法。
這些演算法改編了標準梯度下降演算法,在演算法的每次反覆運算中使用訓練資料的一個子集。SGD在每權重更新上使用一個樣本,mini-batch SGD使用預定義數目的樣本(通常遠小於訓練樣本的總數)。這大大加速了訓練,因為我們在每次反覆運算中沒有使用整個資料集,
正則化基本上是一個懲罰模型複雜度的機制,它是通過在損失函數中加入一個表示模型複雜度的項做到這一點的。
最左:欠擬合;最右:過擬合
若網路的原損失函數記為L(y, t),正則化常數記為λ,則應用了L2正則化後,損失函數改寫為如下形式:
正則化在損失函數中加入了網路的每個權重的平方和,以懲罰給任何一個連接分配了過多權重的模型,希望能降低過擬合程度。
動量簡單來說,動量在當前權重更新上加上一小部分前次權重更新。這有助於預防模型陷入局部極小值,因為即使當前梯度為0,之前梯度絕大多數情況下不為0,這樣模型就不那麼容易陷入極小值。另外,使用動量也使誤差平面上的移動總體上更為平滑,
基於這一簡單的動量概念,我們可以重寫權重更新等式至如下形式(α為動量因數):
還有其他一些更高級的動量形式,比如Nesterov方法。
學習率退火我們可以不在整個訓練過程中使用同一學習率,而是隨著時間的進展降低學習率,也就是退火。
最常見的退火規劃基於1/t關係,如下圖所示,其中T和μ0為給定的超參數,μ為當前學習率:
這經常被稱為“搜索並收斂”(search-then-converge)退火規劃,因為直到t達到T之前,網路都處於“搜索”階段,學習率沒有下降很多,在此之後,學習率減慢,網路進入“收斂”階段。這和探索(exploitation)與利用(exploration)間的平衡多多少少有些關係。剛開始我們優先探索搜索空間,擴展我們關於空間的整體知識,隨著時間的推進,我們過渡到利用搜索空間中我們已經找到的良好區域,收縮至特定的極小值。
結語這些改進標準梯度下降演算法的方法都需要在模型中加入超參數,因而會增加調整網路所需的時間。最近提出的一些新演算法,比如Adam、Adagrad、Adadelta,傾向於在每個參數的基礎上進行優化,而不是基於全域優化,因此它們可以基於單獨情況精細地調整學習率。在實踐中,它們往往更快、更好。下圖同時演示了之前提到的梯度下降變體的工作過程。注意看,和簡單的動量或SGD相比,更複雜的變體收斂得更快。
最常見的退火規劃基於1/t關係,如下圖所示,其中T和μ0為給定的超參數,μ為當前學習率:
這經常被稱為“搜索並收斂”(search-then-converge)退火規劃,因為直到t達到T之前,網路都處於“搜索”階段,學習率沒有下降很多,在此之後,學習率減慢,網路進入“收斂”階段。這和探索(exploitation)與利用(exploration)間的平衡多多少少有些關係。剛開始我們優先探索搜索空間,擴展我們關於空間的整體知識,隨著時間的推進,我們過渡到利用搜索空間中我們已經找到的良好區域,收縮至特定的極小值。
結語這些改進標準梯度下降演算法的方法都需要在模型中加入超參數,因而會增加調整網路所需的時間。最近提出的一些新演算法,比如Adam、Adagrad、Adadelta,傾向於在每個參數的基礎上進行優化,而不是基於全域優化,因此它們可以基於單獨情況精細地調整學習率。在實踐中,它們往往更快、更好。下圖同時演示了之前提到的梯度下降變體的工作過程。注意看,和簡單的動量或SGD相比,更複雜的變體收斂得更快。