[深度學習]爲什麼梯度反方向是函數值下降最快的方向?

1. 版本一用泰勒公式展開式解釋

1.1. 什麼是梯度?

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

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

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

=df(θ)dθ∇= \frac{df(θ)}{dθ}

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

1.2 梯度下降算法

如果函數f(θ)是凸函數,那麼就可以使用梯度下降算法進行優化。梯度下降算法的公式我們已經很熟悉了:
θ=θ0ηf(θ0)θ=θ_0−η⋅∇f(θ_0)
其中,θ0θ0是自變量參數,即下山位置座標,ηη是學習因子,即下山每次前進的一小步(步進長度),θθ是更新後的θ0θ0,即下山移動一小步之後的位置。

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

1.3 一階泰勒展開式

這裏需要一點數學基礎,對泰勒展開式有些瞭解。簡單地來說,泰勒展開式利用的就是函數的局部線性近似這個概念。我們以一階泰勒展開式爲例:
f(θ)f(θ0)+(θθ0)f(θ0)f(θ)≈f(θ0)+(θ−θ_0)⋅∇f(θ_0)

附上高數書上的泰勒展開式
在這裏插入圖片描述
不懂上面的公式?沒有關係。我用下面這張圖來解釋。
在這裏插入圖片描述
凸函數f(θ)f(θ)的某一小段[θ0,θ][θ_0,θ]由上圖黑色曲線表示,可以利用線性近似的思想求出f(θ)f(θ)的值,如上圖紅色直線。該直線的斜率等於f(θ)f(θ)θ0θ_0處的導數。則根據直線方程,很容易得到f(θ)f(θ)的近似表達式爲:

f(θ)f(θ0)+(θθ0)f(θ0)f(θ)≈f(θ_0)+(θ−θ_0)⋅∇f(θ_0)
這就是一階泰勒展開式的推導過程,主要利用的數學思想就是曲線函數的線性擬合近似。

1.4 梯度下降數學原理

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

先寫出一階泰勒展開式的表達式:
f(θ)f(θ0)+(θθ0)f(θ0)f(θ)≈f(θ_0)+(θ−θ_0)⋅∇f(θ_0)
其中,θθ0θ−θ_0是微小矢量,它的大小就是我們之前講的步進長度η,類比於下山過程中每次前進的一小步,η爲標量,而θθ0θ−θ_0的單位向量用vv表示。則θθ0θ−θ_0可表示爲
θθ0=ηvθ−θ_0=ηv

特別需要注意的是,θθ0θ−θ_0不能太大,因爲太大的話,線性近似就不夠準確,一階泰勒近似也不成立了。替換之後,f(θ)的表達式爲:
f(θ)f(θ0)+ηvf(θ0)f(θ)≈f(θ_0)+ηv⋅∇f(θ_0)
重點來了,局部下降的目的是希望每次θ更新,都能讓函數值f(θ)變小。也就是說,上式中,我們希望f(θ)<f(θ0)f(θ)<f(θ_0)。則有:

f(θ)f(θ0)ηvf(θ0)<0f(θ)−f(θ_0)≈ηv⋅∇f(θ_0)<0
因爲η爲標量,且一般設定爲正值,所以可以忽略,不等式變成了:
vf(θ0)<0v⋅∇f(θ_0)<0

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

想要兩個向量的乘積小於零,我們先來看一下兩個向量乘積包含哪幾種情況:
在這裏插入圖片描述
A和B均爲向量,α爲兩個向量之間的夾角。A和B的乘積爲:
AB=ABcos(α)A⋅B=||A||⋅||B||⋅cos(α)
||A||和||B||均爲標量,在||A||和||B||確定的情況下,只要cos(α)=−1,即AA和BB完全反向,就能讓A和B的向量乘積最小(負最大值)。
顧名思義,當v與f(θ0)∇f(θ_0)互爲反向,即v爲當前梯度方向的負方向的時候,能讓vf(θ0)v⋅∇f(θ_0)最大程度地小,也就保證了v的方向是局部下降最快的方向。

知道v是f(θ0)∇f(θ0)的反方向後,可直接得到:

v=f(θ0)f(θ0)v=\frac{−∇f(θ_0)}{||∇f(θ_0)||}

之所以要除以f(θ0)∇f(θ_0)的模f(θ0)||∇f(θ_0)||,是因爲v是單位向量。

求出最優解v之後,帶入到θθ0=ηvθ−θ_0=ηv中,得:

θ=θ0ηf(θ0)f(θ0)θ=θ_0−η\frac{∇f(θ_0)}{||∇f(θ_0)||}
一般地,因爲f(θ0)||∇f(θ_0)||是標量,可以併入到步進因子η中,即簡化爲:
θ=θ0ηf(θ0)θ=θ_0−η∇f(θ_0)

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

1.5總結

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

2.版本二用方向導數解釋

2.1 導數

導數的幾何意義可能很多人都比較熟悉: 當函數定義域和取值都在實數域中的時候,導數可以表示函數曲線上的切線斜率。 除了切線的斜率,導數還表示函數在該點的變化率
在這裏插入圖片描述將上面的公式轉化爲下面圖像爲:

在這裏插入圖片描述
(來自維基百科)

直白的來說,導數代表了在自變量變化趨於無窮小的時候,函數值的變化與自變量變化的比值代表了導數,幾何意義有該點的切線。物理意義有該時刻的(瞬時)變化率…

注意在一元函數中,只有一個自變量變動,也就是說只存在一個方向的變化率,這也就是爲什麼一元函數沒有偏導數的原因。

注意在一元函數中,只有一個自變量變動,也就是說只存在一個方向的變化率,這也就是爲什麼一元函數沒有偏導數的原因。

2.2. 偏導數

既然談到偏導數,那就至少涉及到兩個自變量,以兩個自變量爲例,z=f(x,y) . 從導數到偏導數,也就是從曲線來到了曲面. 曲線上的一點,其切線只有一條。但是曲面的一點,切線有無數條。

而我們所說的偏導數就是指的是多元函數沿座標軸的變化率.

Fx(x,y)F_x(x, y) 指的是函數在y方向不變,函數值沿着x軸方向的變化率

Fy(x,y)F_y(x, y)指的是函數在x方向不變,函數值沿着y軸方向的變化率

對應的圖像形象表達如下:

在這裏插入圖片描述
那麼偏導數對應的幾何意義是是什麼呢?

偏導數[fx(x0,y0)f_x(x_0, y_0)就是曲面被平面y=y0y=y_0所截得的曲面在點M0M_0處的切線M0TxM_0T_x對x軸的斜率
偏導數fy(x0,y0)f_y(x_0, y_0)就是曲面被平面y=x0y=x_0所截得的曲面在點M0M_0處的切線M0TyM_0T_y對y軸的斜率

可能到這裏,讀者就已經發現偏導數的侷限性了,原來我們學到的偏導數指的是多元函數沿座標軸的變化率,但是我們往往很多時候要考慮多元函數沿任意方向的變化率,那麼就引出了方向導數.

2.3 方向導數

終於引出我們的重頭戲了,方向導數,下面我們慢慢來走進它

假設你站在山坡上,相知道山坡的坡度(傾斜度)

山坡圖如下:

在這裏插入圖片描述

假設山坡表示爲z=f(x,y)z= f(x, y),你應該已經會做主要倆個方向的斜率.

y方向的斜率可以對y偏微分得到.

同樣的,x方向的斜率也可以對x偏微分得到

那麼我們可以使用這倆個偏微分來求出任何方向的斜率(類似於一個平面的所有向量可以用倆個基向量來表示一樣)

現在我們有這個需求,想求出u方向的斜率怎麼辦.假設z=f(x,y)z= f(x, y)爲一個曲面,,p(x0,y0)p(x_0, y_0)爲f定義域中一個點,單位向量u=cosθisinθju =\cos\theta i - \sin \theta j的斜率,其中θ\theta是此向量與x軸正向夾角.單位向量u可以表示對任何方向導數的方向.如下圖:

在這裏插入圖片描述

那麼我們來考慮如何求出u方向的斜率,可以類比於前面導數定義,得出如下

f(x,y)f(x, y)爲一個二元函數,u=cosθisinθju =\cos\theta i - \sin \theta j爲一個單位向量,如果下列的極限值存在
在這裏插入圖片描述

則稱這個極限值是 ff 沿着[公式 uu 的方向導數,那麼隨着θ\theta 的不同,我們可以求出任意方向的方向導數.這也表明了方向導數的用處,是爲了給我們考慮函數對任意方向的變化率.

在求方向導數的時候,除了用上面的定義法求之外,我們還可以用偏微分來簡化我們的計算.
表達式是:
在這裏插入圖片描述
(至於爲什麼成立,很多資料有,不是這裏討論的重點)

那麼一個平面上無數個方向,函數沿哪個方向變化率最大呢?

目前我不管梯度的事,我先把表達式寫出來:
在這裏插入圖片描述

那麼我們可以得到:
在這裏插入圖片描述

那麼此時如果Duf(x,y)D_u f(x, y)要取得最大值,也就是當aa爲0度的時候,也就是向量II(這個方向是一直在變,在尋找一個函數變化最快的方向)與向量AA(這個方向當點固定下來的時候,它就是固定的)平行的時候,方向導數最大.方向導數最大,也就是單位步伐,函數值朝這個反向變化最快.

好了,現在我們已經找到函數值下降最快的方向了,這個方向就是和AA向量相同的方向.那麼此時我把A向量命名爲梯度(當一個點確定後,梯度方向是確定的),也就是說明了爲什麼梯度方向是函數變化率最大的方向了!!!(因爲本來就是把這個函數變化最大的方向命名爲梯度)

我的理解是,本來梯度就不是橫空出世的,當我們有了這個需求(要求一個方向,此方向函數值變化最大),得到了一個方向,然後這個方向有了意義,我們給了它一個名稱,叫做梯度

另加兩張方向導數的圖
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章