✨ 复制成功!

以文会友,打造好学人设!

📋 已复制到剪贴板:

【补充内容】什么是中间激活值?

创建时间:2026-09-18 更新时间:2026-09-18 阅读次数:1282 次 分类:分布式训练与工程优化

中间激活值(Intermediate Activations),简单说就是:神经网络前向传播过程中,每一层计算出来的输出结果,在反向传播用完之前,都必须留在显存里。


用一个具体例子来理解

假设你有一个 3 层的小网络:

输入 x → [层1] → h1 → [层2] → h2 → [层3] → 输出 y

前向传播时:

  • $h_1 = \text{layer1}(x)$ —— 这个 $h_1$ 就是中间激活值
  • $h_2 = \text{layer2}(h_1)$ —— 这个 $h_2$ 也是中间激活值
  • $y = \text{layer3}(h_2)$

反向传播时,要计算每一层的梯度,需要用到该层的输入。比如算 layer2 的权重梯度,需要用到 $h_1$;算 layer1 的权重梯度,需要用到 $x$。

所以框架(PyTorch/TensorFlow)在训练时默认会把这些中间结果全部保存下来,等反向传播用完之后才释放。


为什么它占显存特别大?

关键在于每一层的激活值都要存,而且往往维度很高。

以一个 Transformer 为例,某一层的激活值张量形状可能是:

$$ [\text{batch\_size}, \text{seq\_len}, \text{hidden\_dim}] = [32, 512, 4096] $$

这大约是 $32 \times 512 \times 4096 \approx 6700$ 万个元素。如果用 fp16 存储,就是约 134 MB,而这只是一层。

一个 LLM 有几十层,再加上注意力矩阵($\text{seq\_len} \times \text{seq\_len}$)、FFN 中间层(通常是 hidden_dim 的 4 倍)等,激活值总量可以轻松达到几十 GB。

对比一下:

项目 量级特点
模型参数 固定,与 batch/序列长度无关
梯度 和参数一样大
优化器状态 Adam 是参数的 2 倍
中间激活值 随 batch size、序列长度、层数线性甚至平方增长

所以当你把 batch size 或序列长度调大时,显存爆炸的元凶通常就是激活值。


为什么说它“容易被忽视”?

  • 参数、梯度、优化器状态是静态的,你一看模型大小就能估算。
  • 激活值是动态的,取决于你的输入形状、batch size、是否用 checkpointing 等,很多人训练时才发现 OOM。

怎么减少激活值占用?

  • 1、梯度检查点(Gradient Checkpointing):不保存所有中间激活,只保存少数几个,反向传播时重新计算。用时间换显存。
  • 2、减小 batch size / 序列长度。
  • 3、混合精度训练(fp16/bf16):激活值占用减半。
  • 4、FlashAttention:避免显式存储巨大的注意力矩阵。
  • 5、模型并行 / 激活值分片。

一句话总结:中间激活值就是前向传播时每层算出来的中间结果,因为反向传播要用,所以必须暂存在显存里;它的大小随输入规模增长,是训练时显存占用的主要来源之一。


📌 面试天下网:一款服务于上班族的口袋书,让大家在地铁里/公交上可以学习大模型技术!
📌 网站公告:【悬赏 200 元/篇】寻找“大模型面试战场”的一手回忆录
📌 网站公告:【大模型/Agent面试陪练1V1指导】正式启动......

评论专区

评论加载中...