【機器學習】梯度下降

許瑞晗發表於2020-08-11

Gradient Descent 梯度下降

梯度下降 (Gradient Descent) 的直觀解釋

得到 loss function 之後,我們需要一種方法求解其最小值解 \(\theta = \arg \min L(\theta)\). 這種方法最好滿足以下條件:

  1. 對任何 Loss function 都是通用的
  2. 在能求得目標解的條件下,越快越好

首先看第一個條件. 怎樣才能找到對任何函式都能通用的辦法呢?想象一下假如我們在下山,但是對周圍的路況一無所知,我們如何判斷更低的地方在哪裡呢?這個 task 太難了,我們得給出一些條件,比如 \(L(\theta)\) 是一階可微的,這樣我們就能環顧四周,從而知道哪個方向比目前所處的位置高,哪個方向比所處的位置低了. 我們猜想順著低處走就可以下山了,而且步子邁大一點就走得快,邁小一點就走得慢. 把下山整理成數學語言就是:

  • \(L(\theta)\) 目前的海拔
  • \(-\dfrac{d L(\theta)}{d \theta} = -\nabla L(\theta)\) 地勢下降最快的方向
  • \(\eta\) 步長 / 學習率 (learning rate)

\(t\) 步梯度下降的公式

\[\theta^t = \theta^{t-1} - \eta^{t-1}\nabla L(\theta^{t-1}) \]

以上介紹的方法又稱為 Vanilla Gradient Descent.

梯度下降的影響因素

除公式外,梯度下降的結果還受到以下幾個因素的影響:

  • 學習率 \(\eta\)
  • 樣本數量
  • 特徵尺度
  • 損失函式

學習率對梯度下降的影響

仍以下山為例,如果步子太小,下山得下到猴年馬月啊;步子太大,一個筋斗雲過去都不知道自己在哪兒了.

  • 靜態觀點)學習率太小導致收斂過慢,學習率太大導致不收斂

而在山頂的時候可以走快一點,到山腳就不用那麼著急了.

  • 動態觀點)剛開始學習率較大,訓練末期學習率較小

靜態觀點要求選擇一個合適的初始值,這個值是ad hoc的(或者說是超引數);動態觀點要求適當地變化學習率. 一種方法是 Adagrad(注意,很多 Ada 開頭的模型指的都是 adaptive 的方法):

\[\theta^{t+1} = \theta^t - \frac{\eta}{\delta+\sqrt{\sum_{i=0}^{t}g^t\odot g^t}}\odot g^t \]

裡面的 \(\odot\) 表示 element-wise dot,其他運算子也都是 element-wise 操作. 這樣梯度越大的方向,分母上的懲罰也就越大,也就是限制往梯度最大的方向移動. 就好像人在山谷中行走,兩側梯度大,Adagrad方法會限制人儘量少地往兩邊走,這樣就能更快地前進. 又比如現在處在斜面上,Vanilla會先順著斜面衝到底,然後再考慮向左還是向右;Adagrad 會一邊橫向走一邊順著斜面下降,這樣走得距離更短,還有可能避開 local minimum

還有一種解釋是類比牛頓法,根號裡的內容可以看作是二階微分大小的一種表示,而且是通過歷史的一階微分來表示的。

樣本數量

  • 如果我們用所有的樣本來求梯度,那麼就稱為 (Batch) Gradient Descent
  • 如果我們只用一個樣本來求梯度,那麼就稱為 Stochastic Gradient Descent
  • 如果我們用一部分樣本來求梯度,那麼就稱為 Mini-batch Gradient Descent

類似的定義還有 Online learning 和 Offline learning

  • Online learning = Stochastic Gradient Descent,當然收集幾個資料再做 Mini-batch 也是可以的
  • Offline learning = (Batch) Gradient Descent,當讓想用 Batch 或者 Mini-batch 也是可以的

總的規律是:一次下降中使用的樣本越少,梯度波動也就越大,學習率也要相應的調小,但是 iteration 的次數會更多,下降得更快;反之同理.

調整 batchsize 時,需要相應調整學習率. batch 越大,學習率也越大,這樣才能保證 epoch 差不多時結果差不多.

特徵尺度

如果某個特徵 A 的範圍是 0~1000,另一個特徵 B 的範圍是 0~1,那麼特徵 A 在損失函式中所佔的比重會遠遠高於特徵 B 的比重,梯度下降就會忽略特徵 B 而全力學習特徵 A. 為了消除這種不平衡,需要對先做 Feature Scaling,把每個特徵都轉化到大致相等的範圍內. 常用的方法有

  • min-max
  • Z-score

損失函式

對於非凸的損失函式,梯度下降可能陷入區域性極小值. 目前已知的凸函式模型有:

  • Linear Regression, MLE Loss
  • Logistic Regression, Cross Entropy Loss 證明

其他優化方法

還有一些著名的優化方法,比如:

  1. SGD with momentum (SGDM)

    \[v^{t+1} = \lambda v^t - \eta \nabla L(\theta^t) \\ \theta^{t+1} = \theta^t + v^{t+1} \]

    SGDM 的優點

    • 下降的速度更快
    • 不會卡在梯度為零的點(比如鞍點),因為有慣性
    • 可能衝出一些 local optima 的範圍從而走向 global optima
  2. RMSProp

    \[\theta^{t+1} = \theta^t - \frac{\eta}{\sqrt{v^t}}\odot g^t \\ v^1 = g^0 \odot g^0 \\ v^t = \alpha v^{t-1} + (1-\alpha) g^{t-1} \odot g^{t-1} \]

    解決 Adagrad 存在的一些問題:

    • Adagrad 沒有衰減,原始梯度會持續地影響後續的訓練. 如果開始梯度很大的話,後面的步長就會很小. RMSProp 引入衰減係數解決這個問題
  3. Adam

    Adam相當於 SGDM 和 RMSProp 的結合

    \[\theta^{t+1} = \theta^t - \frac{\eta}{\epsilon+\sqrt{v^{t+1}}}\odot \hat m^t \\ m^t = \beta_1 m^{t-1} + (1-\beta_1) g^{t-1}, \hat m^t = \frac{m^t}{1-\beta_1^t}\\ v^t = \beta_2 v^{t-1} + (1-\beta_v) g^{t-1} \odot g^{t-1}, v^t = \frac{v^t}{1-\beta_2^t}\\ \beta_1=0.9, \beta_2=0.999, \epsilon=10^{-8} \]

到此為止,所有的模型訓練方法基本都被囊括了。一般論文中能用到的模型也就是 Adam 和 SGDM,二者的對比如下:

Speed Generalization Stable
Adam
SGD

相關文章