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

地貌:梯度、海森矩陣與極小值

最佳化,是在一片你只能用腳底感覺、卻永遠無法從上空俯瞰的地貌中,尋找最低點。這篇要建起那張地圖:指向上坡的梯度、揭示曲率的海森矩陣、能把真正谷底與山口分辨開來的條件,以及兩大策略——線搜尋與信賴域——本級後面每一個方法都是它們的變奏。

站在地貌上的黑暗之中

這一級剩下我們要計算的幾乎一切,都是同一個問題換上不同衣裳:給定一個函數 f,它吃進一個向量 x = (x_1, x_2, ..., x_n) 並吐回一個數,找出讓 f 盡可能小的那個 x。這就是無約束最佳化。聽起來很窄,但求極大不過是求極小的相反數,而驚人地多的問題都歸結到它:擬合一個模型,就是把預測與資料之間的失配極小化——正是這座階梯前面那個最小平方問題,只是現在誤差曲面彎了;訓練一個神經網路,就是在上百萬個權重上把損失極小化;設計一座橋,就是在它不會倒塌的前提下把重量極小化。學會找出一個函數的底部,你就學會了現代科學與機器學習極大一片版圖底下的那具計算引擎。

這裡有一幅要握住整整一級的圖像。把 f 想成一片地貌在輸入平面 x 之上的高度。把 f 極小化,就是找出那片地形的最低點。殘酷的關鍵——正是這個關鍵讓最佳化成為一種演算法而非一條公式——在於你無法從上空看見這片地貌。你是一名濃霧夜行的登山者。在你目前所在之處,你只被允許量測恰好兩件事:你正站立處的高度 f(x),以及朝每個方向的陡峭程度——哪邊是上坡、有多陡。憑著這些純粹局部的、一次只在一個點取得的量測,你必須設法走到全域的底部。本級的每個方法,都是「該往哪邊踏、踏多遠」的一套不同策略,所憑藉的無非是你腳底能感覺到的東西。

梯度:直指上坡的那支箭

由單變數微積分你知道 f'(x) 量測斜率。在多維裡,斜率不再是一個數,而是每個輸入方向各一個數,把它們裝進一個向量,就得到梯度,記作 grad f(x)。它的第 i 個分量,是 f 對 x_i 的偏導數——若你只輕推那一個座標,f 變化得有多快。梯度有一個值得永遠記住的優美幾何意義:在任一點,grad f 指向最陡上升的方向,也就是 f 攀升最快的那唯一一個羅盤方位,而它的長度,就是那裡攀升得有多陡。轉個身,你就有了最陡下降的方向 -grad f:最往下坡的踏法,這正是它之所以是天然的下降方向、也是下一篇種子的緣故。

現在來看第一個關鍵事實,也就是「令導數為零」的多變數回聲。若 x 是一處山谷的真正谷底,那麼那裡的地面是平的——同時在每一個方向上都平。所以在極小值處,梯度必須完全消失:grad f(x) = 0。這就是一階最佳性條件,幾乎每個方法暗地裡追獵的就是它。解 grad f(x) = 0,是解一個 n 個方程、n 個未知數的系統,這恰恰就是上一級的求根問題,只是現在「我們要找其零點的那個函數」正是梯度本身。最佳化與求根是同一枚硬幣的兩面:極小化 f,或者找出 grad f 的一個零點。把這座橋記在心裡——第三篇會直接走過它。

海森矩陣:曲率,以及碗的形狀

如果說梯度是多變數版的 f'(x),那麼海森矩陣就是多變數版的 f''(x):所有二階偏導數構成的矩陣,記作 H 或 grad^2 f。它的 (i, j) 分量說的是,當你沿第 j 個方向移動時,梯度的第 i 個分量如何變化——白話說,就是斜率怎麼彎。f' 告訴一條一維曲線它是上凹還是下凹,而海森矩陣則同時告訴整片地貌它在每個方向、以及每種方向組合上的曲率。對光滑函數,海森矩陣是對稱的(混合偏導的次序無關緊要),這是一份小小的禮物:對稱矩陣有實的特徵值與正交的特徵向量,而那些特徵方向,正是這只碗的主軸——地形彎得最急與最緩的方向。

鞍點就是在這裡被逮住的。在一個駐點上,去看海森矩陣的特徵值。若它們全為正,曲面在每個方向都向上彎——你正坐在一只真正的碗底,一個真正的局部極小值。若它們全為負,你在一座山峰上。若有些正、有些負,曲面有些方向往上彎、有些往下:那是鞍點,你該繼續走。這就是二階最佳性條件:grad f = 0 再加上海森矩陣正定,便保證是一個局部極小值。一個特徵值全為正的對稱矩陣,稱為正定,所以這句口號很簡單:梯度為零、海森矩陣正定,意味著你真的到了。

海森矩陣還偷偷夾帶了本級的核心反派——條件數——正是條件數那一章的同一個觀念,如今穿上了幾何的戲服。最大特徵值對最小特徵值的比值,就是海森矩陣的條件數,它量度這只碗有多歪斜。當所有特徵值都相近時,等高線近乎圓形、碗是圓的;下降法運作得漂亮極了。當最大特徵值遠遠壓過最小的,碗就是一道又長、壁又陡、底卻近乎平坦的峽谷,而此處一個接近 10^8 的條件數,與求解 A x = b 時的同樣具有毀滅性——是同一個數在造同樣的孽。那道被拉長的峽谷,正是你在緊接的下一篇就會遇上的鋸齒形震盪的幕後元兇。

凸性:當局部即是全域

至此一切都是局部的——這裡地面平、這裡向上彎。但你要的是整片地貌中的最低點,而一名抵達某處谷底的霧中登山者,無從知曉是否有一座更深得多的山谷,正候在下一道山脊之後。一般而言這道鴻溝無法跨越:非凸最佳化可以有無數個局部極小值,而找出全域那個是真正困難的。然而有一類受祝福的問題,這道鴻溝乾脆閉合了——凸最佳化。一個函數若它的圖形是一只沒有任何另外凹坑的單一碗,便稱為凸的:曲面上任意兩點之間的弦都落在曲面之上或其上方;等價地,對光滑的 f,海森矩陣處處半正定。

凸性的回報巨大無比,值得鏗鏘地說清楚:對一個凸函數,每一個局部極小值自動就是全域極小值。沒有可供困住你的假山谷,沒有藏著更好東西的山脊。所以單單一個駐點——grad f = 0 的一個解——就把整個問題了結了,而一趟卑微的下坡之行便保證能抵達真正的底部。這正是為什麼凸問題,包括你將遇到的最小平方擬合與線性規劃問題,被認為是「已解」的,而訓練一個深層網路卻不是。不過要誠實面對邊界:現代機器學習裡大多數的損失曲面斷然是非凸的,佈滿了鞍點與極小值,而本級後面的方法在那裡並不會神奇地找出全域最優——它們找到一個夠好的局部解,至於這在實務上為何如此奏效,至今仍有幾分是個謎。

兩大策略:線搜尋與信賴域

我們有了地圖,卻還沒有行走的方法。本級幾乎每個方法都是迭代的,與它之前的線性求解器和求根器同一種精神:從一個猜測 x_0 出發,生成一個序列 x_0, x_1, x_2, ...,你盼望它一路下坡滑向某個極小化點。整門手藝就在於把每個 x_n 變成一個更好的 x_{n+1},而做這件事有兩套宏大的哲學。現在就替它們命名是值得的,因為你會遇到的每個具體演算法——最陡下降、牛頓法、BFGS,乃至機器學習的隨機方法——都是這兩個框架之一內部的一個特定選擇。

第一套是線搜尋:先挑方向,再挑距離。在 x_n 你選一個下降方向 p_n——某個往下坡的方向,意思是它指向逆著梯度的那半邊空間——然後你問一個一維的問題「我該沿 p_n 走多遠?」那個單變數子問題就是線搜尋,而你不會把它解得精確;你只取一個夠長到能有實質進展、又夠短到不會衝過頭的步,這個平衡由我們將遇到的條件(沃爾夫條件)所釘住。不同的方法只差在它們如何挑 p_n:最陡下降取 p_n = -grad f,牛頓法用海森矩陣把它扳彎,而像 BFGS 這樣的擬牛頓法則廉價地近似那個彎。

第二套是信賴域:先挑距離,再挑方向。在這裡你承認你的局部資訊——梯度與曲率——只在 x_n 周圍某個小半徑內才值得信賴,於是你畫一個那個半徑的圓(信賴域),在圓內為 f 建一個簡單的模型(通常是泰勒展開來的二次式),然後跳到那個模型在圓內的極小值。若真正的 f 像模型所允諾的那樣下降了,你信對了它、便放大半徑;若真正的 f 令你失望,你縮小那個圓再試一次。信賴域法恰恰在線搜尋脆弱之處更為穩健——在鞍點附近,那裡曲率為負、一個天真的牛頓步可能朝著極大值飛走——因為那條半徑的牽繩,永遠不讓步子失控暴衝。

generic descent loop (line-search flavour):

  x = x0
  repeat:
      g = grad f(x)                 # local slope (the gradient)
      if ||g|| < tol:  stop         # first-order condition: grad f ~ 0
      p = choose_direction(g, H)    # -g, or a Newton/quasi-Newton bend
      a = line_search(f, x, p)      # how far along p (a > 0)
      x = x + a * p                 # take the step

  the methods of this rung differ ONLY in choose_direction:
      steepest descent : p = -g
      Newton           : solve  H p = -g   (uses curvature)
      quasi-Newton     : p = -B*g, B approximates the inverse Hessian
後面每個方法都掛在這副骨架上:量測梯度、檢查一階條件、挑一個方向、線搜尋一段距離、踏步。第二到第五篇各自以不同的方式填入 choose_direction 與踏步規則。

什麼是局部的、什麼是誠實的,以及我們接下來往哪走

在繼續行軍之前,握住那些假設,因為遺忘它們正是最佳化在實務上出錯的方式。這裡的一切都建立在 f 夠光滑、能有梯度與海森矩陣之上;尖角與跳躍會打破整幅圖像、需要不同的工具。梯度與海森矩陣本身通常是近似算出的——用有限差分,它背負著與數值導數同樣的步長兩難與捨入誤差地板,或者好得多地用自動微分,那是每個深度學習框架背後的勤勞工具。而這趟迭代活在浮點數裡:「grad f = 0」永遠不會被精確達到,所以實務上你在梯度僅僅變小時就停手,而在一只病態的碗上,一個小的梯度仍可能離真正的極小值很遠。你算出的每一個極小化點都是近似,其品質如本學科一向那樣,由條件數乘以穩定性所決定。

這就是那片地貌與那套工具。梯度給出一階條件 grad f = 0;海森矩陣的特徵值給出那個把真正極小值與鞍點分開、並悄悄定下碗之條件數的二階檢驗;凸性是那份讓局部即全域的禮物;而線搜尋對信賴域,則是真正行走的兩種方式。本級剩下的,就是這副骨架被血肉填滿。第二篇取最顯然的方向 p = -grad f,卻發現它沿著病態峽谷以一種令人抓狂的鋸齒形緩緩爬行。第三篇用海森矩陣把步子扳彎,成為牛頓法及其更廉價的擬牛頓表親,修好那道鋸齒。第四篇用隨機梯度下降以速度換取精確性,那是機器學習的引擎。而第五篇替搜尋圍上一道籬笆——約束——並遇上拉格朗日乘子與 KKT 條件。你如今有了地圖;接下來四篇講的,是學會把它走好。