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 同號。當子式落在零上時檢驗無定論,恰如無約束檢驗在退化海森矩陣上保持沉默。

這為接下來打開了什麼

退一步看,整套方法的形狀就清晰了。要在多個等式約束下最佳化,你寫下一個拉格朗日函數,令每個偏導為零以找到梯度相互平衡的候選點,再讀加邊海森矩陣,給每個候選貼上極大、極小或兩者皆非的標籤——這一切都要尊重那條讓各約束梯度保持無關的約束規範。一階條件找出候選;二階條件裁決它們。這正是你早已從單變量最佳化裡熟知的兩幕劇,如今在一個彎曲的、更低維的可行集上重新上演。

一處不動聲色的局限,徑直指向下一篇。這裡的一切都假定了等式約束——你必須恰好站在其上的曲面。而真實的工程遠更常遞給你不等式:一筆不可超出的預算,一個必須低於的應力,一段不能為負的長度。那時可行集是一個帶邊界的實心區域,而最優可能深藏其內部(約束在那裡無所作為,由尋常駐點性掌管),也可能正抵在某條邊上(在那裡它表現得像個等式)。釐清哪些約束在起作用,正是躍向不等式約束世界、以及你接下來將遇到的 卡羅需-庫恩-塔克條件的那一跳。