拉格朗日乘子、KKT条件等相关理论现在由于机器学习的热度经常可以看到介绍它们的文章,因为它们是一些机器学习模型例如支持向量机的底层原理;更一般的来说,它们属于处理非线性优化问题的典型技术。这篇文章先用一个具体的例子来演示非线性优化问题的处理过程,然后用二维平面的例子来辅助理解拉格朗日定理,最后列出该定理严格的数学描述

最简单的方法: 替换法

只要优化问题中存在非线性关系,无论是目标函数还是约束条件,那么这个问题就成了一个非线性优化问题,像单纯形法等适用于线性优化问题的算法是无法处理的。对于一个无约束的优化问题,即求一个函数的最值问题,相对来说是比较容易的;所以处理带约束的非线性优化问题,最经典的一种思想就是想办法把约束信息移除掉,把原始问题转换成一个没有约束的函数最值问题。

对于一些非常简单的非线性优化问题,替换法是最容易想到的方法。例如这个问题:
python非线性约束优化全局最优解 非线性约束优化问题_优化问题
显然我们可以利用约束等式,把目标函数中的python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_02python非线性约束优化全局最优解 非线性约束优化问题_机器学习_03来替代:
python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_04
现在原问题就变成了一个关于python非线性约束优化全局最优解 非线性约束优化问题_机器学习_03的二次函数,二次函数求最大最小值就很容易了。
当然替换法只能适用于这种非常简单的情况,约束稍微复杂一点就不适用了

更通用的方法:拉格朗日乘子法

拉格朗日乘子方法是更为一般和通用的处理非线性优化问题的技术,一句话描述它,通过引入拉格朗日乘子python非线性约束优化全局最优解 非线性约束优化问题_优化问题_06把约束附加到目标函数上,构成拉格朗日函数,从而将原来的有约束问题转化成无约束问题。

例如我们要计算下面这个例子:
python非线性约束优化全局最优解 非线性约束优化问题_机器学习_07
我们先把约束等式写成下面的格式:
python非线性约束优化全局最优解 非线性约束优化问题_机器学习_08
接着我们引入用python非线性约束优化全局最优解 非线性约束优化问题_优化问题_06表示的拉格朗日乘子,将它乘上约束等式的左边,然后用目标函数减去这个分量:
python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_10
这个python非线性约束优化全局最优解 非线性约束优化问题_机器学习_11就叫做拉格朗日函数,按照拉格朗日定理,拉格朗日函数的最优解就是原始的带约束的优化问题的解;怎么求解拉格朗日函数的最优解呢? 那我们只需要利用可微函数极值点梯度为零的性质求解就行了,也就是分别对python非线性约束优化全局最优解 非线性约束优化问题_机器学习_11中的变量python非线性约束优化全局最优解 非线性约束优化问题_最值问题_13,python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_14python非线性约束优化全局最优解 非线性约束优化问题_优化问题_06求偏导并另其等于零:
python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_16
求解这个方程组,可以得到最优解:
python非线性约束优化全局最优解 非线性约束优化问题_机器学习_17
拉格朗日乘子法局限性也很大,首先它只适用于约束只有等式的情况,当存在不等式时,需要引入KKT条件定理进行扩展;另一方面当目标或约束复杂度很高时,通过简单的求偏导等于零来直接计算最优解也变得不现实

图示

为了辅助理解拉格朗日定理,一般都会借助二维图例来说明,这当然不是该定理严格的数学证明,不过比较直观,便于理解它的过程。

我们用一个简单的二元单约束优化问题来举例:

python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_18

对于目标函数,它的实际图像应该是个三维曲面,因为有着三个变量python非线性约束优化全局最优解 非线性约束优化问题_优化问题_19,那么在二维平面上反映的其实三维曲面的投影,我们称之为等值线,对于任何一个目标值,所有满足python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_20等于该目标值的两个变量构成了二维面上的一条曲线;例如python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_21,它在二维平面上的等值线大致就是这个样子

python非线性约束优化全局最优解 非线性约束优化问题_机器学习_22

对于二元约束等式,我们可以在二维平面上划出它的曲线,例如如果约束是python非线性约束优化全局最优解 非线性约束优化问题_最值问题_23,那么这个约束就是平面上的圆曲线:

python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_24


另一方面,约束曲线也可以看成是约束函数python非线性约束优化全局最优解 非线性约束优化问题_最值问题_25等于零时的等值线;结合约束曲线和目标函数等高线,这个约束问题就是要在约束曲线的所有点中找到目标函数值最大的点

python非线性约束优化全局最优解 非线性约束优化问题_优化问题_26


按照拉格朗日定理,我们定义拉格朗日函数为:

python非线性约束优化全局最优解 非线性约束优化问题_机器学习_27

如果设这个最优解的点为python非线性约束优化全局最优解 非线性约束优化问题_最值问题_28,那么该点一定满足:

python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_29

我们对照平面曲线图来理解这个公式:python非线性约束优化全局最优解 非线性约束优化问题_最值问题_30表示的是目标函数python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_20在点python非线性约束优化全局最优解 非线性约束优化问题_最值问题_28的梯度,即目标函数对各个分量的偏导数构成的向量:

python非线性约束优化全局最优解 非线性约束优化问题_机器学习_33

回顾一下梯度的概念,梯度的方向是函数在该点处变化最快的方向,它的模则是这个最大的变化率,对于二元的目标函数,梯度在二维等值线上画出来就是该点的法向量:

python非线性约束优化全局最优解 非线性约束优化问题_优化问题_34


同样的,python非线性约束优化全局最优解 非线性约束优化问题_优化问题_35表示的是约束函数python非线性约束优化全局最优解 非线性约束优化问题_最值问题_36在点python非线性约束优化全局最优解 非线性约束优化问题_最值问题_28的梯度,表示在二维平面上也是约束曲线上的法向量

python非线性约束优化全局最优解 非线性约束优化问题_优化问题_38


我们可以想象一下,对于两个空间曲面,如果它们在某一点相切,那么在该点两个曲面的法向量是平行的(在一条直线上),对应的等值线上的法向量也是平行的,其实也就是梯度是平行的;梯度python非线性约束优化全局最优解 非线性约束优化问题_优化问题_35和梯度python非线性约束优化全局最优解 非线性约束优化问题_优化问题_35平行,用线性代数的语言描述就是

python非线性约束优化全局最优解 非线性约束优化问题_机器学习_41

这其实就是拉格朗日定理的方程式,所以对于上面这个二元优化问题,拉格朗日定理的意思就是这个最优解代表的点就是约束曲线与目标函数等值线的相切点:

python非线性约束优化全局最优解 非线性约束优化问题_机器学习_42


抛开拉格朗日定理,在这个简单的例子里,我们只凭直觉也可以发现,只有当选择那个相切点的时候能够达到最大的目标值,如果目标函数等高线向左下移一点,它与约束曲线的交点是满足约束的,但是此时的目标值更小了;如果目标函数等高线向右上移一点,他与约束曲线没有交点,也就是没有可以达到这个目标值的解。

拉格朗日定理

最后我从相关资料中摘录了一下拉格朗日定理相关的严格数学定义,严格定义我觉得还是有必要读一下的,不过证明过程就可以忽略了。拉格朗日定理本身是描述最优解的必要条件,而充分条件其实还有更加严格的定义,我就放在最后一节了。

在表述拉格朗日定理前,先明确一些定义:

  • 将优化问题表述为:
    python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_43
    python非线性约束优化全局最优解 非线性约束优化问题_最值问题_44是目标函数,而python非线性约束优化全局最优解 非线性约束优化问题_机器学习_45python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_46的等式约束将变量向量python非线性约束优化全局最优解 非线性约束优化问题_优化问题_47规定在有限轨迹python非线性约束优化全局最优解 非线性约束优化问题_最值问题_48中;
  • 通过引入拉格朗日乘子python非线性约束优化全局最优解 非线性约束优化问题_机器学习_49,可以构造拉格朗日函数:
    python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_50
  • python非线性约束优化全局最优解 非线性约束优化问题_最值问题_51表示python非线性约束优化全局最优解 非线性约束优化问题_最值问题_44python非线性约束优化全局最优解 非线性约束优化问题_优化问题_47上的梯度,即python非线性约束优化全局最优解 非线性约束优化问题_最值问题_44python非线性约束优化全局最优解 非线性约束优化问题_优化问题_47的一阶偏导,即:
    python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_56
    同样的,python非线性约束优化全局最优解 非线性约束优化问题_优化问题_57表示python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_58python非线性约束优化全局最优解 非线性约束优化问题_优化问题_47的梯度
    python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_60
  • 定义python非线性约束优化全局最优解 非线性约束优化问题_最值问题_61代表所有约束函数的向量,那么各个python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_62python非线性约束优化全局最优解 非线性约束优化问题_优化问题_47的偏导构成了一个雅可比(Jacobian)矩阵:
    python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_64
    我们称对于某个点python非线性约束优化全局最优解 非线性约束优化问题_优化问题_65python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_66上满足非退化约束条件(nondegenerate constraint qualification, 简写为NDCQ),当雅可比矩阵python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_67python非线性约束优化全局最优解 非线性约束优化问题_最值问题_68时的秩等于python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_69,即它是满秩矩阵的

那么有拉格朗日条件定理(Lagrange Conditions):

  • 假定python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_70都是python非线性约束优化全局最优解 非线性约束优化问题_机器学习_71函数(一阶可导),python非线性约束优化全局最优解 非线性约束优化问题_优化问题_65python非线性约束优化全局最优解 非线性约束优化问题_最值问题_44在限定空间python非线性约束优化全局最优解 非线性约束优化问题_最值问题_48上的局部极值点,并且python非线性约束优化全局最优解 非线性约束优化问题_优化问题_65满足python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_76条件,那么一定存在python非线性约束优化全局最优解 非线性约束优化问题_机器学习_77使得python非线性约束优化全局最优解 非线性约束优化问题_优化问题_65是拉格朗日函数
    python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_79
    的驻点,即:
    python非线性约束优化全局最优解 非线性约束优化问题_最值问题_80

对于定理中强调的python非线性约束优化全局最优解 非线性约束优化问题_机器学习_81需要满足python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_82条件,我们用一个简单的例子来理解下为什么要加上一点. 假设一个二元优化问题,且只有一个约束条件:
python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_83
它的拉格朗日函数为:
python非线性约束优化全局最优解 非线性约束优化问题_机器学习_27
根据拉格朗日定理,python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_20的驻点满足:
python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_86
再加上:
python非线性约束优化全局最优解 非线性约束优化问题_优化问题_87
三个方程式应该可以求解得到python非线性约束优化全局最优解 非线性约束优化问题_机器学习_88三个变量的值,但是如果不满足python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_82条件,即python非线性约束优化全局最优解 非线性约束优化问题_最值问题_90python非线性约束优化全局最优解 非线性约束优化问题_机器学习_91都等于零,拉格朗日函数一阶偏导的两个等式就可以规约为一个等式,这也就意味着无法求解,所以python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_82条件是拉格朗日定理的严格定义中必须要明确的

极大(极小)值的充分条件

极值点必然是python非线性约束优化全局最优解 非线性约束优化问题_机器学习_93的驻点,也必然满足拉格朗日定理,但是拉格朗日定理只是最值的必要条件,也就是说当我们求得一个驻点后,我们其实不能直接判断它是极大值还是极小值,可能我们计算出的驻点是个局部最小值,但我们的问题是求最大值问题,那么这个驻点其实也不是可选的解;因此我们还要另一个定理来作为极大值(极小值)的判定准则

还是先明确一些定义:

  • 我们用python非线性约束优化全局最优解 非线性约束优化问题_机器学习_94来表示拉格朗日函数python非线性约束优化全局最优解 非线性约束优化问题_最值问题_95的二阶偏微分矩阵,即:
    python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_96
    它一般被称为Hessian矩阵
  • 对于一个python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_97的实对称矩阵python非线性约束优化全局最优解 非线性约束优化问题_机器学习_98,如果对于任意的长度为python非线性约束优化全局最优解 非线性约束优化问题_机器学习_99的非零向量python非线性约束优化全局最优解 非线性约束优化问题_优化问题_47,都有python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_101成立,则称python非线性约束优化全局最优解 非线性约束优化问题_机器学习_98是一个正定矩阵;如果python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_103,则称python非线性约束优化全局最优解 非线性约束优化问题_机器学习_98为负定矩阵

那么有严格极大值的充分条件定理:

  • 假设python非线性约束优化全局最优解 非线性约束优化问题_运筹优化_70python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_106函数(二阶可导),python非线性约束优化全局最优解 非线性约束优化问题_优化问题_65是满足拉格朗日条件的驻点,其对应的拉格朗日乘子为python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_108;对应于python非线性约束优化全局最优解 非线性约束优化问题_最值问题_109有Hessian矩阵python非线性约束优化全局最优解 非线性约束优化问题_优化问题_110,那么驻点python非线性约束优化全局最优解 非线性约束优化问题_优化问题_65是严格极大值,当对于任意满足限制条件python非线性约束优化全局最优解 非线性约束优化问题_python非线性约束优化全局最优解_112python非线性约束优化全局最优解 非线性约束优化问题_优化问题_113python非线性约束优化全局最优解 非线性约束优化问题_优化问题_110是负定的,即
    python非线性约束优化全局最优解 非线性约束优化问题_最值问题_115