跳轉到

算力與結構的對話#

1945 年 ENIAC 每秒約執行五千次加法。今天一枚手機晶片每秒可執行數兆次浮點運算。將近八十年的時間裡,硬體的成長曲線改變了人類可以做什麼樣的數學。但如果把計算數學的進步全部歸功於「機器變快了」,就會錯過整個故事最精彩的部分:演算法的結構性改進,往往比硬體成長更驚人,而且兩者互相餵養。本章講兩件事——算力的歷史,以及為什麼光有算力遠遠不夠。

摩爾定律:一段被經濟與政治驅動的成長史#

1965 年,仙童半導體的 Gordon Moore 在《Electronics》雜誌上撰文觀察到:積體電路上可容納的元件數,大約每年翻一倍(1975 年他修正為每兩年)。這個後來被稱為摩爾定律的經驗規律,並非物理定律,而是一張自我實現的產業承諾書:半導體公司把「跟上摩爾定律」寫進研發時程與財務預測,資本市場據此定價,政府據此補貼,人才據此流入。1968 年 Moore 與 Robert Noyce 創立 Intel,最初的主業是記憶體晶片,真正發跡靠的是 1971 年的 4004 微處理器與後來的 x86 路線。

摩爾定律背後是美國的政治與軍事投入。1960 年代的阿波羅計畫與洲際飛彈的導航需求,是積體電路最早的穩定買家——阿波羅導航電腦消耗了當年全美相當大比例的 IC 產量,把單價從數十美元壓到個位數。冷戰的國防預算養大了這個產業,產業的規模經濟又把晶片推向消費市場。1980 年代日本半導體崛起(NEC、富士通、東芝在 DRAM 市場一度壓過美國),反而刺激了美國在 1987 年成立 Sematech 聯盟、政府與企業共同出資重振製造——晶片史從來都是科技、經濟與地緣政治的三重奏。

超級電腦:從 Cray 到地球模擬器#

Seymour Cray 是超級電腦的代名詞。他從 CDC 6600(1964 年,一般公認第一部超級電腦)做到 1976 年的 Cray-1:向量處理器、75 MHz 時脈、首次以每秒 100+ 百萬次浮點運算的宣稱問世。Cray 的工程哲學近乎藝術:為了讓訊號路徑夠短,Cray-1 做成圓形沙發狀;散熱問題用氟化液冷解決。美國的國家實驗室(Los Alamos、Livermore)與氣象單位是 Cray 機器的主要客戶——氫彈模擬與數值天氣預報,正是 ENIAC 時代延續下來的兩大「殺手級應用」。

1990 年代後,大規模平行架構取代了單機向量機。2002 年,日本地球科學技術總合研究機構(Earth Simulator Center)的「地球模擬器」(Earth Simulator)以每秒約 35.86 兆次浮點運算奪下 TOP500 冠軍,效能是當時美國最快機器的近五倍。這在日本國內被稱為「日本化(Japan Image)危機」後的科技反擊,在美國則被媒體形容為「技術珍珠港」(Sputnik 式的驚嚇),直接促使美國在 2002 年啟動「高性能運算復興計畫」,成立 SCI 領導層與後續的機器研發路線圖。氣候模擬、地震、核子庫存管理(stewardship without testing,即以模擬取代實際核試)成為新一代超級電腦的國家級理由。此後 TOP500 榜首在美、中、日之間輪替,超級電腦成為國家科技實力的公開計分板。

GPU 與深度學習:算力找回了它的理論#

GPU 的出現是另一種故事。1999 年 NVIDIA 推出 GeForce 256 並首度以「GPU」行銷,最初只為電玩遊戲的即時著色。遊戲產業的龐大利潤(再一次:娛樂經濟養大了基礎算力)讓 GPU 以每年數倍的節奏演進。研究者逐漸發現,矩陣乘法與向量運算正是 GPU 的強項——2007 年 NVIDIA 推出 CUDA,把顯示晶片開放為通用平行計算平台。2012 年,Hinton 的學生 Alex Krizhevsky 等人用兩顆 GPU 訓練 AlexNet,在 ImageNet 視覺競賽上把錯誤率從前一年的約 26% 一舉壓到約 16%,深度學習革命自此引爆。到了 2020 年代,訓練大型模型動輒需要上千顆加速器聯合運轉數週,算力成為 AI 競賽的硬通貨,各國政府相繼推出晶片補貼法案與出口管制——摩爾定律時代的地緣政治劇本,換了演員重新上演。

光有算力不夠:四個結構性的教訓#

然而計算數學史給的最深刻教訓是:算力是必要條件,不是充分條件。以下四個概念,是機器再快也繞不過去的牆。

第一是條件數。一個問題本身可能對輸入極度敏感:輸入動一點點,答案天翻地覆。例如用 Hilbert 矩陣求解線性方程組,\(n=10\) 時條件數已達 \(10^{13}\) 量級,雙精度浮點(相對精度約 \(10^{-16}\))的輸入誤差會被放大到完全淹沒答案。這不是機器的錯,也不是演算法的錯,而是問題本身的病態。1940 年代 Turing 與馮紐曼各自獨立提出矩陣條件數的概念,Wilkinson 在英國國家物理實驗室(NPL)的 ACE 機器上以後向誤差分析(backward error analysis)系統化了整套誤差理論——數值分析的成熟,正是為了回答「機器算出來的東西可以信到什麼程度」。

第二是數值穩定性。同一個數學問題,兩個代數上等價的演算法,在有限精度下可以有生死之別。經典例子是求二次方程 \(ax^2+bx+c=0\) 的根:直接套公式 \(x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}\),當 \(b^2 \gg |4ac|\) 時,其中一個根會因為相近數相減而失去幾乎全部有效位數;換一個代數等價的寫法(先算較大的根,再用 Vieta 公式 \(x_1 x_2 = c/a\) 求另一根)就完全穩定。更大的例子是求解特徵值:1950 年代的早期嘗試用特徵多項式求根,很快就證明是大災難——Wilkinson 用例子(後來以他命名的 Wilkinson 多項式)說明多項式係數的微小擾動會讓根劇變。最後勝出的是 QR 演算法(1958-1961 年由 Francis 與 Kublanovskaya 獨立發展),它不碰特徵多項式,靠正交變換迭代收斂,穩定到今天仍是標準。選對演算法,不是工程細節,是數學判斷。

第三是複雜度理論。有些問題本質上就是貴。1971 年 Cook 提出 NP 完全性,証明(與 Levin 獨立)滿足性問題(SAT)等一大類問題互為多項式等價;1979 年 Garey 與 Johnson 的經典著作把數百個問題歸入 NP 完全的行列。P 對 NP 的問題至今未解,是克雷數學研究所 2000 年懸賞百萬美元的七大難題之一。它的實際意義是:對許多組合優化問題(旅行商、整數規劃的一般情形),指望「等機器更快就能算大規模」是不切實際的——輸入每多一個城市,計算量可能成倍暴增。計算數學對此的回應不是放棄,而是轉向:多項式時間的近似演算法、啟發式、以及「放寬問題」的技巧(如線性規劃鬆弛、半正定規劃),這些本身就是深刻的數學。

第四是維度災難(Curse of Dimensionality)。Bellman 在 1957 年的動態規劃著作中提出這個詞:許多看似自然的數值方法,其成本隨維度呈指數成長。想把 \([0,1]^d\) 上一個函數用每維 \(m\) 個點的網格離散,總點數是 \(m^d\)——\(d=100\) 時就算 \(m=2\) 都超過宇宙原子的數量。這堵牆決定了高維問題(統計學習、量子多體、金融選擇權)必須走完全不同的路:蒙地卡羅方法的收斂速率 \(O(1/\sqrt{N})\) 不依賴維度,這解釋了為什麼它成為高維積分的救命索;而近代的稀疏網格、張量分解、低秩近似,則是在結構上反擊維度災難的數學武器。

好演算法的乘數效果#

結構改進的力量,用數字說話最有說服力。

快速傅立葉變換(FFT):離散傅立葉變換樸素計算是 \(O(N^2)\)。Cooley 與 Tukey 在 1965 年發表的 FFT 演算法把它降到 \(O(N \log N)\)。歷史上的曲折是:Gauss 早在 1805 年(比傅立葉的理論還早)就在小行星軌道內插的手稿中寫下等價的想法;Tukey 後來回憶,這個演算法在二戰期間已被英國與美國的戰時計算團隊知道,但因保密未公開。FFT 的實際效果:\(N = 10^9\) 時,\(O(N^2)\) 要 \(10^{18}\) 次運算(現代單機需要數百年),\(O(N\log N)\) 約 \(3\times 10^{10}\) 次(不到一分鐘)。等價於把硬體速度放大了近三億倍。頻譜分析、數位濾波、影像壓縮(JPEG)、通訊(OFDM)都建立在它之上。

Strassen 演算法:1969 年 Volker Strassen 證明矩陣乘法不需要 \(O(n^3)\)——用分塊與七次(而非八次)子矩陣乘法,得到 \(O(n^{\log_2 7}) \approx O(n^{2.807})\)。這個結果震動了整個領域:連「矩陣乘法要 \(n^3\)」這種看似顯然的事都可以改進,還有什麼不能?此後的紀錄一路推進(Coppersmith–Winograd 的 \(O(n^{2.376})\),2000 年代至今的 Alman–Vassilevska Williams 等改進,理論界已到 \(O(n^{2.37}\) 略多\()\)),但在實務上,由於常數因子與數值穩定性,多數函式庫仍用改良的分塊樸素演算法——理論上的乘數效果與工程上的選擇之間,永遠存在張力。有趣的是,2022 年 DeepMind 的 AlphaTensor 用強化學習搜尋矩陣乘法的新分解,在特定硬體上找到了打破人類紀錄的演算法——演算法設計本身,也開始成為被計算的對象。

這就是本書想傳達的核心直覺:硬體的指數成長與演算法的結構改進是相乘的,不是相加的。摩爾定律給你每年百分之幾十的進步,一個好演算法可能一次給你百萬倍。反過來說,忽視條件數、穩定性、複雜度與維度災難的人,會發現再大的算力也只是更快地算出一個錯的、或算不完的答案。算力回答「能不能算」,結構回答「值得怎麼算」——兩者的對話,構成了現代計算數學的全部風景。