數學基礎之梯度


本文是對網上學習資料的整理與記錄(主要來自CSDN,鏈接附在最后的參考資料部分),方便自己日后的復習鞏固,也分享熱愛知識的網友們。

對於機器學習中最重要的數學概念之一梯度的解讀,主要從《高等數學》和《微積分》中的定義與理解進行剖析,並增加了另一個角度泰勒級數,來解析為什么函數上的一點沿着梯度的方向具有最大的變化率,這是機器學習優化算法——梯度下降法的核心思想。

導數

導數,反映的是函數$y=f(x)$在某一點處沿$x$軸正方向的變化率。公式定義如下:

再強調一遍,導數$f’(x)$是函數$f(x)$在$x$軸上某一點處沿着$x$軸正方向的變化率 / 變化趨勢

直觀地看,也就是在$x$軸上某一點處,如果$f’(x) > 0$,說明$f(x)$的函數值在$x$點沿$x$軸正方向是趨於增加的;如果$f’(x) < 0$,說明$f(x)$的函數值在$x$點沿$x$軸正方向是趨於減少的。用圖說話,則

圖中的綠色曲線表示函數,,點P和點M是曲線上的兩點。藍色直線為函數曲線在P點的切線,點P橫坐標(自變量)為$x$,點M橫坐標為$x + \Delta x$,則圖中的$\Delta x, \Delta y, \mathrm{d}x, \mathrm{d}y$等符號的意義及關系如下:

  • $\Delta x$:$x$的變化量;
  • $\mathrm{d}x$:$x$的變化量$\Delta x$趨於$0$時,則記作微元$\mathrm{d}x$;
  • $\Delta y$:$\Delta y = f(x_0 + \Delta x) - f(x_0)$,是函數的增量;
  • $\mathrm{d}y$:$\mathrm{d}y = f’(x_0) \mathrm{d}x$,是切線的增量;

    當$\Delta x → 0$時,$\mathrm{d}y$與$\Delta y$都是無窮小,$\mathrm{d}y$是$\Delta y$的主部,即$\Delta y = \mathrm{d}y + o(\Delta x)$。

可見,導數是代表函數(曲線)的斜率,是描述函數(曲線)變化快慢的量。同時曲線的極大值點也可以使用導數來判斷,即極大值點的導數為$0$,此時斜率為零(但反過來一階導數為零的點不一定是極值點可能是駐點,這時需要根據二階導數判斷),那么導數就為我們求解函數的極值提供了可能,當然我們現在說的導數是一元導數即$f(x)$,只具有一個自變量$x$,因此很容易求導。

多元函數與偏導數

多元函數

大多數情況下,決定因變量的因素可能並非只有一個。以某個地區的房價為例,導致房價變動的因素可能包括面積,學區划分,地段,交通,城市規模等等。每個因素都可以作為自變量,自變量不為1個的函數叫做多元函數。在這種多因素的情況下,如果想知道哪個因素對房價變動的影響最大(所謂的影響最大就是這個因素能使房價函數的變化率最大),很顯然,可以用求導實現。那么針對多變量的情況,例如$f(x, y)$,就要引入偏導數的概念了。

偏導數

多元函數有多個自變量,每個自變量可以獨立自由變化,那么它的函數值的變化率該如何得到呢?這時候就可以采用學過的一個實驗方法——控制變量法

還是以房價為例,如果房價和面積,交通,學區三個因素有關,$area = f(x, y, z)$,$x$代表面積,$y$代表交通,$z$標識學區。

可考慮先把交通$y$和學區$z$固定,考慮面積$x$的微小變化對房價產生的影響,表示成:$\frac{\partial f(x, y, z)}{x}$。同理,分別再把面積$x$和交通$z$固定,以及面積$x$和學區$y$固定在某一個點,得到分別對於交通和學區的變化率:$\frac{\partial f(x, y, z)}{y}$ 和 $\frac{\partial f(x, y, z)}{z}$。

這種在多元函數中,將其他變量看做常數,按照求導法則,計算分別針對某個變量的導數,叫做偏導數。偏導數每次只使一個自變量發生變化,所以計算過程和計算一元函數的導數過程無異。其物理意義就是查看這一個變量在其他情況不變的情況下對函數的影響程度。

比如函數$f(x, y) = x^2 + y^2 + 2xy + 3y$,求偏導的結果為:$\frac{\partial f(x, y)}{x} = 2x + 2y$ 和 $\frac{\partial f(x, y)}{y} = 2y + 2x + 3$。

偏導數的公式定義如下:

不難看到,偏導數與導數本質是一致的,都是當自變量的變化量趨於0時,函數值的變化量與自變量變化量比值的極限。直觀地說,偏導數也就是函數在某一點上沿坐標軸正方向的的變化率。區別在於:

  • 導數,指的是一元函數中,函數$y = f(x)$在某一點處沿$x$軸正方向的變化率;
  • 偏導數,指的是多元函數中,函數$y = f(x_1, x_2, \dots , x_n)$在某一點處沿某一坐標軸$(x_1, x_2, \dots , x_n)$正方向的變化率。

方向導數

方向導數的公式定義:

在前面導數和偏導數的定義中,均是沿坐標軸正方向討論函數的變化率。那么當我們討論函數沿任意方向的變化率時,也就引出了方向導數的定義,即:函數上某一點在某一趨近方向上的導數值。

通俗的解釋是:我們不僅要知道函數在坐標軸正方向上的變化率(即偏導數),而且還要設法求得函數在其他特定方向上的變化率。而方向導數就是函數在其他特定方向上的變化率

梯度

梯度的數學概念

梯度的提出只為回答一個問題:函數在變量空間的某一點處,沿着哪一個方向有最大的變化率?

梯度給出的答案是:函數在某一點的梯度是這樣一個向量,它的方向與取得最大方向導數的方向一致,而它的模為最大方向導數的值

這里注意三點:

1)梯度是一個向量,即有方向有大小;

2)梯度的方向是最大方向導數的方向;

3)梯度的值是最大方向導數的值。

通俗地講,就是函數在該點處沿着該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。

梯度的公式定義:

以圓錐為例,圓錐的方程為:

其中$a$為變參,這里取$a = 2$。則針對曲面上每一個點$P(x,y)$,其梯度可以定義為

$\nabla f(x, y) = \left[\frac{\partial f(x, y)}{\partial x}, [\frac{\partial f(x, y)}{\partial y}\right] = \frac{\partial f(x, y)}{\partial x}\vec i + \frac{\partial f(x, y)}{\partial x}\vec j\quad(\vec i = (1, 0), \vec j = (0, 1))$

其中

同理

所以,在椎體的任意一點,梯度向量為$\frac{a^2x}{z} \vec i + \frac{a^2y}{z} \vec j$記作:

$grad f(x, y) = \left(\frac{a^2x}{z}, \frac{a^2y}{z}\right)$

特殊情況下,在$y = 0$截面和$x = 0$截面與圓交線上的點的梯度為$grad f(x, 0) = (a, 0)$ 和 $grad f(0, y) = (0, a)$

如下圖所示,由於梯度在另一個方向上的分量為$0$,所以梯度向量在坐標軸方向上達到最大,這和直覺是相符的。

直覺上,不論從圓錐上哪個點觸發,它的梯度的大小是一樣的(方向不一樣),我們可以驗證一下

所以

=

所以,圓錐上任意一點的梯度大小均為$a$,處處相等,包括上面計算得到的和坐標軸平面相交的兩條線。

這里,$\nabla = \frac{\partial}{\partial x} \vec i + \frac{\partial}{\partial y} \vec j$ 叫做二維空間向量梯度算子,$\nabla f = \frac{\partial f}{\partial x} \vec i + \frac{\partial f}{\partial y} \vec j$。

方向導數與梯度(幾何角度)

第3節已講過,所謂方向導數,就是指函數$f(x, y)$沿着直線$\ell$變化的速率,這條直線其實就是曲面上相對應的那條曲線在$xoy$平面的投影。完成投影的這個豎立的平面就稱為投影平面,那么,方向導數其實就是空間曲線沿着它自己在xoy平面的投影直線的變化率。正如$\mathrm{d}y / \mathrm{d}x$表示二維平面中一條曲線在某一點沿着$x$軸的變化速率(也就是切線的斜率)一樣。

所以,方向導數的公式可可轉換成

其中角$\theta$是直線$\ell$和$x$軸的夾角。那么,方向導數在$\ell$指向何方的時候取得最大值呢?

是方向$\ell$上的單位向量,則方向導數可以寫成:

其中$\varphi$角是投影直線$$\ell和梯度的夾角,不難得出,當$\varphi$角為$0$時,方向導數取得最大值,換句話說,當方向導數和梯度同向時,變化率最大。

方向導數的最大值即是梯度

等高線與梯度

對於三維空間曲面來說,等高線就是平行於$xoy$平面和曲面圖形交線在$xoy$平面的投影,例如,下面圖形顯示的馬鞍面的等高線,它的等高線每一組都是雙曲線。

當采用等高線的概念后,等高線和梯度有一個非常有趣的關系,實際上,等高線和梯度方向是互相垂直的,以三維曲面等高線為例,推導如下:

等高線方程為:

\left\{\begin{matrix} z=f(x,y)\\ z=c \end{matrix}\right.

則,該曲線在$xoy$平面上的投影是一條曲線,在$xoy$平面上該曲線的方程為:

f(x,y)=c

曲線上一點$P$的斜率,根據隱函數求導公式,兩邊對$x$求導:

\\ \frac{\partial f(x,y)}{\partial x}*1+\frac{\partial f(x,y)}{\partial y}*\frac{dy}{dx}=0\\ \frac{dy}{dx}=-\frac{\frac{\partial f(x,y)}{\partial x}}{\frac{\partial f(x,y)}{\partial y}}

而梯度向量定義為:

\dpi{120} \vec{graduf(x,y)}=\begin{bmatrix} \frac{\partial f(x,y)}{\partial x}, & \frac{\partial f(x,y)}{\partial y} \end{bmatrix}

梯度方向斜率為:

\\ Slop_{gradu}=\frac{\frac{\partial f(x,y)}{\partial y}}{\frac{\partial f(x,y)}{\partial x}}\\ Slop_{gradu}*\frac{dy}{dx}=-1

所以,梯度方向和等高線切線方向垂直。

泰勒級數與梯度

數學中,泰勒公式是一個用函數在某點的信息描述其附近取值的公式。如果函數足夠平滑的話,在已知函數在某一點的各階導數值的情況之下,泰勒公式可以用這些導數值做系數構建一個多項式來近似函數在這一點的鄰域中的值,即泰勒級數在某一鄰域內去無限接近該函數的一個公式。

這里引入泰勒級數的目的是為了證明極值點的導數問題,高階函數一般要使用到矩陣論的海森矩陣相關知識,這里不引入那么深的概念,但是基本的矩陣知識還是需要的。

我們只保留前三項:$f(x_k + \delta) \approx f(x_k) + f'(x_k)\delta + \frac{1}{2}f''(x_k)\delta^2$

之前提到了一階導數是極值點,現在解釋為什么會是這樣:上面的$\delta$是指很小的步長,當$\delta > 0$時說明$x$向右走,當$\delta < 0$時說明$x$向左走,學過高等數學極限的應該有這個概念。

現在我們通過泰勒級數只考慮上面公式的前兩項$f(x_k + \delta) \approx f(x_k) + f'(x_k)\delta$ 來解釋為什么極值點處的一階導數為$0$:

假如$x_k$這一點的函數值$f(X_k)$為極值點,可以是極小值或者極大值(這里以極大值點為例)。因為此時的f(x_k)為極大值,則無論$\delta > 0$還是$\delta < 0$,都有$f(x_k \pm \delta) < f(x_k)$,那么上面的公式想要成立,只能讓$f'(x_k) = 0$才能成立,極小值同理。

無需畫圖,從泰勒級數就可以說明極值點的一階導數一定為$0$,那么一階導數為零的點不一定是極值點怎么證明呢?使用三項即可證明一階導數為零不一定是極值點:$f(x_k + \delta) \approx f(x_k) + f'(x_k)\delta + \frac{1}{2}f''(x_k)\delta^2$ 中,如果$f'(x_k) = 0$,那么公式可寫成這樣:$f(x_k) + \delta \approx f(x_k) + \frac{1}{2}f''(x_k)\delta^2$。從上式可以看到如果在$f'(x_k) = 0$時假如$f(x_k)$為極大值,理應說無論$\delta > 0$還是$\delta < 0$,都有$f(x_k \pm \delta) < f(x_k)$。但是此時如果$f''(x_k) > 0$,則$f''(x_k)\delta^2 > 0$所以$f(x_k \pm \delta) > f(x_k)$,即證得$f(x_k)$不是極大值點,那如何才能判斷是極值點呢?

此時需要借助二階導數,上面如果$f''(x_k) < 0$,則$f(x_k)$為極大值點,所以才有一階導數等於零,二階導數小於零為極大值點,如果二階導數大於零則為極小值點。如果二階導數等於$0$怎么辦?那就繼續判斷三階導數就可以了。

這是在標量的情況下的極值問題,如果$x$是向量怎么處理呢?還是引入泰勒公式就可以了。只是不一樣的是都是向量了。

我們知道機器學習中的變量都很多,一般都使用向量進行表示(此時為列向量)且為多元函數,求導和標量一樣的,只是現在是求偏導了:

$\mathbf{f(x_k+ \delta)} \approx \mathbf{f(x_k)} + \mathbf{f'(x_k)}^T\mathbf{\delta} + \frac{1}{2}\mathbf{f''(x_k)\delta^2}$

上面的公式$\mathbf{f(x_k)}, \mathbf{\delta}, \mathbf{f'(x_k)}^T, \mathbf{f''(x_k)}$都是向量,例如一階偏導$\mathbf{f'(x_k)}$應該是這樣的:$$\frac{\partial f(\mathbf{x})}{\partial \mathbf{x}} = \left[\begin{array}{c} \frac{\partial f(\mathbf{x})}{\partial x_1} \\ \vdots \\  \frac{\partial f(\mathbf{x})}{\partial x_n} \end{array}\right]$$

因為是向量,所以有大小有方向了,大家注意到了沒有此時的$\mathbf{f'(x_k)}^T$為行向量了,因為轉置了,因此和$\mathbf{\delta}$相乘是內積,此時我們也只看前兩項即:$\mathbf{f(x_k+ \delta)} \approx \mathbf{f(x_k)} + \mathbf{f'(x_k)}^T\mathbf{\delta}$。現在重點來了啊,為了每次$x$前進的方向是使函數$\mathbf{f(x_k)}$增長最快,應該怎樣選取前進方向的步伐(即向量$mathbf{\delta}$)才能保證呢?顯然,$mathbf{\delta}$直接影響着$\mathbf{f'(x_k)^T\delta}$,而$\mathbf{f(x_x + \delta)}$的值由$\mathbf{f(x_k)}$、$\mathbf{f'(x_k)^T\delta}$決定,然而$\mathbf{f(x_k)}$是確定的,所以使$\mathbf{f'(x_k)^T\delta}$最大即可。

而該式就是向量的內積,根據向量內積的性質可知,只要使$\mathbf{\delta}$取的向量和$\mathbf{f'(x_k)}$共線就可以了:如果共線同向則取最大方向,反向取最小小方向。因此直接使$\mathbf{\delta} = \mathbf{f'(x_k)}$即可,即保證方向共線就可以了,至於值得大小可以乘一個標量,現在我們找到了這個向量,而這個向量就是多元函數的一階偏導數,這時候就定義,多元函數的一階偏導數為梯度,符號為$\nabla f(x_0 + y_ 0)$,數學上的梯度就是這么來的,此時就可以寫成這樣了:

$\mathbf{f(x_k + \delta)} \approx \mathbf{f(x_k) + \nabla^Tf(x_k)\delta + \frac{1}{2}\delta^T\nabla^2f(x_k)\delta}$。

總結來說,梯度是為了尋找極值而生的,而且是極大值,因此梯度總是指向函數增長最快的方向,這就是本質原因了,但是我們常聽的是梯度下降,梯度方向取反即下降最快的,共線反向取極小值就這個道理。

梯度的知識點難在理解上,梯度不是標量,是向量,有方向有大小,一般我們不是很關心大小,因為可以通過標量放大或者縮小,重要的是方向問題。因為只要確定增長最快的方向,才能最快找到極值點,這也是很多算法使用梯度優化算法的原因,當然是梯度的反方向。

斜率與梯度

斜率的方向對應曲線上某一點的切線,梯度的方向對應曲面上某一點切面的法線。

一維的斜率針對的二維的線,

二維的梯度針對的三維的面,

這里的一維、二維對應的是自變量的個數,而斜率、梯度這些其實就是我們對函數的預測,預測建立在比函數高一維的維度。

梯度檢測

概述

當我們對一個較為復雜的模型(例如神經網絡)使用梯度下降算法時,可能會存在一些不容易察覺的錯誤(比如難以發現的bug),雖然在訓練過程中,代價函數在變小,但最終的結果可能並不是最優解。

所以我們采用一種叫梯度檢測的思想,它可以通過估計梯度(或導數)的近似值來估算我們的梯度下降算法算出的梯度(或導數)是否為正確的。

原理

梯度檢測會估計梯度(或導數)值,然后和你程序計算出來的梯度(導數)的值進行對比,以判斷程序算出的梯度(導數)值是否正確。

上圖中,我們關注$\theta_0$點的函數的導數,即$\theta_0$點切線(圖中藍線)的斜率,現在我們$\theta_0 - \epsilon$ 和 $\theta_0 + \epsilon$兩點間連一條線(圖中紅線),我們發現紅線的斜率和藍線斜率很相似。

紅線的斜率可以用以下式子表示:$\frac{J(\theta_0 + \epsilon)-J(\theta_0 - \epsilon)}{2\epsilon}$。實際上,這個式子很好地表示了$\theta_0$點導數的近似值。

在實際的應用中,$\theta$往往是一個向量,梯度下降算法要求我們對向量中的每一個分量進行偏導數的計算,對於偏導數,我們同樣可以用以下式子進行近似計算:

$\frac{J(\theta_1 + \epsilon, \theta_2, \theta_3, \dots , \theta_n) - J(\theta_1 - \epsilon, \theta_2, \theta_3, \dots , \theta_n)}{2\epsilon}$

上式很好地估計了損失函數對$\theta_1$的偏導數。

梯度下降法

既然在變量空間的某一點處,函數沿梯度方向具有最大的變化率,那么在優化目標函數的時候,自然是沿着負梯度方向去減小函數值,以此達到我們的優化目標。如何沿着負梯度方向減小函數值呢?既然梯度是偏導數的集合,如下: 

梯度定義

同時梯度和偏導數都是向量,那么參考向量運算法則,我們在每個變量軸上減小對應變量值即可,梯度下降法可以描述如下:

梯度下降法以上就是梯度下降法的由來,大部分的機器學習任務,都可以利用Gradient Descent來進行優化。

詳解梯度下降法請點擊機器學習優化算法。

參考資料:

https://blog.csdn.net/walilk/article/details/50978864

https://blog.csdn.net/weixin_42398658/article/details/83017995

https://blog.csdn.net/tugouxp/article/details/109156764

https://www.cnblogs.com/umbrellalalalala/p/9012676.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM