一步一步建立直观
先预测,再点“演示本步”核对右图。每一步都重设到指定情形,随后可以自由修改参数。
01先沿计算方向记下中间量
从输入计算加权和,再计算激活输出,最后得到平方损失。反向传播需要这些前向中间量,因为每个局部导数都要在当前输入处求值。先在右图核对 、输出和目标,才能解释梯度读数为什么具有当前的符号与大小。
02从输出误差追问谁该改变
损失先告诉输出应该增大还是减小,再通过激活函数传到加权和,最后乘以各输入,得到各权重应承担的变化率。这个连乘是链式法则。若一个参数通往损失的路径不止一条,各条路径的贡献还要相加,而不能任选其中一条。
03局部通路可能暂时关闭
当 ReLU 输入严格小于零时,这条通路的局部导数为零,即使当前损失很大,也不会通过它传回非零梯度。在零点本身,经典导数不存在,程序需选定实现约定。这里展示单个节点的机制;大型网络只是把同样的依赖关系按图重复计算。
3.4.1 从最后的误差倒推每个中间量的影响¶
前向计算从输入走向预测,反向传播则从损失出发,询问每个中间量改变一点会让损失怎样变。输出端已经知道“希望预测往哪里改”,链式法则把这份敏感性逐层传回更早的节点。
沿一条路径,每经过一个运算都乘上它的局部导数;若一个中间量通过多条路径影响损失,要把贡献相加。这个规则来自复合与和的求导法则,并不是神经网络额外发明的数学。
3.4.2 共享参数为什么必须累加贡献¶
让同一参数出现在 两个分支中。第一条路径贡献 ,第二条贡献 。只看第一条会把最优点误判为一;两条相加得到 ,真正最优点为 。
反向计算的效率来自复用:同一个中间节点到最终损失的敏感性算一次,就能继续传给它的多个输入。若每个参数都从头展开整个损失,会重复大量共同计算。计算图把这些共享结构明确地记录下来。
一次反向传播给出梯度,还没有改变参数;优化器之后才使用梯度更新。若批量损失取平均,梯度也要平均,否则批量大小一变就暗中改变了更新尺度。下一节将把“沿路径乘、汇合时加”写成一个完整的小例子。
与本图相连的定义与证明:3.5 · 严格激活区域中的权重梯度。本节的具体条件与形式化范围见下文。
数学表述 3.4.1¶
从输出误差倒推每个中间量的责任:一个节点影响损失的每条路径都要计入,路径上的导数相乘,汇合处相加。
若 ,则 。批量损失为平均值时,梯度也必须取平均。
例 3.4.1 把概念用于具体计算
同一个参数 出现在 中,导数为 。只沿第一条路径回传会漏掉 。
练习 3.4.1¶
上例最小点?
展开解答与检查
解 得 ,二阶导数 。
Lean 对照 3.4.1 命题、证明与适用边界
完整证明两条可导损失分支相加时导数相加,作为共享梯度累积的标量核心。
NeuralNetworks.gradient_accumulation
theorem gradient_accumulation (f g : ℝ → ℝ) (x df dg : ℝ)
(hf : HasDerivAt f df x) (hg : HasDerivAt g dg x) :
HasDerivAt (fun t => f t+g t) (df+dg) x := hf.add hg