自動微分
自動微分(autodiff)是框架在你完全不用手算微積分的情況下,計算程式碼之精確導數的方法。你寫下前向計算(一連串的加、乘、矩陣乘、激活),自動微分就對這個確切的序列機械式地套用連鎖律,產生梯度。它既不是數學軟體那種容易出錯的符號微分(可能爆炸成龐大的表達式),也不是不精確的有限差分近似;它藉由把每個基本運算的已知導數複合起來,在浮點精度內算出真正的導數。
自動微分能運作,是因為任何程式無論多複雜,最終都是局部導數(Jacobian)已知的基本運算之複合。連鎖律說,複合的導數是沿路徑上各局部導數的乘積。累積這個乘積有兩種模式:前向模式從輸入往輸出走過圖,在輸入少、輸出多時高效;反向模式從輸出往輸入走,在輸入多、輸出少時高效。套用在純量損失上的反向模式正是反向傳播。
對神經網路(輸入是數百萬到數十億個參數,但輸出是單一純量損失)而言,反向模式壓倒性地是正確選擇:它在單一次反向傳播中算出對所有參數的梯度,成本約與一次前向傳播相當(一個常數倍的開銷,通常 2 到 4 倍,再加上儲存中間激活的記憶體)。前向模式則每個參數需要一次走訪。這個有利的成本正是訓練龐大視覺模型得以可能的原因。代價是記憶體:反向模式必須保留前向傳播的中間激活,以供反向傳播時使用。
自動微分是每個深度學習框架內部的引擎(PyTorch 的 autograd、TensorFlow、JAX 的 grad、jit 與 vmap),它讓研究者得以發明新架構(ViT、DETR、NeRF、Gaussian splatting、擴散取樣器)並只需呼叫 backward,信任梯度是正確的。實務注記:不可微的點(ReLU 的折角、最大池化的 argmax)以次梯度處理,或把梯度導向被選中的那個元素;真正不可微的運算(硬性取樣、argmax)需要像直通估計器(straight-through estimator)或重參數化(reparameterization)這類變通法;而記憶體壓力則以梯度檢查點來管理。
陷阱:自動微分微分的是你實際跑過的那些運算,包括錯誤與 detach。若一個張量被轉成 NumPy、被 detach、或經過一個不可微的自訂運算,梯度就會在那裡無聲地中斷;「損失不下降」的症狀往往是梯度路徑斷了,而非學習率問題。