1. 程式人生 > >李宏毅機器學習筆記2:Gradient Descent(附帶詳細的原理推導過程)

李宏毅機器學習筆記2:Gradient Descent(附帶詳細的原理推導過程)

s函數 太陽 猴子 網易 http 得到 結合 col ear

李宏毅老師的機器學習課程和吳恩達老師的機器學習課程都是都是ML和DL非常好的入門資料,在YouTube、網易雲課堂、B站都能觀看到相應的課程視頻,接下來這一系列的博客我都將記錄老師上課的筆記以及自己對這些知識內容的理解與補充。(本筆記配合李宏毅老師的視頻一起使用效果更佳!)

今天這篇文章的主要內容是第3課的筆記

ML Lecture 3: Gradient Descent

1.要真正理解梯度下降算法的原理需要一定的數學功底、比如微積分、泰勒展開式等等......本文將從一個下山的場景開始,先提出梯度下降算法的基本思想,進而從數學上解釋梯度下降算法的原理,

2.梯度下降的場景假設:梯度下降法的基本思想可以類比為一個下山的過程。假設這樣一個場景:一個人被困在山上,需要從山上下來(i.e. 找到山的最低點,也就是山谷)。但此時山上的濃霧很大,導致可視度很低。因此,下山的路徑就無法確定,他必須利用自己周圍的信息去找到下山的路徑。這個時候,他就可以利用梯度下降算法來幫助自己下山。具體來說就是,以他當前的所處的位置為基準,尋找這個位置最陡峭的地方,然後朝著山的高度下降的地方走,同理,如果我們的目標是上山,也就是爬到山頂,那麽此時應該是朝著最陡峭的方向往上走。然後每走一段距離,都反復采用同一個方法,最後就能成功的抵達山谷。

我們同時可以假設這座山最陡峭的地方是無法通過肉眼立馬觀察出來的,而是需要一個復雜的工具來測量,同時,這個人此時正好擁有測量出最陡峭方向的能力。所以,此人每走一段距離,都需要一段時間來測量所在位置最陡峭的方向,這是比較耗時的。那麽為了在太陽下山之前到達山底,就要盡可能的減少測量方向的次數。這是一個兩難的選擇,如果測量的頻繁,可以保證下山的方向是絕對正確的,但又非常耗時,如果測量的過少,又有偏離軌道的風險。所以需要找到一個合適的測量方向的頻率(即學習率),來確保下山的方向不錯誤,同時又不至於耗時太多!

3.梯度下降:梯度下降的基本過程就和下山的場景很類似。首先,我們有一個可微分的函數。這個函數就代表著一座山。我們的目標就是找到這個函數的最小值,也就是山底。根據之前的場景假設,最快的下山的方式就是找到當前位置最陡峭的方向,然後沿著此方向向下走,對應到函數中,就是找到給定點的梯度 ,然後朝著梯度相反的方向,就能讓函數值下降的最快!(那為什麽最陡峭的方向就是函數值下降最快的方向呢?這個問題就涉及到了梯度下降的原理,在後面將會詳細解釋

4.大致理解了梯度下降之後,接下來讓我們回到老師的PPT技術分享圖片技術分享圖片

看到這可能有些人有這樣的疑惑:為什麽梯度下降的公式中間是減號而不是加號呢?接下來通過一張圖片你就會理解了技術分享圖片

假設現在我們處在小猴子的問題,通過求導我們可以輕而易舉的畫出藍色的切線,切線的斜率即為梯度值,根據圖片可以知道,要是小猴子想達到最低點,就必須往W軸正方向移動,也就是增大W的值,而根據切線的方向可是知道該值為負,所以要想使W變大就必須使用負號,負負得正。

5.梯度下降的三個技巧

(1)Tuning your learning rates技術分享圖片

從圖中可以看出學習率對梯度下降的影響力還是比較大的。在用梯度下降時最好畫出loss隨更新參數次數的曲線(如圖),看一下前幾次更新參數時曲線的走法如何。

如何做到調整學習率呢?其中一個思路是:每幾個epoch之後就降低學習率(一開始離目標遠,所以學習率大些,後來離目標近,學習率就小些),並且不同的參數有不同的學習率。接下來就讓我們學習梯度下降中的一個方法Adagrad。技術分享圖片

這樣操作後,每組參數的learning rate 都不同。

舉個例子幫助大家更好的理解:技術分享圖片

通過Adagrad後,我們的參數變化或者梯度下降公式可改寫為:技術分享圖片

如何理解Adagrad的參數更新式子呢?(以一元二次函數為例)技術分享圖片

技術分享圖片技術分享圖片

(2)Stochastic Gradient Descent(SGD)

SGD讓訓練過程更快。普通GD是在看到所有樣本(訓練數據)之後,計算出損失L,再更新參數。而SGD是每看到一個樣本就計算出一個損失,然後就更新一次參數。

(3)Feature Scaling

如果不同參數的取值範圍大小不同,那麽loss函數等高線方向(負梯度方向,參數更新方向)不指向loss最低點。feature scaling讓不同參數的取值範圍是相同的區間,這樣loss函數等高線是一系列共圓心的正圓,更新參數更容易。 feature scaling的做法是,把input feature的每個維度都標準化(減去該維度特征的均值,除以該維度的標準差)。技術分享圖片技術分享圖片

6.高能預警:梯度下降算法的原理!(需要一定的數學功底,比如微積分、泰勒展開式)

(1)如下圖所示,整個平面表示一個損失函數,要求整個平面的最小值,可以把這個問題分解成隨機給定一點和一個很小的範圍,求出這個範圍內的最小值,然後在以這個最小值為中心點,結合給定的小範圍反復求解技術分享圖片

(2)如何求出一個指定很小範圍內的最小值呢?這就需要用到泰勒級數了。技術分享圖片

(3)當有兩個變量的時候,泰勒級數變為:

技術分享圖片

(4)將常量為字母替代,等式改寫為:技術分享圖片

(5)如下圖所示:因為要求最小值且s為常量,所以可以先忽略s的影響,所以損失函數的計算就變為了兩個向量之間的乘法,且其中向量(u,v)的方向和大小是已知的,當(theta1,theta2)與(u,v)反向的時候,兩個向量相乘的結果最小。又因為是在一個以(theta1,theta2)為圓心的小範圍內,所以可以在(theta1,theta2)之前乘上一個值,讓這個向量的長度正好等於這個小圓的半徑,這樣我們就求出了損失函數的最小值。

技術分享圖片技術分享圖片

(6)經過這個推導的過程,想必大家也都能明白為什麽在梯度下降中的學習率不能太大。因為,若要滿足梯度下降的表達式,就必須要滿足泰勒級數,而我們只取泰勒級數前兩項的條件是x必須非常接近x0,也就是說我們的那個紅色的圓的半徑必須足夠小,因為(theta1,theta2)*學習率=圓的半徑,既然圓的半徑必須要足夠小,所以推導除了學習率正比與圓的半徑,也要足夠小!


梯度下降面臨的主要挑戰和解決方法:

(1)局部最小值

到目前為止來說,梯度下降看起來是一個非常美好的童話。不過我要開始潑涼水了。還記得我之前說過,我們的損失函數是一個非常好的函數,這樣的損失函數並不真的存在?我們以神經網絡為例,神經網絡是復雜函數,具有大量非線性變換。由此得到的損失函數看起來不像一個很好的碗,只有一處最小值可以收斂。實際上,這種聖人般的損失函數稱為凸函數,而深度網絡的損失函數幾乎總是非凸的事實上,損失函數可能是這樣的技術分享圖片

上圖中有一個梯度為零的局部極小值。然而,我們知道那不是我們能達到的最低損失(全局最小值)。如果初始權重位於點A,那麽我們將收斂於局部極小值,一旦收斂於局部極小值,梯度下降無法逃離這一陷阱。梯度下降是由梯度驅動的,而梯度在任何極小值處都是零。局部極小值,顧名思義,是損失函數在局部達到最小值的點。而全局最小值,是損失函數整個定義域上可以達到的最小值。讓事情更糟的是,損失等值曲面可能更加復雜,實踐中可沒有我們考慮的三維等值曲面。實踐中的神經網絡可能有上億權重,相應地,損失函數有上億維度。在那樣的圖像上梯度為零的點不知道有多少。

(2)鞍點技術分享圖片

鞍點因形狀像馬鞍而得名。鞍點處,梯度在一個方向(X)上是極小值,在另一個方向上則是極大值。如果沿著X方向的等值曲面比較平,那麽梯度下降會沿著?方向來回振蕩,造成收斂於最小值的錯覺。

解決這兩個問題的主要方法是-隨機性 具體有以下三種方法:批量梯度下降、小批量梯度下降、隨機梯度下降(見上一篇博客) 參考:https://blog.csdn.net/weixin_42398658/article/details/84502215     https://blog.csdn.net/soulmeetliang/article/details/72830179
以上就是本節課所學和理解的知識點,歡迎大家指正!

李宏毅機器學習筆記2:Gradient Descent(附帶詳細的原理推導過程)