10.3 反向传播算法:计算图、链式法则与自动微分
反向传播算法是训练多层神经网络的核心,它通过高效地计算损失函数相对于网络所有参数的梯度,为基于梯度的优化方法提供了可能。反向传播并非一种新的学习算法,而是梯度计算在神经网络特定结构下的高效实现方案。其核心思想源于微积分中的链式法则,并通过计算图这一抽象得到直观的表示和系统化的实现。本节将详细阐述反向传播的原理,从计算图表示、链式法则的递归应用,到其与现代自动微分技术的紧密联系。
10.3.1 计算图:结构与抽象
计算图是一种用于描述数学运算的有向无环图。在深度学习的语境下,它将复杂的神经网络前向传播过程分解为一系列基本的原子操作(如加法、乘法、指数运算、矩阵乘、激活函数等),从而清晰地揭示出变量之间的依赖关系。
10.3.1.1 图的构成
一个计算图GGG包含两种类型的节点:
- 变量节点:表示计算过程中的数据,包括输入数据、模型参数(权重、偏置)以及计算得到的中间变量。
- 运算符节点:表示施加在变量上的基本运算。每个运算符节点接收一个或多个输入变量,并产生一个输出变量。
图中的边表示数据的流向,从输入指向运算符,再从运算符指向其输出的变量。例如,一个简单的线性层运算z=wTx+bz = \mathbf{w}^T \mathbf{x} + bz=wTx+b可以分解为向量内积和标量加法两个运算符节点。
10.3.1.2 前向传播与反向传播的图视角
神经网络的前向传播过程,对应于从输入节点开始,按照图的拓扑顺序,依次计算每个运算符节点的输出,直至得到最终的输出(如预测值)和损失值LLL。这完成了计算图的“向前”遍历。
反向传播的目标是计算损失LLL对图中所有参数节点(如w\mathbf{w}w,bbb)的梯度∂L∂w,∂L∂b\frac{\partial L}{\partial \mathbf{w}}, \frac{\partial L}{\partial b}∂w∂L,∂b∂L。从计算图的角度看,这等价于从损失节点LLL开始,按照与边相反的方向(即逆向拓扑顺序),依次计算LLL对图中每个节点的梯度。计算图的结构化表示使得梯度计算可以分解为一系列局部梯度传播的步骤。
10.3.2 链式法则与反向传播的递归计算
反向传播算法的数学本质是多变量微积分的链式法则。对于一个由多个函数嵌套组成的复合函数,链式法则说明了如何计算其导数。在计算图中,每个运算符节点代表一个局部函数。
10.3.2.1 链式法则的形式化
设最终损失LLL是变量yyy的函数,而yyy又是变量xxx的函数:y=f(x)y = f(x)y=f(x),L=g(y)L = g(y)L=g(y)。根据链式法则,LLL对xxx的导数为:
∂L∂x=∂L∂y⋅∂y∂x \frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x}∂x∂L=∂y∂L⋅∂x∂y
在计算图中,节点yyy是xxx的后继。当我们进行反向传播时,假设已经计算得到了损失LLL对yyy的梯度∂L∂y\frac{\partial L}{\partial y}∂y∂L(称为yyy的“上游梯度”),那么要计算LLL对xxx的梯度,只需将上游梯度乘以yyy关于