什麼是梯度?
對於梯度下降演算法(Gradient Descent Algorithm),我們都已經很熟悉了。無論是線上性迴歸(Linear Regression)、邏輯迴歸(Logistic Regression)還是神經網路(Neural Network)等等,都會用到梯度下降演算法。我們先來看一下梯度下降演算法的直觀解釋:
假設我們位於黃山的某個山腰處,山勢連綿不絕,不知道怎麼下山。於是決定走一步算一步,也就是每次沿著當前位置最陡峭最易下山的方向前進一小步,然後繼續沿下一個位置最陡方向前進一小步。這樣一步一步走下去,一直走到覺得我們已經到了山腳。這裡的下山最陡的方向就是梯度的負方向。
首先理解什麼是梯度?通俗來說,梯度就是表示某一函式在該點處的方向導數沿著該方向取得最大值,即函式在當前位置的導數。
\nabla=\frac{df(\theta)}{d\theta}
上式中,\theta是自變數,f(\theta)是關於\theta的函式,\theta表示梯度。
梯度下降演算法
如果函式f(\theta)是凸函式,那麼就可以使用梯度下降演算法進行最佳化。梯度下降演算法的公式我們已經很熟悉了:
\theta=\theta_0-\eta\cdot\nabla f(\theta_0)
其中,\theta_0是自變數引數,即下山位置座標,\eta是學習因子,即下山每次前進的一小步(步進長度),\theta是更新後的\theta_0,即下山移動一小步之後的位置。
梯度下降演算法的公式非常簡單!但是”沿著梯度的反方向(坡度最陡)“是我們日常經驗得到的,其本質的原因到底是什麼呢?為什麼區域性下降最快的方向就是梯度的負方向呢?也許很多朋友還不太清楚。沒關係,接下來我將以通俗的語言來詳細解釋梯度下降演算法公式的數學推導過程。
一階泰勒展開式
這裡需要一點數學基礎,對泰勒展開式有些瞭解。簡單地來說,泰勒展開式利用的就是函式的區域性線性近似這個概念。我們以一階泰勒展開式為例:
f(\theta)\approx f(\theta_0)+(\theta-\theta_0)\cdot\nabla f(\theta_0)
不懂上面的公式?沒有關係。我用下面這張圖來解釋。
凸函式f(\theta)的某一小段[\theta_0,\theta]由上圖黑色曲線表示,可以利用線性近似的思想求出f(\theta)的值,如上圖紅色直線。該直線的斜率等於f(\theta)在\theta_0處的導數。則根據直線方程,很容易得到f(\theta)的近似表示式為:
f(\theta)\approx f(\theta_0)+(\theta-\theta_0)\cdot\nabla f(\theta_0)
這就是一階泰勒展開式的推導過程,主要利用的數學思想就是曲線函式的線性擬合近似。
梯度下降數學原理
知道了一階泰勒展開式之後,接下來就是重點了!我們來看一下梯度下降演算法是如何推導的。
先寫出一階泰勒展開式的表示式:
f(\theta)\approx f(\theta_0)+(\theta-\theta_0)\cdot\nabla f(\theta_0)
其中,\theta-\theta_0是微小向量,它的大小就是我們之前講的步進長度\eta,類比於下山過程中每次前進的一小步,\eta為標量,而\theta-\theta_0的單位向量用v表示。則\theta-\theta_0可表示為:
\theta-\theta_0=\eta v
特別需要注意的是,\theta-\theta_0不能太大,因為太大的話,線性近似就不夠準確,一階泰勒近似也不成立了。替換之後,f(\theta)的表示式為:
f(\theta)\approx f(\theta_0)+\eta v\cdot\nabla f(\theta_0)
重點來了,區域性下降的目的是希望每次\theta更新,都能讓函式值f(\theta)變小。也就是說,上式中,我們希望f(\theta)
f(\theta)-f(\theta_0)\approx\eta v\cdot\nabla f(\theta_0)<0
因為\eta為標量,且一般設定為正值,所以可以忽略,不等式變成了:
v\cdot\nabla f(\theta_0)<0
上面這個不等式非常重要!v和\nabla f(\theta_0)都是向量,\nabla f(\theta_0)是當前位置的梯度方向,v表示下一步前進的單位向量,是需要我們求解的,有了它,就能根據\theta-\theta_0=\eta v確定\theta值了。
想要兩個向量的乘積小於零,我們先來看一下兩個向量乘積包含哪幾種情況:
A和B均為向量,\alpha為兩個向量之間的夾角。A和B的乘積為:
A\cdot B=||A||\cdot||B||\cdot cos(\alpha)
||A||和||B||均為標量,在||A||和||B||確定的情況下,只要cos(\alpha)=-1,即A和B完全反向,就能讓A和B的向量乘積最小(負最大值)。
顧名思義,當v與\nabla f(\theta_0)互為反向,即v為當前梯度方向的負方向的時候,能讓v\cdot\nabla f(\theta_0)最大程度地小,也就保證了v的方向是區域性下降最快的方向。
知道v是\nabla f(\theta_0)的反方向後,可直接得到:
v=-\frac{\nabla f(\theta_0)}{||\nabla f(\theta_0)||}
之所以要除以\nabla f(\theta_0)的模||\nabla f(\theta_0)||,是因為v是單位向量。
求出最優解v之後,帶入到\theta-\theta_0=\eta v中,得:
\theta=\theta_0-\eta\frac{\nabla f(\theta_0)}{||\nabla f(\theta_0)||}
一般地,因為||\nabla f(\theta_0)||是標量,可以併入到步進因子\eta中,即簡化為:
\theta=\theta_0-\eta\nabla f(\theta_0)
這樣,我們就推導得到了梯度下降演算法中\theta的更新表示式。
總結
我們透過一階泰勒展開式,利用線性近似和向量相乘最小化的思想搞懂了梯度下降演算法的數學原理。也許你之前很熟悉梯度下降演算法,但也許對它的推導過程並不清楚。看了本文,你是否有所收穫呢?
更多機器學習資源,請關注公眾號:AI有道(ID:redstonewill)