梯度下降法(英語(yǔ):Gradient descent)是一個(gè)一階最優(yōu)化算法,通常也稱為最速下降法。 要使用梯度下降法找到一個(gè)函數(shù)的局部極小值,必須向函數(shù)上當(dāng)前點(diǎn)對(duì)應(yīng)梯度(或者是近似梯度)的反方向的規(guī)定步長(zhǎng)距離點(diǎn)進(jìn)行迭代搜索。如果相反地向梯度正方向迭代進(jìn)行搜索,則會(huì)接近函數(shù)的局部極大值點(diǎn);這個(gè)過(guò)程則被稱為梯度上升法。
以上是維基百科對(duì)梯度下降的解釋。
下面我們來(lái)一步一步的學(xué)習(xí)一遍:
什么是 梯度下降?
為了方便,我們準(zhǔn)備一些數(shù)據(jù),并通過(guò)Python繪制出圖像。
圖1:數(shù)據(jù)準(zhǔn)備和圖像
如圖1所示,我們準(zhǔn)備了一組數(shù)據(jù),x軸為體重(Weight)數(shù)據(jù),y軸是身高(Height)數(shù)據(jù),通過(guò)Python中 matplotlib 包,將數(shù)據(jù)圖像話。
此時(shí),圖像中的點(diǎn)似乎呈現(xiàn)出線性的關(guān)系。
問題來(lái)了,我們?cè)趺礃尤フ业阶钇ヅ涞闹本€關(guān)系式呢?
有的同學(xué)會(huì)直接上手 線性回歸。自然沒錯(cuò),但是今天的主角是 梯度下降。
那么,我們一起來(lái)用梯度下降的方式來(lái)解決這個(gè)問題吧!
既然上述圖像可以被看成是線性關(guān)系,我們就可以假設(shè)一個(gè)線性的函數(shù)關(guān)系式:h(x);
Predicted Height = Intercept + Slope * Weight
身高的預(yù)測(cè)值 = y軸截距 + 斜率 * 體重
找到最優(yōu)化線性關(guān)系的問題就轉(zhuǎn)化成了:找到最優(yōu)的 y軸截距 和 斜率的問題。
用數(shù)學(xué)的方法來(lái)表示如下:
圖2:數(shù)學(xué)公式
在數(shù)據(jù)中,真實(shí)存在的 y值 和 預(yù)測(cè)值 h是存在誤差的。這個(gè)誤差可以用殘留誤差(Residual Error)來(lái)表示。
圖3
圖4:殘留誤差(Residual Error)
在圖4中,數(shù)據(jù)點(diǎn)(紅球)的y值與直線給出的預(yù)測(cè)值之間的誤差顯示為藍(lán)色的虛線。
Sum of the Squared Residuals 殘值平方和;
損失函數(shù) Loss Function ~ J;
為什么損失函數(shù)里要用距離的平方而不是距離的絕對(duì)值?
大家有想過(guò)這個(gè)問題嗎?誤差是| 預(yù)測(cè)值_i - 實(shí)際值_i | ,那我取誤差絕對(duì)值的和的最小值不也可以稱為一個(gè)損失函數(shù)嘛。
千萬(wàn)不要以為這個(gè)平方是隨隨便便來(lái)的。背后是有道理的。
誤差 = 預(yù)測(cè)值_i - 實(shí)際值_i
這個(gè)誤差是符合一定概率分布的??催^(guò)我之前的文章介紹海量數(shù)據(jù)的中心極限定理的朋友,應(yīng)該知道這個(gè)誤差 可以被假定為:
平均值 u = 0,方差為σ 的正態(tài)分布。
圖5:正態(tài)分布
那么在已知正太分布的情況下,每一個(gè)數(shù)據(jù)點(diǎn)都會(huì)對(duì)應(yīng)一個(gè)誤差,而誤差出現(xiàn)的概率,準(zhǔn)確的說(shuō)是Likelihood是可以通過(guò) 正態(tài)分布的函數(shù)求得的。
圖6:likelihood(概率)
所有數(shù)據(jù)點(diǎn) 誤差概率相加
當(dāng)我們對(duì)上述函數(shù)取對(duì)數(shù)可得:
取對(duì)數(shù)
最大似然分析,不懂得看我之前的文章。我們要保證 L 最大,只要保證上式 右邊值最大。
式子右邊 第一項(xiàng)和第二項(xiàng)是定值,只要保證第三項(xiàng)最小就可以使 L最大。
由于 u = 0,只要sum((誤差值_i)^2) 最小就可以啦!
這就是為什么 損失函數(shù) J要采用平方的數(shù)學(xué)解釋啦!
圖7:給出y和x的定義
在Python中,我們首先給β0 和 β1賦值為0,當(dāng)然可以賦值成任何值。
圖8:梯度下降
為什么叫梯度下降?
在圖8中,如果我們將每一個(gè)β0 和 β1對(duì)應(yīng)的的 殘值平方和作圖表示出來(lái),就能發(fā)現(xiàn)局部最低點(diǎn),也就是殘值平方和最小的點(diǎn)。圖8是只考慮斜率的情況下。如果同時(shí)考慮β0 和 β1,則是三維圖像,如圖9.
圖9
介紹了這么多梯度下降,接著我們就進(jìn)入如何使用梯度下降 找到β0 和 β1吧!
小范圍的極小值點(diǎn),我們會(huì)想到 函數(shù)的一階導(dǎo)數(shù) = 0 對(duì)應(yīng)的 x 值。
圖10:一階導(dǎo)數(shù)
接下來(lái),我們要定義一個(gè)重要的概念 學(xué)習(xí)效率(Learning Rate): a:梯度下降對(duì)于 Learning Rate的選擇非常敏感。
圖11:梯度下降
當(dāng)我們?cè)诋?dāng)前的β0 和 β1下無(wú)法使得 損失函數(shù)對(duì)于β0 和 β1的偏微分為0。
損失函數(shù)對(duì)于β0 和 β1的偏微分可以理解成β0 和 β1 變化的梯度方向(如圖11)。那么,我們?cè)谶@個(gè)梯度下降的方向上給β0 和 β1做一個(gè)微小的移動(dòng)。
圖12
通過(guò)對(duì)β0 和 β1 最終找到是的損失函數(shù) J 最小的β0 和 β1。
圖13
先從β0 和 β1都為0開始,圖13中藍(lán)線。
我們運(yùn)行1000次,并且將直線的演變過(guò)程畫出來(lái):
為了有些同學(xué)想自己試試,我把代碼復(fù)制如下:
以上就是梯度下降的過(guò)程,以及如何通過(guò)python來(lái)實(shí)現(xiàn)梯度下降。
最后,我們可以得到我們想要的線性關(guān)系函數(shù)了。
y = 0.058 + 1 * x
希望大家喜歡我的文章。
“逃學(xué)博士”:理工科直男一枚,在冰天雪地的加拿大攻讀工程博士。閑暇之余分享點(diǎn)科學(xué)知識(shí)和學(xué)習(xí)干貨。
聯(lián)系客服