為什么梯度反方向是函數值下降最快的方向?
在學習機器學習算法的時候,很多訓練算法用的就是梯度下降,然后很多資料也說朝着梯度的反方向變動,函數值下降最快,但是究其原因的時候,很多人都表達不清楚,其中當然包括我了。所以就搬運了幾篇博客文章(總有一款適合自己),學習一下為什么梯度反方向是函數值局部下降最快的方向?
第一篇
轉載:機器學習--什么是梯度?為什么梯度方向就是函數上升最快的方向?本文將給你解惑
1. 梯度、向量內積、導數與偏導數
什么是梯度?為什么梯度方向就是函數上升最快的方向?又為什么有梯度下降的說法?他們有什么聯系?
講梯度的定義之前,先說明一下梯度它不是一個實數,他是一個向量,即有方向有大小。這個向量有什么特點呢?這里以二元函數為主講解,先給出公式:
我們在這里說的向量通常是指列向量,下同
設一個多元函數為\(f(x,y)\),在某點\((x_0,y_0)\)的梯度為這點的偏導,即:
其中\(\nabla f(x_0,y_0)\)是函數\(f\)在這一點的梯度符號,是一個整體,而\(\cfrac{\partial f}{\partial x}, \cfrac{\partial f}{\partial y}\)是函數\(f(x,y)\)在點\((x_0,y_0)\)處的偏導數。
看到這里大家肯定是暈暈的,別急我們慢慢往下看,現在問題來了,為什么在多元函數中某點的梯度就是該函數在這一點的偏導數呢?為什么不是二階偏導數不是其他而是一階偏導數呢?為什么會這樣呢?基礎不好的同學可能還會問什么是偏導數呢?什么是向量呢?上面這個定義,大家看了下面理解以后再過來看就懂了。
大家還記得什么是向量嗎?怎么定義的?
在平面直角坐標系中,分別取與\(x\)軸、\(y\)軸方向相同的兩個單位向量\(\pmb i\),\(\pmb j\)作為一組基底。\(\vec{a}\)為平面直角坐標系內的任意向量,以坐標原點\(O\)為起點作向量\(OP = \vec{a}\)。由平面向量基本定理可知,有且只有一對實數\((x,y)\),使得向量\(OP = x\pmb i+y\pmb j\),因此\(\vec{a} = x\pmb i+y\pmb j\),我們把實數對\((x,y)\)叫做向量的坐標,記作\(\vec{a} = (x,y)\)。顯然,其中\((x,y)\)就是點\(P\)的坐標。這就是向量的坐標表示。三維的也是這樣表示的。

圖1 向量的坐標表示
那么這樣大家就能理解向量是可以使用坐標表示的,同時解釋了\(\nabla f(x_0,y_0)\)是一個向量的表示,雖然沒有箭頭,但是它也是向量呀,而且就是梯度,現在大家應該可以理解為什么說\(\nabla f(x_0,y_0)\)它是一個向量,到這里我們還需要一點矩陣方面的知識,例如矩陣方面的向量什么?這里的向量和矩陣的向量有所不同,大家需要區別開,因為應用不同,所有定義有點不同,但是具有相同的性質,即有大小有方向。后面會發現就是通過向量把他們的關系建立起來的。
矩陣:矩陣大家都知道,矩陣的向量默認為列向量即一列為一組向量(這點特別重要,大家務必留心,這關系后面的梯度證明的理解),矩陣中的向量有什么性質呢?在這里只提用到的性質,降低難度,即向量的范數(在空間向量中稱為模),以及兩個向量的內積。
向量的內積:
1)代數定義:
設二維空間內有兩個向量\(\vec{a}=(x_1,y_1)\)和\(\vec{b}=(x_2,y_2)\),定義它們的數量積(又叫內積、點積)為以下實數:
更一般地,\(n\)維向量的內積定義如下:
2)幾何定義:
設二維空間內有兩個向量\(\vec{a}\)和\(\vec{b}\),\(|\vec{a}|\)和\(|\vec{b}|\)表示向量\({a}\)和\({b}\)的大小,它們的夾角為\(\theta\),則內積定義為以下實數:
該定義只對二維和三維空間有效。內積的物理意義就是\(b\)向量在\(a\)向量的投影的乘積或者說\(a\)向量在\(b\)向量投影的乘積,他們是一樣的。

圖2 向量的內積
此時大家看到了內積的定義,知道內積計算結果是一個實數,不是向量,既然是一個數那就存在最大值和最小值,再看看這個公式\(|\vec{a}||\vec{b}|cos\theta\),因為\(cos\theta\)的范圍為\([-1,1]\),所以內積的范圍為\([-|ab|,|ab|]\),因此存在最大值和最小值,當\(\theta\)取180°時最下,當\(\theta\)取0時最大,由此我們可知只要這兩個向量共線就會取極值,如果共線同向則取極大值,反之取極小值,所謂共線就是兩線平行的意思。這個概念很重要,大家務必理解了,這將直接關系能否理解梯度。下面介紹矩陣這方面內容。
矩陣向量:
\(n\)維向量的內積:設\(n\)為向量
稱\(x_1y_1+x_2y_2+\cdots+x_ny_n\)為向量\(x\)與\(y\)的內積,記作\([x,y]=x^Ty=x_1y_1+x_2y_2+\cdots+x_ny_n\)。
從這里大家可以看到,矩陣中向量的內積定義和平面向量的定義很像,只是他們的表達不一樣罷了,如果把平面中\(a\)向量和\(b\)向量寫成列的形式就一樣了。只能說平面向量是矩陣向量的一種特殊情況。大家可以這樣理解,
則,\(\vec{a}\cdot \vec{b} = \vec{a}^T\vec{b} = x_1x_2+y_1y_2\)。
因為矩陣向量是列向量,而矩陣的運算法則是行乘以列,因此矩陣向量求內積需要轉置一下才能求出是一個數。到這里大家知道了矩陣的向量計算內積公式了,總結一下:
設矩陣向量為\(A\)、\(B\),則他們的內積為\(A^TB\),既然是內積,那它也有最大值和最小值,和平面理解一樣,兩向量同向,值最大,反向值最小(這個概念很重要的,理解透什么是內積,切記矩陣向量內積的形式),這樣大家可以理解內積了,至於梯度,大家別急,基礎理解了,梯度自然而然的就理解了。下面是導數方面的內容。
什么是導數?什么是偏導數?他們有什么物理意義?梯度和導數、向量有什么關系?
大家都知道導數是代表函數(曲線)的斜率,是描述函數(曲線)變化快慢的量,同時曲線的極大值點也可以使用導數來判斷,即極大值點的導數為0,此時斜率為零(現在不深入討論,后面會通過泰勒級數進行討論,一階導數為零的點不一定是極值點可能是駐點,這時需要根據二階導數判斷),那么導數就為我們求解函數的極值提供了可能,當然我們現在說的導數是一元導數,即\(f(x)\),只具有一個變量,因此很容易求導。
那么什么是偏導數呢?我們知道導數是指一元函數的,它的物理意義就是衡量函數變化快慢的量,例如一天中,溫度隨時間變化的函數就是一元函數,而多元函數是指形如\(f(x,y)\)、\(f(x,y,z)\)、\(f(x,y,z,w,v)\)等的函數,此時函數的自變量有多個,在這里以二元函數為例說明,我們知道,一旦變量增多,意味着影響因素增加,例如一天的氣溫不僅和時間有關還是天氣有關,還和地理位置有關等,但是我們就想知道,在這多種因素的影響下,哪個因素對它影響最大,怎么辦呢?所謂的影響最大就是這個因素對氣溫的影響最大,即求氣溫的最值,這時候大家可能會說求導啊,對呀,求導最好了,但是這里有很多變量啊,例如\(f(x,y)\),我想求\(x\)對\(f\)的影響,怎么辦呢?初中我們都學過一個實驗方法就是控制變量法,即當我需要改變一個量時,讓其他量不變的情況下去改變這個量然后觀察對函數的影響,那么我們多元求導可不可以也使用這樣的方法呢?當我求\(x\)對\(f\)的影響時,我把\(y\)當做常量來處理,然后對\(x\)求導即可,當然可以啊,只是這時候的求導不在是導數了,因為多元函數是對一個因素也就是\(x\)進行求導,因此稱為偏導,這下大家理解為什么有稱為偏導了吧。
總結一下:偏導數是指在多元函數的情況下,對其每個變量進行求導,求導時,把其他變量看做常量進行處理,物理意義就是查看這一個變量在其他情況不變的情況下對函數的影響程度。
那什么是梯度呢?和上面又有什么關系呢?
再說梯度之前還是要先說一下泰勒級數,為什么要說這個泰勒級數,因為證明梯度方向總是指向函數最大增加方向的一個關鍵支撐。
2. 泰勒級數
數學中,泰勒公式是一個用函數在某點的信息描述其附近取值的公式。如果函數足夠平滑的話,在已知函數在某一點的各階導數值的情況之下,泰勒公式可以用這些導數值做系數構建一個多項式來近似函數在這一點的鄰域中的值,即泰勒級數在某一鄰域內去無限接近該函數的一個公式。詳解泰勒級數可參考這篇文章
假設有一條解析式很“惡心”的曲線\(f(x)\),我們可以用多項式仿造一條曲線\(g(x)\),那么
泰勒指出:在實際操作過程中,可根據精度的要求選擇\(n\)值,只要\(n\)不是正無窮,那么一定要保留上式中的約等號。
這里引入泰勒級數的目的是為了證明極值點的導數問題,高階函數一般要使用到矩陣論的海森矩陣相關知識,這里不引入那么深的概念,但是基本的矩陣知識還是需要的。
我們只保留前三項:
上面提到了一階導數是極值點。現在解釋為什么會是這樣,上面的\(\delta\)是指很小的步長,當\(\delta \gt 0\)時說明\(x\)向右走,當\(\delta \lt 0\)時說明\(x\)向左走,學過高等數學極限的應該有這個概念,現在我們通過泰勒級數只考慮上面公式的前兩項來解釋為什么,極值點處的一階導數為0。
假如\(x_k\)這一點的函數值\(f(x_k)\)為極值點,可以是極小值或者極大值,這里以極大值點為講解內容:
因為此時的\(f(x_k)\)為極大值,無論\(\delta \gt 0\)還是\(\delta \lt 0\),有\(f(x_k+\delta) \lt f(x_k)\),那么上面的公式想要成立,只能讓\(f^{'}(x_k)=0\)才能成立,極小值也是這樣證明的,無需畫圖,從泰勒級數就可以說明極值點的一階導數一定為0,那么一階導數為零的點不一定是極值點怎么證明呢?使用三項即可證明,下面證明;
一階導數為零不一定是極值點:
如果\(f^{'}(x_k)=0\),那么公式可寫成這樣:
從上式可以看到如果在\(f^{'}(x_k)=0\)時假如\(f(x_k)\)為極大值,理應說無論\(\delta \gt 0\)還是\(\delta \lt 0\),有\(f(x_k+\delta) \lt f(x_k)\),但是此時如果\(f^{''}(x_k) \gt 0\),則\(f^{''}(x_k)\delta^2 \ge 0\),所以\(f(x_k+\delta) \gt f(x_k)\),即證得\(f(x_k)\)不是極大值點,那如何才能判斷是極值點呢?
此時需要借助二階導數,上面如果\(f^{''}(x_k) \lt 0\)則為極大值點,所以才有一階導數等於零,二階導數小於零為極大值點,如果二階導數大於零則為極小值點。如果二階導數等於0怎么辦?那就繼續判斷三階導數就可以了。
這是在標量的情況下的極值問題,如果\(x\)是向量怎么處理呢?
還是引入泰勒公式就可以了。只是不一樣的是都是向量了:
我們知道機器學習中的變量都很多,一般都使用向量進行表示(此時為列向量)且為多元函數,求導和標量一樣的,只是現在是求偏導了。
公式中\(f(X_k),f^{'}(X_k),f^{''}(X_k),\delta\)都是向量,例如一階偏導\(f^{'}(X_k)\)應該是這樣的:
因為是向量,所以有大小有方向了,大家注意到了沒有,此時的\(f^{'}(X_k)^{T}\)為行向量了,因為轉置了,因此和\(\delta\)相乘是內積,此時我們也只看前兩項即:
現在重點來了啊,為了每次\(x\)前進的方向是使函數\(f(X_k)\)增長最快,應該怎樣選取前進方向的步伐\(\delta\)(向量),才能保證呢?好,大家能看到\(\delta\)直接影響着\(f^{'}(X_k)^T\delta\),而決定\(f(X_k+\delta)\)的值是由\(f(X_k)\)、\(f^{'}(X_k)^T\delta\)決定,然而\(f(X_k)\)是確定的,所以使其\(f^{'}(X_k)^T\delta\)最大即可,而該式就是向量的內積,根據上面講了半天的向量內積可知,只要使\(\delta\)取的向量和\(f^{'}(X_k)\)共線就可以了,如果共線同向則取最大方向,反向取最小小方向。因此直接使\(\delta\)=\(f^{'}(X_k)\)即可,即保證方向共線就可以了,至於值得大小可以乘一個標量,現在我們找到了這個向量,而這個向量就是多元函數的一階偏導數,這時候就定義,多元函數的一階偏導數為梯度,符號為\(\nabla f(x_0,y_0)\),數學上的梯度就是這么來的,此時就可以寫成這樣了:
好,到這里我們知道了什么是梯度,梯度怎么來的,總結來說梯度是為了尋找極值而生的,而且是極大值,因此梯度總是指向函數增長最快的方向,這就是本質原因了,但是我們常聽的是梯度下降,改變梯度方向就是下降最快的,共線反向取極小值就是這個道理了。
該式更能反映事實。大家細細品味,梯度的知識點難在理解上,梯度不是標量,他是向量,有方向有大小,一般我們不是很關心大小,因為可以通過標量放大或者縮小,重要的是方向問題,因為只要確定增長最快的方向,才能找到極值點,這也是很多算法使用梯度優化算法的原因,當然是梯度的反方向,
到現在基本上就結束了,但是我還是有些知識需要交代,矩陣方面的沒給大家深入講,可能上面的證明還是不夠嚴謹,但是證明思路已經出來了,理解梯度已經夠用了,如果感興趣,建議大家有時間看看張賢達的矩陣論,里面有更嚴謹的數學推到,在這里希望給大家一種拋磚引玉的感覺,矩陣論對這方面講解的很透徹,主要牽扯到二次型、正定、半正定等知識。有時候感覺數學沒什么用,其實用處很大的,需要我們學習者內化或者理解其物理意義,搞明白來龍去脈,方能正確使用數學這把利劍,梯度到此結束,有問題歡迎交流。
第二篇
轉載:在梯度下降法中,為什么梯度的負方向是函數下降最快的方向?
1. 概念引入
需要了解的數學知識有導數,偏導數(這里就不展開了)。
我們引入梯度的概念。假設定義空間是\(n\)維的,我們現在有一個從這個\(n\)維空間映射到\(p\)維空間的函數:
需要注意的是,這里的\(\vec{p}\)是\(p\)維的,\(\vec{x}\)是\(n\)維的。我們設
梯度實質上是一個\(n\)維的向量(和\(x\)的維度相同),梯度的每一個維度又是什么呢?梯度的每一個維度是該函數關於這個維度的偏導數。我們將梯度記為\(\vec grad_f\),將上面這段話公式化就是:
舉一個例子,假設:
這是一種比較特殊的情況,在這種情況下,我們有\(n=2\),\(p=1\)。那么怎么計算梯度呢?我們需要根據自變量的每一維度分別計算函數的偏導數,然后把他們組成一個向量就好了。
因此,這個函數的梯度就是
然后,對於每一個給定的\((x,y)\)我們都可以求出函數在這個點的梯度的數值(帶入就可以了)。
2.證明
接下來,我們來證明我們的目標:為什么上面定義的梯度是函數在該點上升最快的方向呢?換句話講,就是為什么函數在該點下降最快的方向是梯度的負方向呢?現在,讓我們假設一個下降的方向,這個方向是隨機的,我們設這個方向是
什么意思呢?就是說我們現在處於函數的一個點上,這個點的坐標是
我們在這點的函數值是
我們想要去到這個函數更低的地方去,這個低在數學上的體現就是函數值變小。在機器學習當中,就是我們的誤差函數變小。那么我們沿着\(\vec{l}\)下降的意思就是,我們下一步將來到
當然,由於我們的\(\vec{l}\)方向是完全隨機的,所以實際上我們並不能得知函數值到底是增大還是減小,然而這並不影響我們的證明。
根據多元函數的一階泰勒展開公式,我們有:
這個公式的證明就不在這里展開了。
我們發現,
就是我們沿着\(\vec{l}\)方向移動前后,函數值的變化量。也就是說,只要這個值小於零,我們的函數值就在變小;而只要我們可以證明當\(\vec{l}\)取到梯度的負方向時這個值小於零且絕對值最大,那么我們就證明了我們的目標。而我們知道,這個值等於(就是移項)
又因為,當我們的自變量變化值極小的時候(\(||\vec{l}||\)極小),我們是可以忽略
這一項的。在機器學習當中,這個條件很容易被滿足,因為只要我們取得的學習速率\(\alpha\)很小的時候,我們可以近似認為這個條件已經被滿足。因此,我們現在僅剩的問題就是如何找到一個方向,使得
小於零且絕對值最大。我們觀察這一項可以發現,它其實是兩個向量的數量積(scalar product),也就是
(這個表示\(\vec grad_f\)和\(\vec{l}\)的數量積)
根據柯西-施瓦茲不等式,我們可以得知當且僅當這兩個向量方向相同時,該數量積的絕對值取得最大值。注意,這里只是絕對值最大。我們已經勝利了一半,而最后一個小於零的條件很容易滿足,我們只需要讓
這樣的話,對於這兩個向量來說,他們的每一個維度都互為對方的相反數,因此他們的數量積一定不可能大於零,在實際情況下,他們甚至一直小於零,到這里,我們就證明了當且僅當\(\vec{l}\)的方向是負梯度方向時,函數值下降最快。
第三篇
首先,回顧我們怎么在代碼中求梯度的(梯度的數值定義)
1)對向量的梯度
以\(n\times 1\)實向量\(x\)為變元的實標量函數\(f(x)\)相對於\(x\)的梯度為一\(n\times 1\)列向量\(x\),定義為
2)對矩陣的梯度
實標量函數\(f(A)\)相對於\(m×n\)實矩陣\(A\)的梯度為一\(m×n\)矩陣,簡稱梯度矩陣,定義為
然后我們回顧一下導數和方向導數:
1)導數和偏導
導數是函數在某一點的變化率,在一元函數中,就是沿着x軸在某一點的變化率;在二元函數中,就有了偏導,在x方向上的偏導,就是函數在某一點沿着x軸方向的變化率,在y方向上的偏導同理;在更多元函數中以此類推。
2)方向導數
上一點只涉及到坐標軸方向的變化率,那如果我想要知道任意方向的變化率呢?這就引出了方向導數的概念,方向導數是偏導數的概念的推廣。
現在我們回到梯度:
梯度方向就是方向導數值最大的那個方向,那根據上面梯度的數值定義,“為什么梯度方向是變化最快的方向”這個問題就等價於“為什么多元函數各個軸方向的變化率(這里指向量)的合方向就是整個函數值變化率最大的方向?”
以二元函數為例:

已知:\(\vec{x},\vec{y}\)分別是二元函數\(f(x,y)\)在點\((x_0,y_0)\)處沿\(x,y\)軸的偏導數,\(\vec{l}\)是任意方向的方向導數。
求證:\(\vec{l}_2\)的方向是二元函數\(f(x,y)\)在點\((x0,y0)\)處變化最快的方向。
證明:
函數\(f(x,y)\)在點\((x_0,y_0)\)處沿方向\(\vec{l}\)的變化率為\(|\vec{l}|=|\vec{x}|cos\theta+|\vec{y}|sin\theta\),則
\(|\vec{l}|\)最大等價於點\((|\vec{x}|,|\vec{y}|)\)與點\((cos\theta,sin\theta)\)的內積最大(內積的坐標定義),
將上面的內積化為向量形式:記\(\vec{A} =(|\vec{x}|,|\vec{y}|),\vec{B}=(cos\theta,sin\theta)\),則\(\vec{A} \cdot \vec{B}=|\vec{A}| \cdot |\vec{B}|\cdot cos\alpha\),其中\(\alpha\)是\(\vec{A} ,\vec{B}\)的夾角;
則\(|\vec{l}|\)最大等價於\(\vec{A} \cdot \vec{B}\)最大,在問題的設定下\(\theta\)是變量,於是等價於\(\vec{A} ,\vec{B}\)方向平行,而\(\vec{A}\)的方向就是\(\vec{l}_2\)的方向,故\(\vec{B}\)的方向取\(\vec{l}_2\)的方向時,取到最大變化率。
於是由梯度的數值化定義出發,可以證明梯度方向就是方向導數值最大的那個方向,這個方向就是\(\vec{A}\)的方向(注意看它的坐標)。
以上都是在二元函數的情況下進行證明的,同理可以證明多元函數的情況:
比如三元函數\(f(x,y,z)\),沿\(\vec{l}\)方向的方向導數的大小為\(|\vec{l}|=|\vec{x}|cos\theta_1+|\vec{y}|cos\theta_2+|\vec{z}|cos\theta_3\) (1),其中\(\theta_1,\theta_2,\theta_3\)分別是\(x,y,z\)軸和任意方向向量\(\vec{l}\)的夾角;於是又可以\(|\vec{l}|=\vec{A} \cdot \vec{B}\),其中\(\vec{A}=(|\vec{x}|, |\vec{y}|,|\vec{z}|),\vec{B}=(cos\theta_1,cos\theta_2,cos\theta_3)\),接下來就是同理可證了。
因為(1)處用的是幾何觀點,更多元的情況從幾何角度就想象不出來了,但講道理是一樣的,於是證明結束。