罰函數法(penalty method)
沒有一道硬牆強制執行,你要如何遵守規則?加罰款。你偏離容許範圍越遠,罰款越大,直到守規矩單純成了較便宜的選擇。罰函數法正是用這個想法把受約束最佳化問題化為無約束問題:把每個約束換成一個只要違反就增大的成本項,然後用普通的無約束方法最小化合併後的目標。
要在約束 g(x) = 0 下最小化 f(x),二次罰函數法改為在所有 x 上、無任何約束地最小化 f(x) + (rho/2) * g(x)^2。平方項 g(x)^2 在約束成立時為零、否則為正,而罰權重 rho 控制違反被懲罰得多嚴厲。rho 小則約束鬆散地被強制;接著你「增大」rho(rho = 10、100、1000、...)並重新求解,隨 rho 增長,極小點被擠向滿足約束。不等式 g(x) <= 0 用單邊罰,如 (max(0, g(x)))^2。每個子問題都是標準的無約束最小化,所以梯度下降、牛頓、擬牛頓的全套機制可直接套用——這份簡單正是該方法的全部魅力。
罰函數法因實作簡單、能處理一般非線性約束而受重視,並支撐許多實用工具(包括許多工程與機器學習設定中的軟約束)。誠實又重要的難處:當 rho 增到很大以緊密強制約束時,無約束子問題會變得病態——罰項主宰一切,造出一條陡峭狹窄的谷,於是內層求解器慢到龜爬、精度受損。二次罰也只在極限 rho -> 無限大時才精確滿足約束,有限的 rho 從不滿足。解方是增廣拉格朗日法,它在罰項上加進明確的拉格朗日乘子估計,f(x) - lambda * g(x) + (rho/2) g(x)^2;這讓約束能在「中等、固定」的 rho 下被滿足(避開病態的爆炸),這也是 ADMM 與 LANCELOT 等正式求解器所用的形式。
在約束 x = 3 下最小化 f(x) = x^2。二次罰最小化 x^2 + (rho/2)(x - 3)^2,其極小點為 x = 3 rho / (rho + 2):rho = 1 給出 x = 1,rho = 100 給出 x = 2.94,rho = 10000 給出 x = 2.9994——只在 rho 增長時逼近真答案 3,而那條谷越來越陡、越來越難最小化。
對違反處罰;提高罰金直到約束幾乎成立。
樸素二次罰只在 rho -> 無限大時才精確滿足約束,而大的 rho 讓子問題嚴重病態,精度與內層求解器雙雙惡化。改用增廣拉格朗日法:明確的乘子估計讓中等、固定的 rho 就能完成任務,而不引發病態。