李巨集毅機器學習課程筆記-3.梯度下降精講

臭鹹魚發表於2020-12-27

梯度下降虛擬碼

梯度下降可以優化損失函式的值,使其儘量小,即可找到最好(在資料集上擬合效果最好)的模型引數。

現在假設模型\(f\)中只有一個引數\(w\),則損失函式為\(L(f)=L(w)\),梯度下降演算法如下(若模型有多個引數,按相同方法更新各引數)

  1. 初始化引數

    隨機選取一個\(w^0\)\(w^0\)並不一定是隨機選取),令\(w=w^0\)

  2. 計算梯度

    \(\frac{dL(f)}{dw}|_{w=w^0}\)

    如果小於0,此時\(w\)增大則\(L(f)\)會減小;如果大於0,此時\(w\)減小則\(L(w)\)會減小。

    如果模型有多個引數,則計算損失函式在各個引數方向上的偏導數。

  3. 更新模型引數

    \(w^1=w^0-lr\frac{dL(f)}{dw}|_{w=w^0}\)

    \(w\)的變化量取決於梯度和學習率(Learning Rate)的大小:梯度絕對值或學習率越大,則\(w\)變化量越大。

    如果模型有多個引數,則用上一步計算出的偏導數對應更新各引數。

  4. 重複第2步和第3步

    經過多次引數更新/迭代(iteration),可以使損失函式的值達到區域性最小(即區域性最優,Local Optimal),但不一定是全域性最優。

自適應學習率(Adaptive Learning Rate)

梯度下降過程中,固定學習率並不合理。學習率太大,可能導致loss不減小反而增大;學習率太小,loss會減小得很慢。

基本原則是隨著引數迭代更新,學習率應該越來越小,比如\(\eta^{t}=\frac{\eta}{\sqrt{t+1}}\)

更好的方法:每個引數有各自的學習率,比如Adagrad。

Adagrad

Adaptive Gradient Descent,自適應梯度下降。2011年提出,核心是每個引數(parameter)有不同的學習率

定義

每次迭代中,學習率要除以它對應引數的之前梯度的均方根(RMS) 。

\(w^{t+1}=w^t-\frac{\eta}{\sqrt{\sum_{i=0}^t(g^i)^2}}g^t\),其中\(t\)是迭代次數,\(w\)是引數,\(g\)是梯度,\(\eta\)是初始學習率。

隨著引數迭代,\(t\)越來越大,\(\sqrt{\sum_{i=0}^t(g^i)^2}\)也越來越大,因此學習率的變化趨勢是越來越小。

Adagrad的矛盾(Contradiction)

一般的梯度下降方法\(w^{t+1}=w^t-\eta^tg^t\)中,\(\eta^t\)是常量,梯度越大時,則引數更新的步幅越大,這是由\(g^t\)項決定的。

在Adagrad中,\(\eta\)是常量,梯度\(g^t\)越大時會使得引數更新的步幅越大,但\(\sqrt{\sum_{i=0}^t(g^i)^2}\)越大會使得引數更新的步幅越小,這是一個矛盾嗎?

為什麼要除以之前梯度的均方根?

  • 一種直觀的解釋:增強引數更新步幅變化的慣性

    與之前梯度相比如果現在的梯度更大,則現在梯度除以之前梯度會使引數更新的步幅更大;如果現在的梯度更小,則會使步幅更新的步幅更小。

    這樣就相當於增強了引數更新步幅變化的慣性,即如果引數更新的步幅突然變大或變小,就擴大這個趨勢。

  • 同時考慮一次梯度和二次梯度

    在Adagrad中,之前梯度的均方根是用來通過一次梯度估計二次梯度(雖然可以直接使用二次梯度,但其很難計算)。

    • 只考慮一個引數

      當引數只有一個或只考慮一個引數時,梯度越大,離最優點就越遠,引數更新的步幅應該越大。

    • 考慮多個引數

      當引數有多個或者考慮多個引數時,上述內容不一定成立。如果引數1的梯度比引數2的梯度大,但如果損失函式關於引數1的曲線比關於引數2的曲線更陡峭(即二次梯度更大),那引數1離最優點的距離可能比引數2更近。

      所以當引數有多個或者考慮多個引數時,我們既要考慮一次梯度又要考慮二次梯度。

      結論是一次梯度越大、二次梯度越小,離最優點就越遠,引數更新的步幅應該越大。

SGD

Stochastic Gradient Descent,隨機梯度下降,1847年提出,可以讓訓練過程更快。

普通梯度下降中需要計算所有樣本的Loss,而SGD只計算一個樣本的Loss,然後進行梯度下降。

梯度下降的數學理論

建議直接看李宏毅老師的本節視訊,從42分27秒開始看,老師講得很好。

  1. 初始化一組引數後,我們找到鄰域中另一個使損失函式值最小的一組引數並更新引數(然後不斷重複這一步驟)。
  2. 在極小的鄰域中,可以利用泰勒級數將損失函式簡化,然後求其最小值,損失函式簡化後,要使其最小即是讓其中兩個向量的內積最小,由此可以得出新的一組引數的值(具體過程略),這就是梯度下降。
  3. 學習率的作用是限制鄰域大小,學習率太大可能使鄰域太大,導致損失函式展開成泰勒級數時的誤差較大。
  4. 當然也可以將損失函式展開成2次(比如牛頓迭代法),但這並不實用,因為要計算二次微分,甚至可能要求出海森矩陣(Hessian Matrix)逆矩陣等等,這些在做深度學習時是不實用的。

梯度下降的侷限性

梯度下降過程中,每次引數更新不一定都會使損失函式的值更小。

求出的只是區域性最小值(Local Minima)甚至是鞍點(Saddle Point),不一定是全域性最優解。


Github(github.com):@chouxianyu

Github Pages(github.io):@臭鹹魚

知乎(zhihu.com):@臭鹹魚

部落格園(cnblogs.com):@臭鹹魚

B站(bilibili.com):@絕版臭鹹魚

微信公眾號:@臭鹹魚的快樂生活

轉載請註明出處,歡迎討論和交流!


相關文章