理解梯度下降
梯度下降的公式相信大家都耳熟能詳:
θ=θ−λ∂θ∂f(x;θ)
其中λ是步長,那爲什麼他有效呢?
Local linearity
在討論梯度下降之前,我們先討論一個更簡單的問題,我想知道4.36=?是多少?但現在我們只知道4=2,還有這個函數在4這個點的梯度,能不能就憑這兩個信息預測出4.36這個點的值是多少?爲什麼我們可以預測出來?其中的奧祕就是Local linearity, 看下圖:
對於任意的一個光滑的函數,如果我們取某個點,然後不停地放大他(如果你自己能畫圖,也可以自己試試),你會發現那條原本一條扭曲的曲線,在某個區域無限放大後居然變成了一條直線(跟紅色的線重合)。再看看導數的定義:
dxdy=Δx→0limΔxf(x+Δx)−f(x)
它其實就是在算,在一個很小的長度dx下,f(x)大小的變化率,如果在局部是線性的,所以,想象一下,如果我們想要知道在4這個點加上0.36後的位置的變化,也就是4.36這個值(假設現在局部放大後就是線性的),於是我們可以用 f′(x)∗0.36來計算出f(x)增加的量,於是
f(4.36)≈f(4)+0.36∗f′(4)=2+0.5∗4−0.5=2.09
我們拿計算器算一下,4.36=2.088061,答案非常接近!事實上,我們知道其實導數也是一條曲線f′(x),而這條曲線也有Locally linearity的性質,所以,如果我們能夠用二階導數先預測出一階導數在加了0.36後的變化,然後再根據這個變化去預測原函數f的變化,那我們就能夠能加準確!
所以,我們先用二階導數預測一階導數在4.36的值是f′(4.36)≈f′(4)+0.36∗f′′(4),現在我們出現了兩個導數,一個是f′(4),一個是f′(4.36),爲了更準確的地預測,我們可以將這個兩個導數取平均然後再去預測我們的最終值:
f(4.36)≈f(4)+0.36∗2f′(4)+f′(4.36)≈f(4)+0.36∗2f′(4)+f′(4)+0.36∗f′′(4)=f(4)+0.36∗f′(4)+20.362f′′(4)=2.087975
有沒有很熟悉,這其實就是泰勒公式展開,我們可以無窮的寫下去,直到最後的導數真的變成一條直線。
λ函數f(x;θ)的變化
梯度下降
接來下再說說梯度下降就很簡單了,想要知道到底θ到底是向前走一小步,還是向後走一小步會使得使得f(x;θ)減少。
而我們又知道,我們可以根據梯度去預測向前一小步的變化量,那就是λ∗∂θ∂f(x;θ)。
如果∂θ∂f(x;θ)>0,意味着f(x;θ+Δθ)−f(x;θ)>0,也就是θ向前一小步f的預測值是增大的,所以我們希望θ向後一小步,因此θ=θ−λ∂θ∂f(x;θ)。
而如果∂θ∂f(x;θ)<0,意味着f(x;θ+Δθ)−f(x;θ)<0,向前一小步,f(x;θ)是變小的,所以我們希望他保持向前,也就是θ=θ+λ∂θ∂f(x;θ)。
咦,似乎跟原本的梯度下降公式有點不一樣?其實原本的梯度下降公式中的“負”號指的是負梯度,也就是,如果本來就是∂θ∂f(x;θ)<0,那麼他就是一個負梯度,我們是不需要再加一個負變成正數的!爲了簡潔,我們就用負梯度表示梯度下降了!
θ=θ−λ∇θf(x)
參考資料
local-linearization-intro