前面我们有提到,拉格朗日乘子法和KKT求解约束优化问题的思路就是:
将有约束的问题转化为无约束的问题 (最优化问题(一))。转换的主要思想是将约束条件函数与原函数联立,从而求出使原函数取得极值的各个变量的解。
等式约束时使用拉格朗日乘子法,不等约束时使用KKT条件。
对于等式约束问题,
拉格朗日乘子法的做法是对原目标函数进行改造,一般包含如下几个步骤:
1)构造拉格朗日函数
2)解变量的偏导方程
3)带入目标函数
拉格朗日乘子法构造的新目标函数如下:
F ( x , δ ) = f ( x ) + ∑ j = 1 l δ j h j ( x ) F(x, \delta)=f(x)+\sum_{j=1} ^ l \delta_j h_j(x) F(x,δ)=f(x)+∑j=1lδjhj(x)
其中, f ( x ) f(x) f(x)是原始目标函数, h j ( x ) h_j(x) hj(x)为第 j j j个不等式约束, δ j \delta_j δj为对应的约束系数。相当于是将目标函数和约束项加权求和。
然后,分别对每一个变量求导,注意:此时权重 δ \delta δ 也是自变量。相当于:
∂ F ∂ x i = 0 \dfrac{\partial F}{\partial x_i}=0 ∂xi∂F=0,……
∂ F ∂ δ j = 0 \dfrac{\partial F}{\partial \delta_j}=0 ∂δj∂F=0,……
下面我们结合例子理解一下。给定椭圆:
x 2 a 2 + y 2 b 2 + z 2 c 2 = 1 \dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} + \dfrac{z^2}{c^2} = 1 a2x2+b2y2+c2z2=1
求这个椭球内接长方体的最大体积。
这个问题实际上就是条件极值问题,即在条件 x 2 a 2 + y 2 b 2 + z 2 c 2 = 1 \dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} + \dfrac{z^2}{c^2} = 1 a2x2+b2y2+c2z2=1 下,求 f ( x , y , z ) = 8 x y z f(x,y,z)=8xyz f(x,y,z)=8xyz 的最大值。
1)带入拉格朗日乘子法中,新目标函数为:
F ( x , y , z ) = f ( x , y , z ) + δ h ( x , y , z ) = 8 x y z + δ ( x 2 a 2 + y 2 b 2 + z 2 c 2 − 1 ) \begin{aligned} F(x,y,z) & = f(x,y,z) + \delta h(x,y,z) \\ & =8xyz+\delta (\dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} + \dfrac{z^2}{c^2} - 1) \\ \end{aligned} F(x,y,z)=f(x,y,z)+δh(x,y,z)=8xyz+δ(a2x2+b2y2+c2z2−1)
2)对 F ( x , y , z , δ ) F(x,y,z,\delta) F(x,y,z,δ) 求偏导可得:
∂ F ( x , y , z , δ ) ∂ x = 8 y z + 2 δ x a 2 = 0 \dfrac{\partial F(x,y,z,\delta)}{\partial x} = 8yz+\dfrac{2 \delta x}{a^2} = 0 ∂x∂F(x,y,z,δ)=8yz+a22δx=0
∂ F ( x , y , z , δ ) ∂ y = 8 x z + 2 δ y b 2 = 0 \dfrac{\partial F(x,y,z,\delta)}{\partial y} = 8xz+\dfrac{2 \delta y}{b^2} = 0 ∂y∂F(x,y,z,δ)=8xz+b22δy=0
∂ F ( x , y , z , δ ) ∂ z = 8 x y + 2 δ z c 2 = 0 \dfrac{\partial F(x,y,z,\delta)}{\partial z} = 8xy+\dfrac{2 \delta z}{c^2} = 0 ∂z∂F(x,y,z,δ)=8xy+c22δz=0
∂ F ( x , y , z , δ ) ∂ δ = x 2 a 2 + y 2 b 2 + z 2 c 2 = 1 = 0 \dfrac{\partial F(x,y,z,\delta)}{\partial \delta} = \dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} + \dfrac{z^2}{c^2} = 1 = 0 ∂δ∂F(x,y,z,δ)=a2x2+b2y2+c2z2=1=0
解方程可得:
x = 3 3 a x=\dfrac{\sqrt 3}{3}a x=33a, y = 3 3 b y=\dfrac{\sqrt 3}{3}b y=33b, x = 3 3 c x=\dfrac{\sqrt 3}{3}c x=33c
3)带入原始目标函数,求得:
V m a x = f ( 3 3 a , 3 3 b , 3 3 c ) = 8 3 9 a b c V_{max} = f(\dfrac{\sqrt 3}{3}a, \dfrac{\sqrt 3}{3}b, \dfrac{\sqrt 3}{3}c) = \dfrac{8\sqrt 3}{9}abc Vmax=f(33a,33b,33c)=983abc
至此,通过拉格朗日乘子法求得了该等式约束下的最大值。
那么为什么可以这么转换呢?
借用维基百科上的例子,对于如下二维优化问题:
m i n f ( x , y ) min f(x,y) minf(x,y), S.t. g ( x , y ) = c g(x,y)=c 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) 和 g ( x , y ) g(x,y) g(x,y) 在切点的梯度是在一条直线上的。因此有:
∇ f ( x , y ) = λ ( ∇ g ( x , y ) − c ) \nabla f(x,y) = \lambda (\nabla g(x,y)-c) ∇f(x,y)=λ(∇g(x,y)−c)
但实际实现过程中,直接求偏导为0这一方法使用的较少,一般都是采用优化算法迭代拟合,如梯度下降。具体原因可以参见求最优值,梯度下降算法 or 偏导等于0 ?。
对于不等式约束问题,
如果直接套用拉格朗日乘子法,会得到如下表达式:
F ( x , δ ) = f ( x ) + ∑ i = 1 m β i g i ( x ) F(x, \delta)=f(x) + \sum_{i=1} ^m \beta_i g_i(x) F(x,δ)=f(x)+∑i=1mβigi(x)
其中, f ( x ) f(x) f(x)是原始目标函数, g i ( x ) g_i(x) gi(x)为第 i i i个不等式约束, β i \beta_i βi为对应的约束系数。我们引入了KKT条件,
KKT条件是说最优值必须满足以下条件:
1)L(a, b, x)对x求导为零;
2)h(x) =0;
3)a*g(x) = 0;
这一块我也没怎么看懂☺️,后续看懂后再补齐。