导语:拉格朗日乘子法是用于解决一类有约束的非线性规划问题的方法。它并不是一个计算结果的算法,而是把规划问题转化成一个更简便的格式,便于使用其他的算法进行计算。著名的马科维兹均值-方差问题就可以用拉格朗日乘子解决。
(内含公式推荐点击最下方“阅读原文”阅读。)
阅读本文前需要掌握线性代数、多元微积分以及非线性规划的基础知识。
要解决的问题

拉格朗日乘子是一个解决这类问题的方法。直接介绍拉格朗日乘子的话并不是很好理解,于是我们先把上述规划问题的解题思路捋一遍,文章最后再介绍拉格朗日乘子的时候,其中的原理就一目了然了。
g 的水平集


我们来选择一个水平集。嗯,c 等于多少好呢... 就 c=−1 吧。看一眼水平集
,如下图红线所示

如果从上方向下看函数 g˜ 的热力图,那么下图中的每一条线是 g˜ 的一个水平集,根据颜色的从紫到黄,依次是 c=−23,−22,…,22,23 的水平集。其中两条红线是我们的 c=−1 水平集

机智的读者一定已经算出,组成水平集 L˜−1的两条曲线在 (x,y) 坐标系上可以分别用函数

的图像表示。
我们来看水平集 L˜−1一个重要的的几何性质。假设从前有座山,山里有座庙,庙前有片空地,地形和图二里的一模一样。你顺着上边的那条红线走呀走,发现自己的 x 坐标和 y 坐标都在变动,可是竖向的 z 坐标一直不变,也就是说海拔不变。你摸着自己地良心问:“我走过了哪里,又将走向哪里?”良心答曰:“你在时间 t 的 (x,y) 坐标是
。”如梦初醒的你掏出小木棍在土地上一阵划拉,计算出自己在时间 t 的行走方向是
。
“谢谢你,我的良心。”
“嗯,别烦我了。”

也就是说 g˜ 的水平集的切线和 g˜的梯度是永远垂直的!
仔细想一想的话这也是当然。根据线搜索方法文章中所讲,函数 g˜在 (x,y)的梯度 ∇g~(x,y) 是 g˜的取值上升最快的方向,而 −∇g˜(x,y) 则是 g˜ 的取值下降最快的方向。水平集是 g˜取值不变的集合,那么在水平集上行走的话,行走方向应该和上升方向 ∇g˜ 之间保持一定角度,这样就不会上升,当然也要和下降方向 −∇g˜保持一定角度,这样就不会下降。用脚趾头一想,既然 ∇g˜ 和 −∇g˜ 之间的角度是 180 度,那么折中的不上不下的角度应该就是那个的一半吧,也就是说行走方向应该是和 ∇g˜ 垂直的。
以上的现象用直白的话说,就是梯度和水平集是垂直关系的,这也是多元微积分里的一个基础定理:
定理. 设 g:R^n→R 是一个 C^1 函数,c∈R 是一个实数,而 Lc⊆R^n 是 g 取值为 c 的水平集。对于任何一个 a>0 和 C^1 曲线 α:(−a,a)→Lc,都有 ∇g(α(t))⋅α′(t)=0。
证明. 因为对于所有 都有,所以也有 。微分,并且使用链式法则可得

是想要的等式。
用红色箭头表示函数 g˜ 的梯度的话,它会是像下图中这样,和水平集相垂直。

当然,这个现象不只是针对于例子中这个特定的 g,上面的定理适用于任何一个函数 g,它们的梯度和它们的水平集都是相互垂直的。
有请目标函数 f

它长得像这样,中间是一个小山丘。



现在就假设你又来了一座山,又发现了一座庙,庙前有个小山坡,长得这个样。站在山脚下,你回想起了以前沿着 g˜的水平集走过的路径,也就是
,你决定还沿着这条路来走这个山坡。
不过这次可和上一次不一样了,虽然走的同样的路径,但是地形不一样,所以海拔不再是一成不变,而是时高时低。你不禁好奇,在这条路上海拔最高的点在哪里?
你摸了摸自己的良心,“良心良心告诉我,...... ”
“请你不要摸我了好吗?好恶心的。”
“好,”你乖乖地把手拿开,“良心良心告诉我,我的海拔是多少?”
“你在时间 t 的海拔是
。”
啊!你再次恍然大悟,算出了 f˜(p(t)) 的导数并且设它等于零,不就知道海拔高度出现极值的地方了吗?事不宜迟,你掏出了小木棍,又开始在地上胡乱划拉起来。
这一晃又过去了二十三年,你终于长叹一口气,得到了一个如此简练的公式:

具体的数值什么的,已经都无所谓了(其实是因为你到最后也没搞清楚怎么微分 1/(32+3t^2),不过这种事就让它过去吧)。如果在时间t的海拔高度是最高的,那么上面的这条公式必定被满足。也就是说,对于一个点 x0∈L˜,如果 x0 是 f˜在 L˜c上的一个极大点,那么梯度 ∇f˜(x0)和 L˜c 在 x0 的切线一定是垂直的。
“谢谢你,我的良心。”
“你好烦呐。”
可是,这个公式看着真的是好眼熟啊,眼熟到好像刚刚看过... 是吧,

g˜的梯度和它的水平集永远是垂直的。那么,在极大点上,∇g˜和水平集垂直,∇f˜ 也和水平集垂直,也就是说... ∇g˜ 和 ∇f˜ 是平行的!!
事实上,这个现象不只是针对于例子中的 f˜ 和 g˜,对于任何 C1 函数 f 和 g 都是这样的。我们有定理如下:
定理. 设 f,g:R^n→R 是 C^1 函数,c∈R 并且 Lc={x∈R^n:g(x)=c}。如果 x0∈Lc 满足对于所有 x∈Lc 都有 f(x0)≥f(x) 或者 f(x0)≤f(x),那么存在某个 λ∈R 满足 ∇f(x0)=λ∇g(x0),满足这个条件的点叫做一个驻点 (critical point)。
这个定理在 n=2 情况下的证明正如本文中对 f 和 g 的推导一样,但是在更高的维度里有一些细节会增加证明的难度。不过,你只要坚定地相信这个定理是对的,就一定没有问题了!
那么,对于在上边例子中的函数,如果俯视观看 f 的水平集和行走的路径 p(t),是如下图:

图中红色箭头是 g 的梯度方向,蓝色箭头是 f 的梯度方向,在红线上 f 取值极大点的地方,两者的梯度方向是重叠的,标为紫色。
当应用于更一般性的 f 和 g 的规划问题中,定理告诉我们如果有 x0∈R^n 是 maxg(x)=cf(x) 问题的极大点的话,那么它不仅要满足 g(x0)=c,还要存在一个 λ∈R 以至于 ∇f(x0)=λ∇g(x0)。所以如果我们能找出满足这些条件的点,那就可以更简单地找到 x0。 当然,用这个方法算出的点不一定是极大点。它也有可能是极小点或者反射点,这就要用其他的办法来验证了,或者干脆把所有的驻点都算出来,然后比一比哪个大哪个小就知道了。
我们还要拉格朗日乘子干什么?
在以上的计算中,我们没用什么特殊的方法就解决了在 L˜−1上优化 f˜ 的问题,那么为什么还要需要拉格朗日乘子?
上面的例子的一个特点就是,它太简单了,或者说维度太低了,只用两条曲线就完全描述了水平集 L˜−1,在此之上只需要微积分就可以算出答案。但在更高的维度中,Lc是不能用曲线描述的,所以也不会有这么简单的计算方法。但是,前面得出的两个定理在高维中同样适用,并且根据定理,我们知道要找的极大点必须满足

这里 x∈R^n 并且 λ∈R,所以 L 是一个 R^(n+1)→R 的函数。严格来讲,这个函数中的 λ 被称为拉格朗日乘子 (Lagrange multiplier),但我们一般说“拉格朗日乘子”的时候指的是这里介绍的方法。
计算 L 的导数,分别得到


那么,

因此,在 g 的水平集上优化 f 的取值时,只需要计算 ∇L(x,λ) 的零点就可以了。
拉格朗日乘子完全版
拉格朗日乘子的功力还不止于此,它可以应用于有多于一个约束函数的规划问题。

定义函数


如果想要理解或者证明这个完整版的定理,我们需要更多的线性代数和微积分的工具,本文中则不进行更深入的讨论。

而它使用线搜索方法的算法就可以计算。将有约束的规划问题简化成无约束的规划问题,这已经足以体现拉格朗日乘子的价值了。
结语
当然,f 和 gi 并不一定都非常丑。如果目标函数和约束函数都是二次多项式,求得 ∇L 零点的准确值还不是绝望的难,而且很多重要的应用场景都在这个范畴之内,比如... 在量化课堂的下一篇文章中,我们就将针对马科维兹的均值-方差问题使用拉格朗日乘子进行优化,并计算出有效前沿的解析解。
后记
一个白发苍苍的老人独自蹲在荒凉的山脊上,攥着一根细小的木棍,胡乱在土地上划拉着。不论风吹雨打还是春去秋来,他日日都在,一写就是几十载。他书写的的看似是疯狂,又像是真理,模糊、混沌、捉摸不清。一条蜿蜒的红线记载了老人的路程,一头连着彼生,一头连着来世。我们知道,他是一个有良心的人,因为他的良心会说话,你听...
“。。。点击『阅读原文』,可到JoinQuant社区参与讨论:)”

长按指纹,关注JoinQuant

