如何从拉格朗日乘数法一步步到达KKT条件

声明:这篇文章仅仅是本人阅读了一些相关资料并加上自己的理解形成的粗浅见解,逻辑走通了,我就没有继续深入了解了,所以没有经过严谨的数学证明。如果你在阅读的时候发现有不严谨的地方,欢迎与我讨论~

一、拉格朗日乘数法——强约束条件下的最优化

前提:这里讨论的所有函数都是连续可微的。
强约束:即等号约束。与此对应,不等式约束称为弱约束。

在处理无约束的求最值问题时,我们可以使用求导和求梯度这种方法很方便地求出所有的极值点,把边界点算上,最值点必定位于这些极值点之中,所以把所有点的函数值比较一遍就可以得知最值点。
当最优化问题带有约束的时候,就不能使用上边的方法进行求解了(直接求梯度大部分时候求出的点都不满足约束条件)。这时候,如果约束是强约束,就可以使用拉格朗日乘数法求出所有的极值。

接下来,一步步了解拉格朗日乘数法是如何工作的。
图中左边的带有强约束条件的目标函数,就是右边的黄色封闭线。目标函数是一个平面,约束条件是一个圆柱形曲面。可以看出,最值处于目标函数和约束条件共同作用形成的曲线中。
在这里插入图片描述
在这条黄色封闭线上,随意取一个点,怎么判断这个点是极值点呢?该点所在的切线若同时与目标函数的梯度和约束条件的梯度垂直,这个点就是极值点。

解释一下:

  • 对于一条连续可微的曲线来说,一个点所在的切线代表这个点的移动方向。
  • 梯度是一个向量,它始终与函数的等高线垂直。如果在某点,移动方向与梯度成锐角,代表往函数值增大的方向移动;与梯度成钝角,代表往函数值减小的方向移动;与梯度成直角,代表移动不会引起函数值的增大或减小。(这些都是梯度的性质。)
    一条连续可微的曲线,移动方向的函数值变化只有三种趋势:增大、减小或者不变。.如果上图中的黄色封闭曲线上某个点,切线(移动方向)同时与目标函数的梯度和约束条件的梯度垂直,表示移动方向不会引起目标函数和约束条件的函数值增大或减小,那么这个点就是极值点。
  • 上图中的曲线中,某个点所在的切线要同时与两个梯度垂直,这两个梯度需要是共线的。
    假如目标函数是 f ( x , y ) = x + y f(x,y)=x+y f(x,y)=x+y,它的梯度是 ∇ f \nabla f f,约束条件是 c ( x , y ) = x 2 + y 2 − 1 = 0 c(x,y)=x^2+y^2-1=0 c(x,y)=x2+y21=0,它的梯度是 ∇ c \nabla c c,两个向量(梯度)共线的数学表达式为:
    ∇ f = λ ∇ c \nabla f = \lambda\nabla c f=λc

现在,就已经得到了目标函数的极值点需要满足的条件:

  • 目标函数的梯度和约束条件的梯度需要共线
  • 极值点必定处于约束条件所在的曲面上

写成数学公式就是:
{ ∇ f = λ ∇ c c ( x , y ) = 0 \begin{cases}\nabla f = \lambda\nabla c\\c(x,y)=0\end{cases} {f=λcc(x,y)=0
这个条件可以从一个函数求极值得到(把下面这个函数进行求偏导顺推可以轻松验证):
L ( x , y , λ ) = f ( x , y ) − λ c ( x , y ) L(x,y,\lambda)=f(x,y)-\lambda c(x,y) L(x,y,λ)=f(x,y)λc(x,y)这个函数就被称为拉格朗日函数。拉格朗日函数之中的 λ \lambda λ被称为拉格朗日乘子。

如果有多个强约束条件,其实也非常好理解:目标函数的梯度跟各个约束条件的梯度的线性组合共线。 假设有m个强约束条件,上述表述可以写成以下数学表达式:
∇ f = ∑ i = 0 m λ i ∇ g i \nabla f =\sum_{i=0}^{m} \lambda_i \nabla g_i f=i=0mλigi

从另一个角度看,拉格朗日乘子后面跟着的是强约束条件(=0),两者相乘,乘子所在的项就没了。这时候拉格朗日函数就是原函数。所以,可以认为:

  • 对于具有约束 g i ( x ⃗ ) = 0 g_i(\vec{x})=0 gi(x )=0 的函数 f ( x ⃗ ) f(\vec{x}) f(x ) ,它与拉格朗日函数 L ( x ⃗ , λ ⃗ ) = f ( x ⃗ ) + ∑ λ i g i ( x ⃗ ) L(\vec{x},\vec{\lambda})=f(\vec{x})+\sum\lambda_ig_i(\vec{x}) L(x ,λ )=f(x )+λigi(x ) 在求极值上是等价的。

接下来,我们来讨论弱约束(不等式约束)条件构造拉格朗日函数的情况。
min ⁡ f ( x ⃗ ) , x ⃗ ∈ R n s.t . g i ( x ⃗ ) ≤ 0 , i ∈ { 1 , 2 , … , m } \min\quad f(\vec{x}),\vec{x} \in R^n \\ \text{s.t}. \quad g_i(\vec{x})\le0,i\in \{1,2,…,m\} minf(x ),x Rns.t.gi(x )0,i{1,2,,m}对这个函数构造拉格朗日函数:
L ( x ⃗ , λ ⃗ , ν ⃗ ) = f ( x ⃗ ) + ∑ i = 1 m λ i g i ( x ⃗ ) L(\vec{x},\vec{\lambda},\vec{\nu})=f(\vec{x})+\sum_{i=1}^{m}\lambda_ig_i(\vec{x}) L(x ,λ ,ν )=f(x )+i=1mλigi(x )

我们假设目标函数是二元(x,y)函数。假设有4个约束条件。当 g i ( x ⃗ ) = 0 g_i(\vec{x})=0 gi(x )=0,它们都是垂直于xOy平面的平面。假设目标函数的等高线(最中间为最小值)和等式约束平面(4条橙色的线)如图所示(这个图是俯视xOy平面看到的图)。图中橙色区域的边界就是 g i ( x ⃗ ) = 0 g_i(\vec{x})=0 gi(x )=0整个橙色区域就是 g i ( x ⃗ ) ≤ 0 g_i(\vec{x})\le0 gi(x )0
在这里插入图片描述
橙色区域部分代表的约束和目标函数构造出拉格朗日函数,之后对这个拉格朗日函数求极小值。你可能会想,最小值就在最中间的圆的圆心处。没错,理论上来讲, f ( x ) f(x) f(x) 在橙色区域的约束下最小值点确实在这个地方,但是,我们构造的拉格朗日函数求偏导然后求极值,是求不到这个点的。因为,我们对 λ \lambda λ 求偏导,会发现极值点必须满足 g i ( x ⃗ ) = 0 g_i(\vec{x})=0 gi(x )=0,即:拉格朗日函数求极值点求的是橙色区域边界上的极值点!

所以,对具有弱约束的目标函数构造拉格朗日函数,是无法确保能够求到最值的(除非最值就在边界上)。
如果同时具有强约束和弱约束,因为有弱约束的存在,也无法保证能够求到最值。

从上面可以看出,拉格朗日乘数法在有弱约束条件的情况下就是专门用来求边界上的极值点的。这个看起来好像没有什么用,但是在下文中的KKT条件中,就会发现它的美妙之处了。


以上问题弄清楚了之后,我们再来讨论另外一个问题。由弱约束条件参与构造出的拉格朗日函数,它的拉格朗日乘子的取值范围是存在限制的。 为什么呢?
考虑一个同时具有弱约束和强约束的函数:
m i n f ( x ⃗ ) , x ⃗ ∈ R n s . t . { g i ( x ⃗ ) ≤ 0 , i ∈ { 1 , 2 , … , m } h i ( x ⃗ ) = 0 , i ∈ { 1 , 2 , … , n } min\quad f(\vec{x}),\vec{x} \in R^n \\ s.t. \begin{cases} g_i(\vec{x})\le0,i\in \{1,2,…,m\} \\ h_i(\vec{x})=0,i \in \{1,2,…,n\} \end{cases} minf(x ),x Rns.t.{gi(x )0,i{1,2,,m}hi(x )=0,i{1,2,,n}我们构造出它的拉格朗日函数:
L ( x ⃗ , λ ⃗ , ν ⃗ ) = f ( x ⃗ ) + ∑ i = 1 m λ i g i ( x ⃗ ) + ∑ i = 1 n ν i h i ( x ⃗ ) L(\vec{x},\vec{\lambda},\vec{\nu})=f(\vec{x})+\sum_{i=1}^{m}\lambda_ig_i(\vec{x})+\sum_{i=1}^{n}\nu_ih_i(\vec{x}) L(x ,λ ,ν )=f(x )+i=1mλigi(x )+i=1nνihi(x )要求拉格朗日函数的最小值:
min ⁡ x ⃗ , λ ⃗ , ν ⃗ L ( x ⃗ , λ ⃗ , ν ⃗ ) = f ( x ⃗ ) + ∑ i = 1 m λ i g i ( x ⃗ ) + ∑ i = 1 n ν i h i ( x ⃗ ) \min_{\vec{x},\vec{\lambda},\vec{\nu}} L(\vec{x},\vec{\lambda},\vec{\nu})=f(\vec{x})+\sum_{i=1}^{m}\lambda_ig_i(\vec{x})+\sum_{i=1}^{n}\nu_ih_i(\vec{x}) x ,λ ,ν minL(x ,λ ,ν )=f(x )+i=1mλigi(x )+i=1nνihi(x )注意看,由于 h i ( x ⃗ ) = 0 h_i(\vec{x})=0 hi(x )=0,所以最后一项对求最小值无影响,可以忽略不看。由于 g i ( x ⃗ ) ≤ 0 g_i(\vec{x})\le0 gi(x )0 g i ( x ⃗ ) g_i(\vec{x}) gi(x ) 前的系数 λ i \lambda_i λi 必须大于或者等于0,才能使 L ( x ⃗ , λ ⃗ , ν ⃗ ) L(\vec{x},\vec{\lambda},\vec{\nu}) L(x ,λ ,ν ) 减小或者不变。如果小于0, L ( x ⃗ , λ ⃗ , ν ⃗ ) L(\vec{x},\vec{\lambda},\vec{\nu}) L(x ,λ ,ν ) 反而会增加。这违背了我们想让目标函数变小的初衷。
所以,弱约束条件下构造的拉格朗日函数, λ \lambda λ的取值范围是: λ ≥ 0 \lambda \ge 0 λ0

二、KKT条件——弱约束条件下的最优化

上文中,我们发现在存在弱约束条件的情况下,构造出的拉格朗日函数是无法确保求出最值的(除非运气好,最值刚好在弱约束条件的边界上或者在强约束条件上)。那么,想要真正求出弱约束条件下的函数最值,应该用什么方法呢?

KKT条件的提出解决了这个问题。下面我们一步步来摸索,KKT条件到底是如何被提出的。

我们首先看一道高中的题目。假设有一个一元函数 f ( x ) , x 1 < x < x 3 f(x), x1<x<x3 f(x),x1<x<x3,它的图像如下图所示:
在这里插入图片描述
我们都知道,想要求出 f ( x ) f(x) f(x) 的最小值,首先对它求导,解出所有极值点,因为x有范围限制,所以极值点只能取x2。但是x2不一定是最值点,所以还需要求出边界点x1和x3的函数值,之后与x2的函数值比较一遍,就可以得知最小值的点是x1。

下面,把上边的一元求最值问题推广到多元函数中,假设有下面这样一个函数:
m i n f ( x ⃗ ) , x ⃗ ∈ R n s . t . { g i ( x ⃗ ) ≤ 0 , i ∈ { 1 , 2 , … , m } h i ( x ⃗ ) = 0 , i ∈ { 1 , 2 , … , n } min\quad f(\vec{x}),\vec{x} \in R^n \\ s.t. \begin{cases} g_i(\vec{x})\le0,i\in \{1,2,…,m\} \\ h_i(\vec{x})=0,i \in \{1,2,…,n\} \end{cases} minf(x ),x Rns.t.{gi(x )0,i{1,2,,m}hi(x )=0,i{1,2,,n}在不知道KKT条件的情况下,我们也可以利用像求一元函数最值的方法求出多元函数的最值。那就是:

  • 先利用梯度求出所有极值点。然后剔除不满足约束的极值点。
  • 把满足约束的极值点函数值与函数边界的极值点函数值比较一遍,得到最小值所在的点。

想法理论上没问题。求梯度很简单,所以第一步很轻松就可以搞定。但是第二步中,求出边界上的极值点,这个要这么搞呢?这时候,上面我们已经讨论过的弱约束拉格朗日函数就可以使用上了。还记得吗?存在弱约束条件的情况下,拉格朗日乘数法可以求出边界上的极值点!
所以,求多元函数的最值的流程就可以完整走通了。

接下来,我们总结我们上边所做的求最值的流程。

  • f ( x ⃗ ) f(\vec{x}) f(x ) g ( x ⃗ ) ≤ 0 g(\vec{x})\le0 g(x )0 的情况下利用梯度求极值。
  • f ( x ⃗ ) f(\vec{x}) f(x ) g ( x ⃗ ) = 0 g(\vec{x})=0 g(x )=0 的情况下使用拉格朗日乘数法。


也即:

  • 利用梯度求极值: ∇ f = 0 , g ( x ⃗ ) ≤ 0 , h i ( x ⃗ ) = 0 \nabla f=0, g(\vec{x})\le0,h_i(\vec{x})=0 f=0,g(x )0,hi(x )=0
  • 使用拉格朗日乘数法: { ∇ f = ∑ i = 0 m λ i ∇ g i ( x ⃗ ) + ∑ i = 0 n ν i ∇ h i ( x ⃗ ) g i ( x ⃗ ) = 0 h i ( x ⃗ ) = 0 g i ( x ⃗ ) ≤ 0 (可写可不写,写上是为了方便理解) λ ≥ 0 (前面已经讨论它需要是这个范围) \begin{cases}\nabla f =\sum_{i=0}^{m} \lambda_i \nabla g_i(\vec{x})+\sum_{i=0}^{n}\nu_i\nabla h_i(\vec{x})\\g_i(\vec{x})=0\\h_i(\vec{x})=0\\g_i(\vec{x})\le 0(可写可不写,写上是为了方便理解)\\\lambda \ge0(前面已经讨论它需要是这个范围)\end{cases} f=i=0mλigi(x )+i=0nνihi(x )gi(x )=0hi(x )=0gi(x )0(可写可不写,写上是为了方便理解)λ0(前面已经讨论它需要是这个范围) g ( x ⃗ ) = 0 g(\vec{x})=0 g(x )=0


最关键的一步来了。第二个条件中,当 λ i = 0 \lambda_i=0 λi=0 ν i = 0 \nu_i=0 νi=0 的时候, ∇ f = ∑ i = 0 m λ i ∇ g i ( x ⃗ ) + ∑ i = 0 n ν i ∇ h i ( x ⃗ ) \nabla f =\sum_{i=0}^{m} \lambda_i \nabla g_i(\vec{x})+\sum_{i=0}^{n}\nu_i\nabla h_i(\vec{x}) f=i=0mλigi(x )+i=0nνihi(x ) 变成了 ∇ f = 0 \nabla f=0 f=0。如果这时候去掉 g i ( x ⃗ ) = 0 g_i(\vec{x})=0 gi(x )=0 这个条件,不就跟第一个条件 ∇ f = 0 , g i ( x ⃗ ) ≤ 0 , h i ( x ⃗ ) = 0 \nabla f=0, g_i(\vec{x})\le0,h_i(\vec{x})=0 f=0,gi(x )0,hi(x )=0 一样了嘛。所以,问题就变成了,如何在 λ i = 0 \lambda_i=0 λi=0 的情况下去掉 g i ( x ⃗ ) = 0 g_i(\vec{x})=0 gi(x )=0 这个条件,让总的条件变成 ∇ f = 0 , g i ( x ⃗ ) ≤ 0 , h i ( x ⃗ ) = 0 \nabla f=0, g_i(\vec{x})\le0,h_i(\vec{x})=0 f=0,gi(x )0,hi(x )=0。怎么办呢?可以这样做:
λ i g i ( x ⃗ ) = 0 \lambda_i g_i(\vec{x})=0 λigi(x )=0 λ i = 0 \lambda_i=0 λi=0 的时候, g i ( x ⃗ ) g_i(\vec{x}) gi(x ) 可以取任意值(当然,它需要受到其他约束),当 g i ( x ⃗ ) g_i(\vec{x}) gi(x ) 不为0的时候,强制 λ i = 0 \lambda_i=0 λi=0,这样,求多元函数最值的数学表达就变成了:
{ ∇ f = ∑ i = 0 m λ i ∇ g i ( x ⃗ ) + ∑ i = 0 n ν i ∇ h i ( x ⃗ ) λ i g i ( x ⃗ ) = 0 h i ( x ⃗ ) = 0 λ i ≥ 0 g i ( x ⃗ ) ≤ 0 \begin{cases}\nabla f =\sum_{i=0}^{m} \lambda_i \nabla g_i(\vec{x})+\sum_{i=0}^{n}\nu_i\nabla h_i(\vec{x})\\\lambda_i g_i(\vec{x})=0\\h_i(\vec{x})=0\\\lambda_i \ge 0\\g_i(\vec{x})\le 0\end{cases} f=i=0mλigi(x )+i=0nνihi(x )λigi(x )=0hi(x )=0λi0gi(x )0
以上方程组就是KKT条件。

所以,经过上面的讨论,KKT条件就是:
{ ∇ f = ∑ i = 0 m λ i ∇ g i ( x ⃗ ) + ∑ i = 0 n ν i ∇ h i ( x ⃗ ) λ i g i ( x ⃗ ) = 0 h i ( x ⃗ ) = 0 λ i ≥ 0 g i ( x ⃗ ) ≤ 0 \begin{cases}\nabla f =\sum_{i=0}^{m} \lambda_i \nabla g_i(\vec{x})+\sum_{i=0}^{n}\nu_i\nabla h_i(\vec{x})\\\lambda_i g_i(\vec{x})=0\\h_i(\vec{x})=0\\\lambda_i \ge 0\\g_i(\vec{x})\le 0\end{cases} f=i=0mλigi(x )+i=0nνihi(x )λigi(x )=0hi(x )=0λi0gi(x )0其中,当 λ i = 0 \lambda_i=0 λi=0 的时候,就得到了利用梯度求极值的情况:
{ ∇ f = 0 g i ( x ⃗ ) ≤ 0 h i ( x ⃗ ) = 0 \begin{cases} \nabla f =0 \\g_i(\vec{x})\le 0 \\h_i(\vec{x})=0 \end{cases} f=0gi(x )0hi(x )=0 λ i > 0 \lambda_i >0 λi>0 (至于为什么不是小于0,上边已经讨论过啦,弱约束下拉格朗日函数的拉格朗日乘子范围是有限制的),就得到了拉格朗日乘数法:
{ ∇ f = ∑ i = 0 m λ i ∇ g i ( x ⃗ ) + ∑ i = 0 n ν i ∇ h i ( x ⃗ ) g i ( x ⃗ ) = 0 h i ( x ⃗ ) = 0 \begin{cases} \nabla f =\sum_{i=0}^{m} \lambda_i \nabla g_i(\vec{x})+\sum_{i=0}^{n}\nu_i\nabla h_i(\vec{x}) \\g_i(\vec{x})=0 \\h_i(\vec{x})=0 \end{cases} f=i=0mλigi(x )+i=0nνihi(x )gi(x )=0hi(x )=0这样一来,拉格朗日乘数法和KKT条件均讨论完毕,对于这两个东西有了一个粗浅的理解。


  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值