2020s — 符號計算與自動微分#
案件摘要#
二十一世紀二十年代,微積分已經徹底「變成程式」:符號計算(Mathematica、SymPy)讓 \(\frac{d}{dx}\sin x^2\) 一秒出解析解;數值微積分用有限差分近似;自動微分(autodiff)用對偶數(dual numbers)與反向傳播把導數算到機器精度;PyTorch、JAX 讓梯度下降 \(\theta_{n+1} = \theta_n - \eta \nabla L\) 成為深度學習的心臟。Leibniz 與 Newton 340 年前的符號夢想,在 GPU 上全面實現。
前因 -- 為什麼會有這個案子#
- Leibniz/Newton 的符號:1670 年代 Newton 的流數法 \(\dot{x}\) 與 Leibniz 的 \(\frac{dx}{dt}\) 都是「把微積分寫成一種可操作的記號系統」——本質上是在做符號運算。Leibniz 甚至設計過機械計算器,夢想「讓繁瑣的計算交給機器」。
- 計算機誕生:1940–1950 年代 ENIAC、Turing 機問世;1960 年代 FORTRAN 讓科學計算普及;1988 年 Wolfram 發表 Mathematica 第 1 版,符號計算第一次「商品化」;SyPy(2006 年起)讓符號計算開源免費。
- 機器學習的饑渴:2012 年 AlexNet 引爆深度學習,訓練百萬參數模型需要對每一個參數求梯度,訓練要跑數十億次導數運算。手推梯度不可能、數值差分太慢又不準——需要一個「精確又自動」的求導機器。案件的核心訴求。
線索與推理 -- 數學式、程式、理論#
線索一:三種求導方式對質#
給定 \(f(x) = \sin x^2\) ,求 \(f'(1)\) :
- 符號計算:解析求出 \(f'(x) = 2x\cos x^2\) ,代入 \(x=1\) 得 \(2\cos 1 \approx 1.0806\) 。精確但只對「可寫成表達式」的函數有效。
- 數值微分:中心差分 \(f'(x) \approx \frac{f(x+h)-f(x-h)}{2h}\) ,誤差 \(O(h^2)\) ——但存在致命的兩難: \(h\) 太大有截斷誤差、太小有浮點捨入誤差,最優 \(h \approx \sqrt{\varepsilon_{\text{mach}}} \approx 10^{-8}\) ,且誤差永遠無法降到機器精度。
- 自動微分:用鍊式法則把計算過程逐步求導,誤差就是零(只有浮點捨入,沒有近似),速度只比原函數計算慢一個常數倍。三種方式的冠軍,是機器學習唯一的選擇。
線索二:對偶數——微積分的「複數版」#
自動微分前向模式的數學基礎是對偶數:定義 \(\mathbb{D} = \{a + b\varepsilon : a, b \in \mathbb{R}\}\) ,其中 \(\varepsilon^2 = 0\) ( \(\varepsilon \neq 0\) )。這是一個交換環,除法為 \(\frac{a+b\varepsilon}{c+d\varepsilon} = \frac{a}{c} + \frac{cb - ad}{c^2}\varepsilon\) ( \(c \neq 0\) )。
把函數延拓到對偶數上: \(f(a + b\varepsilon) = f(a) + f'(a)\,b\,\varepsilon\) (用 Taylor 展開, \(\varepsilon^2\) 以上的項全滅)。於是
導數就是 \(\varepsilon\) 的係數——這與 Robinson 的無窮小 \(\varepsilon\) 、與複數虛部 \(i\) 的代數,是同一套把戲的三種化身: \(\varepsilon^2 = 0\) 讓鏈式法則自動成立:
線索三:反向傳播——鏈式法則的逆序執行#
前向模式一次算一個輸入的導數,對百萬參數太慢。反向傳播(backprop,1986 年 Rumelhart–Hinton–Williams 推廣)改用逆序:先前向算出所有中間值,再從輸出反向掃回,用鏈式法則一次算出所有偏導數:
計算量只相當於兩次前向傳播,不管參數有幾百萬個。這正是 1970 年代 Wengert、Linnainmaa 的「反向模式自動微分」在神經網路上的重演——1986 年不是發明,而是「重新發現」。
線索四:梯度下降——深度學習的心臟#
有了 \(\nabla L\) ,訓練就是迭代更新參數:
\(\eta\) 是學習率。現代變體(Adam、SGD with momentum)都是這條式子的改良。PyTorch 的 autograd、JAX 的 grad 都是把反向傳播自動化:程式設計師只寫前向計算 \(L(\theta)\) ,框架自動建出計算圖並反向求導。微積分從此成為基礎設施——如同作業系統,使用者感覺不到它的存在,但一切都靠它運轉。
程式碼範例:dual number class 前向自動微分 + 反向傳播#
import numpy as np
class Dual:
"""對偶數 a + b*ε,ε² = 0:前向自動微分的最小實作"""
def __init__(self, a, b=0.0): self.a, self.b = a, b
def __add__(self, o): return Dual(self.a + o.a, self.b + o.b)
def __mul__(self, o): return Dual(self.a*o.a, self.a*o.b + self.b*o.a)
def sin(self): return Dual(np.sin(self.a), np.cos(self.a) * self.b)
def __repr__(self): return f"{self.a} + {self.b}ε"
x = Dual(1.0, 1.0) # x = 1 + 1ε
f = x.sin() * x.sin() # f(x) = sin²x
print("f(1) =", f.a, " f'(1) =", f.b) # f'(x) = sin(2x) -> sin(2) ≈ 0.9093
# 對質:數值微分(中心差分,誤差 ~1e-8 量級)
h = 1e-8
print("數值 f'(1) ≈", (np.sin((1+h)**2)*np.sin((1+h)**2) -
np.sin((1-h)**2)*np.sin((1-h)**2)) / (2*h))
# 反向傳播玩具版:L(θ) = (θ·x - y)²,對 θ_i 求梯度
theta = np.array([0.5, -0.5]); X = np.array([1.0, 2.0]); y = 1.0
eta = 0.1
for step in range(3):
L = (theta @ X - y)**2 # 前向
grad = 2 * (theta @ X - y) * X # 反向(鏈式法則,手寫)
theta = theta - eta * grad # 梯度下降
print(f"step {step}: L = {L:.6f}, θ = {theta}")
對偶數的 \(f.b\) 精確等於 \(\sin(2) \approx 0.9093\) (無截斷誤差),數值差分只能到 \(10^{-8}\) 量級;梯度下降三步就讓損失 \(L\) 穩定下降——深度學習的微積分心臟,二十行程式就能摸到。
結案 -- 後果與影響#
- 深度學習時代的基礎設施:PyTorch(2016)、JAX(2018)、TensorFlow 的 autograd 讓「自動求導」成為所有 ML 框架的標配,數十億 GPU 每天執行著鏈式法則。
- 符號 + 數值 + 自動三合一:SymPy 做解析推導、SciPy 做數值求解、autodiff 做梯度訓練——三種求導各司其職,科學計算的完整工具鏈成形。
- 科學機器學習:物理資訊神經網路(PINN, 2019)、可微程式設計(differentiable programming)讓微積分反過來滲透物理、化學、生物建模——「整個模擬過程都可微分」。
- 歷史的閉環:Leibniz 造記號是為了「讓思考可操作」,autodiff 讓「操作自動化」——340 年前發明的鏈式法則,至今仍是這座大廈唯一的樑柱。
關鍵人物與文獻#
| 人物 | 角色 |
|---|---|
| Gottfried Leibniz / Isaac Newton | 微積分符號與鏈式法則的原創者 |
| Seppo Linnainmaa | 反向模式自動微分(1970) |
| David Rumelhart / Geoffrey Hinton | 反向傳播在神經網路的推廣(1986) |
| Stephen Wolfram | Mathematica,符號計算商品化(1988) |
| Roy Frostig / James Bradbury 等 | JAX,可微程式設計(2018) |
- S. Linnainmaa, "The representation of the cumulative rounding error...", BIT (1970)。
- D. Rumelhart, G. Hinton, R. Williams, "Learning representations by back-propagating errors", Nature 323 (1986)。
- A. Griewank & A. Walther, Evaluating Derivatives, SIAM (2008)。