李宏毅機器學習入門學習筆記(三)Gradient Descent

什麼是Gradient Descent(梯度下降法)?

在第二篇文章中有介紹到梯度下降法的做法,傳送門:機器學習入門系列02,Regression 迴歸:案例研究

Review: 梯度下降法

在迴歸問題的第三步中,需要解決下面的最優化問題:

(1)θ=arg maxθL(θ)\theta^∗= \underset{ \theta }{\operatorname{arg\ max}} L(\theta) \tag1

  • LL :lossfunction(損失函數)
  • θ\theta :parameters(參數)

這裏的parameters是複數,即 θ\theta 指代一堆參數,比如上篇說到的 wwbb

我們要找一組參數 θ\theta ,讓損失函數越小越好,這個問題可以用梯度下降法解決:

假設 θ\theta 有裏面有兩個參數 θ1,θ2\theta_1, \theta_2
隨機選取初始值

(2)θ0=[θ10θ20] \theta^0 = \begin{bmatrix} \theta_1^0 \\ \theta_2^0 \end{bmatrix} \tag2

這裏可能某個平臺不支持矩陣輸入,看下圖就好。

在這裏插入圖片描述

然後分別計算初始點處,兩個參數對 LL 的偏微分,然後 θ0\theta^0 減掉 η\eta 乘上偏微分的值,得到一組新的參數。同理反覆進行這樣的計算。黃色部分爲簡潔的寫法,L(θ)\triangledown L(\theta) 即爲梯度。

η\eta 叫做Learning rates(學習速率)

在這裏插入圖片描述

上圖舉例將梯度下降法的計算過程進行可視化。

Tip1:調整 learning rates(學習速率)

小心翼翼地調整 learning rate

舉例:

在這裏插入圖片描述

上圖左邊黑色爲損失函數的曲線,假設從左邊最高點開始,如果 learningratelearning rate 調整的剛剛好,比如紅色的線,就能順利找到最低點。如果 learningratelearning rate 調整的太小,比如藍色的線,就會走的太慢,雖然這種情況給足夠多的時間也可以找到最低點,實際情況可能會等不及出結果。如果 learningratelearning rate 調整的有點大,比如綠色的線,就會在上面震盪,走不下去,永遠無法到達最低點。還有可能非常大,比如黃色的線,直接就飛出去了,update參數的時候只會發現損失函數越更新越大。

雖然這樣的可視化可以很直觀觀察,但可視化也只是能在參數是一維或者二維的時候進行,更高維的情況已經無法可視化了。

解決方法就是上圖右邊的方案,將參數改變對損失函數的影響進行可視化。比如 learning rate 太小(藍色的線),損失函數下降的非常慢;learningratelearning rate 太大(綠色的線),損失函數下降很快,但馬上就卡住不下降了;learningratelearning rate 特別大(黃色的線),損失函數就飛出去了;紅色的就是差不多剛好,可以得到一個好的結果。

自適應 learning rate

舉一個簡單的思想:隨着次數的增加,通過一些因子來減少 learningratelearning rate

  • 通常剛開始,初始點會距離最低點比較遠,所以使用大一點的 learningratelearning rate
  • update好幾次參數之後呢,比較靠近最低點了,此時減少 learningratelearning rate
  • 比如 ηt=ηtt+1\eta^t =\frac{\eta^t}{\sqrt{t+1}}tt 是次數。隨着次數的增加,ηt\eta^t 減小

learningratelearning rate 不能是 one-size-fits-all ,不同的參數需要不同的 learningratelearning rate

Adagrad 算法

Adagrad 是什麼?

每個參數的學習率都把它除上之前微分的均方根。解釋:

普通的梯度下降爲:

(3)wt+1wtηtgtw^{t+1} \leftarrow w^t -η^tg^t \tag3
(4)ηt=ηtt+1\eta^t =\frac{\eta^t}{\sqrt{t+1}} \tag4

  • ww 是一個參數

Adagrad 可以做的更好:
(5)wt+1wtηtσgtw^{t+1} \leftarrow w^t -\frac{η^t}{\sigma}g^t \tag5
(6)gt=L(θt)wg^t =\frac{\partial L(\theta^t)}{\partial w} \tag6

  • σt\sigma^t :之前參數的所有微分的均方根,對於每個參數都是不一樣的。

Adagrad舉例

下圖是一個參數的更新過程

在這裏插入圖片描述

將 Adagrad 的式子進行化簡:
在這裏插入圖片描述

Adagrad 存在的矛盾?

在這裏插入圖片描述

在 Adagrad 中,當梯度越大的時候,步伐應該越大,但下面分母又導致當梯度越大的時候,步伐會越小。

下圖是一個直觀的解釋:

在這裏插入圖片描述

下面給一個正式的解釋:

在這裏插入圖片描述

比如初始點在 x0x_0,最低點爲 b2a−\frac{b}{2a},最佳的步伐就是 x0x0 到最低點之間的距離 x0+b2a\left | x_0+\frac{b}{2a} \right |,也可以寫成 2ax0+b2a\left | \frac{2ax_0+b}{2a} \right |。而剛好 2ax0+b|2ax_0+b| 就是方程絕對值在 x0x_0 這一點的微分。

這樣可以認爲如果算出來的微分越大,則距離最低點越遠。而且最好的步伐和微分的大小成正比。所以如果踏出去的步伐和微分成正比,它可能是比較好的。

結論1-1:梯度越大,就跟最低點的距離越遠。

這個結論在多個參數的時候就不一定成立了。

多參數下結論不一定成立

對比不同的參數

在這裏插入圖片描述

上圖左邊是兩個參數的損失函數,顏色代表損失函數的值。如果只考慮參數 w1w_1,就像圖中藍色的線,得到右邊上圖結果;如果只考慮參數 w2w_2,就像圖中綠色的線,得到右邊下圖的結果。確實對於 aabb,結論1-1是成立的,同理 ccbb 也成立。但是如果對比aacc,就不成立了,ccaa 大,但 cc 距離最低點是比較近的。

所以結論1-1是在沒有考慮跨參數對比的情況下,才能成立的。所以還不完善。

之前說到的最佳距離 2ax0+b2a\left | \frac{2ax_0+b}{2a} \right |,還有個分母 2a2a 。對function進行二次微分剛好可以得到:
(7)2yx2=2a\frac{\partial ^2y}{\partial x^2} = 2a \tag7
所以最好的步伐應該是:
\frac{一次微分}{二次微分}
即不止和一次微分成正比,還和二次微分成反比。最好的step應該考慮到二次微分:

在這裏插入圖片描述

Adagrad 進一步的解釋

再回到之前的 Adagrad

在這裏插入圖片描述

對於 i=0t(gi)2\sqrt{\sum_{i=0}^t(g^i)^2} 就是希望再儘可能不增加過多運算的情況下模擬二次微分。(如果計算二次微分,在實際情況中可能會增加很多的時間消耗)

Tip2:Stochastic Gradient Descent(隨機梯度下降法)

之前的梯度下降:

(8)L=n(y^n(b+wixin))2L=\sum_n(\hat y^n-(b+\sum w_ix_i^n))^2 \tag8
(9)θi=θi1ηL(θi1)\theta^i =\theta^{i-1}- \eta\triangledown L(\theta^{i-1}) \tag9

而Stochastic Gradient Descent(更快):

損失函數不需要處理訓練集所有的數據,選取一個例子 xnx^n

(10)L=(y^n(b+wixin))2L=(\hat y^n-(b+\sum w_ix_i^n))^2 \tag{10}
(11)θi=θi1ηLn(θi1)\theta^i =\theta^{i-1}- \eta\triangledown L^n(\theta^{i-1}) \tag{11}

此時不需要像之前那樣對所有的數據進行處理,只需要計算某一個例子的損失函數Ln,就可以趕緊update 梯度。

對比:

在這裏插入圖片描述

常規梯度下降法走一步要處理到所有二十個examples,但Stochastic 此時已經走了二十步(沒處理一個example就更新)

Tip3:Feature Scaling(特徵縮放)

比如有個function:

(12)y=b+w1x1+w2x2y=b+w_1x_1+w_2x_2 \tag{12}
兩個輸入的分佈的範圍很不一樣,建議把他們的範圍縮放,使得不同輸入的範圍是一樣的。

在這裏插入圖片描述

爲什麼要這樣做?

在這裏插入圖片描述

上圖左邊是 x1x_1 的scale比 x2x_2 要小很多,所以當 w1w_1w2w_2 做同樣的變化時,w1w_1yy 的變化影響是比較小的,x2x_2yy 的變化影響是比較大的。

座標系中是兩個參數的error surface(現在考慮左邊藍色),因爲 w1w_1yy 的變化影響比較小,所以 w1w_1 對損失函數的影響比較小,w1w_1 對損失函數有比較小的微分,所以 w1w_1 方向上是比較平滑的。同理 x2x_2yy 的影響比較大,所以 x2x_2 對損失函數的影響比較大,所以在 x2x_2 方向有比較尖的峽谷。

上圖右邊是兩個參數scaling比較接近,右邊的綠色圖就比較接近圓形。

對於左邊的情況,上面講過這種狹長的情形不過不用Adagrad的話是比較難處理的,兩個方向上需要不同的學習率,同一組學習率會搞不定它。而右邊情形更新參數就會變得比較容易。左邊的梯度下降並不是向着最低點方向走的,而是順着等高線切線法線方向走的。但綠色就可以向着圓心(最低點)走,這樣做參數更新也是比較有效率。

怎麼做 scaling?

方法非常多,這裏舉例一種常見的做法:

在這裏插入圖片描述

上圖每一列都是一個例子,裏面都有一組feature。

對每一個維度 ii(綠色框)都計算平均數,記做 mim_i;還要計算標準差,記做 σi\sigma _i

然後用第 rr 個例子中的第 ii 個輸入,減掉平均數 mim_i,然後除以標準差 σi\sigma _i,得到的結果是所有的維數都是 00,所有的方差都是 11

梯度下降的理論基礎

問題

當用梯度下降解決問題:

(1)θ=arg maxθL(θ)\theta^∗= \underset{ \theta }{\operatorname{arg\ max}} L(\theta) \tag1

每次更新參數 θ\theta,都得到一個新的 θ\theta,它都使得損失函數更小。即:

(13)L(θ0)>L(θ1)>L(θ2)>L(\theta^0) >L(\theta^1)>L(\theta^2)>···\tag{13}

上述結論正確嗎?

結論是不正確的。。。

數學理論

在這裏插入圖片描述

比如在 θ0\theta^0 處,可以在一個小範圍的圓圈內找到損失函數細小的 θ1\theta^1,不斷的這樣去尋找。

接下來就是如果在小圓圈內快速的找到最小值?

Taylor Series(泰勒展開式)

先介紹一下泰勒展開式

定義

h(x)h(x)x=x0x=x_0 點的某個領域內有無限階導數(即無限可微分,infinitely differentiable),那麼在此領域內有:

(14)h(x)=k=0hk(x0)k!(xx0)k=h(x0)+h(x0)(xx0)+h(x0)2!(xx0)2+ \begin{aligned} h(x) &= \sum_{k=0}^{\infty }\frac{h^k(x_0)}{k!}(x-x_0)^k \\ & =h(x_0)+{h}'(x_0)(x−x_0)+\frac{{h}''(x_0)}{2!}(x−x_0)^2+⋯ \tag{14} \end{aligned}

xx 很接近 x0x_0 時,有 h(x)h(x0)+h(x0)(xx0)h(x)≈h(x_0)+{h}'(x_0)(x−x_0)
式14 就是函數 h(x)h(x)x=x0x=x_0 點附近關於 xx 的冪函數展開式,也叫泰勒展開式。

舉例:

在這裏插入圖片描述

圖中3條藍色線是把前3項作圖,橙色線是 sin(x)sin(x)

多變量泰勒展開式

下面是兩個變量的泰勒展開式

在這裏插入圖片描述

利用泰勒展開式簡化

回到之前如何快速在圓圈內找到最小值。基於泰勒展開式,在 (a,b)(a,b) 點的紅色圓圈範圍內,可以將損失函數用泰勒展開式進行簡化:

在這裏插入圖片描述

將問題進而簡化爲下圖:

在這裏插入圖片描述

不考慮s的話,可以看出剩下的部分就是兩個向量(θ1,θ2)(\triangle \theta_1,\triangle \theta_2)(u,v)(u,v) 的內積,那怎樣讓它最小,就是和向量 (u,v)(u,v) 方向相反的向量

在這裏插入圖片描述

然後將u和v帶入。

在這裏插入圖片描述
(14)L(θ)s+u(θ1a)+v(θ2b)L(\theta)\approx s+u(\theta_1 - a)+v(\theta_2 - b) \tag{14}

發現最後的式子就是梯度下降的式子。但這裏用這種方法找到這個式子有個前提,泰勒展開式給的損失函數的估算值是要足夠精確的,而這需要紅色的圈圈足夠小(也就是學習率足夠小)來保證。所以理論上每次更新參數都想要損失函數減小的話,即保證式1-2 成立的話,就需要學習率足夠足夠小纔可以。

所以實際中,當更新參數的時候,如果學習率沒有設好,是有可能式1-2是不成立的,所以導致做梯度下降的時候,損失函數沒有越來越小。

式1-2只考慮了泰勒展開式的一次項,如果考慮到二次項(比如牛頓法),在實際中不是特別好,會涉及到二次微分等,多很多的運算,性價比不好。

梯度下降的限制

在這裏插入圖片描述

容易陷入局部極值
還有可能卡在不是極值,但微分值是0的地方
還有可能實際中只是當微分值小於某一個數值就停下來了,但這裏只是比較平緩,並不是極值點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章