Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4
2700 字
14 分钟
多层感知机之正向传播、反向传播与计算图

在深度学习的宏伟殿堂中,神经网络的训练过程犹如一位严谨的学者进行着“学习-反思-修正”的循环。其中,正向传播 (Forward Propagation)反向传播 (Backpropagation) 构成了这个循环的核心骨架,而 计算图 (Computational Graph) 则是理解这一切的绝佳视觉化工具。本文将带你深入浅出地解析这三者,并通过从标量到矩阵的实例,揭示现代深度学习框架高效计算的秘密。

一、正向传播:从输入到预测的“解题”过程#

正向传播,顾名思义,就是数据沿着网络结构从输入层流向输出层的过程。这个过程非常直观,就像我们根据已知公式一步步解题。

  1. 数据流动:输入数据(如图像像素、文本向量)被送入网络。
  2. 逐层计算:数据依次经过每一层(或每个“神经元”)。在每一层,输入会与权重矩阵相乘,加上偏置项,然后通过一个非线性激活函数(如ReLU、Sigmoid)进行变换,产生该层的输出。
  3. 得到预测:经过所有隐藏层的处理后,数据到达输出层,产生最终的预测结果(如分类概率、回归值)。
关键记忆

在正向传播过程中,框架会自动保存所有中间计算结果(如每一层的输入、激活前的值等)。这些值并非无用,它们是为接下来的“纠错”环节——反向传播——所准备的“草稿纸”。

这个过程可以形式化地表示为:给定输入 x\mathbf{x} 和当前参数 θ\theta(包含所有权重 W\mathbf{W} 和偏置 b\mathbf{b}),网络计算预测输出 y^=f(x;θ)\hat{y} = f(\mathbf{x}; \theta)

二、反向传播:基于误差的逆向“追责”机制#

当我们得到预测值 y^\hat{y} 后,会将其与真实标签 yy 进行比较,通过损失函数 L(y,y^)L(y, \hat{y}) 计算出模型的“错误”程度。反向传播的任务就是:找出每个参数对这个“错误”应负多少责任,即计算损失函数关于每个参数的梯度 Lθ\frac{\partial L}{\partial \theta}

2.1 灵魂:链式法则#

反向传播的数学核心是微积分中的链式法则 (Chain Rule)。它告诉我们,如果一个变量 zz 依赖于 yy,而 yy 又依赖于 xx,那么 xxzz 的影响可以通过以下方式计算:

dzdx=dzdydydx\frac{dz}{dx} = \frac{dz}{dy} \cdot \frac{dy}{dx}

在神经网络这个由多层复合函数构成的复杂系统中,链式法则允许我们将全局的、复杂的梯度计算,分解为一系列局部的、简单的梯度连乘。每个计算节点(如一次矩阵乘法、一个激活函数)只需要负责计算自己的局部梯度,然后将其与从后续节点传递来的梯度相乘,再传递给前驱节点。这种“接力赛”模式是反向传播高效的关键。

2.2 一个直观的标量例子#

让我们通过一个最简单的例子来感受这个过程。假设我们的“模型”只有一个权重 ww,任务是学习当输入 x=2x=2 时,输出应接近 y=10y=10

  • 模型y^=w×x\hat{y} = w \times x
  • 损失函数 (均方误差)L=(y^y)2L = (\hat{y} - y)^2
  • 初始参数w=3w = 3(一个随机的初始猜测)

第一步:正向传播

  1. 计算预测值:y^=w×x=3×2=6\hat{y} = w \times x = 3 \times 2 = 6
  2. 计算损失:L=(y^y)2=(610)2=16L = (\hat{y} - y)^2 = (6 - 10)^2 = 16

模型发现自己预测的结果(6)与目标(10)相差甚远,损失高达16。

第二步:反向传播(追责) 我们的目标是计算 Lw\frac{\partial L}{\partial w},即权重 ww 的变化会如何影响损失 LL。应用链式法则:

Lw=Ly^y^w\frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial w}
  1. 计算 Ly^\frac{\partial L}{\partial \hat{y}}(误差对预测值的影响): Ly^=2×(y^y)=2×(610)=8\frac{\partial L}{\partial \hat{y}} = 2 \times (\hat{y} - y) = 2 \times (6 - 10) = -8
  2. 计算 y^w\frac{\partial \hat{y}}{\partial w}(预测值对权重的影响): y^w=x=2\frac{\partial \hat{y}}{\partial w} = x = 2
  3. 计算总梯度: Lw=(8)×2=16\frac{\partial L}{\partial w} = (-8) \times 2 = -16

梯度为 16-16,这意味着:

  • 符号为负:增加 ww 会导致损失 LL 减小。
  • 绝对值较大ww 对当前误差负有“很大责任”,需要显著调整。

第三步:参数更新(梯度下降) 我们使用梯度下降算法来更新权重:

wnew=wηLww_{\text{new}} = w - \eta \cdot \frac{\partial L}{\partial w}

其中 η\eta学习率,控制每次更新的步长。假设 η=0.1\eta = 0.1

wnew=30.1×(16)=4.6w_{\text{new}} = 3 - 0.1 \times (-16) = 4.6

第四步:验证效果 使用新的权重 w=4.6w=4.6 再次进行正向传播:

  • y^new=4.6×2=9.2\hat{y}_{\text{new}} = 4.6 \times 2 = 9.2
  • Lnew=(9.210)2=0.64L_{\text{new}} = (9.2 - 10)^2 = 0.64

仅仅一次“正向-反向-更新”的循环,损失就从 16 急剧下降到了 0.64!这就是反向传播结合梯度下降的威力。

三、计算图:一切的可视化与自动化基础#

计算图是一种用于描述数学表达式的有向无环图(DAG)。它将计算过程分解为基本操作的节点和数据流动的边,是理解正向/反向传播和现代深度学习框架(如PyTorch、TensorFlow)实现自动微分 (Automatic Differentiation, Autodiff) 的基石。

  • 节点:代表数学操作(加法、乘法、矩阵乘、激活函数如ReLU、Sigmoid等)。
  • :代表数据(输入、输出、中间变量)。
    前向传播示意图
    当你写下 z = torch.matmul(x, w) + b 这样的代码时,框架在后台默默构建了一张计算图。正向传播时,数据沿图流动,并缓存中间结果。反向传播时,框架从损失节点开始,沿着图的边反向遍历,利用链式法则和每个节点存储的局部梯度,自动计算出所有参数的梯度。

3.1 局部梯度与常见“门控”#

自动微分的精妙之处在于其模块化。每个操作节点都像一个小型处理器,在反向传播时执行固定的规则:

节点类型正向操作 (z=…)反向传播梯度 (Linputs\frac{\partial L}{\partial \text{inputs}})角色形象
加法 (Add)a+ba + b全额分发给 aabb复读机:不改变压力,直接传递
乘法 (Mul)aba \cdot b互换相乘后传给 aabb放大器:根据对方的大小分配责任
最大值 (Max)max(a,b)\max(a, b)谁大传给谁,小的拿 0单行道:只有“赢家”才需要调整
ReLUmax(0,x)\max(0, x)x>0x>0 时全传,x0x \le 0 时归零开关:控制信号是否能够回传

举例说明(加法节点): 假设有一个节点 z=a+bz = a + b。在反向传播时,如果从上游(zz 的后续节点)传回的梯度是 Lz=5\frac{\partial L}{\partial z} = 5

  • zzaa 的局部梯度是 za=1\frac{\partial z}{\partial a} = 1
  • zzbb 的局部梯度是 zb=1\frac{\partial z}{\partial b} = 1 根据链式法则:
  • 传给 aa 的梯度:La=Lzza=5×1=5\frac{\partial L}{\partial a} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial a} = 5 \times 1 = 5
  • 传给 bb 的梯度:Lb=Lzzb=5×1=5\frac{\partial L}{\partial b} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial b} = 5 \times 1 = 5 加法节点就像一个“复读机”,将上游的梯度原封不动地复制给所有输入。

四、扩展到矩阵:深度学习效率的引擎#

真实的神经网络处理的是高维数据。例如,在全连接层中,正向传播公式为:

Y=XW+b\mathbf{Y} = \mathbf{X}\mathbf{W} + \mathbf{b}

其中:

  • X\mathbf{X} (输入): 形状是 (batch_size,input_dim)(batch\_size, input\_dim)
  • W\mathbf{W} (权重): 形状是 (input_dim,output_dim)(input\_dim, output\_dim)
  • Y\mathbf{Y} (输出): 形状是 (batch_size,output_dim)(batch\_size, output\_dim)

反向传播的核心挑战变成了维度对齐。梯度 LW\frac{\partial L}{\partial \mathbf{W}} 的形状必须与 W\mathbf{W} 本身完全一致。

已知上游梯度 LY\frac{\partial L}{\partial \mathbf{Y}}(形状同 Y\mathbf{Y}),根据链式法则和矩阵求导规则,可以推导出:

LW=XTLY\frac{\partial L}{\partial \mathbf{W}} = \mathbf{X}^T \cdot \frac{\partial L}{\partial \mathbf{Y}}

这里的转置 XT\mathbf{X}^T 正是为了进行正确的维度匹配,使得结果矩阵的形状为 (input_dim,output_dim)(input\_dim, output\_dim),与 W\mathbf{W} 相同。

为什么矩阵运算如此强大?

这正是深度学习能够处理海量数据的核心。框架不会为成千上万个权重逐个计算标量梯度,而是将整个层的梯度计算表达为一次或几次矩阵乘法。GPU拥有为并行处理矩阵运算而设计的数千个核心,可以一次性完成整个批量(Batch)所有样本、所有参数的梯度计算,实现了极致的效率。这种从标量思维到矩阵/张量思维的跃迁,是理解现代深度学习库的关键。

思考#

假设你在训练一个MNIST手写数字分类模型:

  • 输入 X\mathbf{X}:一批128张灰度图,每张图展平为 28×28=78428 \times 28 = 784 个像素值。
  • 输出层:10个神经元,对应数字0-9。

请问:

  1. 连接输入层和输出层的权重矩阵 W\mathbf{W} 的形状是多少?
  2. 反向传播中,梯度矩阵 LW\frac{\partial L}{\partial \mathbf{W}} 包含多少个具体的导数值?
答案与解析
  1. W\mathbf{W} 的形状(784,10)(784, 10)
    • 原因:输入 X\mathbf{X} 形状为 (128,784)(128, 784),为了计算 Y=XW\mathbf{Y} = \mathbf{X}\mathbf{W} 得到形状为 (128,10)(128, 10) 的输出,根据矩阵乘法规则,W\mathbf{W} 的行数必须等于 X\mathbf{X} 的列数(784),列数等于输出维度(10)。
  2. 梯度矩阵中的导数值数量784×10=7840784 \times 10 = \mathbf{7840} 个。
    • 原因:每个权重 WijW_{ij} 都有一个对应的梯度 LWij\frac{\partial L}{\partial W_{ij}},告诉它该如何调整。这7840个梯度在框架中被组织成一个 (784,10)(784, 10) 的矩阵 LW\frac{\partial L}{\partial \mathbf{W}} 进行统一管理和更新。

这个简单的例子揭示了为什么大型神经网络需要巨大的显存(VRAM)。我们不仅要存储数百万甚至数十亿的权重参数 W\mathbf{W},在训练时还需要为它们存储同样大小的梯度 LW\frac{\partial L}{\partial \mathbf{W}},以及正向传播中产生的各种中间激活值,这对硬件提出了很高的要求。

总结#

正向传播、反向传播与计算图构成了神经网络训练的黄金三角。正向传播负责“执行”和“记录”,反向传播借助链式法则进行“归因”和“指导”,而计算图则为这一过程提供了结构化的表示和自动化实现的框架。从标量的直观理解,到矩阵的高效运算,这一套机制使得我们可以训练极其复杂的模型,从而驱动了当今深度学习的蓬勃发展。在PyTorch等框架中,我们只需定义前向计算图,反向传播的梯度计算便会自动完成,这让我们能够更专注于模型结构的设计与创新。

多层感知机之正向传播、反向传播与计算图
https://blog.solmount.top/posts/mlp/
作者
空 柏
发布于
2026-03-15
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00