2020s — 深度學習的線性代數#
案件摘要#
2020 年代,深度學習席捲世界,而它的心臟只有一顆:矩陣乘法。LLM 的每一層都是 \(y = Wx + b\) ,注意力機制是 \(\operatorname{softmax}(QK^T/\sqrt{d})V\) ,訓練 GPT-4 這種模型要動用上萬顆 GPU,做 \(10^{25}\) 次以上的浮點運算——其中九成以上是矩陣乘法。這樁大案不是單一偵探的傑作,而是 Strassen 的演算法、SVD 的理論、GPU/TPU 的硬體,在七十年間共同交織出的「線性代數基礎設施」。
前因 -- 為什麼會有這個案子#
- 1958 年 Householder 的 QR、1969 年 Strassen 的分塊乘法,把矩陣計算的理論與演算法基礎打好。BLAS(1979 年起)成為標準程式庫。
- 1965 年 Golub–Kahan 的 SVD 演算法:任意矩陣 \(A = U\Sigma V^T\) ,低秩近似、主成分分析(PCA)的數學基礎就此確立。
- 1986 年 Rumelhart、Hinton、Williams 的反向傳播(backpropagation):神經網路訓練本質上就是一連串矩陣乘法再加鏈鎖法則求梯度。
- 2012 年 AlexNet 用 GPU 訓練,掀開深度學習革命:GPU 的數千核心天生適合平行做矩陣乘法。
- 2017 年 Google 的 Transformer 論文〈Attention Is All You Need〉:拋棄遞迴,全部用注意力機制——而注意力的核心就是三個矩陣乘法。
- 2020 年代,GPT、BERT、LLaMA 等大語言模型把矩陣乘法推到極限:訓練一次的成本以百萬美元計,每一 FLOP 都要斤斤計較。矩陣乘法從「數學工具」變成「國家級基礎設施」。
線索與推理 -- 數學式、程式、理論#
線索一:深度學習的心臟 \(y = Wx + b\)#
神經網路的每一層線性變換:
一個 \(m \times n\) 的權重矩陣就是 \(mn\) 個可訓練參數。GPT-3 有 1750 億參數,幾乎全部裝在數百個這樣的矩陣裡。非線性(ReLU、GELU)只是「調味料」——表達能力來自矩陣的堆疊:
通用逼近定理(Cybenko 1989、Hornik 1991)證明:單隱層網路在寬度足夠時可逼近任意連續函數。但實務上「深」比「寬」效率高——而「深」的每一層,都是一次矩陣乘法。
訓練 = 反向傳播:對損失 \(L(y, \hat{y})\) 求梯度,鏈鎖法則展開:
其中每個 \(\frac{\partial h_{l}}{\partial h_{l-1}}\) 都涉及 \(W_l^T\) 的矩陣乘法。前向一次、反向兩次矩陣乘法——訓練成本約是推論的 3 倍。
線索二:注意力機制 \(\operatorname{softmax}(QK^T/\sqrt{d})V\)#
2017 年 Transformer 的核心創新:給定輸入序列 \(X \in \mathbb{R}^{n \times d_{model}}\) ,用三個權重矩陣投影出查詢(Query)、鍵(Key)、值(Value):
注意力輸出:
拆解: \(QK^T \in \mathbb{R}^{n \times n}\) 是成對相似度矩陣(每個 token 對每個 token 的關聯分數),除以 \(\sqrt{d_k}\) 是為了防止 softmax 飽和(內積的變異數隨 \(d_k\) 線性成長, \(\sqrt{d_k}\) 正規化使其穩定),softmax 轉成機率分布,最後乘 \(V\) 做加權平均。
注意力的意義:每個 token 可以「看向」序列中所有其他 token,權重由資料自動學出。這取代了 RNN 的循序處理——矩陣乘法可以完全平行,GPU 的數千核心同時上陣。這就是 Transformer 打敗 RNN 的關鍵:把「計算」轉化成「矩陣乘法」,讓硬體發揮到極致。
多頭注意力(multi-head)則是並聯 \(h\) 組不同的 \(W_Q, W_K, W_V\) ,讓模型同時學多種關聯模式。
線索三:嵌入向量與 SVD 的幽靈#
LLM 把每個 token 映射成向量(embedding):詞表大小 \(V\) (如 50,257)、維度 \(d\) (如 12,288),嵌入矩陣 \(E \in \mathbb{R}^{V \times d}\) 。語意關係藏在向量幾何裡:相似詞的向量夾角小、 \(\cos\theta\) 接近 1;經典的 \(king - man + woman \approx queen\) 就是線性代數的向量運算。
SVD 在這裡的幽靈無所不在: - 低秩近似: \(A \approx U_k \Sigma_k V_k^T\) (取前 \(k\) 個奇異值)是 PCA、推薦系統、主題模型的基礎。 - 模型壓縮:LLM 權重矩陣往往低秩,可以用 SVD 或 LoRA 分解壓縮。 - LoRA(Low-Rank Adaptation,2021):微調時凍結原始權重 \(W_0\) ,只訓練一個低秩增量:
參數量從 \(mn\) 降到 \(r(m+n)\) ——若 \(m = n = 12288\) 、 \(r = 8\) ,參數量從 1.5 億降到 19.6 萬,壓縮 768 倍。LoRA 讓單張消費級 GPU 就能微調大模型,這是 SVD「低秩」思想在 2020 年代的復活。
線索四:GPU/TPU 的大規模平行#
矩陣乘法 \(C = AB\) 的每個元素 \(C_{ij} = \sum_k A_{ik}B_{kj}\) 互相獨立——天生可平行。GPU 有數千核心,TPU 更是專為矩陣乘法設計的「脈動陣列」(systolic array):資料在硬體網格中流動,每個處理單元只做乘加。
2020 年代的效能關鍵字: - Tensor Core:NVIDIA GPU 的專用矩陣乘法單元,一次做 \(4\times 4\) 或 \(16\times 16\) 小塊乘法。 - 混合精度:FP16/BF16/FP8 訓練,矩陣乘法用低精度、累加用高精度。 - Flash Attention(2022):不改變數學,只改變記憶體存取順序,把注意力的 \(O(n^2)\) 記憶體需求降到 \(O(n)\) ——這是 Strassen 精神的現代版:「演算法不一定要改數學,改存取模式也行」。 - KV cache 與推論優化:推論時快取 \(K, V\) 矩陣,避免重複計算——本質是空間換時間。
程式碼範例:矩陣乘法與注意力機制的 numpy 實作#
import numpy as np
np.set_printoptions(precision=3, suppress=True)
rng = np.random.default_rng(7)
# 線索一:線性層 y = Wx + b
n_in, m = 8, 16
W = rng.standard_normal((m, n_in)) * 0.1
b = np.zeros(m)
x = rng.standard_normal(n_in)
y = W @ x + b
print("線性層輸出形狀:", y.shape)
# 線索二:注意力 softmax(QK^T/sqrt(d))V
n_tok, d_model, d_k = 6, 32, 8
X = rng.standard_normal((n_tok, d_model))
Wq, Wk, Wv = (rng.standard_normal((d_model, d_k)) * 0.1 for _ in range(3))
Q, K, V = X @ Wq, X @ Wk, X @ Wv
scores = Q @ K.T / np.sqrt(d_k) # 相似度矩陣 n x n
scores -= scores.max(axis=-1, keepdims=True) # 數值穩定的 softmax
attn = np.exp(scores) / np.exp(scores).sum(axis=-1, keepdims=True)
out = attn @ V
print("注意力權重(每列和為 1):")
print(attn)
print("每列和:", attn.sum(axis=-1))
print("輸出形狀:", out.shape)
# 線索三:LoRA 低秩微調
d, r = 128, 8
W0 = rng.standard_normal((d, d)) * 0.02
A_lora = rng.standard_normal((r, d)) * 0.01
B_lora = np.zeros((d, r)) # 初始化 B 為零:起點=W0
n_params_full, n_params_lora = d * d, r * (d + d)
print(f"全量微調參數: {n_params_full:,} LoRA 參數: {n_params_lora:,} 壓縮倍率: {n_params_full/n_params_lora:.0f}")
W_out = W0 + B_lora @ A_lora
print("‖W_out - W0‖ =", np.linalg.norm(W_out - W0)) # 應為 0(B 初始為零)
# 線索四:SVD 低秩近似驗證
U, S, Vt = np.linalg.svd(W0)
for k in [4, 8, 16]:
W_k = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
err = np.linalg.norm(W0 - W_k) / np.linalg.norm(W0)
print(f"秩 {k:2d} 近似相對誤差: {err:.4f}")
輸出顯示:注意力權重每列和為 1(softmax 正確)、LoRA 起點等於 \(W_0\) ( \(B\) 初始為零的設計)、SVD 低秩近似的誤差隨秩 \(k\) 增大而下降——矩陣分解、注意力、低秩微調三大線索在一個程式裡交會。
結案 -- 後果與影響#
- 線性代數成為 AI 時代的「通用語言」:從嵌入向量到注意力、從訓練到推論,LLM 的每一步都是矩陣運算。不會線性代數,就看不懂 2020 年代最重要的科技。
- 硬體為矩陣乘法而生:GPU 的 Tensor Core、TPU 的脈動陣列、蘋果 M 系列的神經引擎——晶片設計的核心指標就是「每秒多少矩陣乘法」。NVIDIA 從遊戲公司變成三兆美元巨頭,靠的就是這顆心臟。
- 軟體堆疊:cuBLAS、cuDNN、FlashAttention、PyTorch/DeepSpeed——整個 AI 軟體基礎設施都在最佳化矩陣乘法的記憶體存取與平行度。
- 低秩思想的復活:LoRA、QLoRA、SVD 壓縮、蒸餾,讓大模型可以在有限資源下微調與部署——SVD 1965 年的理論在 2020 年代重新成為主角。
- 懸案仍在:注意力的 \(O(n^2)\) 序列長度瓶頸(Flash Attention 只優化常數)、矩陣乘法的 \(\omega\) 上界(Strassen 遺留的問題)、混合精度的數值極限——線性代數的偵探故事,還遠沒有結案。
關鍵人物與文獻#
| 人物 | 角色 |
|---|---|
| Gene Golub | SVD 演算法(1965),低秩近似的理論基礎 |
| David Rumelhart / Geoffrey Hinton | 反向傳播(1986),訓練即矩陣乘法 |
| Ashish Vaswani 等(Google) | Transformer(2017),注意力機制 |
| Edward Hu 等 | LoRA(2021),低秩微調 |
| Tri Dao | FlashAttention(2022),注意力記憶體優化 |
- G. H. Golub & W. Kahan, An algorithm for the singular value decomposition, SIAM J. Numer. Anal. (1965)。
- D. E. Rumelhart, G. E. Hinton, R. J. Williams, Learning representations by back-propagating errors, Nature 323, 533–536 (1986)。
- A. Vaswani et al., Attention Is All You Need, NeurIPS (2017)。
- E. J. Hu et al., LoRA: Low-Rank Adaptation of Large Language Models, ICLR (2022)。
- T. Dao et al., FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness, NeurIPS (2022)。