跳转至

P2-4.6 复合函数(composite function)与链式法则(chain rule)

Section ID: P2-4.6 Version: v2026.07.20

读完导数(derivative)、梯度(gradient)、梯度下降(gradient descent)之后,还会留下这样一句话:backpropagation uses the chain rule。如果这里不知道链式法则(chain rule),反向传播就很容易看起来像一句需要背下来的话,而不是一种计算结构。

核心直觉是:当一个函数由多个阶段连接起来时,前面阶段的变化会穿过后面的阶段,一直传到最终结果。 只有先抓住这个直觉,才能读懂损失(loss)是怎样和每一层、每一个参数连接起来的。需要快速回看术语时,也可以一起查看概念词汇表

核心判断标准:复合函数(composite function)与链式法则(chain rule)

  • 能把复合函数(composite function)解释成 前一个输出进入下一个函数作为输入的结构
  • 能把链式法则(chain rule)说成 把各阶段变化率连起来相乘读取的规则
  • 能建立这样的直觉:前面的值一旦变化,后面的结果也会通过多个阶段一起变化。
  • 能在入门层面说明为什么反向传播(backpropagation)需要链式法则。

先抓住的一个场景

这一节最先要抓住的,是一个按 x -> y -> z 流动的两阶段计算。

阶段 表达式 现在要读的问题
第 1 阶段 y = 2x + 1 如果 x 变一点,y 会变多少?
第 2 阶段 z = y^2 变化后的 y 会让 z 再多变多少?
整体 z = (2x + 1)^2 x 的变化是怎样一路传到最终结果 z 的?

所以,链式法则并不是要多背一个新符号,而是在读 前段变化怎样通过中间阶段传到后段结果 这条路径。

三个基准

基准 为什么重要 本节所需的理解水平
把复合函数读成 计算管线 因为它会自然连到神经网络层(layer)的说明。 理解函数会经过多个阶段。
链式法则是 变化传递规则 因为它让我们能读懂前段变化怎样到达最终输出。 理解各阶段的变化率会被连接起来。
反向传播不是链式法则本身,而是使用它的过程 因为这样就不会把概念和算法流程混在一起。 只要清楚地区分两者角色就够了。

复合函数是把多个函数连成一行的结构

例如:

\[ z = f(g(x)) \]

这样写时,我们会读成:先计算 g(x),然后把这个结果再送进 f

所以它的计算顺序是:

  1. x 进入。
  2. g 做出一个中间结果。
  3. f 接收这个中间结果,并生成最终结果 z

这种直觉在看神经网络时会原样再次出现,因为一层的输出会成为下一层的输入。

把它画成下面这样的流程会更直观。

flowchart LR
    x["输入 x"]
    g["中间函数 g(x) = 2x + 1"]
    f["外层函数 f(y) = y^2"]
    z["结果 z = (2x + 1)^2"]

    x --> g --> f --> z

如果写得更像日常计算:

\[ x \rightarrow 2x + 1 \rightarrow (2x + 1)^2 \]

意思就是:先做出一个中间分数 2x + 1,再把这个值平方成最终结果。只要计算阶段这样接了起来,前面的微小变化就会先改变中间分数,然后再把这份变化继续传给最终结果。

链式法则是把前面的变化往后传的规则

在复合函数里,前面阶段只要稍微变化,这份变化就会经过中间阶段并影响最终输出。链式法则(chain rule)就是读这种传递规则的方法。

对初学者来说,最重要的一句话是:

链式法则是在多阶段函数里,沿着各阶段变化率去读“前段变化最终能传到输出多少”的规则。

只看一个很短的公式:

\[ \frac{dz}{dx} = \frac{dz}{dy} \cdot \frac{dy}{dx} \]

这里最重要的不是符号本身,而是那种结构:前面的变化会经过中间值,再被传到后面的结果。

如果继续用同一个例子,就会更直观。

\[ y = 2x + 1,\quad z = y^2 \]

只要 x 变化,y 会先变化,而变化后的 y 会再继续改变 z。想读懂 x 对最终结果 z 的影响,就必须把 x -> y 的变化与 y -> z 的变化分开看,然后再把它们接起来。这就是链式法则的核心。

例如当 x = 1 时:

  • y = 2(1) + 1 = 3
  • z = 3^2 = 9

如果这时把 x 稍微再变大一点,y 会先变大,而变大的 y 被平方之后,z 会更明显地变化。也就是说,前段变化的效果会在后面的阶段里累积起来。

把这个场景重新写成表:

问题 读法
x -> y 有多敏感? dy/dx
y -> z 有多敏感? dz/dy
整个 x -> z 路径有多敏感? 把前两个变化连起来读

为什么只做一步求导还不够

如果函数只是 z = x^2,那么 x 会直接改变 z。但在复合函数里,x 不会直接改动 z,它是通过中间阶段一步一步地影响 z

所以在复合函数里,我们必须把下面两个问题分开看。

  1. 前面阶段的值会把中间值改变多少?
  2. 这个中间值又会把最终结果改变多少?

链式法则就是把这两个问题接成一个式子的规则。读者在这里真正要抓住的,不是“比微分更难的额外规则”,而是“沿着计算阶段读取影响路径的方法”。

把这个差别再写得更短一些:

函数形式 求导时怎样读
z = x^2 x 直接改变 z
z = (2x + 1)^2 x 先改变中间值 y,那个 y 再继续改变 z

为什么反向传播说明里一定会需要链式法则

反向传播(backpropagation)是一种过程:它从神经网络最后算出的损失(loss)开始,倒着去算每一层、每个参数到底对这个损失影响了多少。而实现这件事所需要的最小规则,就是链式法则。

也就是说:

  • 链式法则是“变化如何传递”的数学规则。
  • 反向传播则是利用这条规则,高效地算出许多参数梯度的过程。

如果没有这个区分,就很容易把它们读成 chain rule = backprop

在进入后面的 Part 之前,可以先把最小的连接记成下面这样。

后面会看到的表达 现在先这样读
loss -> layer -> parameter 损失的变化会穿过层,一路传到参数
backpropagation 从后往前沿着这条传递路径计算的过程
gradient 被传递过来的变化率结果

这种结构后面还会在哪里出现

后面再次遇到的场景 这里先留下的直觉
Part 5 的反向传播 如果没有 chain rule,就很难读懂“损失从后往前被传回去”这句话。
Part 5 的多层神经网络 层越深,也就意味着复合函数结构越长。
optimizer 与 gradient 计算 gradient 不该被看成突然出现的数字,而应该被看成传递过来的变化率结果。

这一节真正应该留下的一句核心话很简单:复合函数是把多个计算阶段打包成一行的结构,而链式法则是沿着这些阶段传递变化率的规则。 只要这句话稳住,后面再看到 backpropagation 时,每一层就不会再像完全分开的独立计算。

检查清单

  • 能把复合函数解释成 阶段相连的函数 吗?
  • y = 2x + 1z = y^2 里,能说明为什么必须把 x -> yy -> z 分开看吗?
  • 能把链式法则解释成 把各阶段变化率接起来读的规则 吗?
  • 能说明反向传播和链式法则在角色上有什么不同吗?
  • 能用“损失的变化穿过多个阶段传回去”的图景来解释反向传播吗?

来源与参考资料