拉格朗日乘子法和KKT条件
首先明确一点,拉格朗日乘子法和KKT条件是两种求条件极值的方法,具体来说KKT是拉格朗日乘子法的一种推广。条件极值,顾名思义,即函数在一定条件约束下可取到的极值。谈到约束条件无非两种,等式约束和不等式约束,拉格朗日乘子法用于解决等式约束条件下函数极值的问题,KKT条件用于解决含有不等式条件约束下函数的极值问题。下面先介绍拉格朗日乘子法是肿么来滴。
拉格朗日乘子法
假设我们有二元函数f(x,y)f(x, y)f(x,y)和约束条件g(x,y)=cg(x, y) = cg(x,y)=c, 现在我们要求函数f(x,y)f(x, y)f(x,y)在g(x,y)g(x, y)g(x,y)约束条件下的最小值,换句话说我们要在g(x,y)g(x, y)g(x,y)上找一点 (x0,y0)(x_{0}, y_{0})(x0,y0),使得f(x,y)f(x, y)f(x,y)取得最小值,将这句话公式化即为:(s.t. 为subject to,受限于)min(f(x,y)) min(f(x, y))min(f(x,y)) s.t.g(x,y)=cs.t. \quad g(x, y) = cs.t.g(x,y)=c 我们将f(x,y)f(x, y)f(x,y)和g(x,y)g(x, y)g(x,y)在图像上表示,即为,
图中虚线为函数f(x,y)f(x, y)f(x,y)值的等高线,假设我们的待求函数为z=f(x,y)z = f(x, y)z=f(x,y),那么等高线即为zzz 在(x,y)(x, y)(x,y)平面内的投影。因为我们求的是f(x,y)f(x, y)f(x,y)的最小值所以,假定箭头方向为负梯度方向即为函数值下降最快的方向,即d3>d2>d1d_{3} > d_{2} > d_{1}d3>d2>d1。
很明显,g(x,y)g(x, y)g(x,y)上能使f(x,y)f(x, y)f(x,y)取得最小值的点(x0,y0)(x_{0}, y_{0})(x0,y0)一定为f(x,y)f(x, y)f(x,y)等高线和g(x,y)=cg(x, y)=cg(x,y)=c的切点。同是在点(x0,y0)(x_{0}, y_{0})(x0,y0)处我们可以知道,f(x,y)f(x, y)f(x,y)和g(x,y)g(x, y)g(x,y)的梯度共线。下面计算f(x,y)f(x, y)f(x,y)和g(x,y)g(x, y)g(x,y)在点(x0,y0)(x_{0}, y_{0})(x0,y0)处的梯度:∇f(x0,y0)=fx′(x0,y0)+fy′(x0,y0)\nabla f(x_{0}, y_{0}) = f_{x}^{'}(x_{0}, y_{0}) + f_{y}^{'}(x_{0}, y_{0}) ∇f(x0,y0)=fx′(x0,y0)+fy′(x0,y0) ∇g(x0,y0)=gx′(x0,y0)+gy′(x0,y0)\nabla g(x_{0}, y_{0}) = g_{x}^{'}(x_{0}, y_{0}) + g_{y}^{'}(x_{0}, y_{0}) ∇g(x0,y0)=gx′(x0,y0)+gy′(x0,y0) 上面说到f和g的梯度共线,所以由两个向量共线,分量等比的性质,我们可以得到:fx′(x0,y0)gx′(x0,y0)=fy′(x0,y0)gy′(x0,y0)=−λ\frac{f_{x}^{'}(x_{0}, y_{0})}{ g_{x}^{'}(x_{0}, y_{0}) } = \frac{f_{y}^{'}(x_{0}, y_{0})}{ g_{y}^{'}(x_{0}, y_{0}) } = -\lambdagx′(x0,y0)fx′(x0,y0)=gy′(x0,y0)fy′(x0,y0)=−λ此外,由于点(x0,y0)(x_{0}, y_{0})(x0,y0)在g(x,y)=cg(x, y)=cg(x,y)=c上,所以有:g(x0,y0)=cg(x_{0}, y_{0})=cg(x0,y0)=c所以我们得到这样三个等式fx′(x0,y0)+λgx′(x0,y0)=0f_{x}^{'}(x_{0}, y_{0}) + \lambda g_{x}^{'}(x_{0}, y_{0}) = 0fx′(x0,y0)+λgx′(x0,y0)=0 fy′(x0,y0)+λgy′(x0,y0)=0f_{y}^{'}(x_{0}, y_{0}) + \lambda g_{y}^{'}(x_{0}, y_{0}) = 0fy′(x0,y0)+λgy′(x0,y0)=0 g(x0,y0)=cg(x_{0}, y_{0})=cg(x0,y0)=c很明显,我们可以构造这样的一个函数L(x,y,λ)=f(x,y)+λ(g(x,y)−c)L(x, y, \lambda) = f(x, y) + \lambda (g(x, y)-c)L(x,y,λ)=f(x,y)+λ(g(x,y)−c),其在点(x0,y0,λ0)(x_{0}, y_{0}, \lambda_{0})(x0,y0,λ0)处对x,y,λx, y, \lambdax,y,λ的偏导数,即在(x0,y0,λ0)(x_{0}, y_{0}, \lambda_{0})(x0,y0,λ0)处的梯度,刚好为上面的三个等式。我们知道,函数在一点处取极值的必要条件是在该点处梯度为0,所以在约束条件g(x,y)g(x, y)g(x,y)下对函数f(x,y)f(x, y)f(x,y)求最小值这个原问题就转变为对拉格朗日函数求极值,问题就很简单了,只需要分别对x,y,λx, y, \lambdax,y,λ求偏导取0,解出x,y,λx, y, \lambdax,y,λ的候选值,然后从中选取极值即可。
我们构造的这个函数就是传说中的拉格朗日函数,λ\lambdaλ就被称为拉格朗日乘子。这种使用拉格朗日函数和拉格朗日乘子求解具有等式约束条件的函数极值的方法就被称为拉格朗日乘子法。
KKT条件
上面说到,约束条件存在两种情况,等式约束和不等式约束,拉格朗日乘子法解决了具有等式约束的条件极值问题。对于具有不等式约束的条件极值,我们就要使用KKT条件来求解,KKT条件其实是拉格朗日乘子法的一个扩展。类似的,我们假设问题情景为:min(f(x,y)) min(f(x, y))min(f(x,y)) s.t.gi(x,y)≤0(i=1,2,...,m)s.t. \quad g_{i}(x, y) \leq 0 \quad (i = 1, 2, ..., m) s.t.gi(x,y)≤0(i=1,2,...,m) 其中iii表示第iii个不等式约束条件。即我们的目标是,求在iii个不等式和jjj个等式约束条件下,函数f(x,y)f(x, y)f(x,y)取极值的点(x0,y0)(x_{0}, y_{0})(x0,y0)。
更具体的,结合下面的图,我们的目标就是在阴影部分内的找到一点(x0,y0)(x_{0}, y_{0})(x0,y0)使得f(x,y)f(x, y)f(x,y)取最小值。
说了半天,怎么求这个(x0,y0)(x_{0}, y_{0})(x0,y0)点呢(即图中的x∗x^*x∗)。由上图可以看出来,最优解的相对于gi(x,y)g_{i}(x, y)gi(x,y)的位置情况无非两种:
- 最优解(x0,y0)(x_{0}, y_{0})(x0,y0)在阴影部分内部,即gi(x,y)<0g_{i}(x, y) < 0gi(x,y)<0
- 最优解(x0,y0)(x_{0}, y_{0})(x0,y0)在gi(x,y)=0g_{i}(x, y) = 0gi(x,y)=0这条曲线上
对于第二种情况,即为拉格朗日乘子法的原问题,使用拉格朗日乘子法求解即可,即需要对任意iii有∇L(x0,y0,λ0)=∇f(x0,y0)+∑i=1mλi∇gi(x0,y0)=0\nabla L(x_{0}, y_{0}, \lambda_{0}) = \nabla f(x_{0}, y_{0}) + \sum_{i=1}^{m}\lambda_{i} \nabla g_{i}(x_{0}, y_{0})=0∇L(x0,y0,λ0)=∇f(x0,y0)+i=1∑mλi∇gi(x0,y0)=0 gi(x0,y0)=0g_{i}(x_{0}, y_{0}) = 0gi(x0,y0)=0 另外,由于阴影部分表示的是gi(x,y)<0g_{i}(x, y)<0gi(x,y)<0,那我可以明确的是在点(x0,y0)(x_{0}, y_{0})(x0,y0)处,f(x,y)f(x, y)f(x,y)和gi(x,y)g_{i}(x, y)gi(x,y)的梯度方向相反,结合上面拉格朗日乘数法的推导过程,我们可以知道必有λi>0\lambda_{i}>0λi>0对于第一种情况,极值点位于gi(x,y)g_{i}(x, y)gi(x,y)内部,即最小的那圈等值线位于gi(x,y)g_{i}(x, y)gi(x,y)的内部,所以此时压根就没gi(x,y)g_{i}(x, y)gi(x,y)什么事,我们只需要求得f(x,y)f(x, y)f(x,y)的极值即可得到在约束条件下的极值: ∇f(x0,y0)=0\nabla f(x_{0}, y_{0})=0∇f(x0,y0)=0 gi(x0,y0)<0g_{i}(x_{0}, y_{0}) < 0gi(x0,y0)<0
那么如果我们将两种情况统一,将原问题统一使用拉格朗日函数的梯度进行求解,即有:L(x,y,λ)=f(x,y)+∑i=1mλigi(x,y)L(x, y, \lambda) = f(x, y) + \sum_{i=1}^{m}\lambda_{i} g_{i}(x, y)L(x,y,λ)=f(x,y)+i=1∑mλigi(x,y) 此时,对于第二种情况势必有λi=0\lambda_{i}=0λi=0使得λigi(x0,y0)=0\lambda_{i}g_{i}(x_{0}, y_{0}) = 0λigi(x0,y0)=0,换句话说,如果我们限制了gi(x0,y0)<0g_{i}(x_{0}, y_{0}) < 0gi(x0,y0)<0,那么必须有λi=0\lambda_{i}=0λi=0成立。类似的,对于第一种情况,如果我们严格要求gi(x0,y0)=0g_{i}(x_{0}, y_{0})=0gi(x0,y0)=0,那么λi\lambda_{i}λi取多少,其实无所谓。总结起来,即为,不管是情况1还是情况2,总有:λigi(x0,y0)=0\lambda_{i}g_i(x_{0}, y_{0})=0λigi(x0,y0)=0显然,对于两种情况,我们总是严格要求一个,放水一个,我们把这种情况称为”互补松弛“,上面的条件,我们称为松弛条件。
同时整合λi\lambda_{i}λi可以得到,λi≥0\lambda_{i} \geq 0λi≥0
现在我们整合对于情况1,2的所有讨论,可以得到:{∇f(x,y,λ)=0gi(x,y)≤0∀i=1...mλi≥0∀i=1...mλigi(x,y)=0∀i=1...m \left\{ \begin{array}{c} \nabla f(x, y, \lambda) =0\\ g_{i}(x, y) \leq 0 \quad \forall i=1...m\\ \lambda_{i} \geq 0 \quad \forall i=1...m\\ \lambda_{i} g_{i}(x, y) = 0 \quad \forall i=1...m \end{array} \right. ⎩⎪⎪⎨⎪⎪⎧∇f(x,y,λ)=0gi(x,y)≤0∀i=1...mλi≥0∀i=1...mλigi(x,y)=0∀i=1...m上面的这组条件就是传说中的KKT条件