11/22/2017 12:40:56 PM
優化問題在很多領域有着重要的應用。為了日后查閱方便,本文列舉常見的無約束優化方法的計算公式。
需要說明的是,本文的大部分內容選自圖書《算法筆記》。
一、梯度下降法
梯度下降法(Gradient Descent Method)也叫做最速下降法(Steepest Descent Method),因為負梯度是函數局部下降最快的方向。
梯度下降
梯度下降法的迭代格式為
梯度下降法非常簡單,只需要知道如何計算目標函數的梯度就可以寫出迭代格式。因此,盡管在不少情況下梯度下降法的收斂速度都很慢,也依然不影響它在工業界的廣泛應用。梯度下降法應用到一些具體模型上有時也會被視作一類特定的算法,例如神經網絡中的后向傳導算法(Back Propagation Algorithm)。
隨機梯度下降
在機器學習中經常有\(f(x)=\sum_{i=1}^m \ell_i(x)\),其中\(\ell_i(x)\)是第\(i\)個訓練樣本的損失函數。這時我們可以使用隨機梯度下降法(Stochastic Gradient Descent Method)。其迭代格式為
其中\(r\in \\{1,2,\cdots,m\\}\)為隨機數。這種做法可以理解為隨機選擇一個訓練樣本,進行一次梯度下降的訓練。在機器學習的問題中,我們通常不需要真的求得最優值,這樣不精確的迭代,使得算法不容易過擬合。由於隨機梯度下降法的普及,與此相對的梯度下降法有時被稱為批量梯度下降法(Batch Gradient Descent Method),因為它同時考慮所有訓練樣本。介於批量梯度下降法和隨機梯度下降法之間,還有小批量梯度下降法(Min-Batch Gradient Descent Method),也就是每次迭代選擇若干個訓練樣本。
步長\(\alpha_k\)的選取
梯度下降法可采用BB步長(Barzilai Borwein)。BB步長有兩個計算公式,選擇其一即可。
\begin{aligned}
\alpha_k&=\frac{(\nabla f(x_k)-\nabla f(x_{k-1}))^T(x_k-x_{k-1})}{(\nabla f(x_k)-\nabla f(x_{k-1}))^T(\nabla f(x_k)-\nabla f(x_{k-1}))}\newline
\alpha_k&=\frac{(x_k-x_{k-1})^T(x_k-x_{k-1})}{(x_k-x_{k-1})^T(\nabla f(x_k)-\nabla f(x_{k-1}))}
\end{aligned}
BB步長適合我們在對步長選擇缺乏經驗的時候,它經常會有不錯的效果。
二、共軛梯度法
由於每次都是沿着當前的負梯度方向逼近極小值,梯度下降法往往不能很快地收斂到極小值點。改進的方法是,在上一次梯度方向的共軛方向上進行迭代。
在這里,不對原理和公式推導進行過多介紹。下面直接給出迭代的公式。
其中,\(d_k\)為迭代方向,它由下面的式子確定
這里使用系數\(\beta_k\)借助上一次的迭代方向\(d_{k-1}\),對迭代方向\(d_k\)進行一個修正。\(\beta_k\)的表達式不止一種,常用的式子如下
三、牛頓法
牛頓方向和梯度方向最大的差別是考慮了Hessian矩陣(我們記\(x_k\)處的Hessian矩陣為\(\nabla^2 f(x_k)\))。
牛頓法的迭代格式為
這里的步長\(\alpha_k\)有多種取法。但與梯度下降法不同的是,這里步長取\(1\)的效果通常不錯。值得注意的是,雖然我們寫作\(d_k=-(\nabla^2 f(x_k))^{-1} \nabla f(x_k)\),但在計算\(d_k\)時,並不真正求逆,而是去求解線性方程組\((\nabla^2 f(x_k))d_k=-\nabla f(x_k)\)。
假設\(f(x)\)是一元函數,那么上式將變為
牛頓法的局限
牛頓法在計算上有一下局限性
- 計算矩陣\(\nabla^2 f(x_k)\)可能要花費很長時間。
- 可能沒有足夠的內存去存儲矩陣\(\nabla^2 f(x_k)\)。
- \(\nabla^2 f(x_k)\)不一定可逆,也就是\((\nabla^2 f(x_k))^{-1}\)也就不一定存在。
因此一般只有當問題規模比較小,而且\(f(x_k)\)是嚴格凸函數的時候,我們才會考慮牛頓法。在其他情形下使用牛頓法,都需要設法進行一些修正。
四、擬牛頓法
牛頓法的局限性基本源於\(\nabla^2 f(x_k)\)。在擬牛頓法中,我們不直接使用\(\nabla^2 f(x_k)\),而是使用\(H_k\)近似代替。
在第一次迭代的時候,我們沒有任何有效信息可以用於選取\(H_0\),因此一般直接取\(H_0=I\)。對於\(H_{k+1}\)的確定方法,下面給出兩種方法,分別為BFGS(Brotden-Fletcher Goldfard Shanno)和DFP(Davidon Fletcher Powell)公式。為了書寫方便,我們令\(s_k=x_{k+1}-x_k\),\(y_k=\nabla f(x_{k+1})-\nabla f(x_k)\)。
BFGS公式:
DFP公式:
於是擬牛頓法的迭代公式變為
這里的步長\(\alpha_k\)可以使用某種線搜索方法進行確定。(關於線搜索,有時間寫一篇博文)
擬牛頓法很好地解決了Hessian矩陣的計算問題,但是仍然沒有解決存儲問題。一個很好的解決辦法是有限內存BFGS方法。這里不做進一步的介紹。
參考文獻
[1] 刁瑞,謝研. 電子工業出版社. 2016年. 算法筆記.
本文鏈接:www.superzhang.site/blog/common-method-of-unconstrained-optimization