一个行人,变化的许多条路径
回想第一卷里的单变量链式法则:若 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。两条路,一个答案。
那个核对值得停一停,因为它揭示了链式法则诚实的身份。你总是可以先代入内层函数,再当作单变量问题求导——这不是作弊,而是定义本身,并且它必给出相同答案。链式法则不是另一种真理;它是一个省力的组织者,让你无需先做代入就能求导,而当代入很难看、或者你在某点只有偏导数的数值而无公式时,这一点价值连城。把两条路都记在心里:链式法则用于速度与结构,直接代入则是你随时可退守的基准真相。