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

注:本系列全部博客將持續更新併發布在github上,您能夠經過github下載本系列全部文章筆記文件git

1 引言

最近打算開始寫一些關於機器學習方面的博客,算是對以往接觸過的算法的一個總結,在考慮從哪一個算法開始。想了想仍是從基礎算法開始,例如本文要說的梯度降低。說梯度降低算法是基礎中的基礎毫不爲過,咱們必須認可,機器學習中,不少算法都與優化有關,梯度降低算法算是最受歡迎的一類的優化算法,線性迴歸、邏輯迴歸、SVM、深度學習等等算法都用到了梯度降低。github

2 梯度

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

梯度降低算法與這個下山問題求解思路是同樣的。併發

假設存在函數$f(x)$,圖像以下圖所示,起始點是的初始值,但願找到函數$f(x)$的最小值點。機器學習

 

在下山問題中,咱們人能夠經過視覺或者其餘外部感官上的觸覺來感知東南西北不一樣方向的坡度,而後選擇最陡的方向,但在函數求最小值問題中,計算機可沒有視覺等外部感官,那麼怎麼來判斷那個方向最陡呢?函數

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

${f}'(x)=\underset{\Delta x\to 0}{\mathop{\lim }}\,\frac{\Delta y}{\Delta x}=\underset{\Delta x\to 0}{\mathop{\lim }}\,\frac{f({{x}_{0}}+\Delta x)-f({{x}_{0}})}{\Delta x}$優化

固然,定義不是關鍵,關鍵在於它的的幾何意義:函數$f(x)$在$x={{x}_{0}}$處的導數表示在這一點上的切線斜率,換句話說,函數$f(x)$在${{x}_{0}}$處的導數表明着$f(x)$在$x={{x}_{0}}$附近的變化率,也就是導數能夠衡量$x$取值在${{x}_{0}}$附近時$f(x)$隨$x$變化的快慢。$\left| {f}'(x) \right|$越大,$f(x)$隨x變化得越快,函數在圖像上表現得越陡峭。spa

導數解決了一元函數中函數值隨自變量變化快慢的問題,但對於多元函數例如上面3爲圖像所表示的函數,導數就力有未逮了,這時候咱們須要用到偏導的知識:blog

$\frac{\partial }{\partial {{x}_{i}}}f({{x}_{0}},{{x}_{1}},\ldots ,{{x}_{n}})=\underset{\Delta x\to 0}{\mathop{\lim }}\,\frac{\Delta y}{\Delta x}=\underset{\Delta x\to 0}{\mathop{\lim }}\,\frac{f({{x}_{0}},\ldots ,xi+\Delta x,\ldots ,{{x}_{n}})-f({{x}_{0}},\ldots ,{{x}_{i}},\ldots ,{{x}_{n}})}{\Delta x}$

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

好了,咱們如今能夠迴歸到梯度的問題了。什麼是梯度呢?函數在某一點的梯度是一個向量,它的方向與取得最大方向導數的方向一致,而它的模爲方向導數的最大值。

咱們以一元線性迴歸爲例,假設模型爲:

$y=f(x)={{\theta }_{0}}+{{\theta }_{1}}\cdot x$

此時,${{\theta }_{0}}$和${{\theta }_{1}}$都是未知的,是須要去擬合的參數。當咱們初步肯定了${{\theta }_{0}}$、${{\theta }_{1}}$的值以後,咱們須要定義一個損失函數這對${{\theta }_{0}}$和${{\theta }_{1}}$與的擬合程度進行衡量,通常用預測值與真實值之間的偏差平方和來做爲損失函數:
$J({{\theta }_{0}},{{\theta }_{1}})=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{({{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{i}}-{{y}_{i}})}^{2}}}$
注意,在這個損失函數中,${{x}_{i}}$和${{y}_{i}}$都是已知的值,${{\theta }_{0}}$和${{\theta }_{1}}$纔是變量。若是你足夠細心的話,你會發現上面的函數表達式中,多了一個$\frac{1}{2}$,這個$\frac{1}{2}$對損失函數$J({{\theta }_{0}},{{\theta }_{1}})$在何處取得最小值並沒有影響,只是爲了後續求導方便而添加的,千萬不要糾結這個。做爲損失函數,咱們要作的就是求出${{\theta }_{0}}$、${{\theta }_{1}}$具體值使$J({{\theta }_{0}},{{\theta }_{1}})$最小。這就能夠用上梯度的知識了,$J({{\theta }_{0}},{{\theta }_{1}})$中有兩個位置參數,因此,咱們須要使用偏導。
而後分別對${{\theta }_{0}}$、${{\theta }_{1}}$求偏導:
$\frac{\partial J({{\theta }_{0}},{{\theta }_{1}})}{\partial {{\theta }_{0}}}=2\cdot \frac{1}{2m}\sum\limits_{i=1}^{m}{({{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{i}}-{{y}_{i}})=}\frac{1}{m}\sum\limits_{i=1}^{m}{(f({{x}_{i}})-{{y}_{i}})}$
$\frac{\partial J({{\theta }_{0}},{{\theta }_{1}})}{\partial {{\theta }_{1}}}=2\cdot \frac{1}{2m}\sum\limits_{i=1}^{m}{({{x}_{i}}({{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{i}}-{{y}_{i}}))=}\frac{1}{m}\sum\limits_{i=1}^{m}{({{x}_{i}}\cdot (f({{x}_{i}})-{{y}_{i}})})$
至此,等號右邊就沒有了未知參數,就是說能夠經過計算獲取偏導。另外還記得上面說的$\frac{1}{2}$嗎,這不就被約去了嗎?
上面的函數只有兩個參數,咱們繼續擴展到$n$個參數的狀況,這時候該怎麼求偏導(梯度)呢?
此時函數表達式爲:
$f({{x}_{0}},{{x}_{1}},\ldots ,{{x}_{n}})={{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{1}}+{{\theta }_{2}}\cdot {{x}_{2}}+\ldots +{{\theta }_{n}}\cdot {{x}_{n}}$
損失函數爲:
$J({{x}_{0}},{{x}_{1}},\ldots ,{{x}_{n}})=\frac{1}{2m}\cdot \sum\limits_{i=1}^{m}{{{(f({{x}_{i}})-{{y}_{i}})}^{2}}}=\frac{1}{2m}\cdot \sum\limits_{i=1}^{m}{{{({{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{1}}+{{\theta }_{2}}\cdot {{x}_{2}}+\ldots +{{\theta }_{n}}\cdot {{x}_{n}}-{{y}_{i}})}^{2}}}$
求偏導:

$\begin{align}
  & \frac{\partial J({{\theta }_{0}},{{\theta }_{1}},\ldots ,{{\theta }_{n}})}{\partial {{\theta }_{k}}}=\frac{\partial }{\partial {{\theta }_{k}}}\frac{1}{2m}\sum\limits_{i=1}^{m}{{{({{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{1}}+{{\theta }_{2}}\cdot {{x}_{2}}+\ldots +{{\theta }_{n}}\cdot {{x}_{n}}-{{y}_{i}})}^{2}}} \\
 & =\frac{1}{2m}\sum\limits_{i=1}^{m}{2\cdot ({{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{1}}+{{\theta }_{2}}\cdot {{x}_{2}}+\ldots +{{\theta }_{n}}\cdot {{x}_{n}}-{{y}_{i}})\cdot }\frac{\partial }{\partial {{\theta }_{k}}}({{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{1}}+{{\theta }_{2}}\cdot {{x}_{2}}+\ldots +{{\theta }_{n}}\cdot {{x}_{n}}-{{y}_{i}}) \\
\end{align}$

在${{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{1}}+{{\theta }_{2}}\cdot {{x}_{2}}+\ldots +{{\theta }_{n}}\cdot {{x}_{n}}-{{y}_{i}}$中,只有${{\theta }_{k}}\cdot {{x}_{k}}$這一項是未知參數,因此對${{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{1}}+{{\theta }_{2}}\cdot {{x}_{2}}+\ldots +{{\theta }_{n}}\cdot {{x}_{n}}-{{y}_{i}}$求導時,只會留下${{\theta }_{k}}$,因此上式能夠化簡爲:

$\begin{align}
  & \frac{\partial J({{\theta }_{0}},{{\theta }_{1}},\ldots ,{{\theta }_{n}})}{\partial {{\theta }_{k}}}=\frac{1}{2m}\sum\limits_{i=1}^{m}{2\cdot ({{\theta }_{0}}+{{\theta }_{1}}\cdot {{x}_{1}}+{{\theta }_{2}}\cdot {{x}_{2}}+\ldots +{{\theta }_{n}}\cdot {{x}_{n}}-{{y}_{i}})\cdot }{x_k} \\
 & =\frac{1}{m}\sum\limits_{i=1}^{m}{(f({{x}_{i}})-{{y}_{i}})\cdot }{x_k} \\
\end{align}$

這就是更通常化的求偏導公式。

3 更新梯度

知道怎麼求偏導,咱們就能夠得到在不一樣位置下的梯度,進一步的,就能夠進行梯度更新,仍是先以上面說過的一元線性迴歸爲例,假設本次參數初始取值爲${{\theta }_{0}}$、${{\theta }_{1}}$,下一次參數取值${{{{\theta }'}}_{0}}$和${{{{\theta }'}}_{1}}$:

${{{{\theta }'}}_{0}}\text{=}{{\theta }_{0}}\text{-}\beta \frac{\partial J({{\theta }_{0}},{{\theta }_{1}})}{\partial {{\theta }_{0}}}\text{=}{{\theta }_{0}}-\frac{\beta }{m}\sum\limits_{i=1}^{m}{(f({{x}_{i}})-{{y}_{i}})}$

${{{{\theta }'}}_{1}}\text{=}{{\theta }_{1}}\text{-}\beta \frac{\partial J({{\theta }_{0}},{{\theta }_{1}})}{\partial {{\theta }_{1}}}\text{=}{{\theta }_{1}}-\frac{\beta }{m}\sum\limits_{i=1}^{m}{({{x}_{i}}(f({{x}_{i}})-{{y}_{i}}))}$

而後經過上面的兩個公式不斷迭代更新參數${{\theta }_{0}}$和${{\theta }_{1}}$,直到梯度不在降低,即偏導數爲0。用上面的下山問題來講,就是每走一步都計算一下最陡的方向,而後朝這個方向邁一步,而後又計算哪一個方向最陡,繼續朝這個方向邁步……直到走到一個地方不管朝哪一個方向走,海拔都不會下降,那麼就認爲到了最低的山谷。

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

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

是否是$\beta$越小越好呢?也不是,$\beta$過小的話,下山太慢,正常一步1米,你非要一步1毫米,幾十年也下不了山,另外,若是半山腰處有個小坑窪,若是踩了進去,因爲步子過小,不管朝哪一個方向邁步,都是上坡,就會覺得到了山谷,在函數優化問題上,這就是陷入局部最優。

因此,$\beta$的大小仍是要視狀況而定。

更通常化的,咱們將上述梯度更新公式應用到更多維的狀況。應用到多維上也是同樣的,只不過計算量更大,由於每一維度都要先求偏導,而後經過下面公式更新參數:

${{{{\theta }'}}_{k}}\text{=}{{\theta }_{k}}\text{-}\beta \frac{\partial J({{\theta }_{0}},{{\theta }_{1}})}{\partial {{\theta }_{k}}}\text{=}{{\theta }_{k}}-\frac{\beta }{m}\sum\limits_{i=1}^{m}{({{x}_{k}}(f({{x}_{i}})-{{y}_{i}}))}$

4總結

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

相關文章
相關標籤/搜索