JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

拉格朗日乘数法

你想登上一座山的最高处——却不许离开一条划定的小径。诀窍简单得惊人:答案恰恰出现在小径与某条等高线相切之处,也就是目标与约束的梯度指向同一方向的那唯一一点。

受约束的问题

在上一篇里,你通过令函数 f(x, y) 的梯度为零来搜寻它的峰与谷——这是[[unconstrained-optimization|无约束优化]]中切平面水平的条件。但几乎没有哪个真实问题是无约束的。工厂在产出固定数量的前提下使成本最小;卫星在到达固定轨道的前提下求最省燃料;肥皂膜在贴附于固定铁丝框的前提下使面积最小。每一种情形里,你都不能在整个平面上自由游荡:你被钉在一条曲线上,即满足某条件 g(x, y) = 0 的点集。问题于是变成:仅在这些被允许的点中,f 在何处最大或最小?

脑中要握住这样一幅图。把目标函数 f 画成一片等高线构成的地形——水平集 f(x, y) = c,每一条都是 f 取常值的曲线,就像地形图上一圈圈彩色的环。如今把约束曲线 g(x, y) = 0 叠上去,它是一条蜿蜒穿过那张地图的固定路径。你是一名不许离开路径的徒步者。沿着它走,你会从一圈等高环跨到下一圈;f 的值随你的路线起起落落。你想要的是路径上 f 升到最高的那一刻。

为何两个梯度必须对齐

沿约束路径慢慢走,看你跨过哪些等高环。当路径横切这些环——从较低的等高线切向较高的——f 仍在变化,所以你还没到最佳点;继续走就能爬得更高。f 沿路径的值唯有在路径不再跨环时才会停止变化。而要身在路径上却连一瞬都不跨过任何等高线,唯一的办法是路径与某条等高线相——擦着它,亲吻一圈环而不切穿它。这个相切就是全部的秘密。

现在把相切翻译成梯度的语言。回想本台阶的关键事实:梯度永远垂直于它自己的水平集,并指向最陡上升的方向。于是 nabla f 垂直于 f 的等高线,而 nabla g 垂直于约束曲线(约束曲线无非就是水平集 g = 0)。当两条曲线相切时,它们共享同一条切线——因而共享同一个垂直方向。两个拥有相同垂线的向量,自身必然平行。故而在最优点处,nabla f 与 nabla g 指向同一条直线。方向信息恰好对齐,是因为沿着被允许的方向,f 的方向导数必须为零——不离开路径就再无上坡可赚。

方法,逐步走一遍

平行梯度的想法化成一套配方。条件 nabla f = lambda nabla g 是一个向量方程,所以在二元情形它实际上是两个标量方程——一个对 x 分量,一个对 y 分量。再加上约束 g = 0,便是三个未知数 x、y 与乘数 lambda 的三个方程。解这个方程组,找到的点就是你受约束的最优与最劣的候选。

  1. 把约束写成 g(x, y) = 0 的形式(把所有项移到一边),并辨明你要优化的目标 f(x, y)。
  2. 用你已熟悉的偏导数,算出两个梯度 nabla f = (df/dx, df/dy) 与 nabla g = (dg/dx, dg/dy)。
  3. 令它们平行:df/dx = lambda dg/dx,且 df/dy = lambda dg/dy。这是你的两个分量方程。
  4. 把约束 g(x, y) = 0 作为第三个方程并入,三者一起求解 x、y 与 lambda。
  5. 在你找到的每个候选点上算出 f;最大的值即受约束最大值,最小的即受约束最小值。

把这一切一次性记住的干净办法,是拉格朗日函数 L(x, y, lambda) = f(x, y) - lambda * g(x, y)。取它的三个偏导数并各令为零。对 x 与 y 的偏导恰好重现两个平行梯度方程;而对 lambda 的偏导,妙极了,正好交还约束 g = 0,因为 lambda 是线性出现的。于是整个受约束问题变成一个普通的「令梯度为零」问题——只多了一个维度。我们把平面上的受约束搜索,换成了 (x, y, lambda) 空间里无约束的驻点搜寻。

Objective:   maximize  f(x, y) = x * y     (area of a rectangle)
Constraint:  g(x, y) = 2x + 2y - P = 0     (fixed perimeter P)

Lagrangian:  L = x*y - lambda*(2x + 2y - P)

  dL/dx = 0  ->   y = 2 lambda
  dL/dy = 0  ->   x = 2 lambda     ==>  x = y   (a square!)
  dL/dlam = 0 ->  2x + 2y = P      ==>  x = y = P/4

so the largest-area rectangle of fixed perimeter is the square,
and lambda = (P/4)/2 = P/8  -- we read its meaning below.
经典的范例:在所有周长固定的矩形中,正方形围出的面积最大——而乘数顺带白白算出。

乘数究竟意味着什么

人们很想把 lambda 当作可弃之物——一根算完就扔的代数拐杖。这太小看它了。乘数承载着真实含义:lambda 是最优值对约束放松的敏感度。把约束写成 g(x, y) = c,并令 f 所能达到的最佳值为 M(c)。那么,到一阶,dM/dc = lambda。换句话说:若你把预算放宽一个单位,可达到的最佳 f 大约改善 lambda 个单位。这正是经济学家称 lambda 为影子价格的缘由——它是约束所配给的那种稀缺资源每多一个单位的边际价值。

回看那个矩形。我们求得最大面积是边长 x = y = P/4 的正方形,故最佳面积为 M(P) = (P/4)^2 = P^2 / 16。直接求导:dM/dP = 2P / 16 = P/8——这正是我们算出的 lambda。这种吻合并非巧合;它是敏感度定理的现身。把可用周长拉长一丁点 dP,所围面积大约增加 (P/8) dP。那个你或许会扔掉的乘数,一直在悄悄告诉你约束与奖赏之间的兑换率。

诚实的限制,以及它接下去通向何处

对这方法保证什么、不保证什么,要诚实。平行梯度条件是受约束最优的必要条件,而非充分条件。它定出约束上的驻点,但那些点可能是极大、极小、或两者都不是,正如单变量里切线水平之处可能是峰、谷或鞍点。方法递给你一份嫌疑名单;它自身并不告诉你哪个是极大、哪个是极小。在闭且有界的约束曲线上,稳妥的做法就是上面步骤里那条:径直在每个候选点上算 f,读出最大与最小。若要改用曲率来判别某候选点,你得检验[[bordered-hessian|加边海森矩阵]],它是上一篇二阶导数判别法的受约束表亲。

还有第二条诚实的提醒:推导悄悄假定了在最优点处 nabla g 不是零向量。若 nabla g 在那里为零,约束曲线便有一个尖角或尖点——其切线方向无从定义——于是「平行梯度」这幅利落的图景就崩了,因为你无法与一个没有方向的向量平行。这类点必须另行手工检查。这一非退化性是约束规范的小字条款;它是真正需要的,而非走过场,省掉这一检查正是一份细致的解偶尔会漏掉真正答案的原因。