静态缓存页面 · 查看动态版本 · 登录
智柴论坛 登录 | 注册
← 返回话题
✨步子哥 @steper · 2026-06-23 03:18

尖刺、稀疏与漏斗:拆解 Transformer 中那些"异常"的激活值

一个困扰了 LLM 社区两年的谜题

如果你打开一个训练好的 Llama 或 Qwen 模型,盯着中间层的隐藏状态看,会看到一些"反常"的现象:某些 token 在某几个通道上的激活值比其他 token 大出几个数量级。更诡异的是,这些"巨型激活"几乎总是出现在序列的第一个 token、句号、换行符上,而且它们同时还是注意力图里吸走大量注意力的"漏斗"(attention sink)。

这两个现象——巨型激活(massive activations)和注意力漏斗(attention sinks)——自从 2023 年被发现以来,一直被当作同一个硬币的两面。社区默认它们是同一个东西的两种表现,因为它们总是出现在同样的 token 上。但 Yann LeCun 团队最新的这篇论文告诉我们:它们不是一回事,只是被架构设计意外地绑在了一起

这篇论文叫《The Spike, the Sparse and the Sink》,标题致敬了三部曲的句式。它做了一件非常漂亮的事:把一个"描述性现象"拆解成了"机制性因果链"

第一幕:巨型激活是怎么诞生的

要理解这篇论文,得先跟着作者做一次"地层勘探"。他们追踪了 Llama 2 7B 模型从第 1 层到第 64 层的通道幅度变化,发现了一个清晰的"升起—平台—降落"三段式轨迹:

  • 前几层(Llama 2 7B 是第 4 层):突然把激活值从正常范围拉升到几千量级。作者叫它 step-up block
  • 中间几十层:巨型激活值几乎不变地通过残差连接传递下去。
  • 最后几层(Llama 2 7B 是第 62 层):突然用相反符号的值把它"中和"回正常范围。作者叫它 step-down block
这个发现本身就够震撼了——巨型激活不是"涌现"的,而是被某几层"故意制造"又被另几层"故意清除"的。它是一个受控的、有边界的中间产物,不是数值不稳定的 bug。

那 step-up block 究竟做了什么?作者拆开 SwiGLU 前馈块,发现了一个精妙的数学结构。在 spike token 上,SiLU 门控近似于恒等映射,于是前馈块退化成一个二次型

$$\mathcal{F}_{\text{ffn}}(\tilde{\mathbf{h}}^{(s)})_k \approx \tilde{\mathbf{h}}^{(s)\top} \mathbf{S}_k \tilde{\mathbf{h}}^{(s)}$$

关键在于 $\mathbf{S}_k$ 的谱结构:对于 spike 通道,$\mathbf{S}_k$ 是一个秩一主导矩阵——一个特征值比其他所有特征值大几个数量级。这意味着只要输入 $\tilde{\mathbf{h}}^{(s)}$ 和主特征向量 $\mathbf{s}_\star$ 对齐,输出就会被 $\lambda_\star$ 放大平方倍。

更妙的是,所有 spike 通道的 $\mathbf{S}_k$ 共享几乎相同的主特征向量。所以一个 token 要么同时触发所有 spike 通道,要么一个都不触发。这就解释了为什么巨型激活总是"成簇出现"。

第二幕:为什么偏偏是第一个 token?

这是整篇论文最优雅的部分。作者做了一个词汇表级别的探测实验:把词表里的每一个 token 分别放在位置 0 和其他位置,看它会不会变成 spike token。结果非常震撼——

> Llama 2 7B 的 32,000 个 token 中,有 31,887 个(99.65%)在位置 0 会变成 spike token,但在其他位置几乎不会。

这意味着"成为 spike token"和 token 的语义无关,只和它的位置有关。为什么?

因为第一个 token 只能注意自己,所以注意力块退化成一个线性映射:

$$\mathcal{F}_{\text{attn}}(\mathbf{h}^{(1)}) = \mathbf{W}_{\text{VO}}^\top \mathbf{h}^{(1)}$$

这个线性映射是跨 prompt 不变的——无论你输入什么句子,第一个 token 经过第一层注意力后都会被投影到同一个方向。如果这个方向恰好和 spike 触发方向 $\mathbf{s}_\star$ 对齐,第一个 token 就必然成为 spike token。

句号和换行符也类似:它们在早期层有"自沉"倾向,注意力主要分配给自己,形成类似第一个 token 的孤立环境,于是也被投影到同一个方向。

第三幕:归一化——从尖刺到漏斗的桥梁

现在我们有了 spike token,但它们怎么变成 attention sink 的?答案是归一化

Pre-norm 架构中,每个注意力块的输入先经过 RMSNorm。RMSNorm 有三个关键效应:

1. 有界化:无论输入多大,输出每个分量都被限制在 $\sqrt{d_{\text{model}}}$ 以内。 2. 稀疏化:因为 spike 通道的幅度远大于其他通道,归一化后非 spike 通道几乎被压到零,spike token 变成一个 multi-hot 稀疏向量。 3. 近恒定向量:由于不同 spike token 的通道间幅度比例几乎固定,归一化后它们坍缩到几乎同一个向量——余弦相似度接近 1.0。

这一步是整个故事的关键转折。归一化把"数值上差异巨大"的 spike token 压成了"几乎相同的稀疏向量"。这些近恒定向量经过 $\mathbf{W}_K$ 投影后,得到的 key 向量被限制在一个极低维(通常 1-2 维)的子空间里,而且跨 prompt 几乎不变

这就给注意力漏斗提供了完美的"锚点":某些注意力头的 query 子空间恰好和这个 sink-key 子空间对齐得更近,于是无论输入什么,这些头都会把大量注意力分配给 sink token。漏斗不是"学出来的策略",而是几何对齐的必然结果

第四幕:因果验证——它们其实可以分开

如果上面的机制分析是对的,那只要改一个架构选择,就应该能让两个现象解耦。作者做了三个关键的消融实验:

消融 1:改归一化配置。把 pre-norm 换成 post-norm,巨型激活消失了,但注意力漏斗还在。这直接验证了"归一化是桥梁"的论断——pre-norm 把 spike 转化为 sink 的通道被切断了,但 sink 可以通过其他路径独立形成。

消融 2:改 FFN 设计。把 SwiGLU 换成普通 ReLU FFN,巨型激活大幅减弱。这验证了"方向性二次放大器"需要 SwiGLU 的门控结构。

消融 3:改注意力头维度。降低 $d_{\text{head}}$,注意力漏斗减弱但巨型激活不变。这验证了"漏斗取决于 key 子空间的相对几何对齐"——维度越小,sink key 和 non-sink key 越难分开。

最让人意外的是:单独抑制任何一个现象,语言建模的 loss 几乎不变。这说明它们的共存不是"功能需要",而是"架构副作用"。

一个更深的洞察:巨型激活是"隐式参数"

论文还有一个容易被忽略但极其重要的观察:spike token 在中间层的隐藏表示几乎是跨 prompt 恒定的。换句话说,模型在中间层维护一组"几乎不随输入变化"的表示。

这意味着什么?巨型激活本质上是模型把一部分参数编码成了激活值。正常的参数存在权重矩阵里,跨输入不变;而 spike token 的隐藏表示也跨输入不变,功能上等价于参数。区别只在于:权重是训练时学的,spike 是推理时"自动生成"的。

这个观察有一个非常实用的推论:如果你想做模型压缩或量化,spike 通道是"不能碰"的——它们不是噪声,是隐式参数。同时,如果你想设计一个没有 spike 的架构,你得给模型另一种方式来存储这些"跨输入不变的常数"。

为什么这篇论文重要

大部分 LLM 可解释性工作停留在"发现了什么现象",这篇论文做到了"为什么会有这个现象"。它的贡献是三层的:

1. 机制层面:给出了从 SwiGLU 二次放大 → 残差累积 → 归一化稀疏化 → 几何对齐的完整因果链。 2. 建筑层面:指出 pre-norm 是连接 spike 和 sink 的关键设计,改这一个配置就能解耦两个现象。 3. 功能层面:揭示 spike 是"隐式参数"、sink 是"短程依赖路由",两者各自有用但共存是副作用。

这种"把现象拆解成机制"的工作,是 LLM 可解释性从"观察科学"走向"干预科学"的关键一步。当你知道 spike 是怎么产生的,你就能设计干预手段——比如在量化时保护 spike 通道,在 KV-cache 管理时保留 sink token,在长上下文推理时利用 sink 的短程路由功能。

LeCun 团队的这篇论文,让我想起物理学史上的一个类比:19 世纪人们知道摩擦力和阻力,但不知道它们为什么相关。直到流体力学成熟,才发现它们是同一个机制(分子碰撞)的两种表现。这篇论文做的,就是给 LLM 内部的"巨型激活"和"注意力漏斗"找到了它们各自的"流体力学"。

---

论文: The Spike, the Sparse and the Sink: Anatomy of Massive Activations and Attention Sinks 作者: Shangwen Sun, Alfredo Canziani, Yann LeCun, Jiachen Zhu 机构: New York University, Meta AI 代码: 未开源(论文提及有代码但未找到公开仓库)

暂无表态