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

多个约束与加边海森矩阵

一个约束把你钉在一张曲面上;多个约束把你钉在它们的交集上——一条曲线、一道棱、一个角。本篇教你一次性平衡一整束力,并读懂那个终于能把约束极小与约束极大区分开来的加边海森矩阵。

从一堵墙到诸墙相会的墙角

在上一篇里,单个等式约束 g(x) = 0 把你困在一张弯曲的曲面上,而[[lagrange-multiplier|拉格朗日乘数]]法则说,唯一值得检查的地方,是 nabla f 与 nabla g 平行之处——即 f 的等值集恰好擦过约束曲面的地方。从几何上看,nabla g 笔直地指离曲面,所以条件 nabla f = lambda nabla g 是说:f 的梯度中沿着曲面的那一部分已被抵消殆尽,再没有任何你被允许走的下坡方向了。

现在一次性加上两个约束,g_1(x) = 0 与 g_2(x) = 0。每一个都是一张曲面;坚持两者同时成立,就把你钉在两面相交之处。在三维里,这交集不再是一张曲面,而是一条曲线——一根在空间中弯折的金属丝。三个变量配三个约束,它便收缩成孤立的点。你每加一个约束,就吃掉一个自由度:n 个变量、m 个独立约束,你被限制在一个维数为 n 减 m 的可行集上。优化问题与其说变难了,不如说变窄了。

想象你站在房间里两面墙相会的墙角。要合法地待着,你必须同时把后背贴住两面墙,于是只能沿两墙交接的竖直接缝滑动。一个被压向接缝的球,会停在重力沿接缝再无分量之处——但如今有两面墙各自回推,球的重量是被这两股推力的某种组合托住的。这种多股力的平衡,正是多约束法则将要写下的东西。

多约束的法则

推广如下。在 g_1 = 0, ..., g_m = 0 约束下的约束极值处,目标函数的梯度必须是各约束梯度的线性组合:nabla f = lambda_1 nabla g_1 + lambda_2 nabla g_2 + ... + lambda_m nabla g_m。每个约束都挣得自己的乘数 lambda_i。这是[[multiple-constraints|多约束拉格朗日法]]的核心,它说的恰是墙角图景所暗示的——目标的梯度完全被各约束力撑住,再无任何沿可行集方向的残余分量。

这里藏着一个诚实的条件,很容易被略过。该法则只在正则点处有保证——即各约束梯度 nabla g_1, ..., nabla g_m 线性无关之处。这就是约束规范。若你的两张约束曲面相切,或某个约束暗中重复了另一个,它们的梯度就会塌缩到同一条直线上,「墙角」退化,于是即便在真正的最优点处,乘数也可能根本不存在。约束梯度的无关性,是线性无关在多元情形下的回声:它保证可行集真的具有你所期望的干净维数 n 减 m,并带有一个良定义的切空间。

实践中你绝不会徒手摆弄那个向量方程。你把一切折叠进一个拉格朗日函数里,去搜寻它的驻点。定义 L(x, lambda_1, ..., lambda_m) = f(x) - lambda_1 g_1(x) - ... - lambda_m g_m(x)。令 L 的所有偏导数为零,一举找回两样东西:对原变量 x 求导重现 nabla f = sum lambda_i nabla g_i,而对每个 lambda_i 求导则恰好重现约束 g_i = 0。于是 L 上一个驻点条件,就把力的平衡与可行性要求捆进了同一个待解的方程组。

  1. 构造拉格朗日函数 L = f - lambda_1 g_1 - ... - lambda_m g_m,每个约束配一个乘数。
  2. 对每个原变量求 L 的偏导并令其为零——这就是梯度平衡条件。
  3. 对每个乘数求 L 的偏导并令其为零——这只是还原出原始约束 g_i = 0。
  4. 把整个方程组连同变量与乘数一起解出来;每个解都是一个约束临界点——是候选,尚未定论。

为何寻常的二阶导数检验失灵

解出方程组给了你候选点,但它从不告诉你哪些是极小、哪些是极大、哪些两者都不是。在无约束问题里你用二阶导数检验了结此事:构造二阶偏导组成的海森矩阵,检查它的定性——正定意味着碗状(极小),负定意味着穹顶状(极大),不定意味着鞍点。很想直接把同一个检验套到拉格朗日函数上就收工。这种诱惑是个陷阱。

它失灵的原因微妙,值得看清。在约束问题里,你并不在乎 f 沿每个方向如何弯曲——只在乎它沿可行集弯曲,即你实际被允许移动的那些方向。一个点可能看着像整个拉格朗日函数的鞍点,沿某个被禁的方向上弯、沿另一个下弯,可一旦你把自己限制在约束曲线上,它却是一个再好不过的极小。朴素海森矩阵回答的是错误的问题;它包含了那些迈离约束的方向,那是问题所禁止的方向。你需要一个已被告知哪些方向合法的曲率检验。

加边海森矩阵

补救之法是[[bordered-hessian|加边海森矩阵]],其名已道出它的构造。先取拉格朗日函数 L 仅对原变量所成的海森矩阵——L 对 x_i 与 x_j 的二阶偏导。再给它加边:把由各约束一阶偏导组成的行与列裹在外圈,并在诸约束彼此相会的角上放一块零块。对两变量中的单个约束 g,布局是一个 3 乘 3 的矩阵;对 n 个变量中的 m 个约束,则是一个 (n + m) 乘 (n + m) 的矩阵,左上角带一个 m 乘 m 的零块。

One constraint g, two variables x, y.  Border with the gradient of g:

          |   0      g_x     g_y  |
   H_b =  |  g_x    L_xx    L_xy  |
          |  g_y    L_yx    L_yy  |

  g_x, g_y   = first partials of the constraint   (the BORDER)
  L_xx ...   = second partials of the Lagrangian  (the inner Hessian)
  corner 0   = constraints have no second-order self-term

 m constraints, n variables  ->  (n+m) x (n+m), with an m x m zero block.
加边海森矩阵的布局:约束梯度把一圈外边裹在拉格朗日函数的内层海森矩阵之外,角上是零。

为何加边能完成上一节「删去被禁方向」的活儿?因为约束梯度的那些行与列充当了一道滤网。当你计算这矩阵的行列式时,加边在代数上把内层海森矩阵投影到约束的切空间上——它悄悄丢掉了你不被允许移动的那些方向上的曲率,只留下你实际能感知的曲率。加边海森矩阵,乔装之下,正是被限制到可行集上的寻常海森矩阵。你检验的依旧是碗状还是穹顶状,但只沿合法方向检验。

读懂主子式的符号

判决来自加边海森矩阵的各顺序主子式——其左上方各方块的行列式——的符号。加边把一切都挪了位,所以法则不是无约束情形里你用过的那个简单的「全正即极小」。在 n 个变量、m 个约束下,你只看最后 n 减 m 个顺序主子式(小的那些被零角强制,不携带信息),并把它们对照一个依赖于 m 的符号样式来检查。

取最干净的情形来锚定这个样式:单约束、两变量,于是上面那个 3 乘 3 矩阵,以及唯一要紧的子式——它的整个行列式。若 det(H_b) 为正,该约束临界点是局部极大;若 det(H_b) 为负,则是局部极小。注意这符号感觉与无约束检验相反——这里正的行列式标示极大——这一翻转不是笔误,而是角上那个零的直接后果。对极大,相关子式从某一方向起交替变号;对极小,它们全都与 (-1)^m 同号。当子式落在零上时检验无定论,恰如无约束检验在退化海森矩阵上保持沉默。

这为接下来打开了什么

退一步看,整套方法的形状就清晰了。要在多个等式约束下优化,你写下一个拉格朗日函数,令每个偏导为零以找到梯度相互平衡的候选点,再读加边海森矩阵,给每个候选贴上极大、极小或两者皆非的标签——这一切都要尊重那条让各约束梯度保持无关的约束规范。一阶条件找出候选;二阶条件裁决它们。这正是你早已从单变量优化里熟知的两幕剧,如今在一个弯曲的、更低维的可行集上重新上演。

一处不动声色的局限,径直指向下一篇。这里的一切都假定了等式约束——你必须恰好站在其上的曲面。而真实的工程远更常递给你不等式:一笔不可超出的预算,一个必须低于的应力,一段不能为负的长度。那时可行集是一个带边界的实心区域,而最优可能深藏其内部(约束在那里无所作为,由寻常驻点性掌管),也可能正抵在某条边上(在那里它表现得像个等式)。厘清哪些约束在起作用,正是跃向不等式约束世界、以及你接下来将遇到的 卡罗需-库恩-塔克条件的那一跳。