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

預處理:快速收斂的關鍵

共軛梯度法與 GMRES 的速度,受限於你矩陣譜的好壞——而真實矩陣的譜往往很醜。這篇收尾的指南教你如何悄悄把困難的系統換成一個等價但容易的系統,讓同一個原本慢如蝸牛的 Krylov 方法,瞬間健步如飛。

前兩篇指南尾聲撞上的那道牆

到現在,你已經能在對稱正定系統上建立 Krylov 子空間 並執行 共軛梯度法,或在一般系統上執行 GMRES。這兩者都是越過緩慢的 雅可比法高斯-賽德爾法 的一大躍進。但那兩篇指南都在同一個令人不安的結論上收尾:Krylov 方法收斂得多「快」,並不是方法說了算。它由 A 的譜所決定——對 CG 而言,是 條件數 kappa(A);對 GMRES 而言,是特徵值在平面上散布的方式。這些你無從選擇;是矩陣把它們塞給你的。

回想那個具體的 CG 估計:誤差每一步大約縮小一個因子 (sqrt(kappa) - 1) / (sqrt(kappa) + 1)。當 kappa(A) 是不大的 100 時,sqrt(kappa) = 10,這因子約為 9/11——令人愉快,很快。但真實格點問題的矩陣很惡劣:對一個 N 點格點上的拉普拉斯算子,kappa 約如 1/h^2 般成長,所以把網格細化 10 倍,kappa 就乘上 100。當 kappa = 10^6 時,sqrt(kappa) = 1000,因子是 999/1001——每一步幾乎什麼都換不到,你得跑上數千次迭代。方法本身沒問題;問題出在矩陣。

於是轉折就在這裡。既然收斂由矩陣主宰、而矩陣又很糟,那就「換掉矩陣」——但不改變答案。這個單一、略帶頑皮的念頭,就是 預處理,它正是「迭代求解器只是教科書裡的奇珍」與「迭代求解器是幾乎一切大規模科學計算主力」之間的分水嶺。

核心把戲:求解一個等價但更容易的系統

假設你有一個矩陣 M,它某種程度上「接近」A,但對它求解卻便宜到不費吹灰之力。把 A x = b 兩邊左乘 M 的逆,得到一個新系統 M^(-1) A x = M^(-1) b。它的解 x 與先前「完全相同」——你只是把方程式重寫了,並沒有改變它們所說的內容。但 Krylov 方法現在看到的矩陣是 M^(-1) A,而若 M 挑得好,M^(-1) A 的譜會比 A 溫和得多。我們稱 M 為 預處理子,而 M^(-1) A 為預處理後的算子。

兩個理想的極端讓這念頭變得生動。若你選 M = A 本身,那麼 M^(-1) A 就是單位矩陣 I,其條件數為 1,任何 Krylov 方法都會「一步」收斂——但套用 M^(-1) = A^(-1) 恰恰就是你想避開的原問題,所以這選擇毫無用處。另一個極端,M = I 意味著 M^(-1) A = A,你什麼也沒做。每個真實的預處理子都活在這兩者之間的張力裡:它必須夠接近 A,讓 M^(-1) A 表現得像單位矩陣;又得夠便宜,讓每次迭代求解 M z = r 幾乎不花成本。整門藝術就是在這兩個要求之間取得平衡。

預處理子對全局做了什麼

把 CG 想成讓一顆球滾下一個碗,碗的形狀由 A 決定。當 kappa(A) 很大時,這碗是一道又長又窄、壁又陡的山谷——球在窄的方向上來回振盪許多次,同時沿長的方向緩慢爬行。那種來回曲折,正是收斂緩慢的本質。一個好的預處理子會重塑這只碗:M^(-1) A 把那道扭曲的山谷,變成接近一個圓碗的東西,球幾乎能一路直滾到底。最低點不變、答案不變——下降卻容易得多。

從譜的角度看,故事的重點在於把特徵值「聚攏」。CG 之所以快,不只在 kappa 小,更精確地說,是在算子的特徵值擠成少數幾個緊密的群組時,因為 Krylov 多項式只需在那些群組上取得很小的值。GMRES 也一樣:它收斂所需的步數,大約就是相異特徵值群組的個數。一個能把廣為散布的譜聚攏成一兩團、且靠近數值 1 的預處理子,能把上千次迭代的求解變成十次的——即使原始條件數看起來沒有大幅改善,致勝的關鍵正是這份聚攏。

兩點誠實的警告。第一,預處理並未廢除條件性那一階的鐵律:若底層問題 A x = b 本身就是 病態的,真正的答案仍然敏感,當 kappa 接近 10^8 時,無論你迭代得多漂亮,仍會在約 16 位 雙精度 數字中損失約 8 位。預處理加快的是「收斂」;它無法製造出資料並不支持的準確度。第二,一個「好」的預處理子是因問題而異的——在熱擴散格點上奏效如奇蹟的 M,對另一個算子可能毫無作用。並不存在一個普世最佳的預處理子,而找到對的那一個,往往是真實求解中最困難的部分。

選擇 M:從廉價粗糙到強大深刻

最簡單的預處理子莫過於 M = diag(A),也就是 A 的對角線——這是 雅可比(對角)預處理,沒錯,正是你在雅可比迭代裡遇過的那條對角線。套用它的逆,只是把每個殘差分量除以一個對角數字,便宜得不得了。它對均勻格點幫助不大,但當 A 的對角元素大小差異懸殊時卻出奇地有效,做法不過是把各列重新縮放到相當的量級。它幾乎不花成本,所以是最自然的第一個嘗試。

往上一大步是 不完全 LU 預處理子,寫作 ILU。回想直接求解器那一階:稀疏矩陣的完整 LU 分解會受填入之苦——因子 L 與 U 冒出許多新的非零元,可能變得近乎稠密。ILU 計算一個「近似」分解,刻意丟棄大部分的填入——例如只在 A 原本就有非零元的位置保留非零——得到便宜、稀疏的因子 L 波浪號與 U 波浪號,使得 M = L波浪號 乘 U波浪號 約等於 A。套用 M^(-1) 於是只是兩趟稀疏三角替代法,所費不多。ILU 是一個穩健、通用的預設選擇,往往能把迭代次數削減一大截。

在強大的這一端坐著 多重網格法,它值得擁有專屬的一篇指南,但在此一見也很值得。它的洞見是:像高斯-賽德爾這樣的簡單迭代,能極快地消滅高頻(鋸齒狀、局部的)誤差,卻幾乎碰不到低頻(平滑、整體的)誤差。多重網格法在平滑誤差「看起來變鋸齒」的地方攻擊它:在一個較粗的網格上。它在細網格上稍微平滑一下,把剩餘的誤差轉移到粗網格——那誤差在此看起來成了高頻——在那裡求解,再修正回來——遞迴地、穿過一整個網格階層。其驚人的回報是:對許多橢圓型問題,多重網格法把誤差壓降的速率「與網格大小無關」,以 O(N) 的工作量解完整個系統——最優,是你所能企盼的極致。當作 CG 內部的預處理子使用時,它的效力令人嘆為觀止。

把它組起來:逐步走過預處理共軛梯度法

讓我們追蹤預處理如何嵌進你已熟悉的迴圈。和純 CG 相比,恰好只多了一行——預處理求解 M z = r——接著搜尋方向便由預處理後的殘差 z、而非原始殘差 r 來建構。其餘一切,包括讓 CG 如此優雅的那些廉價遞迴關係,全都保留。有個微妙處要替對稱系統標示出來:為保持 CG 有效,算子必須維持對稱正定,所以 M 本身必須是對稱正定的,且要對稱地使用它;這也是為何 ILU 對對稱正定矩陣有個對稱的表親(不完全 Cholesky 分解)。

PLAIN CG step              PRECONDITIONED CG step
----------------------     ----------------------------
r = b - A x                r = b - A x
                           solve  M z = r       <-- the only new line
p = r        (first step)   p = z        (first step)
alpha = (r.r)/(p.(A p))    alpha = (r.z)/(p.(A p))
x = x + alpha p            x = x + alpha p
r_new = r - alpha (A p)    r_new = r - alpha (A p)
                           solve  M z_new = r_new
beta = (r_new.r_new)/(r.r) beta = (r_new.z_new)/(r.z)
p = r_new + beta p         p = z_new + beta p

per iteration: one  A*p  product  +  one  M z = r  solve
純 CG 對比預處理 CG。整個改動就是那次 M z = r 求解,以及在內積與方向更新中改用 z。

讓這一切值得的,是成本效益的帳本。每次預處理迭代都比純迭代昂貴——你每一步都要付出那次額外的 M z = r 求解。但若它換來迭代次數從 2000 次降到 30 次,你就大獲全勝。對的問題從來不是「每一步是否更便宜?」而是「總時間 =(每步成本)×(步數)是否更小?」一個能猛砍步數的較重預處理子通常獲勝;一個昂貴到足以與求解原系統相提並論的預處理子(如 M = A)則落敗。你要朝那個甜蜜點去調校。

退一步看:整階的全貌

看看本階所描出的弧線。我們從追問 為何要迭代而非消去 開始——因為對真實科學中那些上百萬列的稀疏系統而言,O(n^3) 的分解之牆無法跨越。我們認識了 定常 方法,學到它們的收斂存亡繫於 譜半徑。我們建立了 Krylov 子空間 以及其上的最優方法——對稱正定系統用 CG、其餘用 GMRES——並依一個合理的 停止準則 緊盯每個殘差。而現在,有了預處理,我們握住了那根把這些方法從「理論上優雅」變成「實務上無可匹敵」的槓桿。

這通向何處?同一套 Krylov 機器、同一份預處理的直覺,會在整個計算數學中一再現身——在特徵值那一階,Lanczos 與 Arnoldi 其實是偽裝的 Krylov 方法;也深藏在剛性問題逼你採用的隱式時間步進器之中,那裡每一步都暗藏一個大型線性求解。你如今握有大規模數值線性代數的核心反射:當問題大到無法分解,就迭代;當迭代太慢,就預處理。把這對習慣帶著往前走,那些巨大的系統就不再是牆,而成了家常便飯。