计算图 · 局部记账

沿着一张小图,把梯度送回每个参数

先从左到右算节点值,再从损失反向走。每到一个运算,只核对“上游梯度 × 局部梯度”;同一个变量分成两路时,再把两路贡献相加。

m = x × w → z = m + b → a = ReLU(z) p = a × u ∥ q = a + c → s = p + q L = ½(s − y)²

先给计算图填一组数

输入与参数一改,整张图会重新计算。数值范围限制在教学演示需要的区间,避免结果被极端数值淹没。

输入、参数与目标
ReLU 路径演示

当前路径状态正在计算。

计算图现场

蓝色沿前向方向,红色沿反向方向。节点里的红色小签是已经回传到该变量的梯度。

前向 反向

共享变量 a 的梯度收件箱

反向走到分叉处后,两条路径都向 a 寄回一份贡献。必须先收齐,再继续穿过 ReLU。

来自 p = a × u 等待该断点
来自 q = a + c 等待该断点
在 a 处相加 等待两路贡献

逐站对账

先逐节点揭示前向值,再切换到反向断点。聚焦断点区后,可用左右方向键移动。

前向 1 / 6

前向传播

乘法节点先工作

直接跳到任一站:

参数梯度对账单

∂L/∂w 等待反传
∂L/∂b 等待反传
∂L/∂u 等待反传
∂L/∂c 等待反传

把这张图读成三条规则

先别急着背完整导数。反向传播真正重复的动作很少,关键是不要漏掉分支,也不要把算梯度和改参数混为一谈。

节点只管局部

每个运算拿到上游梯度,再乘自己的局部导数。乘法节点看另一个因子,加法节点的局部导数是 1。

分叉必须累加

a 同时影响 p 和 q,所以 ∂L/∂a 是两条路径贡献之和。只保留其中一条,会漏算参数对损失的影响。

ReLU 是一道门

z>0 时局部梯度为 1,反向信号通过;z≤0 时按常见约定取 0,前面的 w 与 b 收到零梯度。

展开完整的符号对账
∂L/∂s = s − y,∂L/∂p = ∂L/∂q = ∂L/∂s ∂L/∂a = (∂L/∂p)u + (∂L/∂q)·1 ∂L/∂z = (∂L/∂a)·𝟙[z>0] ∂L/∂w = (∂L/∂z)x,∂L/∂b = ∂L/∂z ∂L/∂u = (∂L/∂p)a,∂L/∂c = ∂L/∂q