深度学习 - 5.3. 前向传播、后向传播与计算图

🎯 深度学习 - 5.3. 前向传播、后向传播与计算图

下面是完整博客正文(已经根据你的要求,把内容精炼为适合博客发布的格式,同时每一节保持清晰分层,带有小标题,可以直接用于发布):


🎯 深度学习 - 5.3. 前向传播、后向传播与计算图


📖 前言

到目前为止,我们已经使用小批量随机梯度下降训练了模型。然而,在实现时,我们只需要关心如何通过前向传播和后向传播计算损失和梯度。

深度学习中,梯度的自动计算极大简化了算法实现。在早期,即使模型有微小更改,也需手动推导复杂的导数。而现代自动微分(autograd)机制,让我们能够专注于模型设计本身。

不过,要真正深入理解深度学习,掌握前向传播、后向传播和计算图的细节是不可或缺的。


5.3.1. 🚀 前向传播

前向传播(Forward Propagation)指的是神经网络从输入层逐层计算输出的过程。

以单隐藏层的神经网络为例,步骤如下:

  • 输入:$ \mathbf{x} \in \mathbb{R}^d $

  • 隐藏层计算:$ \mathbf{z} = \mathbf{W}^{(1)} \mathbf{x} $

  • 激活函数(如 ReLU):$ \mathbf{h} = \phi(\mathbf{z}) $

  • 输出层计算:$ \mathbf{o} = \mathbf{W}^{(2)} \mathbf{h} $

  • 损失函数:$ L(\mathbf{o}, \mathbf{y}) $

  • 正则化项(例如权重衰减):

最终目标函数:

理论理解
前向传播指的是神经网络根据输入数据,从输入层到输出层依次计算出每一层的中间输出,最终得到预测结果。在这个过程中,所有中间变量都需要被保留下来,因为反向传播需要用到它们。

公式回顾:

  • 输入到隐藏层:$ \mathbf{z} = \mathbf{W}^{(1)}\mathbf{x} $

  • 激活后输出:$ \mathbf{h} = \phi(\mathbf{z}) $

  • 隐藏层到输出层:$ \mathbf{o} = \mathbf{W}^{(2)}\mathbf{h} $

企业实战理解
在 Google、NVIDIA 这类公司中,前向传播不仅用于推理,还在训练中配合强制缓存(checkpointing)机制。比如训练 GPT-4 时,为了节省显存,只缓存关键节点输出,其它中间节点在反向传播时动态重算(即 Trade-off 计算 vs 存储)。

字节跳动在大规模推荐系统(例如抖音 Feed 流推荐)中,为了加速前向传播,会大量使用稀疏连接(Sparse Fully Connected)和混合精度计算(Mixed Precision)。


5.3.2. 🖼️ 前向传播的计算图

为了更好地理解各变量的依赖关系,我们通常绘制计算图

  • 正方形表示变量

  • 圆圈表示操作符

  • 箭头表示数据流向(通常从左下角的输入开始,到右上角的输出结束)

(图 5.3.1:前向传播的计算图)

理论理解
计算图(Computational Graph)是一种有向无环图(DAG),其中节点表示变量或操作,边表示数据流动方向。绘制计算图有助于我们理清运算的依赖关系,为反向传播自动推导梯度打下基础。

  • 正方形:变量

  • 圆圈:操作

  • 箭头:数据流动方向(从输入到输出)

企业实战理解
在 TensorFlow、PyTorch 等框架中,模型在训练前都会隐式或显式构建计算图。例如 OpenAI 在训练 GPT 系列模型时,先构建静态或动态图(Dynamic vs Static Graph),根据依赖关系自动生成高效的反向传播路径。

国内的百度 PaddlePaddle 框架,在工业部署时为了优化速度,会提前将动态图转为静态图(动态图转静态图编译),大幅提升推理速度。

 


5.3.3. 🔄 反向传播

反向传播(Backward Propagation)用于计算目标函数 $J$ 关于所有参数的梯度。

核心是链式法则(Chain Rule): 如果 $ Z = f(X) = g(Y(X)) $,那么:

运算符 $\prod$ 表示按照依赖顺序乘积,例如矩阵乘法。

具体到本网络:

  1. 目标函数 $J$ 关于 $L$ 和 $s$ 的梯度

  1. 输出层的梯度

  1. 正则化项梯度

  1. 输出层权重梯度

  1. 隐藏层输出的梯度

  1. 中间变量 $z$ 的梯度(考虑激活函数 $\phi$):

  1. 输入到隐藏层权重的梯度

(图 5.3.2:反向传播的梯度流动)

理论理解
反向传播是深度学习中计算梯度的标准方法。它基于链式法则(Chain Rule),按计算图的逆向顺序,依次推导每个变量对损失函数的梯度。

关键思想是:

  • 从目标函数 $J$ 出发,逐层向输入方向回溯

  • 每一层的梯度是其输出梯度和当前操作的局部梯度的乘积

企业实战理解
在 Google、OpenAI 等企业中,大型模型训练中反向传播的优化是重点工作:

  • 混合精度训练(Mixed Precision Training):将部分梯度用半精度(float16)计算,减少显存使用和提升速度(如 NVIDIA A100 专门优化的 AMP 技术)。

  • 分布式反向传播(Distributed Backpropagation):字节跳动在千亿参数推荐系统中使用 AllReduce 技术同步各 GPU 上的梯度。

反向传播自动求导系统(Autograd Engine)如 PyTorch 的 Autograd 和 TensorFlow 的 Eager Execution,就是围绕计算图自动实现链式反推。


5.3.4. 🏋️‍♂️ 训练神经网络

训练时,前向传播和反向传播紧密配合:

  • 前向传播:沿计算图正向计算中间变量。

  • 反向传播:逆序沿计算图传播误差信号,逐步计算各参数的梯度。

在每次参数更新前,我们必须:

  • 保留前向传播中的中间变量(用于反向传播计算)

  • 注意内存开销,因为中间变量的数量和 batch size 成正比

所以,batch size 太大容易导致显存爆炸(out-of-memory, OOM)。

理论理解
训练神经网络本质上是反复交替执行:

  • 前向传播:计算输出和损失

  • 反向传播:计算梯度

  • 优化器更新:使用梯度更新模型参数

这个流程在每个 mini-batch 上执行一次,称为一次 iteration,多个 iteration 完成一次 epoch。

特别注意:

  • 前向传播过程中,必须缓存中间变量

  • 反向传播过程中,需要用到这些中间变量

  • 所以训练阶段内存开销比推理阶段大很多

企业实战理解
在工业界训练大规模模型时,一般采用以下策略:

  • Checkpointing 重计算策略:在前向传播时只保存部分节点,其他节点在反向传播时临时重算,以节省显存(Google、DeepMind 大规模模型如 AlphaFold2 使用此策略)。

  • 微批处理(Micro-batch):将大的 batch 拆成多个小 batch 分步训练,累积梯度后一起更新,缓解内存压力。

  • 异步更新(如 Parameter Server 架构):在阿里巴巴推荐系统中,为了提升吞吐量,采用异步梯度下发机制(Async SGD)。

 


5.3.5. ✨ 小结

  • 前向传播:计算各层输出,存储中间结果。

  • 反向传播:反向传播误差信号,计算各参数梯度。

  • 前向与反向传播交替进行,共同完成深度学习模型训练。

  • 深度学习训练通常比推理(预测)需要更多内存。

理论理解

  • 前向传播沿计算图正向计算所有中间变量

  • 反向传播逆向传播误差信号,按链式法则计算梯度

  • 前向传播和反向传播互为依赖,缺一不可

  • 训练需要比推理更多的内存资源

企业实战理解

  • Google、NVIDIA 在超大模型(如 PaLM、Megatron)训练中,极致优化前向和反向传播 pipeline

  • 字节跳动推荐系统工程中,为了应对巨量模型参数(上万亿),专门定制了反向传播高效内存管理系统

  • OpenAI 在训练 GPT-4 时,为反向传播引入了稀疏化策略(Sparsity-Aware Backprop),减少了计算与存储负担

 


🔥 小练习(思考题)

  1. 如果输入是矩阵,输出是标量,$\frac{\partial y}{\partial X}$ 的维度是什么?

  2. 在模型隐藏层添加偏置项,绘制新的计算图,并推导出更新的前向和后向传播公式。

  3. 估算训练 vs 推理时的内存占用差异。

  4. 二阶导数的计算对计算图有什么影响?

  5. 当计算图太大时,如何在多个 GPU 上进行分区?优缺点是什么?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值