神經網路

自動微分(automatic differentiation)

/ aw-toh-MAT-ik dif-er-en-shee-AY-shun /

自動微分,是一種讓電腦精確而自動地算出一項計算的結果對它每個輸入有多敏感的技術——也就是導數,或者說斜率。訓練神經網路說到底全是關於這些斜率的:要把一個權重往正確的方向輕推,你必須知道增大它會讓誤差上升還是下降,以及上升或下降多少。面對數以百萬計的權重,靠手算簡直不可想像。自動微分替你把這件事做了,無需做任何微積分作業。

把它和兩個表親區分開會很值得。你可以試著手寫出導數公式(符號微分),但對一個大網路來說,那公式會膨脹成一團無法收拾的亂麻。或者你可以把每個輸入輕輕挪動一點點,看看輸出怎麼變(數值微分),但這又慢又不精確。自動微分是聰明的第三條路:它把計算拆成一個個基本步驟——也就是計算圖——再一步步運用微積分的鏈式法則,得出的答案既精確(沒有近似),又快。

在實踐中,現代深度學習框架在幕後悄悄完成這件事。你寫普通的程式碼來計算網路的輸出;框架默默地記錄下每一個運算,然後把圖反向跑一遍,一次性把梯度——也就是每個參數所有斜率的整捆——交到你手上。這趟反向傳播,正是把反向傳播本身看作自動微分的一個特例。它是那一類默默無聞的工程之一,讓訓練龐大的模型,在程式設計師看來幾乎毫不費力。

假設你的輸出按 y = (w × x + b) 算出,然後被平方成一個誤差。自動微分記下這兩個運算,再往回走:平方貢獻一個因子,乘加貢獻另一個因子,鏈式法則把它們相乘,準確告訴你誤差對 w 如何反應——你一行公式都沒寫,也沒有任何近似。

自動微分沿著記錄下來的圖運用鏈式法則——精確的斜率,自動算出。

自動微分是精確的,而非近似——這正是它與「輕推再測量」的數值方法的區別所在。反向傳播,不過就是把自動微分以反向的方式應用到神經網路上。

又稱
autodiffautogradAD自动微分自動微分