【数学与算法】步长一维搜索、梯度下降法、最速下降法、牛顿法
更詳細的推導,可以參考這篇博客:一維搜索、最速下降(梯度下降)與牛頓法(擬牛頓法)
1.求解最優步長的方法:
f(x)f(x)f(x)可以理解為目標函數,損失函數。我們的目標是最小化這個損失函數,最小化大多通過迭代得到,那么每一步迭代更新的步長也很重要,知道每一點的函數值下降最快的方向后(負梯度方向),還需要選取最優的步長,可以使得損失函數每一步迭代下降更快。
如果我們不想求解最優步長,那么就只需要設定固定步長即可,但是這樣做的話,迭代更新較慢,也有可能取不到(全局或局部)最優解,而是在最優解附近。后面的例子,我們會討論固定步長的劣勢。
每一步的最優步長λk\lambda{_k}λk? 由求解式 λk=argminf(xk+λdk)\color{red}\lambda{_k}=arg min f(x_k+λd_k)λk?=argminf(xk?+λdk?)得到,是一種精確步長的搜索方式。
即,由x0x_0x0?到x1x_1x1?的更新步長為λ0\lambda{_0}λ0?,由x1x_1x1?到x2x_2x2?的更新步長為λ1\lambda{_1}λ1?,… ,由xk?1x_{k-1}xk?1?到xkx_kxk?的更新步長為λk?1\lambda{_{k-1}}λk?1?。
dkd_kdk? 是在 xkx_kxk? 點時的搜索方向,如果是梯度下降法時,我們的方向就變成了 dk=??f(xk)d_k =??f(x_k)dk?=??f(xk?),(梯度方向是函數值增長最快的方向,梯度下降就是負梯度方向,即函數值減小最快的方向)。
求解這個式子,就需要把f(xk+λdk)f(x_k+λd_k)f(xk?+λdk?)看做是λ\lambdaλ的函數,令:g(λ)=f(xk+λdk)\color{red}g(\lambda)=f(x_k+λd_k)g(λ)=f(xk?+λdk?)
那么f(xk+λdk)f(x_k+λd_k)f(xk?+λdk?)取極小值,就是 g′(λ)=0\color{red}g'(\lambda)=0g′(λ)=0 時,求解 λ\lambdaλ 。
由于f(x),xk,?f(xk)f(x),x_k,?f(x_k)f(x),xk?,?f(xk?)已知,所以f′(xk+λdk)f'(x_k+λd_k)f′(xk?+λdk?)中只有λ\lambdaλ一個未知數,那么
g′(λ)=f′(xk+λdk)=0\color{red}g'(\lambda)=f'(x_k+λd_k)=0g′(λ)=f′(xk?+λdk?)=0
可以求解出λ\lambdaλ。
例子:
一維度函數f(x)=(x+1)2\color{red}f(x)=(x+1)^2f(x)=(x+1)2,在初始值x0=0x_0=0x0?=0時,梯度即一階導
?f(x0)=2x0+2=2\nabla{f(x_0)}=2x_0+2=2?f(x0?)=2x0?+2=2
d0=??f(x0)=?2d_0=-\nabla{f(x_0)}=-2d0?=??f(x0?)=?2
f(x1)=f(x0+λd0)=(x0+λd0+1)2=(1?2λ)2\begin {aligned} f(x_{1})&=f(x_0+\lambda{d_0})\\ &=(x_0+\lambda{d_0}+1)^2 \\ &=(1-2{\lambda})^2\\ \end {aligned}f(x1?)?=f(x0?+λd0?)=(x0?+λd0?+1)2=(1?2λ)2?
f′(x0+λd0)=2(1?2λ)?(?2)=0f'(x_0+\lambda{d_0})=2(1-2{\lambda})*(-2)=0f′(x0?+λd0?)=2(1?2λ)?(?2)=0
解得:λ=0.5\color{red}\lambda =0.5λ=0.5,從而得到了x0x_0x0?到x1x_1x1? 的最優步長。
那么就可以求得x1=x0+λd0=0+0.5?(?2)=?1x_1=x_0+λd_0=0+0.5*(-2)=-1x1?=x0?+λd0?=0+0.5?(?2)=?1
這就是迭代。
繼續下一次迭代:
x1=?1,?f(x1)=0,d1=0x_1=-1,\nabla{f(x_1)}=0,d_1=0x1?=?1,?f(x1?)=0,d1?=0,那么
x1=x0+λ?d1=x0+λ?0=x0x_1=x_0+\lambda *d_1=x_0+\lambda*0=x_0x1?=x0?+λ?d1?=x0?+λ?0=x0?
我們看到,x1=x0\color{red}x_1=x_0x1?=x0?,就是說,下一次更新的點還在x0x_0x0?就是沒更新了,在看前面在x1x_1x1?處的梯度?f(x1)=0\color{red}\nabla{f(x_1)}=0?f(x1?)=0,就是不會再更新了,已經找到了最優點,就是x1=?1x_1=-1x1?=?1。到這里,僅僅做了一次迭代就達到了最優點,是因為我這里設置的函數比較簡單,取初值也恰好合適,實際情況中不會這么一次就迭代完成。
我們驗證一下,x=?1x=-1x=?1是不是f(x)=(x+1)2f(x)=(x+1)^2f(x)=(x+1)2的最小值點呢?
對f(x)f(x)f(x)求導f′(x)=0f'(x)=0f′(x)=0,解得x=?1x=-1x=?1。所以前面的迭代法求得的結果是準確的。
最優步長 對比 固定步長:
那么,如果我們在每個點xkx_kxk?處都設置固定步長為 λ=0.1\lambda=0.1λ=0.1 的話,那么:
x1=x0+λ?d0=0+0.1?(?2)=?0.2x_1=x_0+\lambda*d_0=0+0.1*(-2)=-0.2x1?=x0?+λ?d0?=0+0.1?(?2)=?0.2
f(x1)=(?0.2+1)2=0.64f(x_1)=(-0.2+1)^2=0.64f(x1?)=(?0.2+1)2=0.64
比最優步長得到的函數值0還大很多,需要繼續迭代:
d2=?1.6d_2=-1.6d2?=?1.6
x2=x1+λ?d2=?0.2+0.1?(?1.6)=?0.36x_2=x_1+\lambda*d_2=-0.2+0.1*(-1.6)=-0.36x2?=x1?+λ?d2?=?0.2+0.1?(?1.6)=?0.36
f(x2)=(?0.36+1)2=0.642=0.4096f(x_2)=(-0.36+1)^2=0.64^2=0.4096f(x2?)=(?0.36+1)2=0.642=0.4096
x2=?0.36x_2=-0.36x2?=?0.36處的損失函數值變成了0.4096進一步縮小,再往后迭代幾次可能也得不到最優解x?=?1x^*=-1x?=?1,而是在-1附近徘徊,我這里不再向后推算,明白原理即可,感興趣的自己往后推算。
下面這個是最速下降法的性質,即前后兩次迭代的梯度向量方向正交,并不是求解步長λ\lambdaλ。
根據求導公式,y=f(a+b?x)y=f(a+b*x)y=f(a+b?x)對xxx求導,得到 y′=f′(a+b?x)?(b?x)′y'=f'(a+b*x)*(b*x)'y′=f′(a+b?x)?(b?x)′,
即 y′=f′(a+b?x)?by'=f'(a+b*x)*by′=f′(a+b?x)?b
那么 g′(λ)=f′(xk+λdk)=0\color{red}g'(\lambda)=f'(x_k+λd_k)=0g′(λ)=f′(xk?+λdk?)=0 是對λ\lambdaλ求導,則:
g′(λ)=?f(xk+λkdk)T?dk=0g'(\lambda)=\nabla f(x_k+λ_kd_k)^T*d_k=0g′(λ)=?f(xk?+λk?dk?)T?dk?=0
可得:
??f(xk+1)T?f(xk)=0\color{red}-\nabla f(x_{k+1})^T\nabla f(x_k)=0??f(xk+1?)T?f(xk?)=0
2.梯度下降法 和 最速下降法:
相同點:都是讓迭代點沿著負梯度方向前進,保證函數的“最速”下降;
不同點:在于步長λ\lambdaλ的取值:
- 梯度下降法的步長λ\lambdaλ是定值,由工程師指定;
- 最速下降法的步長λ\lambdaλ是通過求解得到最優步長,它能使迭代更快收斂。
因此梯度下降法只是最速下降法中的一種特殊形式。
使用最速下降法得到的迭代路線往往是呈現一個之字形的走勢。而當迭代點越靠近極小點,其移動的步長較小,嚴重影響到了收斂的速度。雖然從局部來看,每次選擇的方向都是函數值下降最快的方向,但是從全局來看,鋸齒現象導致當距離極小點較近時需要繞不少彎路才能收斂,反而收斂較慢。
因此,在計算的前中期使用梯度下降,而在接近極小點時使用其他算法進行迭代,會是更理想的方案。
3.牛頓法迭代法:
牛頓法迭代法:基本思想是利用二階泰勒展開在極小點附近來近似目標函數,最終解出極小點的一個近似值。
4.梯度下降法 或 牛頓法 進行最優化的步驟:
要最小化目標函數f(x?)f(\vec{x})f(x),也就是要找到某個點 xk?\vec{x_k}xk??使得f(x?)f(\vec{x})f(x)最小,即minf(x?)min f(\vec{x})minf(x)。
這里 xk?\vec{x_k}xk??頭上打箭頭表示xxx是多維點,就是向量。因為實際問題中很少會是一維點的。
一般都是使用迭代法更新求最優值x??\vec{x^*}x?:
4.1.方法1:使用梯度下降法進行更新迭代:
-
步驟1:給一個初始值x0?\vec{x_0}x0??,和精度閾值 ?\epsilon?,并令 k=0k=0k=0;
-
步驟2:更新迭代計算:
如果步長λ\lambdaλ 需要計算,就在這里進行計算,得到這一步迭代的最優步長;
計算梯度?f(xk)\nabla f(x_k)?f(xk?)后,按照下式進行迭代更新x?\vec{x}x:
xk+1=xk?λ?f(xk)x_{k+1}=x_{k}-\lambda\nabla f(x_k)xk+1?=xk??λ?f(xk?) -
步驟3:判斷迭代停止條件:
若梯度模∣∣?f(xk)∣∣<?||\nabla f(x_k)||< \epsilon∣∣?f(xk?)∣∣<?,(梯度特別小的點基本就是局部或者全局最優點),則停止迭代。
梯度模是類似下面這樣計算:
zhz:這里迭代停止條件也可以使用:1.連續10次更新得到的f(xk)f(x_k)f(xk?)差值∣∣f(xk+1)?f(xk)∣∣<?||f(x_{k+1})-f(x_k)||< \epsilon∣∣f(xk+1?)?f(xk?)∣∣<?;2.達到多少次迭代后。 -
步驟4:另k=k+1k=k+1k=k+1,轉至步驟2;
4.2.方法2:使用牛頓法即 二階泰勒展開式 更新迭代:
- 步驟1:給一個初始值x0?\vec{x_0}x0??,和精度閾值 ?\epsilon?,并令 k=0k=0k=0;
- 步驟2:更新迭代計算:
計算牛頓方向: -?2f(xk)?1?f(xk){\nabla}^2 f(x_k)^{-1} \nabla f(x_k)?2f(xk?)?1?f(xk?)后,按照下式進行迭代更新 x?\vec{x}x:
xk+1=xk??2f(xk)?1?f(xk)x_{k+1}=x_{k}- {\nabla}^2 f(x_k)^{-1} \nabla f(x_k)xk+1?=xk???2f(xk?)?1?f(xk?)
或者也加上步長λ\lambdaλ,就變成了阻尼牛頓法,這里需要使用求解最優步長λ\lambdaλ的方法:
xk+1=xk?λ?2f(xk)?1?f(xk)x_{k+1}=x_{k}- \lambda{\nabla}^2 f(x_k)^{-1} \nabla f(x_k)xk+1?=xk??λ?2f(xk?)?1?f(xk?) - 步驟3:判斷迭代停止條件:
梯度模是類似下面這樣計算:
若梯度模∣∣?f(xk)∣∣<?||\nabla f(x_k)||< \epsilon∣∣?f(xk?)∣∣<?,(梯度特別小的點基本就是局部或者全局最優點),則停止迭代。
zhz:這里迭代停止條件也可以使用:1.連續10次更新得到的f(xk)f(x_k)f(xk?)差值∣∣f(xk+1)?f(xk)∣∣<?||f(x_{k+1})-f(x_k)||< \epsilon∣∣f(xk+1?)?f(xk?)∣∣<?;2.達到多少次迭代后 - 步驟4:另k=k+1k=k+1k=k+1,轉至步驟2;
這里貼上阻尼牛頓法的更新步驟:
4.3.比較兩種方法的異同
比較上面兩種方法,步驟2開始使用不同方法來迭代更新。對于兩種方法的迭代公式,可以看出,方法2牛頓法迭代公式中黑塞矩陣的逆?2f(xk)?1\nabla^2f(x^k)^{-1}?2f(xk)?1相當于方法1梯度下降法迭代公式的步長λ\lambdaλ,這樣兩個公式就一樣了。當然,我們也可以在方法2牛頓法中也加上步長λ\lambdaλ,這樣,其實是由黑塞矩陣的逆?2f(xk)?1\nabla^2f(x^k)^{-1}?2f(xk)?1和λ\lambdaλ共同決定。
對于方法1梯度下降的步長λ\lambdaλ,可以人為設定一個定值,也可以使用最速下降法中的一維搜索尋求最優步長,讓算法迭代快速收斂。使用一維搜索的話,就可以參考前面的 argminf(xk+λdk)\color{red}arg min f(x_k+λd_k)argminf(xk?+λdk?) 求解步長λ\lambdaλ。
一般認為方法2牛頓法可以利用到曲線本身的信息,比方法1梯度下降法更容易收斂(迭代更少次數)。
如下圖,是一個最小化一個目標方程的例子,紅色曲線是利用牛頓法迭代求解,綠色曲線是利用梯度下降法求解:
4.4.疑問:實際工程中,什么時候使用梯度下降法呢?什么時候用到牛頓法呢?
如果需要訓練神經網絡模型,那么可以使用梯度下降法。如果需要實時計算得到最優解的話,梯度下降法需要迭代,那么每一幀數據都迭代的話,如果耗時比較久,就不合適了,如果耗時很短,可以試試。
實際工程中,什么時候用到牛頓法呢?它能保證實時嗎?它能用在神經網絡嗎?還有,特征維度特別大的時候,計算黑塞矩陣就會有維度災難,計算的代價特別大,可以考慮使用PCA降維?或者不直接計算黑塞矩陣(見阻尼牛頓法的藍色字體的介紹)?
總結
以上是生活随笔為你收集整理的【数学与算法】步长一维搜索、梯度下降法、最速下降法、牛顿法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数学与算法】PCA主成分分析(降维)的
- 下一篇: 【数学与算法】牛顿法的两种应用:求根和最