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 在那裡為零,約束曲線便有一個尖角或尖點——其切線方向無從定義——於是「平行梯度」這幅利落的圖景就崩了,因為你無法與一個沒有方向的向量平行。這類點必須另行手工檢查。這一非退化性是約束規範的小字條款;它是真正需要的,而非走過場,省掉這一檢查正是一份細緻的解偶爾會漏掉真正答案的原因。