6.8 前向传播:从输入到输出
前向传播(Forward Propagation)是神经网络”用”的过程——输入数据一层层往前走,每层做矩阵乘法加激活函数,最终输出一个结果。你每次用 ChatGPT 回答问题,它内部做的就是这件事。
6.8.1 矩阵形式:一个批次一起算
前向传播不是逐个神经元地计算,而是用矩阵乘法一次性处理整层。对于单层:
Z = X · W + b (线性变换:加权求和)
A = f(Z) (非线性激活,f 是激活函数)
其中 X 是输入矩阵(形状为 [样本数, 特征数]),W 是权重矩阵(形状为 [输入特征数, 输出神经元数]),b 是偏置向量,f 是 激活函数 (Activation Functions)。
为什么用矩阵而不是逐个算?因为 GPU 是为矩阵乘法而生的——一次矩阵运算能同时处理几百个样本、几千个神经元。这种并行能力正是深度学习能扩展到千亿参数规模的基础。1
6.8.2 逐层传递:信息的三明治加工
一个典型三层网络的前向传播过程,就像做三明治——每一层对数据进行一次加工,层层叠加:
- 第一层(底层特征):Z₁ = X·W₁ + b₁,A₁ = ReLU(Z₁) —— 提取最基础的模式
- 第二层(中层组合):Z₂ = A₁·W₂ + b₂,A₂ = ReLU(Z₂) —— 将基础模式组合成复杂特征
- 输出层(最终决策):Z₃ = A₂·W₃ + b₃,ŷ = Softmax(Z₃) —— 产生最终预测
每一层的输出 A 叫做”激活值”——可以理解为这一层对输入数据的”理解结果”。就像盖房子:底层打地基(边缘和纹理),中层砌墙(形状和部件),顶层封顶(完整的物体语义)。6.3 神经网络为什么有效中讲的层级抽象,正是通过这一层层的加工实现的。
一个关键细节:前向传播过程中,每一层的中间结果(Z 和 A)都必须保存下来。原因很简单——之后的反向传播需要这些中间值来计算梯度。这也是为什么训练比推理更吃显存:训练时必须同时存激活值和梯度,而推理时算完一层就可以丢弃前一层的中间结果。
6.8.3 自回归生成:LLM 的重复前向传播
你每次问 ChatGPT 一个问题,它内部做的是一个循环:
你的问题被编码成向量 -> 经过 96 层 Transformer 做前向传播 -> 输出层产生下一个 token 的概率分布 -> 选一个概率最高的 token -> 把这个 token 拼回到输入末尾 -> 再做一次完整的 96 层前向传播 -> 下一个 token…
这个循环叫”自回归生成”——每次只生成一个 token(AI 处理的最小文本单位,见 Ch01|Ch01),把它加回输入,再生成下一个。生成一段 100 个 token 的回复,就需要做 100 次完整的前向传播。这也是为什么长回复比短回复慢——计算量随输出长度线性增长。
6.8.4 前向传播 vs 反向传播
“推理”(Inference)就是只做前向传播、不做反向传播——模型参数已经固定,你只是在用它。训练时则是前向和反向交替进行:
| 前向传播 | 反向传播 |
|---|---|
| 数据从输入流向输出 | 梯度从输出流回输入 |
| 目的是”做题”——产生预测 | 目的是”对答案”——计算每个参数该改多少 |
| 需要缓存中间激活值 | 利用缓存的激活值计算梯度 |
下一节的反向传播会详细讲”对答案”这一半——前向算出预测后,怎么把差距的责任分配回每个参数,让模型下一次做得更好。
← 上一节:6.7 权重初始化 | 下一节:6.9 损失函数:衡量模型多差 →
注释
-
Goodfellow, Bengio & Courville, “Deep Learning”, MIT Press, 2016, Chapter 6 ↩