最优化问题—非线性规划(二)

在之前的文章最优化问题—非线性规划(一)里面,我们主要关注了对于非线性规划的一般形式和最优条件,在最后我们介绍了关于凸规划的相关定义和其最优条件。下面,我们要介绍的是关于对于非线性规划问题的一般的求解思路。

1. 非线性规划的求解思路

1.1 迭代法以及其基本思想

对于非线性规划问题的求解,一般情况下,我们都是采用迭代法进行求解,这种方法的思路很简单,首先给定一个初始的点Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数,按照某种迭代法则产生一个点Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_02,使得当Python非线性规划最优解要是整数 非线性最优规划法_迭代法_03是又穷点列是,其最后一个点是最优化模型问题的最优解:当Python非线性规划最优解要是整数 非线性最优规划法_迭代法_03是无穷点列的时候,它有一个极限点,其极限点是最优化模型的最优解。

举一个具体的例子来说,在最经典的BP神经网络中,我们随机初始化网络参数,正是通过这种迭代的思路在最小化误差的基础上来迭代生成最优的参数。

这里,我们在进一步来说明,在上述的思路中,我们提到了,迭代法需要根据某一种方法来产生一个点Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_05,那么我们应该如何选择这种迭代方法或者说如何评价这种方法的优劣呢?

迭代点列能够稳定的接近局部极小点Python非线性规划最优解要是整数 非线性最优规划法_线性规划_06的邻域,然后能够迅速收敛到Python非线性规划最优解要是整数 非线性最优规划法_线性规划_06,当给定的某种收敛规则满足之后,迭代终止。一般的,我们迭代产生的点的集合Python非线性规划最优解要是整数 非线性最优规划法_迭代法_03的极限为一个局部极小点,我们以此来作为一个迭代算法优劣的评价标准。

1.2 迭代法的核心步骤

在了解了基本思想之后,我们将目光聚焦在这种方法的核心步骤上。
首先,设Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_09是某种迭代算法的第k轮迭代点,Python非线性规划最优解要是整数 非线性最优规划法_线性规划_10是第k+1轮的迭代点,令Python非线性规划最优解要是整数 非线性最优规划法_迭代_11,也就是Python非线性规划最优解要是整数 非线性最优规划法_迭代法_12。这里根据Python非线性规划最优解要是整数 非线性最优规划法_迭代法_13我们可以知道,Python非线性规划最优解要是整数 非线性最优规划法_迭代_14也是一个向量的形式,并且,这个向量表示以Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_02为起点,Python非线性规划最优解要是整数 非线性最优规划法_迭代_16为重点的向量表示。

则进一步,我们去这个向量的方向,也就是令Python非线性规划最优解要是整数 非线性最优规划法_迭代_17表示在Python非线性规划最优解要是整数 非线性最优规划法_迭代_14方向上的单位向量。我们最后在取一个关于这个单位向量的长度系数Python非线性规划最优解要是整数 非线性最优规划法_迭代_19,最后,对于Python非线性规划最优解要是整数 非线性最优规划法_迭代_20来进行最终的表示。

最后,我们表达式也变成了:
Python非线性规划最优解要是整数 非线性最优规划法_线性规划_21

我们将Python非线性规划最优解要是整数 非线性最优规划法_迭代_19称为步长,将Python非线性规划最优解要是整数 非线性最优规划法_迭代_23称为第k轮迭代的搜索方向。由此可以知道,当我们选择不同的步长和不同的确定方向之后,这也就构成了不同的迭代方法。

小结一下,这里我们确定了如何进行更新的核心步骤,在这个步骤中,我们发现了一个新的问题,那就是如何选择步长Python非线性规划最优解要是整数 非线性最优规划法_迭代_19和如何确定更新的方向Python非线性规划最优解要是整数 非线性最优规划法_迭代_23。关于这两个步骤的求解,我们将在下面以及之后的文章中进行具体的介绍。

1.3 迭代法的基本流程

在了解了迭代法的核心步骤以及基本思路之后,我们对迭代法的流程进行描述:

  1. 确定搜索方向Python非线性规划最优解要是整数 非线性最优规划法_迭代_26:即依照一定的准则,构造f在Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_27点处的下降方向作为搜索方向。
  2. 确定步长λ,是目标函数值有某种意义的下降。
  3. 对当前搜索的点进行更新,也及时Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_28,如果Python非线性规划最优解要是整数 非线性最优规划法_线性规划_29满足某种终止条件,则停止迭代,得到近似最优解Python非线性规划最优解要是整数 非线性最优规划法_线性规划_29,否则,重复上面的步骤。

算法框架如下图所示:

Python非线性规划最优解要是整数 非线性最优规划法_迭代法_31


这这一段的描述中,我们除了对于步长和方向的求解方法不确定之外,还引入了另外的一个问题,那就是如何控制迭代的停止?也就是应该如何定义停止条件?

小结一下,通过该段的介绍,能够知道迭代法的基本流程,根据上一段和本段的,描述,我们也知道的了下面需要解的问题包括步长,方向和迭代停止条件。

1.4 方向问题

在这一节中,我们首先要解决的是方向问题,这里我们需要先了解到下降方向可行下降方向

下降方向: 是指对于目标函数Python非线性规划最优解要是整数 非线性最优规划法_迭代法_32,向量p∈Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_33(p≠0),如果存在δ>0,任意的λ∈(0,δ),都有Python非线性规划最优解要是整数 非线性最优规划法_迭代法_34,则称向量p为函数在Python非线性规划最优解要是整数 非线性最优规划法_迭代_35的下降方向。同时,凡是满足这种迭代性质的最优化方法都可以成为下降方法。

通俗一点的来说,我们所获得的方向p,要能够保证x的邻域内的其他的点的函数值是要小于x的函数值,这种我们能够保证在不断的对点x进行迭代更新的时候,函数值是不断下降的。

可行下降方向: 在有约束的规划问题中,我们首先要保证的是x在其可行域内进行迭代,也就是说,x在通过步长和方向进行转移之后新生成的点也必须保证在可行域内。这种下降的方向称为可行下降方向。

在上篇文章中,我们着重回顾了梯度这个概念,梯度表示了在当前点x的最快的是的函数值增大的方向,同理,当我们把梯度值取到相反的方向的时候,我们能够获得也是最快下降的一个方向。所以这里我们就给出了使用负梯度作为下降方向的方法。当然,这是一种最为常见的方法,有兴趣的读者可以可以查阅求他的关于下降反向如何确定的方法。

1.5 步长因子

在解决了关于下降方向如何确定之后,我们来关注上面的第二个问题,如何确定步长因子?这里,我先回顾目标函数的形式为Python非线性规划最优解要是整数 非线性最优规划法_线性规划_36,在进行迭代之后,函数值变成了Python非线性规划最优解要是整数 非线性最优规划法_线性规划_37,步长因子是一个标量,p代表一个反向,我们利用上一段的方法以及可以进行确定了。换一个角度来讲,我们之前是将输入的点x作为f的变量,同理对于位置量λ而言,其也可以是f的一个变量。我们用公式来表示就是:
Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_38
对于第k+1轮迭代的函数值,显然我们已经能够知道当前的点Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_02,以及在Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_02处的下降方向Python非线性规划最优解要是整数 非线性最优规划法_迭代_23,λ就顺理成章的称为了我们在第k+1轮要确定的参数。同时,我们希望尽量的减少迭代的次数,这样可以降低算法的时间复杂度。那么我们就希望每一次能够尽量的去降低目标函数值。这也就是上面公式成立的意义。

在确定了最优步长和下降方向之后,就可以给出一个使用最优步长和下降方向进行更新的定理:

定理:设目标函数f(x)具有连续的一阶偏导数,Python非线性规划最优解要是整数 非线性最优规划法_迭代_16则可以有下面的规则进行产生:

Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_43
Python非线性规划最优解要是整数 非线性最优规划法_线性规划_21
则有,Python非线性规划最优解要是整数 非线性最优规划法_迭代法_45

前两个公式想必大家能够明白其中的含义了,我们来看最优的这个公式,在这个公式中,其说明了一维的最优搜索步长Python非线性规划最优解要是整数 非线性最优规划法_迭代_19,所对应的点Python非线性规划最优解要是整数 非线性最优规划法_迭代_16的目标函数的梯度Python非线性规划最优解要是整数 非线性最优规划法_迭代_48与下降方向Python非线性规划最优解要是整数 非线性最优规划法_迭代法_49正交。
这个部分很好说明,我们以步长λ作为变量,f作为目标函数,其最优的步长Python非线性规划最优解要是整数 非线性最优规划法_迭代_19肯定对应着函数f关于λ的导数为0(极值点)。那么则有Python非线性规划最优解要是整数 非线性最优规划法_线性规划_51,则将f的公式展开就有Python非线性规划最优解要是整数 非线性最优规划法_迭代_52

对于最优步长的搜索,一般是采用线性搜索的方式来确定最优的λ,对于线性搜索的相关思想和方法,我们将在下一篇文章中进行具体的介绍。

1.6 小结

通过上几个小结的描述,我们知道了如何确定方向,如何确定步长(具体算法在下一篇文章中说明)。显然这种利用梯度作为方向和线性搜索最优步长的方法只能算作是一类求解非线性规划问题的方法。其不能适应与所有的非线性最优化问题,最简单的原因在于我们无法保证目标函数是有梯度值的。

对于这种方法而言,其迭代映射的方法我们假设为Python非线性规划最优解要是整数 非线性最优规划法_迭代_53,则下一个迭代的点为:
Python非线性规划最优解要是整数 非线性最优规划法_迭代_54
而我们最终迭代的目的是希望能够找到一个使得目标函数最小的极值点Python非线性规划最优解要是整数 非线性最优规划法_线性规划_06,并且迭代最终能够停在极值点上面,也就是说Python非线性规划最优解要是整数 非线性最优规划法_迭代法_56。显然,这个最优的极值点就是一个不动点。对于这种迭代查找的方式,我们只需要这种迭代映射是关于某一种范数是收缩映射。也就是||T(x)-T(y)||≤β||x-y||,任意的x,y∈Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_33,β<1。这意味这这种映射T有唯一的不动点,从任意的初始点x开始,迭代之后一定能够收敛域Python非线性规划最优解要是整数 非线性最优规划法_线性规划_06点。

上面这段话主要是从数学的角度出发来进行阐述的,从理解的层面,我们想要找到一个极值点Python非线性规划最优解要是整数 非线性最优规划法_线性规划_06,我们需要的是这个极值点是能够收敛到的,如果我们当前的迭代算法无法收敛,那么也就找不到最优解。而通过某一种收缩的迭代映射T,我们能够保证这种迭代是能够收敛到极值点的。

举一个例子来说:

Python非线性规划最优解要是整数 非线性最优规划法_迭代_60

2 终止条件与收敛速度

在整个上一节的介绍中,我们给出了非线性规划的问题使用迭代法的求解思路,包括如何确定步长,如何确定下降方向等等。在本节中,我们重点讨论关于如何停止迭代的方法和算法收敛的速度。

2.1 终止条件
  1. 最自然的停止准则:Python非线性规划最优解要是整数 非线性最优规划法_迭代法_61,其中Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_62为实现定义的阈值,这表明当梯度趋于0,并且迭代序列Python非线性规划最优解要是整数 非线性最优规划法_迭代法_63收敛到某一个点。
  2. 相邻两次迭代点的关系:Python非线性规划最优解要是整数 非线性最优规划法_线性规划_64,或者 Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_65。这个停止条件将注意力关注再来“收敛”上面,当不存在梯度的时候,可以采用这种方法。
  3. 相邻两次迭代函数值的关系:Python非线性规划最优解要是整数 非线性最优规划法_迭代法_66,或者Python非线性规划最优解要是整数 非线性最优规划法_迭代_67
  4. 同时使用迭代值和迭代函数作为收敛的条件,当Python非线性规划最优解要是整数 非线性最优规划法_迭代_68和|Python非线性规划最优解要是整数 非线性最优规划法_迭代法_69时,采用Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_70,否则采用Python非线性规划最优解要是整数 非线性最优规划法_迭代_71
2.2 收敛速度

收敛速度是算法的局部刻画,其主要度量了优化算法的有效性,使得迭代序列Python非线性规划最优解要是整数 非线性最优规划法_迭代法_03依照某一个范数收敛到Python非线性规划最优解要是整数 非线性最优规划法_线性规划_06

Q-α收敛速度: Python非线性规划最优解要是整数 非线性最优规划法_迭代_74,如果存在实数α≥1,和迭代次数K无关的正数β>0,使得:
Python非线性规划最优解要是整数 非线性最优规划法_迭代法_75
这称为算法产生的点列具有Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_76阶收敛速度。

  1. 当α=1,β∈(0,1),迭代点列Python非线性规划最优解要是整数 非线性最优规划法_迭代_77叫做具有Q-线性收敛。
  2. 当α∈(1,2),β>0或者α=1,β=0的时候,Python非线性规划最优解要是整数 非线性最优规划法_迭代_77叫做具有Q-超线性收敛。
  3. 当α=2,Python非线性规划最优解要是整数 非线性最优规划法_迭代_77叫做具有Q-二阶收敛。

相关定理:如果迭代点列Python非线性规划最优解要是整数 非线性最优规划法_迭代法_03具有Q-超线性收敛到Python非线性规划最优解要是整数 非线性最优规划法_线性规划_06,则Python非线性规划最优解要是整数 非线性最优规划法_迭代_82,反之一般不成立。

2.3 如何选择一个好的停止条件?

对于具有一阶的导数信息,其收敛速度不太快的算法,例如共轭梯度方法,可以采用第一种的终止条件:Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_83。但是由于临界点点可能是鞍点,因此建议可以结合上述的第一种和第四种方法综合来进行使用,综合使用的时候,一般第一种方法中的Python非线性规划最优解要是整数 非线性最优规划法_迭代_84,第二种方法中的Python非线性规划最优解要是整数 非线性最优规划法_迭代_85

最后,我们对终止条件简单的扩展的一下,这里我们先介绍二次终止性的概念:

一个算法用于其求解正定二次函数的无约束极小值的时候,有限的迭代步骤可以到达最优解,则该算法具有二次终止性。

大多数的优化算法本身是基于二次函数的模型导出,因此在极小值点的附件可以采用二次函数进行很好的近似,如果算法具有二次终止性,则会很快的进行收敛。

2.4 共轭方向

在上一个小节里面,我们主要给出的是一般的算法的终止条件,并在最后强调的二次函数的优势和二次终止性的概念。

进一步,我们知道了二次终止性的概念,对于二次终止性而言,二次终止性=共轭方向+精确的一维搜索。一维搜索的过程,我们在下一篇文章中具体介绍。这里我们首先来介绍共轭方向的问题。

共轭方向:Python非线性规划最优解要是整数 非线性最优规划法_迭代法_86为对称的正定矩阵,若Python非线性规划最优解要是整数 非线性最优规划法_迭代法_87,满足Python非线性规划最优解要是整数 非线性最优规划法_迭代_88,则称Python非线性规划最优解要是整数 非线性最优规划法_线性规划_89关于矩阵A共轭,如果m个不同的非零向量Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_90,满足Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_91,则称这m个向量为共轭向量组,或者A共轭,如果A=I(单位矩阵),则共轭等价于正交。

换句话来讲,当两个向量Python非线性规划最优解要是整数 非线性最优规划法_迭代法_92关于对称正定矩阵A的乘积结果Python非线性规划最优解要是整数 非线性最优规划法_线性规划_93,则说明Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_94l两个向量代表的方向是共轭的方向。

2.5 一般的共轭方向法(GCD)

在介绍完共轭方向的概念之后,我们下面给出的是一般的使用共轭方向的最优化的方法。

  1. 给定初始点Python非线性规划最优解要是整数 非线性最优规划法_迭代_95,计算Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_96,再计算方向Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_97,使得Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_98
  2. 如果Python非线性规划最优解要是整数 非线性最优规划法_迭代_99,则迭代终止。
  3. 计算步长因子Python非线性规划最优解要是整数 非线性最优规划法_线性规划_100,令Python非线性规划最优解要是整数 非线性最优规划法_线性规划_21
  4. 通过某种共轭方向算法计算Python非线性规划最优解要是整数 非线性最优规划法_Python非线性规划最优解要是整数_102,使得Python非线性规划最优解要是整数 非线性最优规划法_迭代法_103
  5. 令k=k+1,转移到第二步。

总结一下,共轭方向法实际上针对的是梯度下降的方向来进行改变的。同时,在这种方式中,如果函数正定的,则GCD方法最多经过n步精确线性搜索终止。同时还可以证明的是,如果多个向量关于正定矩阵A两两是共轭的,则这些向量线性无关。

3 总结

在整个的这一个部分中,我们重点介绍了对于非线性规划算法的一般的求解思路和求解框架,并介绍了下降方向步长,终止条件,收敛速度等概念,其中也给出量常见的梯度迭代的算法和共轭方向的迭代算法。

3.1 回顾步长问题

在上文的描述中,我们有一个问题的始终没有得到具体的解决,那就是步长因子的确定。对于最优步长而言,其求解的算法有很多,但是其一般不具有解析解。此时,我们选择的是采用近似求解的方式。其求解过程如下:

  1. 首先,确定包含最小值的搜索区间。
  2. 其次,利用某些区间的分割技术或者插值技术来迭代减少区间,一直到最后的区间宽度小于预先设定的精度,就可以获得近似解。

具体而言,这种搜索近似解的方法可以分成试探法和插值法。这些方法我们将在下一篇文章中进行介绍。

4 参考

  1. 哈工大—组合优化与凸优化