無痛理解梯度下降

理解梯度下降

梯度下降的公式相信大家都耳熟能詳:
θ=θλf(x;θ)θ \theta=\theta-\lambda \frac{\partial f(x;\theta)}{\partial \theta}
其中λ\lambda是步長,那爲什麼他有效呢?

Local linearity

在討論梯度下降之前,我們先討論一個更簡單的問題,我想知道4.36=?\sqrt{4.36}=?是多少?但現在我們只知道4=2\sqrt{4}=2,還有這個函數在4這個點的梯度,能不能就憑這兩個信息預測出4.36這個點的值是多少?爲什麼我們可以預測出來?其中的奧祕就是Local linearity, 看下圖:

在這裏插入圖片描述

對於任意的一個光滑的函數,如果我們取某個點,然後不停地放大他(如果你自己能畫圖,也可以自己試試),你會發現那條原本一條扭曲的曲線,在某個區域無限放大後居然變成了一條直線(跟紅色的線重合)。再看看導數的定義:
dydx=limΔx0f(x+Δx)f(x)Δx \frac{dy}{dx}=\lim_{\Delta x\to 0}\frac{f(x+\Delta x)-f(x)}{\Delta x}

它其實就是在算,在一個很小的長度dxdx下,f(x)大小的變化率,如果在局部是線性的,所以,想象一下,如果我們想要知道在4這個點加上0.36後的位置的變化,也就是4.36這個值(假設現在局部放大後就是線性的),於是我們可以用 f(x)0.36f'(x)*0.36來計算出f(x)f(x)增加的量,於是
f(4.36)f(4)+0.36f(4)=2+0.540.5=2.09 f(4.36)\approx f(4)+0.36*f'(4)=2+0.5*4^{-0.5}=2.09

我們拿計算器算一下,4.36=2.088061\sqrt{4.36}=2.088061,答案非常接近!事實上,我們知道其實導數也是一條曲線f(x)f'(x),而這條曲線也有Locally linearity的性質,所以,如果我們能夠用二階導數先預測出一階導數在加了0.36後的變化,然後再根據這個變化去預測原函數f的變化,那我們就能夠能加準確!

所以,我們先用二階導數預測一階導數在4.36的值是f(4.36)f(4)+0.36f(4)f'(4.36)\approx f'(4)+0.36*f''(4),現在我們出現了兩個導數,一個是f(4)f'(4),一個是f(4.36)f'(4.36),爲了更準確的地預測,我們可以將這個兩個導數取平均然後再去預測我們的最終值:

f(4.36)f(4)+0.36f(4)+f(4.36)2f(4)+0.36f(4)+f(4)+0.36f(4)2=f(4)+0.36f(4)+0.3622f(4)=2.087975 \begin{aligned} f(4.36) & \approx f(4)+0.36*\frac{f'(4)+f'( 4.36)}{2} \\ & \approx f(4)+0.36*\frac{f'(4)+f'( 4) +0.36*f''( 4)}{2}\\ & =f(4)+0.36*f'(4)+\frac{0.36^{2}}{2} f''( 4)\\ & =2.087975 \end{aligned}

有沒有很熟悉,這其實就是泰勒公式展開,我們可以無窮的寫下去,直到最後的導數真的變成一條直線。

λ\lambda函數f(x;θ)f(x;\theta)的變化

梯度下降

接來下再說說梯度下降就很簡單了,想要知道到底θ\theta到底是向前走一小步,還是向後走一小步會使得使得f(x;θ)f(x;\theta )減少。

而我們又知道,我們可以根據梯度去預測向前一小步的變化量,那就是λf(x;θ)θ\lambda *\frac{\partial f(x;\theta )}{\partial \theta }

如果f(x;θ)θ>0\frac{\partial f(x;\theta )}{\partial \theta } >0,意味着f(x;θ+Δθ)f(x;θ)>0f(x;\theta +\Delta \theta )-f(x;\theta ) >0,也就是θ\theta向前一小步f\displaystyle f的預測值是增大的,所以我們希望θ\theta向後一小步,因此θ=θλf(x;θ)θ\theta =\theta -\lambda \frac{\partial f(x;\theta )}{\partial \theta }

而如果f(x;θ)θ<0\frac{\partial f(x;\theta )}{\partial \theta } < 0,意味着f(x;θ+Δθ)f(x;θ)<0f(x;\theta +\Delta \theta )-f(x;\theta )< 0,向前一小步,f(x;θ)f(x;\theta )是變小的,所以我們希望他保持向前,也就是θ=θ+λf(x;θ)θ\displaystyle \theta =\theta +\lambda \frac{\partial f(x;\theta )}{\partial \theta }

咦,似乎跟原本的梯度下降公式有點不一樣?其實原本的梯度下降公式中的“負”號指的是負梯度,也就是,如果本來就是f(x;θ)θ<0\frac{\partial f(x;\theta )}{\partial \theta } < 0,那麼他就是一個負梯度,我們是不需要再加一個負變成正數的!爲了簡潔,我們就用負梯度表示梯度下降了!

θ=θλθf(x) \theta =\theta -\lambda \nabla _{\theta } f( x)

參考資料

local-linearization-intro

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