一個行人,變化的許多條路徑
回想第一卷裡的單變數鏈式法則:若 y 依賴於 u、而 u 依賴於 x,則 dy/dx =(dy/du)(du/dx)。它說變化沿一條鏈傳遞,而各個變化率相乘——像一列齒輪組,轉動輸入,輸出便以各級齒輪比之積旋轉。當從 x 到 y 恰好只有一條路徑時,這幅畫是完整的。本篇的全部故事,就是當路徑不止一條時會發生什麼——因為在多元情形裡,幾乎總是不止一條。
下面這個場景把它說實。設 T(x, y) 是房間裡每一點的溫度——一個二元函數。現在你沿一條路徑行走,於是你的位置 (x(t), y(t)) 依賴於時間 t。你邊走,所感到的溫度,記作 T(x(t), y(t)),此刻就成了僅關於 t 的普通函數。問題是:所感溫度變化得多快,即 dT/dt?同一時刻有兩件事在發生。t 向前一跳,你在 x 方向滑動一點,溫度便經由它在 x 上的敏感度、即偏導數 partial T / partial x 來響應。但你同時也在 y 方向滑動一點,溫度又經由 partial T / partial y 來響應。兩個微推發生在同一瞬間,並且都匯入 dT/dt 這一個數。
所以答案不可能是單個乘積;它必須是若干乘積之和,每一個把變化從 t 帶到 T 的變數貢獻一項:dT/dt =(partial T / partial x)(dx/dt) +(partial T / partial y)(dy/dt)。每一項讀起來都正像單變數鏈式法則——T 對該變數的敏感度,乘以該變數的速度——而我們之所以把各項相加,是因為變化可經任一條路徑抵達 T。這一行,就是多元鏈式法則最常見形式的全部。其餘的一切,都是為更繁複的依賴之網所做的記帳。
為什麼是求和:不過是梯度遇見速度
這個乘積之和究竟從何而來?來自本級最深的事實:在一點附近,可微函數被一個線性映射很好地逼近,那就是全導數。對一點處的 T,這個線性逼近說:一個微小位移 (dx, dy) 使 T 改變約 dT =(partial T / partial x)dx +(partial T / partial y)dy。這個對象 dT 就是全微分:它把兩個偏敏感度捆進一個誠實的一階變化估計。多元鏈式法則不過就是這個估計,除以 dt、並在極限中變得精確。
還有一種看出同一行的更俐落方式。把兩個偏導數收進梯度向量 nabla T =(partial T / partial x, partial T / partial y),把兩個速度收進速度向量 v =(dx/dt, dy/dt)。於是 dT/dt 恰好就是點積 nabla T . v。鏈式法則即「梯度點乘速度」:地形上升得多陡,投影到你實際行進的方向上。這也正是為什麼方向導數——沿選定方向的上升率——等於 nabla T 點乘一個單位方向。同一套機器,為另一個問題換上衣裝。
樹形圖:可以信賴的記帳
一旦依賴之網超過兩層,漏掉一項就變得很危險。樹形圖是一張小圖,保證你寫下的恰是正確的那個和——它是記帳,不是新理論。你把最終的量畫在頂端,向下分叉到它直接依賴的每個變數,再向下分叉到那些變數各自依賴的東西,如此繼續,直到抵達你正在對其求導的那個變數。你畫的每一條線,都是上面那個東西對下面那個東西的一個偏導數(或常導數)。
隨後兩條規則收割答案,一經說出便難以忘記。沿每一條從頂到底的路徑相乘。對所有不同的路徑相加。整個演算法就這兩句:從最終的量向下到該變數的每一條路線,都貢獻一項「沿途各導數之積」,而總導數就是這些積之和。溫度的例子裡,從 T 向下到 t 有兩條路徑(經 x、經 y),給出我們已寫下的兩項之和。數分支取代了死記:你永遠不必去回想某個設定會產生幾項——你直接從樹上讀出來。
w = f(x, y, z)
/ | \ <- branches: partial w/partial x, etc.
x y z
/ \ / \ / \
s t s t s t <- branches: partial x/partial s, etc.
partial w / partial s
= (partial w/partial x)(partial x/partial s)
+ (partial w/partial y)(partial y/partial s)
+ (partial w/partial z)(partial z/partial s)
three top-to-bottom paths reach s through x, y, z -> three terms矩陣視角:鏈式法則即雅可比矩陣相乘
對單個輸出而言,樹形圖妙極了;但當若干輸出依賴若干輸入時,最俐落的陳述是矩陣相乘。把一個向量映射的偏導數碼進它的雅可比矩陣:每個輸出分量佔一行,每個輸入變數佔一列。對把 (x, y) 送到 (u, v) 的映射,雅可比矩陣是 [partial u/partial x, partial u/partial y; partial v/partial x, partial v/partial y]。這不過是該映射的全導數寫成方格——那個最佳線性逼近,如今用於輸入與輸出都是向量的情形。
於是鏈式法則讀來驚人地經濟:複合映射的雅可比矩陣,等於各雅可比矩陣之積。若 g 把輸入映到中間變數、f 把中間變數映到輸出,則「f 接在 g 之後」在一點處的雅可比矩陣是 J_f 乘 J_g,一次誠實的矩陣相乘。這正是 dy/dx =(dy/du)(du/dx) 在多元中的迴響:純量長成了矩陣,普通乘法長成了矩陣乘法,但定律的形狀一模一樣。把乘積的每個元素展開來寫,恰好就是樹形圖會交給你的某一條「沿路徑求和」公式——矩陣乘法正是樹形圖「把路徑相加」那條規則,被組織進行與列。
此刻次序要緊。矩陣乘法不可交換,所以必須是 J_f 乘 J_g——外層映射的雅可比在左,內層在右——與你複合映射的次序一致。單變數法則允許你把因子隨意排列,因為數可交換;一旦輸出與輸入是向量,這份自由便消失了。讓矩陣保持複合次序,維數就自動對齊:一個「輸出×中間」矩陣乘一個「中間×輸入」矩陣,得到一個「輸出×輸入」矩陣,恰是整個複合映射的雅可比矩陣。
那些層出不窮的特例
有那麼幾種形態出現得太頻繁,值得一望即識。其一,是我們開篇那個唯一終極變數的情形:w = f(x, y)、而 x、y 都依賴於 t,給出常導數 dw/dt =(partial w/partial x)(dx/dt) +(partial w/partial y)(dy/dt)。它是相關變化率背後的主力,是任何場沿運動粒子之變化率背後的主力,也是物理中能量方法背後的主力。其二,是換坐標的情形,對極座標、柱座標、球座標的工作不可或缺:把一個函數改寫到新變數 r、theta,意味著每個舊偏導數都成為一個鏈式法則之和,例如 partial f/partial r =(partial f/partial x)(partial x/partial r) +(partial f/partial y)(partial y/partial r),拉普拉斯算子與梯度正是這樣獲得它們的曲線座標形式。
其三,也是著名的陷阱:某變數既直接出現、又經由其他變數出現的情形。設 w = f(x, y, t),但 x 與 y 也依賴於 t。那麼當 t 變化時 w 的變化率是 dw/dt =(partial f/partial x)(dx/dt) +(partial f/partial y)(dy/dt) + partial f/partial t。最後一項是「其餘一切固定」時對 t 的顯式敏感度,很容易漏掉——樹形圖救了你,因為 t 既作為自己的底層分支直接掛在 f 之下,也掛在 x 之下、y 之下。這裡記號繃得很緊:dw/dt(總變化率,所有路徑)與 partial f/partial t(僅顯式那一條路徑)是真正不同的兩回事。混淆二者,是整個應用微積分中最常見、也最要命的錯誤之一。
其四,是隱函數求導的重生。回想第一卷裡,你如何對像 x^2 + y^2 = 1 這樣的方程求導,從而無需解出 y 就得到 dy/dx。鏈式法則解釋了那為何奏效,並將其推廣:若關係 F(x, y) = 0 悄悄地把 y 定義為 x 的函數,就用鏈式法則對兩邊關於 x 求導——partial F/partial x +(partial F/partial y)(dy/dx) = 0——再解出 dy/dx = -(partial F/partial x)/(partial F/partial y)。這一切之所以合法,那個關係之所以真在某點附近定義出 y(x),是隱函數定理的許諾,本級隨後的內容會把它說精確;而鏈式法則,是隨後算出斜率的那台引擎。
一次從頭到尾的演練
讓我們用真實數字跑一遍溫度漫步,看看各路徑如何相加。取 T(x, y) = x^2 y,沿路徑 x(t) = cos t、y(t) = sin t 行走——一個單位圓,逆時針描出。我們要 dT/dt:繞圈時所感溫度變化得多快。各零件是 partial T/partial x = 2xy 與 partial T/partial y = x^2,而 dx/dt = -sin t、dy/dt = cos t。下面的演練把它們組裝起來。
- 畫樹:T 在頂端,向下分叉到 x 與 y,二者又各向下分叉到唯一終極變數 t。有兩條從頂到底的路徑抵達 t——恰好兩項。
- 沿每條路徑相乘:經 x 的路線給出 (2xy)(-sin t);經 y 的路線給出 (x^2)(cos t)。
- 把路徑相加:dT/dt = -2xy sin t + x^2 cos t。
- 代入路徑 x = cos t、y = sin t:dT/dt = -2 cos t sin t · sin t + cos^2 t · cos t = -2 cos t sin^2 t + cos^3 t。
- 用另一條路核對:先代入路徑,得到 T = cos^2 t · sin t,再對這個單變數函數直接求導。你會得到同樣的 -2 cos t sin^2 t + cos^3 t。兩條路,一個答案。
那個核對值得停一停,因為它揭示了鏈式法則誠實的身份。你總是可以先代入內層函數,再當作單變數問題求導——這不是作弊,而是定義本身,並且它必給出相同答案。鏈式法則不是另一種真理;它是一個省力的組織者,讓你無需先做代入就能求導,而當代入很難看、或者你在某點只有偏導數的數值而無公式時,這一點價值連城。把兩條路都記在心裡:鏈式法則用於速度與結構,直接代入則是你隨時可退守的基準真相。