梯度下降為什麼步長要乘以導數?

我目前的理解是導數只是說明了方向,那麼為什麼不使用導數大於0則乘1,導數小於0則乘-1的計算方法呢?

梯度下降: x^{k+1} = x^k - eta 	riangledown f(x^k) 題主問的是為什麼不可以: x^{k+1} = x^k - eta 	ext{Sign}(	riangledown f(x^k))


題主的問題:梯度下降為什麼步長要乘以導數?

這個問題本身就有問題。

所謂「梯度」下降,即用梯度函數迭代求解優化問題,減小目標函數的值。而一個函數的梯度,就是它的導數。所以梯度下降法就是每次迭代時,將當前解參照梯度向量進行修改。題主所謂「為什麼步長要乘以導數」,從字面上問的是,有一個確定的步長(標量)了,為什麼要乘以一個的導數(向量)。那麼,最直接的回答就是:梯度下降法就是要走導數方向,光一個步長你往哪兒走?

然而,我想題主應該所問的並不是這個問題。而是:為什麼梯度下降法不是沿導數方向走一個固定的步長,而是與導數的模長成正比?

規範一下下文使用的符號:

x:維度為n維的自由變數,亦即我們所要研究的優化問題的自變數。形式上是一個列向量;

f:一個從n維實空間到實數域的映射;

x_0:初始解;

x_n (n=1,2,dots):第n個迭代的當前解。

那麼,梯度下降法的迭代步驟即可表示為:

x_{n+1} = x_n - alpha cdot frac{mathrm d f(x_n)}{mathrm d x}, n = 0,1,2,dots

其中alpha是一個正常數。

於是修改版的題主問題就是:為什麼梯度下降法不採用

x_{n+1} = x_n - alpha cdot left.frac{mathrm d f(x_n)}{mathrm d x}middle/ left|frac{mathrm d f(x_n)}{mathrm d x} 
ight| 
ight., n = 0,1,2,dots

作為迭代步驟的遞推公式?

對於這個問題,精簡版的回答:因為這樣做既簡單又更易收斂

詳細版回答:

  1. 加上一個模長作為分母,形式上首先就不及原方法簡潔,無端增加的分母並沒有對求解帶來幫助,反而弄巧成拙地增加了計算的複雜性。哲學上,有一個奧卡姆剃刀原理,大意是說如果一個簡單的形式和一個複雜的形式能做同樣一件事情,並且可以做的同樣好,那麼簡單的形式是更好的。因此,在沒有充足的理由做導數的歸一化時,我們認為,不去做這個歸一化是更好的;

  2. 事實上,不做導數歸一化有更大的優勢。我們姑且用一元函數舉例說明一下。實際上對平滑的高維函數依然成立。試看下圖

    藍色曲線為f(x),橘色和綠色直線分別為f(x)x=0x=1.5處的切線。橘色直線的方程為

    g_1(x)=f(1.5) - (1.5-x) cdot frac{mathrm d f(1.5)}{mathrm d x}

    綠色直線的方程為

    g_2(x)=f(0) - (-x) cdot frac{mathrm d f(0)}{mathrm d x}

    兩條直線上橫坐標為x的點的縱坐標,分別可以表示目標函數從當前解x_n=1.5; (x_n=0)出發,使用梯度下降法沿負梯度方向前進步長left|x-1.5
ight|;(left|x
ight|)後的值。可以看出,x=0處的切線斜率較小,那麼極小值應該就在附近不遠了!那麼以這一點為初始解,應該要少移動一點,否則可能一步就跨出了這個好地方;而x=1.5處則不然,它的導數較大,目標函數值變化較為劇烈,如果採用和x=0相同的步長,那就慢慢等吧,一點一點挪要到什麼時候才能達到極小值呢?不如步子邁大一點,快些找到目標函數值平穩的區間。

以上是一個直觀的解釋。事實上可以證明如下結論:對實數域上嚴格凸函數f(x),以任意正數eta作為題主修改版梯度下降法的步長,序列left{x_n
ight}均不收斂。這個證明很簡單,讀者請利用級數收斂的定義自證。而原版的梯度下降法,在梯度滿足Lipschitz連續性條件並且各步迭代滿足Wolfe條件的情況下,可以證明其收斂性。具體證明較為複雜,超越本答案範疇,請自行參考經典最優化相關教材。


梯度下降是指沿著梯度下降的方向走。導數是梯度上升的方向,所以導數乘以負一是梯度下降方向,步長意味著你這步子一次邁多遠。也就是說負導數決定你往哪個方向走,係數決定你一次走多遠


有幾個回答已經擊中了題目要害,即:

正負號只代表一維的方向

二維甚至更高維的變數空間,當然要用梯度這個矢量(或者你可以理解為跟梯度方向一樣的單位矢量)

====擴展閱讀 (網上都可找到)===

1. 視頻課程:Stanford公開課"Convex Optimization II" by Stephen P. Boyd

2. 入門教材:"Optimization-Theory and Practice" by Jonathan M. Borwein


樓上的回答是不準確的,梯度下降顧名思義,導數向量也就是他的梯度方向!樓上回答的在一維導數的情況下取-1/1,方向仍然正確。但如果是多維的話,那麼方向都錯了,極有可能根本不會收斂。例如(1,1000)這個二維向量,他的梯度方向幾乎是90度,也就是y軸,如果改成(1,1)那麼他的方向就會是45度。手機答,無圖


乘的是梯度好伐?

高數學過的,沿梯度方嚮導數最大,對於光滑可微的點,梯度(導數最大的方向)恰好等於各維求偏導得出的向量所指向的那個方向,大小也是導數大小。但關鍵這裡是乘方向,不是乘導數,導數就是一個數。


梯度下降法利用梯度方向。

當梯度只有一維的時候,『導數大於0則乘1,導數小於0則乘-1』和梯度方向一樣。

但是,對於多維的梯度,採用『導數大於0則乘1,導數小於0則乘-1』顯然這個方向不再是梯度方向,而是在每個維度上都做了一定的歸一化。

當然,題主可以設計不使用原始梯度的優化演算法,完全可以換個名字。


其實不一定不可以,只要能設計相應的演算法,並證明在一定情況下它能收斂且有較好的收斂速度就可以了,現在我們只知道它是下降方向


為了達到坡越陡滑的越快,坡越緩滑的越慢的效果。


既然導數的正負已經決定了方向,那你何必還要認為的判斷正負並加上符號?莫非你忘記了數軸的正方向么。

題目描述改了。

導數的絕對值也可以告訴你應該跑多快啊。何必丟掉呢


因為單位步長1不一定是最優步長。

------------------------------------------

好吧,原來題主不是問這個。

更新:

兩句話解決題主問題:梯度是一個向量,具有大小和方向。負梯度(它本身具有確定的方向!)是函數值下降最快的方向。

以下是簡要說明:

求解無約束問題	ext{min} f(x)時候,負梯度-
abla f(x)是當前函數值下降最快的方向。

對於線性搜索型的下降演算法,迭代格式為x^{k+1} = x^{k}+alpha_kd^{k},其中alpha_k為步長,d^k為方向。

所謂最速下降法,就是在迭代的過程中使用負梯度的方向作為迭代的方向,即d^k=-
abla f(x^k),於是就有了迭代格式x^{k+1} = x^{k}+alpha_k(-
abla f(x^k))。(寫負號寫裡面會不會好理解點?)

現在來看看題主給出的迭代格式x^{k+1} = x^{k}-alpha_k	ext{sgn}(
abla f(x^k))
abla f(x^k)(此處根據題目中文描述以及我腦補,應該是想問這個形式…謝評論指正),為方便說明,以一元函數為例,即x^{k+1} = x^{k}-alpha_k	ext{sgn}(f

如果f0" eeimg="1">,即x^{k+1} = x^{k}+alpha_k(-f,「看起來沒什麼問題」;

如果f,即x^{k+1} = x^{k}+alpha_kf。親,為什麼要走正梯度的方向,這可是函數值增加的方向!說好的要求極小值呢!

那麼為什麼不使用導數大於0則乘1,導數小於0則乘-1的計算方法呢?

然而,不管一元還是多元,負梯度(它的方向是確定的!)都是函數值下降最快的方向,而不是梯度
abla f(x)裡面的分量frac{partial f}{partial x_i}「全部為負值」的方向。

最後,推薦優化入門級教材:Jorge Nocedal, Stephen J. Wright, Numerical Optimization.


omega = omega  -eta  frac{partial y_{i}  }{partial omega}

負號 控制始終滑向下降的方向

導數omega ^{frac{partial y_{i}  }{partial omega} 控制下降速度

omega ^{時,omega ^{越小,函數變化越快, - eta frac{partial y_{i}  }{partial omega} 越大,滑動就越快

反之亦然


這個要從梯度下降法的原理說起,步長乘以導數是從變步長到常數步長的結果,具體推導見下圖。


越到最優的地方坡度越小,極端的,最優值處的導數為0。而在離最優值近的地方應該慢點逼近,步子大了,容易越過找不到最優值。在離最優值值遠的地方應該快點走,步子大點沒關係。

調節步大步小當然是成一個可變的係數,這個係數在坡度小的地方要小,在坡度大的地方要大。導數不是正好滿足這個要求嗎!



你這麼搞也不是不可以, 因為它確實是一個下降方向(d"g&>=0, d 是你的update方向 g是梯度)。

事實上,你不能說你這樣按照sign來更新就一定不如按照梯度更新。

按照梯度的更新的一個理論依據是這種更新實際上是在你只有一階梯度信息,和bounded二階導數特徵值(Lipschitz continuous gradient),即目標函數f(x)被近似函數h(x)bound (和泰勒展開式類似):

f(x)&<=h(x)=f(x0)+&+0.5*L|x-x0|^2

且f(x0)=h(x0)

so f(x) &<= [min_x h(x)] &<= h(x0) = f(x0)

L通常被稱為Lipschitz常數

此時 argmin_x h(x) 即為gradient descent 在x0點的更新公式

so 你可以理解為在你沒有其他更多信息的時候 minimize h(x) 給你一個「最好」的解


梯度是由各特徵緯度上的偏導形成的,既然是偏導那麼拿其中一個緯度來說就可以按斜率來理解了。斜率/偏導的正負決定了,這個緯度隨著自變數增加是增的還是減的!同樣重要的,其大小決定了這個增/減的速度,怎麼能忽略?


您這樣如果x是大於1維的那麼就丟失方向的信息。不過可能您認為對x中每一維都這麼做的話,似乎是可以收斂的…


擼主,你這是僅僅考慮一維情況,多維空間可不止正負


因為導數不是只有正負兩個方向呀。

二維的平面為例,你在山腰上,要向山下走,並不是只有東西兩個方向呀。斜率最大的方向,如果恰好是南北方向,這麼橫著走不是很虧。

當然如果你的向量就是1維的,那其實取個正負的方向就可以了。


陡的地方多走點,不陡的地方少走點算是兼顧了效率的同時又保證了收斂吧。


梯度向量的分量是偏導數,實際上是乘以梯度向量。

分開寫就是乘以偏導數了。

不知道你的問題重點是導數部分還是步長部分,步長的話,就是控制每一步在梯度方向走多遠,步長太大會出現無法收斂到最優解的情況,太小的話收斂速度慢,所以要選擇合適的步長。


推薦閱讀:

正態分布里為什麼會出現自然底數e和圓周率pi呢?
真正的數學建模高手是什麼境界...?
數學中國論壇的美賽輔助報名靠譜嗎?
微軟的計算器為什麼輸入 ln 2 是先輸入 2 再輸入 ln?
物理系適合的張量教材還有變分法教材?

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