優化算法——牛頓法與擬牛頓法(DFP / BFGS)

工作中遇到優化的問題,回顧一下當初學過的基本優化算法。

 

本博客主要考慮無約束且非線性的極小化優化問題

\underset{\mathbf{x}}{min} f(\mathbf{x})         (1)

 \mathbf{x}=(x_1,x_2,...,x_N)^T\in \mathbb{R}^N

在工作中遇到的變量和函數值均爲1維變量,方便理解和處理。

 

一、牛頓法

直接貼合工作目標,考慮變量\mathbf{x}的維度爲N=1的情形。

牛頓法的算法思想:給定一個隨機初始點,在該點附近對目標函數f(x)二階泰勒展開,找到下一個迭代點,重複上述方式直至找到極值點。

 

x_k爲當前迭代點(即當前極值點),則當前泰勒展開式如下所示:

f(x)=f(x_k)+f^{'}(x_k)(x-x_k)+\frac{1}{2}f^{''}(x_k)(x-x_k)^2+o((x-x_k)^2),        (2)

\phi(x)=f(x_k)+f^{'}(x_k)(x-x_k)+\frac{1}{2}f^{''}(x_k)(x-x_k)^2        (3)

其中,o((x-x_k)^2)表示(x-x_k)的高於2階的無窮小,忽略該值後使用\phi(x)近似表示f(x)

 

此時,對於函數\phi(x)根據求極值的必要條件(極值點導數趨近於0)有:

\phi^{'}(x)=f^{'}(x_k)+f^{''}(x_k)(x-x_k)=0,        (4)

x=x_k-\frac{f^{'}(x_k)}{f^{''}(x_k)}        (5)

 

根據上述公式及牛頓法算法思想,給定初試迭代點x_0,則可以構造如下迭代公式:

x_{k+1}=x_k-\frac{f^{'}(x_k)}{f^{''}(x_k)},k=0,1,2,...        (6)

從初始迭代點x_0開始可以通過公式(6)迭代產生序列\{x_k\}逼近目標函數f(x)的極小值點。

 

對於N > 1的情況,可以將二階泰勒展開式(3)作如下推廣:

\phi(\mathbf{x})=f(\mathbf{x}_k)+\bigtriangledown f(\mathbf{x}_k)(\mathbf{x}-\mathbf{x}_k)+\frac{1}{2}(\mathbf{x}-\mathbf{x}_k)^T\bigtriangledown ^2 f(\mathbf{x}_k)(\mathbf{x}-\mathbf{x}_k),       (7)

\bigtriangledown ff的梯度向量(簡記爲\mathbf{g}\bigtriangledown f(x_k)=\mathbf{g}_k),\bigtriangledown ^2 ff的海塞矩陣(Hessian Matrix,簡記爲\mathbf{H}\bigtriangledown ^2 f(x_k)=\mathbf{H}_k),即:

\bigtriangledown f=\begin{bmatrix} \frac{\partial f}{\partial x_1}\\ \frac{\partial f}{\partial x_2}\\ ...\\ \frac{\partial f}{\partial x_N} \end{bmatrix}, \bigtriangledown^2 f=\begin{bmatrix} \frac{\partial^2f}{\partial x_1^2} & \frac{\partial^2f}{\partial x_1 \partial x_2} & ... & \frac{\partial^2f}{\partial x_1 \partial x_N}\\ \frac{\partial^2f}{\partial x_2 \partial x_1} & \frac{\partial^2f}{\partial x_2^2} & ... & \frac{\partial^2f}{\partial x_2 \partial x_N} \\ ... & ... & ... & ... \\ \frac{\partial^2f}{\partial x_N \partial x_1} & \frac{\partial^2f}{\partial x_N \partial x_2} & ... & \frac{\partial^2f}{\partial x_N^2} \end{bmatrix}       (8)

根據極值的必要條件對公式(7)求導可得:

\bigtriangledown \phi(x)=\mathbf{g}_k+\mathbf{H}_k(\mathbf{x}-\mathbf{x}_k)=0       (9)

此時,根據公式(9)可知,那麼類似公式(5)可得基本迭代公式如下所示:

矩陣{\color{Red} \mathbf{H}_k}非奇異         =>         {\color{Purple} \mathbf{x}_{k+1}=\mathbf{x}_k-\mathbf{H}_k^{-1}\mathbf{g}_k}      (10)   =>         原始牛頓迭代法

該迭代公式的搜索方向定義爲\mathbf{d}_k = -\mathbf{H}_k^{-1}\mathbf{g}_k,也稱爲牛頓方向。

 

注意:原始牛頓法中,只有搜索方向,而缺少步長。那麼當遇到非二次型目標函數時,可能出現更新後目標函數值變大的的情況,即原始牛頓法不能保證目標函數值一直下降。

 

二、擬牛頓法

第一節詳細介紹了牛頓法的公式推導,整個原始牛頓法的核心就是公式(10)

注意其中需要計算當前迭代點\mathbf{x}_k的一階導數\mathbf{g}_k、二階導數的逆\mathbf{H}_k^{-1},這可能導致計算複雜度加大、且有可能遇到Hessian矩陣非正定而無法求逆的情況,從而導致原始牛頓迭代法失效。

爲了克服上述問題,擬牛頓法就被提出了。顧名思義,擬牛頓法類似牛頓法,不同的是:擬牛頓法不直接求二階導數,而是採用近似的方式擬合Hessian矩陣或Hessian矩陣的逆,該近似矩陣保證正定,從而進行優化迭代

 

2.0 擬牛頓條件

對求極值的必要條件(即公式(9))代入\mathbf{x}=\mathbf{x}_{k+1}可得:

\bigtriangledown \phi(\mathbf{x_{k+1}})=\mathbf{g}_k+\mathbf{H}_{k+1}(\mathbf{x}_{k+1}-\mathbf{x}_k)\approx =\mathbf{g}_{k+1},    (11)

\mathbf{g}_{k+1}-\mathbf{g}_k\approx \mathbf{H}_{k+1}(\mathbf{x}_{k+1}-\mathbf{x}_k)=0,    (12)

在公式(12)中引入記號:

\mathbf{y}_k=\mathbf{g}_{k+1}-\mathbf{g}_k,\mathbf{s}_k=\mathbf{x}_{k+1}-\mathbf{x}_k     (13)

則公式(12)可以通過公式(13)的記號轉化爲:

\mathbf{y}_{k}\approx \mathbf{H}_{k+1}\mathbf{s}_{k},    (14)

\mathbf{s}_{k}\approx \mathbf{H}_{k+1}^{-1}\mathbf{y}_{k},    (15)

公式(14)和公式(15)即爲擬牛頓條件。在擬牛頓法中使用\mathbf{B}_{k+1}近似矩陣\mathbf{H}_{k+1} or 使用\mathbf{D}_{k+1}近似矩陣\mathbf{H}_{k+1}^{-1}

{\color{Red} \mathbf{y}_{k} = \mathbf{B}_{k+1}\mathbf{s}_{k}},    (16)

{\color{Red} \mathbf{s}_{k}= \mathbf{D}_{k+1}\mathbf{y}_{k}}.    (17)

 

接下來,就按照不同的近似方式介紹擬牛頓法的具體實現方式。

 

2.1. DFP  {\color{Red} \mathbf{s}_{k}= \mathbf{D}_{k+1}\mathbf{y}_{k}}.

DFP算法的核心思想:使用\mathbf{D}_{k+1}近似Hessian矩陣的逆\mathbf{H}_{k+1}^{-1}

DFP算法的迭代格式:

\mathbf{D}_{k+1}=\mathbf{D}_{k}+\bigtriangledown \mathbf{D}_{k},k=0,1,2,...    (18)

其中,初始化的\mathbf{D}_{0}取單位矩陣\mathbf{I},接下來推導校正矩陣\bigtriangledown \mathbf{D}_{k}的構造方式,

 

TRICKY METHOD:

爲保證\bigtriangledown \mathbf{D}_{k}的對稱正定性,直接假設

\bigtriangledown \mathbf{D}_{k}=\alpha \mathbf{u} \mathbf{u}^T + \beta \mathbf{v} \mathbf{v}^T,    (19)

將公式(18)和公式(19)代入公式(17)可得,

\mathbf{s}_{k}= (\mathbf{D}_{k}+\bigtriangledown \mathbf{D}_{k})\mathbf{y}_{k}=(\mathbf{D}_{k}+\alpha \mathbf{u} \mathbf{u}^T + \beta \mathbf{v} \mathbf{v}^T)\mathbf{y}_{k},    (20)

\mathbf{s}_{k}= \mathbf{D}_{k}\mathbf{y}_{k}+\alpha \mathbf{u} \mathbf{u}^T\mathbf{y}_{k} + \beta \mathbf{v} \mathbf{v}^T\mathbf{y}_{k},    (21)

\mathbf{s}_{k}= \mathbf{D}_{k}\mathbf{y}_{k} +\mathbf{u} {\color{Red} (\alpha \mathbf{u}^T\mathbf{y}_{k} )} + \mathbf{v} {\color{Red} (\beta \mathbf{v}^T\mathbf{y}_{k})},    (22)

\mathbf{s}_{k}= \mathbf{D}_{k}\mathbf{y}_{k} +{\color{Red} (\alpha \mathbf{u}^T\mathbf{y}_{k} )}\mathbf{u} + {\color{Red} (\beta \mathbf{v}^T\mathbf{y}_{k})}\mathbf{v} ,    (23)

注意,公式(22)和公式(23)中紅色括號內的內容均爲實值,所以DFP的Tricky1就是對這兩個數字做簡單賦值

{\color{Red} \alpha \mathbf{u}^T\mathbf{y}_{k} } =1,    (24)

{\color{Red} \beta \mathbf{v}^T\mathbf{y}_{k}}=-1,    (25)

通過公式(24)和公式(25)可得\alpha\beta的值:

\alpha =\frac{1}{\mathbf{u}^T\mathbf{y}_{k}},    (26)

\beta =-\frac{1}{\mathbf{v}^T\mathbf{y}_{k}},    (27)

至此,我們想要求\bigtriangledown \mathbf{D}_{k}依舊需要確定\mathbf{u}\mathbf{v}的值,通過將公式(24)(25)代入公式(22)(23)可得:

\mathbf{s}_{k}= \mathbf{D}_{k}\mathbf{y}_{k} +\mathbf{u} - \mathbf{v},    (28)

\mathbf{s}_{k}- \mathbf{D}_{k}\mathbf{y}_{k} =\mathbf{u} - \mathbf{v},    (29)

此時,DFP的Tricky2就是直接將公式(29)左右兩邊對應位置的元素取相等,即:

\mathbf{u}=\mathbf{s}_{k},    (30)

\mathbf{v}= \mathbf{D}_{k}\mathbf{y}_{k},    (31)

將公式(30)(31)分別代入公式(26)(27)可得\alpha\beta的值:

\alpha =\frac{1}{\mathbf{s}_k^T\mathbf{y}_{k}},    (32)

\beta =-\frac{1}{\mathbf{y}_{k}^T \mathbf{D}_{k} \mathbf{y}_{k}},    (33)

此時,根據公式(19)(30)(31)(32)(33)可推導出\bigtriangledown \mathbf{D}_{k}的值:

\mathbf{{\color{Red} \bigtriangledown \mathbf{D}_{k}=\frac{\mathbf{s}_k \mathbf{s}_k^T}{\mathbf{s}_k^T\mathbf{y}_{k}} -\frac{\mathbf{D}_{k}\mathbf{y}_{k}\mathbf{y}_{k}^T\mathbf{D}_{k}}{\mathbf{y}_{k}^T \mathbf{D}_{k} \mathbf{y}_{k}}}},    (34)

 

DFP算法流程:

1 給定初始迭代點 \mathbf{x}_0 和迭代精確到閾值 \epsilon ,初始的近似Hessian矩陣\mathbf{D}_{0}=I,迭代次數k=0

2 計算 \mathbf{g}_k 和 \mathbf{D}_{k} 來確定搜索方向 \mathbf{d}_k = -\mathbf{D}_k\mathbf{g}_k ;

3 利用Wolfe方法(步長搜索的方式)得到搜索步長 \lambda _k,更新迭代點位置 \mathbf{x}_{k+1}=\mathbf{x}_k+\lambda _k \mathbf{d}_k

4 若滿足 ||\mathbf{g}_{k+1}||\leqslant \epsilon,達到終止條件,結束;

5. 否則,計算 \mathbf{y}_k=\mathbf{g}_{k+1}-\mathbf{g}_k,\mathbf{s}_k=\mathbf{x}_{k+1}-\mathbf{x}_k

6 計算 \mathbf{D}_{k+1}=\mathbf{D}_{k}+\frac{\mathbf{s}_k \mathbf{s}_k^T}{\mathbf{s}_k^T\mathbf{y}_{k}} -\frac{\mathbf{D}_{k}\mathbf{y}_{k}\mathbf{y}_{k}^T\mathbf{D}_{k}}{\mathbf{y}_{k}^T \mathbf{D}_{k} \mathbf{y}_{k}}

7 令 k:=k+1,轉至步驟2繼續。

 

2.2. BFGS {\color{Red} \mathbf{y}_{k} = \mathbf{B}_{k+1}\mathbf{s}_{k}},

BFGS算法的思想與DFP類似,推導流程也類似。

算法的核心思想:使用使用\mathbf{B}_{k+1}近似Hessian矩陣\mathbf{H}_{k+1}

BFGS算法的迭代格式:

\mathbf{B}_{k+1}=\mathbf{B}_{k}+\bigtriangledown \mathbf{B}_{k},k=0,1,2,...    (35)

其中,初始化的\mathbf{B}_{0}取單位矩陣\mathbf{I},接下來類似DFB直接推導校正矩陣\bigtriangledown \mathbf{B}_{k}的構造方式,

 

TRICKY METHOD:

爲保證\bigtriangledown \mathbf{B}_{k}的對稱正定性,直接假設

\bigtriangledown \mathbf{B}_{k}=\alpha \mathbf{u} \mathbf{u}^T + \beta \mathbf{v} \mathbf{v}^T,    (36)

之後就是完完全全的公式推導過程:

\\ \mathbf{y}_{k} = (\mathbf{B}_{k}+\bigtriangledown \mathbf{B}_{k})\mathbf{s}_{k}, \\\mathbf{y}_{k} = (\mathbf{B}_{k}+\alpha \mathbf{u} \mathbf{u}^T + \beta \mathbf{v} \mathbf{v}^T)\mathbf{s}_{k}, \\\mathbf{y}_{k} = \mathbf{B}_{k}\mathbf{s}_{k}+\alpha \mathbf{u} \mathbf{u}^T \mathbf{s}_{k}+ \beta \mathbf{v} \mathbf{v}^T\mathbf{s}_{k}, \\\mathbf{y}_{k} = \mathbf{B}_{k}\mathbf{s}_{k}+{\color{Red} (\alpha \mathbf{u}^T \mathbf{s}_{k}) }\mathbf{u} + {\color{Red} (\beta \mathbf{v}^T\mathbf{s}_{k} ) }\mathbf{v} ,    (37)

進入BFGS的Tricky

{\color{Red} \alpha \mathbf{u}^T\mathbf{s}_{k} } =1,{\color{Red} \beta \mathbf{v}^T\mathbf{s}_{k}}=-1    (38)

\mathbf{u}=\mathbf{y}_{k},\mathbf{v}= \mathbf{B}_{k}\mathbf{s}_{k},    (39)

此時,根據公式(37)(38)(39)可推導出\bigtriangledown \mathbf{D}_{k}的值:

\mathbf{{\color{Red} \bigtriangledown \mathbf{B}_{k}=\frac{\mathbf{y}_k \mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_{k}} -\frac{\mathbf{B}_{k}\mathbf{s}_{k}\mathbf{s}_{k}^T\mathbf{B}_{k}}{\mathbf{s}_{k}^T \mathbf{B}_{k} \mathbf{s}_{k}}}},    (40)

\mathbf{B}_{k+1}=\mathbf{B}_{k}+\frac{\mathbf{y}_k \mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_{k}} -\frac{\mathbf{B}_{k}\mathbf{s}_{k}\mathbf{s}_{k}^T\mathbf{B}_{k}}{\mathbf{s}_{k}^T \mathbf{B}_{k} \mathbf{s}_{k}},    (41)

 

對比DFP的公式(34)和BFGS的公式(40)可以發現,更新方式只是 \mathbf{s}_{k} 和 \mathbf{y}_{k} 的位置互換。

 

通過公式(41)可以得到近似的Hessian矩陣,但在實際更新中使用的搜索方向是\mathbf{d}_k = -\mathbf{B}_k^{-1}\mathbf{g}_k,這裏使用 \mathbf{Sherman-Morrison} 公式直接給出 \mathbf{B}_{k+1}^{-1} 與 \mathbf{B}_{k}^{-1} 間的關係:

\mathbf{B}_{k+1}^{-1}=(I-\frac{\mathbf{s}_k \mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_{k}}) \mathbf{B}_{k}^{-1} (I-\frac{\mathbf{y}_k \mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_{k}}) + (I-\frac{\mathbf{s}_k \mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_{k}}),    (42)

\mathbf{B}_{k+1}^{-1}=\mathbf{B}_{k}^{-1}+(\frac{1}{\mathbf{s}_{k}^T\mathbf{y}_{k}}+\frac{\mathbf{y}_{k}^T\mathbf{B}_{k}^{-1}\mathbf{y}_{k}}{(\mathbf{s}_{k}^T\mathbf{y}_{k})^2})\mathbf{s}_{k}\mathbf{s}_{k}^T-\frac{1}{\mathbf{s}_{k}^T\mathbf{y}_{k}}(\mathbf{B}_{k}^{-1}\mathbf{y}_{k}\mathbf{s}_{k}^T+\mathbf{s}_{k}\mathbf{y}_{k}^T\mathbf{B}_{k}^{-1}),    (43)

至此,BFGS算法可以使用類似DFP的算法流程進行迭代更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章