Forward_Propagation(正向传播)
在大模型训练或深度学习中,正向传播(Forward Propagation,简称 Forward) 是最基础、也是最先发生的物理计算过程。
如果把大模型训练比作一次“学生期末考试”:
- 正向传播:就是学生拿到题目,翻开书本,一步步推导,最后在试卷上写下答案(模型预测值)的过程。
- 计算损失(Loss):就是老师拿标准答案和学生的答案对一下,打个分,看看错得有多离谱。
- 反向传播(Backward):就是学生看着错题本,往回倒推,看看自己当时到底是哪一步的公式背错了,然后去修正大脑里的记忆(更新模型权重参数 W)。
下面我们直接剥离所有复杂的数学外衣,来看看正向传播的底层物理原理和数据流转逻辑。
一、 正向传播的底层物理原理
正向传播的原理可以总结为一句话:数据的“层层闯关与特征压榨”。
无论多么复杂的大模型(比如 700B 参数的 Llama 3),它的正向传播在微观上都是由三个核心物理步骤,在成百上千个网络层中循环往复构成的:
步骤 1:线性矩阵乘法(物理轰鸣区:Tensor Core 爆满)
当数据(比如一句话被切成的一组 Token 向量)进入某一个网络层时,它首先要和这一层的权重矩阵(Weights,也就是 $W$)进行一轮疯狂的乘法运算,并加上偏置(Bias,也就是 $b$):
$$
Z = W \cdot X + b
$$
- 干了什么:这是正向传播中最消耗算力的部分。我们之前聊到的 GPU Tensor Core、SRAM 工作台,在正向传播时有 90% 的时间都在疯狂咆哮着算这个公式。
- 物理意义:通过旋转和拉伸空间坐标系,把原始数据里的隐藏特征(比如词与词之间的空间关系)给挤压、提取出来。
步骤 2:非线性激活(打破死板:引入“灵魂”)
如果只做矩阵乘法,无论叠加多少层,整个模型本质上都只是一个巨大的“一元一次方程”,根本无法理解人类语言中复杂的逻辑。所以,矩阵乘法算出的结果 $Z$,必须塞进一个激活函数(Activation Function,如 ReLU、GELU 或 SwiGLU):
$$
A = \text{Activation}(Z)
$$
- 物理意义:激活函数就像一个“开关”或“过滤器”。它告诉模型:“如果特征信号不够强,就一刀切掉变成 0(或者变得很小);如果信号够强,就成倍放大传给下一层。” 这赋予了神经网络拟合任何复杂宇宙规律的能力。
步骤 3:数据传递,奔向下一层
这一层算出来的最终输出 $A$,会变成下一层的输入 $X_{next}$。数据就这样像接力赛一样,从输入层 $\rightarrow$ 隐藏层 1 $\rightarrow$ 隐藏层 2 $\rightarrow \dots \rightarrow$ 输出层。
当输出层吐出最终的概率分布(比如预测下一个词是“猫”的概率是 85%)时,正向传播正式宣告结束。
二、 SRE 视角:正向传播时的显存里到底装了什么?
为什么我们要死磕正向传播的原理?因为在大模型训练的 SRE 运维中,正向传播有一个极其致命的副作用:它是“显存吞噬者”。
在正向传播的过程中,GPU 并不是算完第一层就把中间结果扔掉。它必须把每一层算出来的 $Z$ 和 $A$(也就是激活值 Activation)老老实实地全部缓存在昂贵的 HBM 显存里!
- 为什么不扔掉?:因为一会儿等老师批改完试卷、开始跑反向传播算梯度的时候,微积分的链式法则必须用到正向传播时留下的这些中间现场数据。
- 带来的灾难:如果你的 Batch Size 设得太大,或者上下文特别长,正向传播进行到一半,显存就会被这些密密麻麻的中间激活值彻底塞满,直接引发 CUDA Out of Memory (OOM)。
🛠️ 工业界的救火手段:激活重算(Activation Checkpointing)
为了拯救被正向传播撑爆的显存,现代 AI Infra 发明了一个极其无情的黑科技:重计算(Recomputation)。
- 逻辑:在正向传播时,我不再保留所有层的中间结果。我每隔 3 层保留一次(存一个检查点 Checkpoint),其他的全部扔掉。
- 代价:等反向传播需要用到那些扔掉的数据时,GPU 会立刻在原地重新跑一次局部的正向传播,临时把数据算出来用,用完马上再扔掉。
- 用空间换时间:这虽然多消耗了约 33% 的计算时间,但能让显存占用暴降 70% 以上,是万卡集群在大模型预训练时的标准必修课。
一句话总结:
正向传播就是数据从左到右穿过模型、不断被矩阵乘法榨取特征并产生海量显存垃圾(激活值)的过程;它的运算速度直接决定了你训练的底线,而它留下的显存负担则直接决定了你的集群能不能开得起来。
