优化是自然界和人类社会最为普遍行为,物理系统趋于较低的能量,化学分子相互作用以达到最小的电子势能,投资者寻求最佳收益,工程师寻求最佳性能,优化是宇宙运行的本质之一。在本文中,我们将主要讨论非线性规划的数值方法。
根据函数性质,优化问题可分为线性优化和非线性优化;根据是否含有约束,可以分为无约束优化和有约束优化。一般来说,有约束优化问题要比无约束优化问题更难求解,因此本文将先介绍非线性优化的求解算法,再介绍非线性规划的内点法。阅读本文之前最好对高等数学的基础知识有一定了解。
非线性优化
问题描述与必要性条件
非线性优化问题是指,对于一个给定的非线性函数 f ( x ) f(x) f(x),确定出使函数值最小的自变量 x x x:
min x f ( x ) \min _{x} f(x) xminf(x)
其中 f ( x ) f(x) f(x)称为目标函数, x x x称为未知量或参数。实际情况中的最大化问题一般都可以通过简单的变换转化为最小值问题,因此我们仅考虑最小化一种情况。由高等数学可知,在无约束的情况下,该问题的解应满足如下一阶条件和二阶条件:
一阶必要条件: ∇ f ( x ∗ ) = 0 \nabla f\left(x^{*}\right)=0 ∇f(x∗)=0
二阶必要条件: ∇ f ( x ∗ ) = 0 , ∇ 2 f ( x ∗ ) ≥ 0 \nabla f(x^*)=0, \nabla^2 f(x^*)\ge 0 ∇f(x∗)=0,∇2f(x∗)≥0
对于参数为多维的情况, ∇ f ( x ∗ ) \nabla f\left(x^{*}\right) ∇f(x∗)表示梯度向量, ∇ 2 f ( x ∗ ) \nabla^2 f\left(x^{*}\right) ∇2f(x∗)表示海森矩阵,而符号 ≥ \ge ≥表示海森矩阵半正定。一阶必要条件表明目标函数达到极值点,而二阶必要条件进一步将其限定为极小值点。对于一般情况,二阶必要条件只能判定其为局部最优解,而不一定为全局最小值;只有当目标函数为凸函数时,局部极小才等价为全局极小值。
非线性优化的数值方法
对于复杂的非线性函数,计算机没办法根据必要条件直接得到解,而是一般通过数值迭代的方法从一个初始点一步步逼近问题的解 x ∗ x^* x∗。用数学的语言表述为,从一个初始点 x 0 x_0 x0,通过构造一个迭代序列 { x k } k = 0 ∞ \left\{x_{k}\right\}_{k=0}^{\infty} { xk}k=0∞,使 x k → x ∗ x_k\to x^* xk→x∗。这种迭代的思路可以分为两种:线搜索算法和置信域算法。在本文中我们主要讨论线搜索的方法。
在线搜索策略中,算法每次迭代会先在当前参数 x k x_k xk处确定一个参数的迭代方向 d k d_k dk,然后让参数在该方向上移动一定步长 α k \alpha_k αk,即:
x k + 1 = x k + α k d k x_{k+1}=x_k+\alpha_k d_k xk+1=xk+αkdk
迭代步长
假定我们已经确定了一个迭代方向 d k d_k dk,则原优化问题可以转化为一个一维搜索问题:
min α > 0 f ( x k + α d k ) \min _{\alpha>0} f\left(x_{k}+\alpha d_{k}\right) α>0minf(xk+αdk)
我们可以进行精确一维搜索,采用例如二分法、黄金分割法来求出该一维问题的最佳步长;当然我们也可以采用非精确一维搜索来确定 α k \alpha_k αk,只要其满足:
f ( x k + α k d k ) < f ( x k ) f(x_k+\alpha_k d_k) < f(x_k) f(xk+αkdk)<f(xk)
实际上,在现代优化算法中,一般采取非精确一维搜索的策略,甚至直接固定步长参数 α \alpha α,虽然其每次迭代目标函数的下降幅度不如精确一维搜索,但整体的优化效率更高。
梯度法
非线性优化的主要问题在于确定一个适当的迭代方向 d k d_k dk。最速下降方向,即负梯度方向 − ∇ f ( x k ) -\nabla f(x_k) −∇f(xk)是最明显的迭代方向,它本身就描述目标函数下降最快的方向。除了最速下降方向,任何与其夹角小于 π / 2 \pi/2 π/2的方向,都可以作为迭代方向,都能够保证目标函数下降。即 d k = − B k ∇ f k d_k=-B_k \nabla f_k dk=−Bk∇fk, B k B_k Bk为·正定矩阵。如图所示,灰色表示原函数的等高线,蓝色向量表示目标函数梯度,同样指向了等高线的法向,红色表示一种可行的迭代方向。
上面我们已经说过,在确定了迭代方向后,可以采用线搜索的方法来确定合适的迭代步长。由于精确一维搜索比较耗时,因此往往采用非精确一维搜索策略,使 f k + 1 < f k f_{k+1}<f_k fk+1<fk:
x k + 1 = x k − α k ∇ f k x_{k+1}=x_k-\alpha_k\nabla f_k xk+1=xk−αk∇fk
梯度下降法简单直观,但对复杂问题的求解效果往往不太理想,尤其是当迭代点接近最优点时,函数梯度会变得很小,优化速度也因而变得很慢,下图所示。
牛顿法
另一种更常用的方法是Newtown法。考虑对目标函数 f ( x ) f(x) f(x)在 x = x k x=x_k x=xk处进行二阶泰勒近似:
f ( x k + d ) ≈ f k + d T ∇ f k + 1 2 d T ∇ 2 f k d = def m k ( d ) f\left(x_{k}+d\right) \approx f_{k}+d^{T} \nabla f_{k}+\frac{1}{2} d^{T} \nabla^{2} f_{k} d \stackrel{\text { def }}{=} m_{k}(d) f(xk