機器學習回顧篇(1) 梯度下降法

2021-10-24 21:05:13 字數 4163 閱讀 8202

最近打算開始寫一些關於機器學習方面的部落格,算是對以往接觸過的演算法的乙個總結,在考慮從哪個演算法開始。想了想還是從基礎演算法開始,例如本文要說的梯度下降。說梯度下降演算法是基礎中的基礎絕不為過,我們必須承認,機器學習中,很多演算法都與優化有關,梯度下降演算法算是最受歡迎的一類的優化演算法,線性回歸、邏輯回歸、svm、深度學習等等演算法都用到了梯度下降。

我們先來分析乙個下山問題:假設我們在一座山上,要做的是以最快的速度趕往乙個最低的那個山谷,但是我們不知道附近的地形,不知道路線,更不知道海拔最低的山谷在哪。要做到盡快,我們就只能走一步算一步,即每走一步時都選擇下降最多的那個方向走,換句話說就是往最陡的方向走,當走到乙個位置無論下一步往**邁,海拔都不會降低時,我們就認為我們已經到達了我們要去的山谷。

梯度下降演算法與這個下山問題求解思路是一樣的。

假設存在函式$f(x)$,影象如下圖所示,起始點是的初始值,希望找到函式$f(x)$的最小值點。

在下山問題中,我們人可以通過視覺或者其他外部感官上的觸覺來感知東南西北不同方向的坡度,然後選擇最陡的方向,但在函式求最小值問題中,計算機可沒有視覺等外部感官,那麼怎麼來判斷那個方向最陡呢?

還記得大學的時候學過(其實高中也學過)的導數知識嗎?導數定義如下:

$'(x)=\underset}\,\frac=\underset}\,\frac_}+\delta x)-f(_})}$

當然,定義不是關鍵,關鍵在於它的的幾何意義:函式$f(x)$在$x=_}$處的導數表示在這一點上的切線斜率,換句話說,函式$f(x)$在$_}$處的導數代表著$f(x)$在$x=_}$附近的變化率,也就是導數可以衡量$x$取值在$_}$附近時$f(x)$隨$x$變化的快慢。$\left| '(x) \right|$越大,$f(x)$隨x變化得越快,函式在影象上表現得越陡峭。

導數解決了一元函式中函式值隨自變數變化快慢的問題,但對於多元函式例如上面3為影象所表示的函式,導數就力有未逮了,這時候我們需要用到偏導的知識:

$\frac_}}f(_},_},\ldots ,_})=\underset}\,\frac=\underset}\,\frac_},\ldots ,xi+\delta x,\ldots ,_})-f(_},\ldots ,_},\ldots ,_})}$

導數與偏導數本質是一致的,但偏導可以衡量除$x$外其他自變數保持不變時,函式值隨xj所在維度變化快慢。分別對不同維度求偏導,我們就可以知道函式$f(_},_},\ldots ,_})$在不同維度(方向)變化快慢,從而綜合各個方向,獲取乙個最佳的方向收斂(下山)。

好了,我們現在可以回歸到梯度的問題了。什麼是梯度呢?函式在某一點的梯度是乙個向量,它的方向與取得最大方向導數的方向一致,而它的模為方向導數的最大值。

我們以一元線性回歸為例,假設模型為:

$y=f(x)=_}+_}\cdot x$

此時,$_}$和$_}$都是未知的,是需要去擬合的引數。當我們初步確定了$_}$、$_}$的值之後,我們需要定義乙個損失函式這對$_}$和$_}$與的擬合程度進行衡量,一般用**值與真實值之間的誤差平方和來作為損失函式:

$j(_},_})=\frac\sum\limits_^_}+_}\cdot _}-_})}^}}$

注意,在這個損失函式中,$_}$和$_}$都是已知的值,$_}$和$_}$才是變數。如果你足夠細心的話,你會發現上面的函式表示式中,多了乙個$\frac$,這個$\frac$對損失函式$j(_},_})$在何處取得最小值並無影響,只是為了後續求導方便而新增的,千萬不要糾結這個。作為損失函式,我們要做的就是求出$_}$、$_}$具體值使$j(_},_})$最小。這就可以用上梯度的知識了,$j(_},_})$中有兩個位置引數,所以,我們需要使用偏導。

然後分別對$_}$、$_}$求偏導:

$\frac_},_})}_}}=2\cdot \frac\sum\limits_^_}+_}\cdot _}-_})=}\frac\sum\limits_^_})-_})}$

$\frac_},_})}_}}=2\cdot \frac\sum\limits_^_}(_}+_}\cdot _}-_}))=}\frac\sum\limits_^_}\cdot (f(_})-_})})$

至此,等號右邊就沒有了未知引數,就是說可以通過計算獲取偏導。另外還記得上面說的$\frac$嗎,這不就被約去了嗎?

上面的函式只有兩個引數,我們繼續擴充套件到$n$個引數的情況,這時候該怎麼求偏導(梯度)呢?

此時函式表示式為:

$f(_},_},\ldots ,_})=_}+_}\cdot _}+_}\cdot _}+\ldots +_}\cdot _}$

損失函式為:

$j(_},_},\ldots ,_})=\frac\cdot \sum\limits_^_})-_})}^}}=\frac\cdot \sum\limits_^_}+_}\cdot _}+_}\cdot _}+\ldots +_}\cdot _}-_})}^}}$

求偏導:

$\begin

& \frac_},_},\ldots ,_})}_}}=\frac_}}\frac\sum\limits_^_}+_}\cdot _}+_}\cdot _}+\ldots +_}\cdot _}-_})}^}} \\

& =\frac\sum\limits_^_}+_}\cdot _}+_}\cdot _}+\ldots +_}\cdot _}-_})\cdot }\frac_}}(_}+_}\cdot _}+_}\cdot _}+\ldots +_}\cdot _}-_}) \\

\end$

在$_}+_}\cdot _}+_}\cdot _}+\ldots +_}\cdot _}-_}$中,只有$_}\cdot _}$這一項是未知引數,所以對$_}+_}\cdot _}+_}\cdot _}+\ldots +_}\cdot _}-_}$求導時,只會留下$_}$,所以上式可以化簡為:

$\begin

& \frac_},_},\ldots ,_})}_}}=\frac\sum\limits_^_}+_}\cdot _}+_}\cdot _}+\ldots +_}\cdot _}-_})\cdot } \\

& =\frac\sum\limits_^_})-_})\cdot } \\

\end$

這就是更一般化的求偏導公式。

知道怎麼求偏導,我們就可以獲得在不同位置下的梯度,進一步的,就可以進行梯度更新,還是先以上面說過的一元線性回歸為例,假設本次引數初始取值為$_}$、$_}$,下一次引數取值$'}}_}$和$'}}_}$:

$'}}_}\text_}\text\beta \frac_},_})}_}}\text_}-\frac\sum\limits_^_})-_})}$

$'}}_}\text_}\text\beta \frac_},_})}_}}\text_}-\frac\sum\limits_^_}(f(_})-_}))}$

然後通過上面的兩個公式不斷迭代更新引數$_}$和$_}$,直到梯度不在下降,即偏導數為0。用上面的下山問題來說,就是每走一步都計算一下最陡的方向,然後朝這個方向邁一步,然後又計算哪個方向最陡,繼續朝這個方向邁步……直到走到乙個地方無論朝哪個方向走,海拔都不會降低,那麼就認為到了最低的山谷。

那麼,上面兩個式子中的$\beta$是什麼呢?在梯度下降演算法中,這個$\beta$被稱為學習率,用於控制下降的速度。還是用下山問題來解釋,偏導可以告訴我們,哪個方向最陡,而且偏導的大小就意味著朝這個方向邁一步可以走多遠,如果你覺得這一步的的距離滿足不了你,那麼你可以讓b大於1,偏導乘以這個$\beta$,那麼你一步可以走的更遠;如果你覺得下山步子太大危險,你可以讓$\beta$處於0和1之間,然後偏導乘以$\beta$,這樣一步邁出距離就會小一些。

是不是$\beta$越大越好呢?不是,有句話怎麼說來著,步子大了容易扯著蛋,本來一步正常是走1公尺,你非要一步走1千公尺,就可能直接從這座山跨到領一座山,直接躍過了山谷,還怎麼找山谷。

是不是$\beta$越小越好呢?也不是,$\beta$太小的話,下山太慢,正常一步1公尺,你非要一步1公釐,幾十年也下不了山,另外,如果半山腰處有個小坑窪,如果踩了進去,由於步子太小,無論朝哪個方向邁步,都是上坡,就會以為到了山谷,在函式優化問題上,這就是陷入區域性最優。

所以,$\beta$的大小還是要視情況而定。

$'}}_}\text_}\text\beta \frac_},_})}_}}\text_}-\frac\sum\limits_^_}(f(_})-_}))}$

本文介紹了梯度下降演算法,精髓盡囊括其中。希望對各位讀者有所幫助。

機器學習(三) 梯度下降法

本部落格大部分參考了這篇博文 在微積分裡面,對多元函式的引數求 偏導數,把求得的各個引數的偏導數以向量的形式寫出來,就是梯度。比如函式f x,y 分別對x,y求偏導數,求得的梯度向量就是 f x f y 簡稱gr adf x,y 或者 f x,y 如果是3個引數的向量梯度,就是 f x f y,f ...

機器學習(二) 梯度下降法

前言 在上篇博文機器學習 一 中,最後我們提到,通過計算代價函式j 是否收斂於最小值來確定假設函式的引數 進而訓練出機器學習中的線性回歸演算法,那麼如何來找到使得j 最小話的引數 呢,本篇博文將介紹一種常用的方法,梯度下降法來確定引數 值。一 對於單特徵線性回歸,梯度下降法的演算法如下 repeat...

機器學習一(梯度下降法)

最近偶觸python,感ctrl c和ctrl v無比順暢,故越發膨脹。怒拾起python資料分析一pdf讀之,不到百頁,內心惶恐,嘆 臥槽,這都tm是啥,甚是迷茫。遂感基礎知識薄弱,隨意搜了機器學習教程,小看一翻。此文給出課件中幾個演算法,自己都不知道對不對,感覺還可以吧。本文以線性回歸為例,在給...