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

梯度下降與最小二乘

梯度不只定位平坦處——它把最陡的下坡路遞到你手裡,而一步步沿它走下去,正是訓練幾乎每一個機器學習模型的誠實引擎。把這同一個引擎對準一條擬合直線的誤差,你便抵達最小二乘。

梯度指向最陡的下坡

在本臺階裡,我們一直把梯度 nabla f 當作探測器:令它為零,便找到平坦處——候選的峰、坑與鞍點。但梯度不為零並非失敗——它是一隻羅盤。回想整道階梯的核心事實:nabla f 指向 f 最陡上升的方向,而它的長度恰是那段攀爬有多陡。這就是[[gradient-steepest-ascent|梯度作為最速上升]]的含義。把它反過來,minus nabla f 指向相反方向——最陡下降的方向,即從你腳下出發 f 跌落最快的那唯一一個羅盤方位。

為什麼那是最陡的方向,而不只是眾多下坡方向中的一個?想像你站在霧中的山坡上。當你沿某個單位方向 u 邁步時 f 的變化率,就是方向導數;一個簡短的計算表明它等於 nabla f 點乘 u——即梯度在你所選方位上的投影。點積在兩個向量對齊時最大,所以當 u 恰好沿 nabla f 時攀爬最陡,當 u 恰好逆 nabla f 時下降最陡。其他每個方向都給出更緩的坡;與梯度垂直的方向則毫無變化,這正是它們描出水平集的緣由。

一步步走下坡

現在把羅盤變成一段旅程。你想要 f 的極小,卻看不見整片地貌——你只能感覺腳下的坡度。於是採取能想到的最有耐心的策略:無論身在何處,沿最陡下坡方向邁一小步,然後再看,再邁。這就是[[steepest-descent|最速下降]],更新就是誠實的一行:x_new = x_old - t 乘 nabla f(x_old)。負號送你下坡,nabla f 給出方向與陡度,而正數 t——步長——說明在重新查看之前要邁出多遠。

唯一最難的抉擇就是那個步長。t 取得太小,你便寸寸前挪,要走上千個微步才橫過一片緩坡。t 取得太大,你便一躍越過谷底、落在對面更高的坡上,也許每次彈得更寬,直到整個過程崩飛。經典最速下降以一次線搜索來解決:沿所選的射線,它暫時化為一個單變量問題,你挑選在那條射線上最小化 f 的那個 t——也就是你早在第一卷就熟知的單變量最小化。每這樣一步都把你落在路徑變平之處,從而逼得下一個方向必與這一個垂直。

這被迫的垂直,正是最速下降著名的弊病。在又長又窄的山谷裡——一道橫向遠比縱向更陡的溝壑——每一步都橫射過谷底、衝過了頭,下一步又射回來,於是路徑以微小的橫步在谷中鋸齒般下行,而不是順谷長徑直往下跑。收斂慢如蝸行。這不是可以打補丁抹去的缺陷;它內在於只跟隨一階坡度資訊這件事,也正是它催生了更聰明的表親——共軛梯度、動量,以及把曲率納入考量的牛頓型方法。樸素的方法,是它們全體誠實的概念祖先。

梯度下降:機器真正如何學習

這裡是與機器學習誠實的連接,不留半點魔法。訓練一個模型,就是選取它的參數——比方說一個神經網路的權重——好讓某種誤差度量盡可能小。這個誤差,看作所有權重一齊的函數,就是損失:一個單一的數,坐落在一片可能有數百萬維(每個權重一維)的地貌之上。學習,不多不少,就是最小化這個損失,而幹這活的主力就是[[calc-gradient-descent|梯度下降]]——正是你剛遇見的那個下坡步,被放大到了龐大的維度。

實用的梯度下降對教科書的理想作了兩處務實的偏離。其一,它放棄了精確線搜索:在數百萬個權重上哪怕只算一次梯度都已昂貴,所以你不再每步去求最佳的 t,而是固定一個小步長,稱為學習率,記作 eta。更新寫作 x_new = x_old - eta 乘 nabla f(x_old)。挑選 eta 是一門藝術——太小則訓練拖上幾天,太大則損失發散——而實用機器學習的很大一部分,坦白說,就是學會調它。其二,梯度本身由反向傳播算出,那無非是把鏈式法則小心地沿網路各層逆向施用。

凸性:下坡何時就夠了

梯度下降有一個深刻而誠實的侷限:它永遠只往下坡走,所以它停在路徑碰巧抵達的那個低處——一個局部極小,未必是任何地方的最低點。這正是[[local-versus-global-optimum|局部最優與全域最優]]的核心。在一片滿是凹坑的崎嶇地貌上,你從哪裡出發決定了你落進哪個凹坑,而演算法無從知道是否有一道更深的谷就藏在下一道山脊之後。它看不見整張地圖;它只感覺腳下的坡度。

有一種美麗的情形讓這層憂慮徹底消失:當 f 是一個[[convex-function|凸函數]]時。凸函數就是圖像能兜住水的函數——它像碗一樣向上拱,圖像上任意兩點之間的直弦總落在圖像之上或與之重合,從不在其下方。決定性的後果是一條值得背下來的定理:對凸函數,每個局部極小自動就是全域極小。沒有可供困住人的虛假山谷,因為本質上只有一個山谷。那麼任何誠實的下坡方法——包括梯度下降——都保證能找到真正最好的答案。

凸性有一個乾淨的判別,能接回本臺階前面的幾篇。對光滑函數,f 凸當且僅當它的黑塞矩陣處處半正定——這是「曲面在每一點、每個方向上都向上彎(或至少絕不向下彎)」的多元說法。所以凸性不過是二階導數判別法被推到全域且永久的版本:不只是某一個駐點處的一個碗,而是處處同時都是碗。但要誠實地面對這份保證的代價:大多數真正有趣的問題,尤其是神經網路訓練,是劇烈非凸的。在那裡乾淨的定理失效,一切保證都軟化為僅僅局部的陳述,而梯度下降依然如此管用,一部分靠來之不易的工程,一部分靠經驗上的好運氣。

最小二乘:把擬合當作最佳化

現在把這整套機械對準應用科學中最常見的任務:用模型擬合數據。你有一團測得的點,想要那條「最接近」它們的直線,但沒有哪一條單一的直線能全部命中——數據點比可調的旋鈕(斜率與截距)多。誠實的做法是先界定「最接近」是什麼意思,再去最小化它。[[calc-least-squares|最小二乘]]選取使直線與數據之間豎直間隙的平方和盡可能小的那條線。把間隙平方,會更重地懲罰大的偏差,讓每個誤差都保持為正而不致相消,並且——關鍵地——給出一個你能求導的光滑函數。

正是在這裡,整道臺階咔嗒一聲合攏。記斜率為 m、截距為 b;總平方誤差 E(m, b) 就只是這兩個變量的函數——一張鋪在 (m, b) 平面上的曲面。而它是平方之和,所以是一隻完美的開口朝上的碗:凸的,有唯一的全域極小,處處沒有鞍點或虛假凹陷。要找最佳直線,我們做的恰是第一篇所教的:令偏導數為零,dE/dm = 0 與 dE/db = 0,求解。因為碗是凸的,那一個駐點保證就是全域最佳擬合。擬合一條直線不是另一門手藝——它就是穿著日常便裝的多元最佳化。

令這兩個導數為零,會產生一個小小的線性方程組——而寫成矩陣形式,它就是著名的[[normal-equations|正規方程]]。把模型寫作 A x = b,其中 A 裝著輸入,x 是未知參數,b 是數據;最小化殘差 A x - b 的平方長度並令梯度為零,給出 A 的轉置乘 A 乘 x = A 的轉置乘 b。「正規」一詞是幾何性的:在最佳擬合處,殘差被弄得與模型所能觸及的空間垂直——法向——所以最小二乘解恰是數據到那個空間上的正交投影,剩下的誤差以直角戳出去。把誤差平方,便把對「接近」的含糊願望,化成了你能一舉求解的乾淨投影。

Fit a line  y = m x + b  to data points (x_i, y_i),  i = 1..N

  residual at point i :   r_i = (m x_i + b) - y_i
  squared error       :   E(m, b) = sum_i  r_i^2          (a convex bowl)

set both partials to zero:
  dE/dm = 2 sum_i x_i (m x_i + b - y_i) = 0
  dE/db = 2 sum_i    (m x_i + b - y_i) = 0

=> the normal equations (2 x 2 linear system in m and b):
  [ sum x_i^2 , sum x_i ;  sum x_i , N ] * [ m ; b ] = [ sum x_i y_i ; sum y_i ]

TWO routes to the SAME answer:
  closed form  ->  solve the 2x2 system directly       (one shot)
  iterative    ->  gradient descent on E(m,b)           (step downhill)
擬合一條直線就是多元最佳化:一隻凸的平方誤差碗,要麼由正規方程閉式求解,要麼由梯度下降迭代求解——兩者都落在同一個極小處。

通向同一谷底的兩條路

最小二乘此刻顯出一個把本篇兩半繫在一起的小小奇蹟。同一條最佳擬合直線,可以由兩條截然不同的路抵達。正規方程一舉給出它——一個閉式答案,解出線性方程組便大功告成。或者你可以完全不理那道公式,只在平方誤差碗上跑梯度下降:從任意斜率與截距出發,反覆把它們逆著 E 的梯度輕推,看著直線朝數據緩緩爬去。迭代夠多次後,參數穩定在正規方程直接點名的那同一處。一條路是代數,另一條是往下坡走,而因為碗是凸的,它們不可能彼此相左。

既然有公式,何苦還選那條慢路?得對規模誠實。正規方程要求構造並求解一個尺寸隨參數個數增長的方程組,而構造 A 的轉置乘 A 還悄悄把問題對捨入誤差的敏感度平方了,所以為了穩定,謹慎的軟體寧取 QR 分解或奇異值分解,而非那道生公式。更具決定性的是,當模型有數百萬個參數時——每一個現代模型都如此——那閉式形式大得無從拼裝,而單獨一個梯度步卻依舊廉價。這才是迭代下降統治機器學習的真正緣由:不是精確答案未知,而是一次一個廉價小步地走到它那裡,才是唯一能擴展的辦法。

退後一步,看清本臺階的整道弧線。你從尋找梯度消失的平坦處、並用黑塞矩陣為之分類開始;你學會了用拉格朗日乘數在約束下最佳化;如今你又把梯度從探測器變成了載具,騎著它下坡去訓練模型、去擬合數據。臨界點、二階導數判別法、約束、下降——這不是四樣彼此分立的把戲——它們是同一套「尋找最優」的微積分,從四個角度講述。那唯一的思想,一經放大,就是現代工程與機器學習共同的內在引擎。