优化算法——牛顿法与拟牛顿法(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的算法流程进行迭代更新。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值