為什麼局部下降最快的方向就是梯度的負方向?

個人網站:紅色石頭的機器學習之路

CSDN博客:紅色石頭的專欄

知乎:紅色石頭

微博:RedstoneWill的微博

GitHub:RedstoneWill的GitHub

微信公眾號:AI有道(ID:redstonewill)

1. 什麼是梯度?

對於梯度下降演算法(Gradient Descent Algorithm),我們都已經很熟悉了。無論是在線性回歸(Linear Regression)、邏輯回歸(Logistic Regression)還是神經網路(Neural Network)等等,都會用到梯度下降演算法。我們先來看一下梯度下降演算法的直觀解釋:

假設我們位於黃山的某個山腰處,山勢連綿不絕,不知道怎麼下山。於是決定走一步算一步,也就是每次沿著當前位置最陡峭最易下山的方向前進一小步,然後繼續沿下一個位置最陡方向前進一小步。這樣一步一步走下去,一直走到覺得我們已經到了山腳。這裡的下山最陡的方向就是梯度的負方向。

首先理解什麼是梯度?通俗來說,梯度就是表示某一函數在該點處的方嚮導數沿著該方向取得最大值,即函數在當前位置的導數。


abla=frac{df(	heta)}{d	heta}

上式中, 	heta 是自變數, f(	heta) 是關於 	heta 的函數, 	heta 表示梯度。

2. 梯度下降演算法

如果函數 f(	heta) 是凸函數,那麼就可以使用梯度下降演算法進行優化。梯度下降演算法的公式我們已經很熟悉了:

	heta=	heta_0-etacdot
abla f(	heta_0)

其中, 	heta_0 是自變數參數,即下山位置坐標, eta 是學習因子,即下山每次前進的一小步(步進長度), 	heta 是更新後的 	heta_0 ,即下山移動一小步之後的位置。

梯度下降演算法的公式非常簡單!但是」沿著梯度的反方向(坡度最陡)「是我們日常經驗得到的,其本質的原因到底是什麼呢?為什麼局部下降最快的方向就是梯度的負方向呢?也許很多朋友還不太清楚。沒關係,接下來我將以通俗的語言來詳細解釋梯度下降演算法公式的數學推導過程。

3. 一階泰勒展開式

這裡需要一點數學基礎,對泰勒展開式有些了解。簡單地來說,泰勒展開式利用的就是函數的局部線性近似這個概念。我們以一階泰勒展開式為例:

f(	heta)approx f(	heta_0)+(	heta-	heta_0)cdot
abla f(	heta_0)

不懂上面的公式?沒有關係。我用下面這張圖來解釋。

凸函數 f(	heta) 的某一小段 [	heta_0,	heta] 由上圖黑色曲線表示,可以利用線性近似的思想求出 f(	heta) 的值,如上圖紅色直線。該直線的斜率等於 f(	heta)	heta_0 處的導數。則根據直線方程,很容易得到 f(	heta) 的近似表達式為:

f(	heta)approx f(	heta_0)+(	heta-	heta_0)cdot
abla f(	heta_0)

這就是一階泰勒展開式的推導過程,主要利用的數學思想就是曲線函數的線性擬合近似。

4. 梯度下降數學原理

知道了一階泰勒展開式之後,接下來就是重點了!我們來看一下梯度下降演算法是如何推導的。

先寫出一階泰勒展開式的表達式:

f(	heta)approx f(	heta_0)+(	heta-	heta_0)cdot
abla f(	heta_0)

其中, 	heta-	heta_0 是微小矢量,它的大小就是我們之前講的步進長度 eta ,類比於下山過程中每次前進的一小步, eta 為標量,而 	heta-	heta_0 的單位向量用 v 表示。則 	heta-	heta_0 可表示為:

	heta-	heta_0=eta v

特別需要注意的是, 	heta-	heta_0 不能太大,因為太大的話,線性近似就不夠準確,一階泰勒近似也不成立了。替換之後, f(	heta) 的表達式為:

f(	heta)approx f(	heta_0)+eta vcdot
abla f(	heta_0)

重點來了,局部下降的目的是希望每次 	heta 更新,都能讓函數值 f(	heta) 變小。也就是說,上式中,我們希望 f(	heta)<f(	heta_0) 。則有:

f(	heta)-f(	heta_0)approxeta vcdot
abla f(	heta_0)<0

因為 eta 為標量,且一般設定為正值,所以可以忽略,不等式變成了:

vcdot
abla f(	heta_0)<0

上面這個不等式非常重要! v
abla f(	heta_0) 都是向量, 
abla f(	heta_0) 是當前位置的梯度方向, v 表示下一步前進的單位向量,是需要我們求解的,有了它,就能根據 	heta-	heta_0=eta v 確定 	heta 值了。

想要兩個向量的乘積小於零,我們先來看一下兩個向量乘積包含哪幾種情況:

AB 均為向量, alpha 為兩個向量之間的夾角。 AB 的乘積為:

Acdot B=||A||cdot||B||cdot cos(alpha)

||A||||B|| 均為標量,在 ||A||||B|| 確定的情況下,只要 cos(alpha)=-1 ,即 AB 完全反向,就能讓 AB 的向量乘積最小(負最大值)。

顧名思義,當 v
abla f(	heta_0) 互為反向,即 v 為當前梯度方向的負方向的時候,能讓 vcdot
abla f(	heta_0) 最大程度地小,也就保證了 v 的方向是局部下降最快的方向。

知道 v
abla f(	heta_0) 的反方向後,可直接得到:

v=-frac{
abla f(	heta_0)}{||
abla f(	heta_0)||}

之所以要除以 
abla f(	heta_0) 的模 ||
abla f(	heta_0)|| ,是因為 v 是單位向量。

求出最優解 v 之後,帶入到 	heta-	heta_0=eta v 中,得:

	heta=	heta_0-etafrac{
abla f(	heta_0)}{||
abla f(	heta_0)||}

一般地,因為 ||
abla f(	heta_0)|| 是標量,可以併入到步進因子 eta 中,即簡化為:

	heta=	heta_0-eta
abla f(	heta_0)

這樣,我們就推導得到了梯度下降演算法中 	heta 的更新表達式。

5. 總結

我們通過一階泰勒展開式,利用線性近似和向量相乘最小化的思想搞懂了梯度下降演算法的數學原理。也許你之前很熟悉梯度下降演算法,但也許對它的推導過程並不清楚。看了本文,你是否有所收穫呢?

更多機器學習資源,請關注公眾號:AI有道(ID:redstonewill)


推薦閱讀:

人工智慧對網路安全的意義(和誤解)
台大林軒田機器學習課第卅二講筆記:結束曲
自然語言分析加關係網路 - 半自動分析倚天屠龍記
Tensorflow入門教程(10)
10分鐘圖解論文直覺(開題)

TAG:機器學習 | 梯度下降 | 數學 |