1. 程式人生 > >梯度下降法和最速下降法的細微差別

梯度下降法和最速下降法的細微差別

1. 前言:

細微之處,彰顯本質;不求甚解,難以理解。

一直以來,我都認為,梯度下降法就是最速下降法,反之亦然,老師是這麼叫的,百度百科上是這麼寫的,wiki百科也是這麼說的,這麼說,必然會導致大家認為,梯度的反方向就是下降最快的方向,然而最近在讀Stephen Boyd 的凸優化的書,才發現事實並非如此,梯度下降和最速下降並不相同,梯度方向也不一定總是下降最快的方向。

2. 梯度下降法

梯度下降法是一種優化方法,用來求解目標函式的極小值。梯度下降法認為梯度的反方向就是下降最快的方向,所以每次將變數沿著梯度的反方向移動一定距離,目標函式便會逐漸減小,最終達到最小。

f(x)=f(x

0)+f(x)(xx0)+12(xx0)T2f(x)(xx0)+
f(x)f(x0)+f(x)(xx0)
所以如果x-x_0和f(x)的方向相反,那麼相同距離的移動,f(x)的減小最大。

所以梯度下降法的核心步驟就是
xk+1=xkaf(x) 其中,a是步長,可以通過精準線性查詢或非精準線性查詢確定。

3. 最速下降法

最速下降法在選取x的變化方向時與梯度下降法有細微的差別。
nsd=argminv(f(x)Tvv<=1) nsd表示下降最快的方位方向(normalized sleepest descent direction)。

4. 差異

看到這裡,可能覺得最速下降的方向和梯度下降法的方向並沒有差別,都是移動單位步長,下降最多的方向。而差別就在單位步長這裡,如果

nsd=argminv(f(x)Tvv<=1)v是歐式範數,那麼最速下降法就是梯度下降法,也就是說梯度下降法是最速下降法使用歐式範數的特殊情況。

5. 為什麼會有不用歐式範數的情況

原因其實很簡單,因為使用歐式範數的最速下降法(也就是梯度下降法)得到下降方向並非永遠都是下降最快的方向。讀到這裡,你可能有些吃驚,可能會問,難道梯度的反方向是下降最快的方向嗎?如果你有這樣的疑問和思考,那麼恭喜你,你對梯度有著一定的理解。
然而實際情況是這樣的:梯度是變化的,而梯度下降在一次迭代的過程中假設梯度是固定不變的,所謂的梯度方向只是起始點(xk)的梯度方向,並不一定是起始點和終點之間其他點的梯度方向(a

xk+(1a)xk+1,0<a<=1),所以梯度方向不一定是下降最快的方向,所以為了得到更快的下降方向,我們有時並不適用歐式範數。
這裡寫圖片描述
圖片來自Stephen Boyd的凸優化。

6. 什麼時候會不用歐式範數?

我們知道梯度是函式對每個因子求偏導得到的列向量,表示著函式的變化趨勢,
f(x)=(fx1,fx2,,fxn)(如果你是一名程式設計師,你也可選擇從0開始編號),向量中元素的相對大小決定了梯度的方向。我們前面提到,梯度下降的方向不是最快的方向的原因正是由於梯度方向的變化,那的梯度的方向變化由什麼來決定呢?
提到梯度的變化,很自然的想到了函式的二階導數,對於多變數函式,也就是函式的Hessian矩陣。
H=

2fx1x12fx2x12fxnx12fx1x22fx2x22fxnx22fx1xn