实用优化算法总结——0.618法、梯度下降、牛顿法、共轭梯度、外罚、内罚

实用优化算法总结

实用优化算法的种类繁多,并且各自使用的领域有所区别,为此,设计有多种优化算法,本文着重介绍其中几种,见目录。
如有需要,matlab版代码会后期放出来
最优化问题,可以分为两大部分“无约束最优化问题”和“约束最优化问题”。

无约束最优化问题

黄金分割法

黄金分割法,也叫0.618(τ=0.618τ=0.618)法,这个方法可所谓足够简单,同时它适用的范围也就相对有限,需要给定单峰目标函数,以及代求区间[aa0bb0]
算法设计
步骤1:给定aa0>0,bb0>0,i=0,ε>0,τ=0.618τ=0.618
步骤2:若bbi-aai<ε,则αα*=bi+ai2\frac{b_i+a_i}{2},输出αα*,算法停止
步骤3:计算

αilα^l_i=aai++(1-ττ)((bbi-aai))
αirα^r_i=aai++ττ(bbi-aai))

步骤4:若αilα_i^l<αirα_i^r,则aai+1=aaibbi+1=αirα^r_i ,否则aai+1=αilα^l_ibbi+1=bbi ,转步骤2
通过上述算法步骤,容易得知当ττ时,从区间[aa0bb0]开始迭代,经过m次迭代后,区间长度为ττm(bb0-aa0).

流程图可能思路更清晰:
实用优化算法总结——0.618法、梯度下降、牛顿法、共轭梯度、外罚、内罚

那我们可能会想,既然区间在每次迭代都会缩短,那如何使它每次缩短到不能再缩短就可以达到最快速度了,基于这种想法,ττ可以取不同值,相较于0.618,事实上我们可以用斐波那契数列来替换每次的ττ

由于matlab涉及到多个文件,代码资源上传至网络较为方便,可自行下载。
例题:f(x)=ex+1/exf(x)=e^x+1/e^x 在[-1,2]区间内的极小值点、极小值,运行结果如下:
实用优化算法总结——0.618法、梯度下降、牛顿法、共轭梯度、外罚、内罚

最速下降法

最速下降法,又叫梯度下降法,具有代码实现简单、原理简单的特点。
通过梯度概念的学习,我面都知道梯度代表的方向是函数递增最快的方向,所以负梯度方向就是函数递进最快的方向,由此,我们利用函数每次的负梯度方向作为搜索方向,利用上述的黄金分割法搜索目标函数在搜索方向上的极小值作为前进的步长,详情见下方算法设计。

这里提到的搜索方向、步长类似于神经网络中的概念,如步长类似于学习率

算法设计:
步骤1:给出x0Rnx_0∈R^n×\timesRnR^n,k=0,ε>0
步骤2:若终止条件满足(gk<ε||g_k||<ε),则迭代停止
步骤3:计算dk=gkd_k=-g_k
步骤4:在dkd_k方向上利用一维精确线性搜索(如黄金分割法、多项式插值法)求步长αkα_k
步骤5:xk+1=xk+αkdkk=k+1x_{k+1}=x_k+α_kd_k,k=k+1,转步骤2

缺点:会产生Zigzag现象,由于采用精确搜索、且搜索方向为负梯度方向,造成了该方法收敛速度不够快,效率不高的缺点。

例题:min(x12+2x22)min(x_1^2+2x_2^2),初始点为x0=(4,4)x_0=(4,4),求最小值点。运行结果如下图:
实用优化算法总结——0.618法、梯度下降、牛顿法、共轭梯度、外罚、内罚

牛顿法

这个方法是个大家庭,其中有基本牛顿法、阻尼牛顿法、拟牛顿法
相较于梯度下降法,梯度下降法只用到了一次导数,而牛顿法引入高阶导数,提高了算法效率。
利用泰勒展开式:
qk(x)=f(x)=f(xk)+fT(xxk)+12(xxk)TGk(xxk)q_k(x)=f(x)=f(x_k)+▽f^T(x-x_k)+\frac{ 1}{ 2}(x-x_k)^TG_k(x-x_k)
当Gk正定时,qk(x)q_k(x)有唯一极小点,同时

qk(x+1)=0▽q_k(x+1)=0
Gk(xk+1xk)+fk=0G_k(x_{k+1}-x_k)+▽f_k=0
xk+1=xk+Gk1fkx_{k+1}=x_k+G^{-1}_k▽f_k递推式

通过上述的分析,可以得到牛顿法的递推式xk+1=xk+Gk1fkx_{k+1}=x_k+G^{-1}_k▽f_k,令dk=Gk1fkd_k=-G^{-1}_k▽f_kfk▽f_kgkg_k

基本牛顿法

算法设计:
步骤1:给出x0Rnx_0∈R^n×\timesRnR^n,k=0,ε>0
步骤2:若终止条件满足(gk<ε||g_k||<ε),则迭代停止
步骤3:计算dkd_k
步骤4:计算xk+1=xk+dkk=k+1x_{k+1}=x_k+d_k,k=k+1,转步骤2

特点:
1.当初始点选取位置靠近最优解位置时,算法可以达到二次收敛
2.对于正定二次函数,牛顿法可以一次迭代求出最优解
3.对多数问题并非全局收敛,收敛至鞍点、极大点的概率不小
4.计算量相对于梯度下降法增大,且计算机计算逆矩阵较为耗时

例题1:x12+4x22+9x322x1+18x2x_1^2+4x_2^2+9x_3^2-2x_1+18x_2 的极小点,求解结果如下:
初始点取得是x0=(1,1,1)x_0=(1,1,1)
实用优化算法总结——0.618法、梯度下降、牛顿法、共轭梯度、外罚、内罚
通过结果可以得知,对于正定二次函数,基本牛顿法经过一次迭代即可求解。

例题2:利用Newton法求解min(x11)2+2x22min (x_1-1)^2+2x_2^2的极小点,x0=(0,1)Tx_0=(0,1)^T,求解结果如下图:
实用优化算法总结——0.618法、梯度下降、牛顿法、共轭梯度、外罚、内罚
借助图像可以看出来,基本牛顿法对于非二次函数问题,求解较为低效。

阻尼牛顿法

算法设计:
步骤1:给出x0Rnx_0∈R^n×\timesRnR^n,k=0,ε>0
步骤2:若终止条件满足(gk<ε||g_k||<ε),则迭代停止
步骤3:计算dkd_k,在dkd_k方向上利用一维精确线性搜索(如黄金分割法、多项式插值法)求步长αkα_k
步骤4:计算xk+1=xk+αkdkk=k+1x_{k+1}=x_k+α_kd_k,k=k+1,转步骤2

相较于基牛顿法,阻尼牛顿法在其基础上,使用了线性搜索,克服了基本牛顿法的3、4缺点

LM方法:克服G1G^{-1}奇异、非正定的问题

由于上述的基本牛顿法、阻尼牛顿法,均使用到了G1G^{-1},且要求GG为正定矩阵,但现实情况不可能总符合要求。

gkTdk<0g^T_kd_k<0,即gkTGk1gk<0-g^T_kG^{-1}_kg_k<0,则dkd_k为下降方向

GG非正定时,我们知道特征值(λi,iNλ_i,i∈N)非全部大于0,此时我们需要对矩阵GG进行改造:(II为单位矩阵,vk>0v_k>0)

(Gk+vkI)d=gk(G_k+v_kI)d=-g_k

此时矩阵(Gk+vkI)(G_k+v_kI)的特征值为λi+vk,iNλ_i+v_k,i∈N,若是所有特征值均大于0,则vkv_k取合适值即可。

拟牛顿法

也是本人最为喜欢的一种优化算法,方法思想,引入矩阵HkH_k逼近Gk1G_k^{-1},而并非直接计算Gk1G_k^{-1}
算法设计:
步骤1:给出x0Rnx_0∈R^n×\timesRnR^n,对称正定矩阵H0RnH_0∈R^n×\timesRnR^nk=0ε>0k=0,ε>0
步骤2:若终止条件满足(gk<ε||g_k||<ε),则迭代停止
步骤3:计算dk=Hkgkd_k=-H_kg_k,在dkd_k方向上线性搜索求步长αkα_k,计算xk+1=xk+αkdkx_{k+1}=x_k+α_kd_k
步骤4:更新HkH_kHk+1H_{k+1},使得Hk+1H_{k+1}满足A式,k=k+1k=k+1,转步骤2
A式:

  • 秩一矫正:Hk+1=Hk+βuuTH_{k+1}=H_k+βuu^Tu,βRnu,β∈R^n×\timesRnR^n
    Hk+1SR1=Hk+(skHkyk)(skHkyk)T(skHkyk)TykH_{k+1}^{SR1}=H_k+\frac{(s_k-H_ky_k)(s_k-H_ky_k)^T}{ (s_k-H_ky_k)^Ty_k}
    实现简单,但此方法不能满足正定继承性
  • DFP公式:
    Hk+1DFP=Hk+skskTskTykHkykykTHkykTHkykH_{k+1}^{DFP}=H_k+\frac{s_ks_k^T}{s_k^Ty_k}-\frac{H_ky_ky_k^TH_k}{y_k^TH_ky_k}
    满足正定继承性,即H0H_0为正定则HkH_k为正定
  • BFGS公式:(被誉为最好用的算法)
    Hk+1BFGS=Hk+(1+ykTHkykykTsk)skskTykTsk(skykTHk+HkykskTykTsk)H_{k+1}^{BFGS}=H_k+(1+\frac{y_k^TH_ky_k}{y_k^Ts_k})\frac{s_ks_k^T}{y_k^Ts_k}-(\frac{s_ky_k^TH_k+H_ky_ks_k^T}{y_k^Ts_k})

特点:
1.克服了牛顿法计算量大的问题
2.避免了矩阵非正定的问题
3.效率高,收敛快,具有二次终止性

例题:利用DFP拟牛顿法求解min(x12+x22x1x2+2x14x2)min(x_1^2+x_2^2-x_1x_2+2x_1-4x_2)的最优解,运行结果如下图
实用优化算法总结——0.618法、梯度下降、牛顿法、共轭梯度、外罚、内罚
好用!

共轭方向法

下次更新再写吧
未完待续……

约束最优化问题

三道例题见-> 已上传