直观理解KKT条件
等高线
从等高线讲起。如果我们要优化
f
(
x
,
y
)
=
x
2
y
f(x,y)=x^2y
f(x,y)=x2y这个函数,给定约束为,
x
2
+
y
2
=
1
x^2+y^2=1
x2+y2=1,我们希望在满足约束的情况下使得f最大。也就是说,我们希望找到一个最“上方”的平面z,并且该平面要在可行域范围内。这个优化函数的可视化为:
为了更好的演示,我们一般使用等高线,等高线就是考虑俯视图:
显然,随着z越来越大,他离我们的圆越来越远,而如果我们缩小z,我们就能找到一个点,恰好与圆相切,这个值就是最优值:
梯度总是垂直于等高线
现在我们考虑目标函数 f ( x , y ) = x y f(x,y)=xy f(x,y)=xy,其梯度为 < ∂ f / ∂ x , ∂ f / ∂ y > = < y , x > <\partial f/\partial x,\partial f/\partial y>=<y,x> <∂f/∂x,∂f/∂y>=<y,x>。举个例子,我们选择一个点,比如 x = 2 , y = 1 x=2,y=1 x=2,y=1,此时梯度为 < 1 , 2 > <1,2> <1,2>,将这个向量画在图上,就得到下图白色的直线:
我们发现梯度总是垂直于等高线的,为什么?首先梯度的直观理解应该是,在这个平面上增长最快的方向,那如果我们考虑两个很相近的平面, z = 2 , z = 2.1 z=2,z=2.1 z=2,z=2.1:
那么因为两个平面相隔足够小,所以它们的登高线应该几乎是是平行的,于是,这个登高线增长最快的方向,显然就是往与它垂直的方向走(从2走到2.1的方向)。
KKT条件
对于优化问题
m
a
x
x
f
(
x
)
s
.
t
.
h
j
(
x
)
=
0
,
j
=
1
,
…
,
q
g
i
(
x
)
≤
0
,
i
=
1
,
…
,
p
max_{x}f(x) \\s.t.h_j(x)=0,j=1,\dots,q \\g_i(x)\leq 0,i=1,\dots,p
maxxf(x)s.t.hj(x)=0,j=1,…,qgi(x)≤0,i=1,…,p
其KKT条件(必要条件)为,若
x
∗
x^*
x∗是最优解则一定满足一下条件
∇
f
(
x
∗
)
=
∑
j
λ
j
∇
h
j
(
x
∗
)
+
∑
i
μ
i
∇
g
i
(
x
∗
)
μ
i
≥
0
,
i
f
g
i
(
x
∗
)
<
0
t
h
e
n
μ
i
=
0
\nabla f(x^*)=\sum_j\lambda_j\nabla h_j(x^*)+\sum_i\mu_i \nabla g_i(x^*) \\\mu_i\geq0,if~g_i(x^*)<0~then~\mu_i=0
∇f(x∗)=j∑λj∇hj(x∗)+i∑μi∇gi(x∗)μi≥0,if gi(x∗)<0 then μi=0
这个条件,可以直接理解为拉格朗日法的推广,就是转换成无约束问题,然后那个无约束的目标函数的梯度等于0.
为了理解这个东西,我们来个简单的例子,
m
a
x
f
(
x
,
y
)
=
x
2
y
s
.
t
.
x
2
+
y
2
=
1
maxf(x,y)=x^2y \\s.t.x^2+y^2=1
maxf(x,y)=x2ys.t.x2+y2=1
其中
h
(
x
,
y
)
=
x
2
+
y
2
−
1
=
0
h(x,y)=x^2+y^2-1=0
h(x,y)=x2+y2−1=0。回想一下,我们之前提到,等高线与约束相切的时候是可以得到最优值的。那么这个相切怎么定义呢?实际上,利用梯度总是垂直于登高线的性质,两条线相切,那么在相切点上,
f
f
f的梯度,以及约束
h
h
h的梯度,应该是平行的!这意味着:
∇
f
(
x
∗
)
=
λ
∇
h
(
x
∗
)
\nabla f(x^*)=\lambda\nabla h(x^*)
∇f(x∗)=λ∇h(x∗)
这不就是KKT条件嘛!这个垂直的状态就如下图所示:
那个g的梯度其实就是那个约束的梯度,对于事实上,对于约束我们也可以画出类似的等高线图:
最后我们来算一下,这个平行的梯度在哪个位置:
f
(
x
,
y
)
=
x
2
y
h
(
x
,
y
)
=
x
2
+
y
2
−
1
x
2
+
y
2
=
1
∇
f
=
<
2
x
y
,
x
2
>
∇
h
=
<
2
x
,
2
y
>
\begin{array}{l} f( x,y) =x^{2} y\\ h( x,y) =x^{2} +y^{2} -1\\ x^{2} +y^{2} =1\\ \nabla f=< 2xy,x^{2} >\\ \nabla h=< 2x,2y > \end{array}
f(x,y)=x2yh(x,y)=x2+y2−1x2+y2=1∇f=<2xy,x2>∇h=<2x,2y>
我们希望找到成比例的梯度:
∇
f
=
λ
∇
h
⟹
{
2
x
y
=
2
λ
x
x
2
=
2
λ
y
\begin{aligned} & \nabla f=\lambda \nabla h\\ \Longrightarrow & \begin{cases} 2xy=2\lambda x\\ x^{2} =2\lambda y \end{cases} \end{aligned}
⟹∇f=λ∇h{2xy=2λxx2=2λy
联合等式:
2
x
y
=
2
λ
x
x
2
=
2
λ
y
x
2
+
y
2
=
1
\begin{array}{l} 2xy=2\lambda x\\ x^{2} =2\lambda y\\ x^{2} +y^{2} =1 \end{array}
2xy=2λxx2=2λyx2+y2=1
我们可以求出 y 2 = 1 3 , x 2 = 2 3 \displaystyle y^{2} =\frac{1}{3} ,x^{2} =\frac{2}{3} y2=31,x2=32,将这个值带到目标函数里, x 2 y = 2 3 1 3 = 2 3 9 \displaystyle x^{2} y=\frac{2}{3}\sqrt{\frac{1}{3}} =\frac{2\sqrt{3}}{9} x2y=3231=923,这个就是目标函数的最优解啦!到这里我们只考虑了等式约束,也就是 h = 0 h=0 h=0的情况,没有考虑 g j ( x ) ≤ 0 g_j(x)\le0 gj(x)≤0 的情况,其实,到这里已经很好理解了,如果最优值的点是落在 g j ( x ) < 0 g_j(x)<0 gj(x)<0处的话,那么我们是没有必要让这个 g j g_j gj的梯度也跟 f f f的梯度垂直,因为落在里面的时候在各个方向都可以任意的移动,并不会受到约束,所以我们如果 g j ( x ) < 0 g_j(x)<0 gj(x)<0,那么我们令其对应的 μ j = 0 \mu_j=0 μj=0。
参考资料
Lagrange multipliers, using tangency to solve constrained optimization