Vision Transformer 里的"伪影"与"寄存器":一场模型自己发明出来的计算小把戏

2025-11-10

研究主题:Vision Transformer (ViT) 的可解释性与架构机制

📚 核心参考文献

  1. Darcet, T., et al. (2024). “Vision Transformers Need Registers.” ICLR 2024.
  2. Jiang, N., et al. (2025). “Vision Transformers Don’t Need Trained Registers.” NeurIPS 2025.

0. 从一张“奇怪的注意力图”说起

早期自监督 ViT(比如 DINO)有个很迷人的特性:
[CLS] 的注意力可视化之后,物体轮廓干净利落地浮现出来,几乎像“自带分割头”。

然而,当我们切换到更强的大模型——DINOv2、OpenCLIP、DeiT-III 等,注意力图开始出现一种诡异现象:

这些就是所谓的 Attention Artifacts(注意力伪影)
它们既破坏了可解释性,也让一票基于注意力图做下游任务的方法(比如 LOST)非常难受。

📊 图示:DINO / DINOv2 / OpenCLIP 的注意力图对比

注意力图对比
Figure 2 (Paper 2): 展示伪影现象的出现

接下来要讲的,就是两篇论文如何把这件事从”怪现象”一路追到”具体神经元”和”理论解释”,最后还顺带给出了解决方案。


1. 伪影背后:高范数离群 Token

1.1 先看一个简单统计:Token 范数的双峰分布

Darcet 等人的工作先做了一件很朴素的事情:
在像 DINOv2 这样的模型里,把最后一层的 patch token 全部拿出来,统计它们的 L2 范数。

然后发现了两件事:

  1. 大多数 Token 的范数都落在一个较低的区间
  2. 2–3% 左右的 Token 范数异常之高(比如 > 150 这种等级),形成了一个单独的峰

更有趣的是,这些 高范数 Token 的空间位置,和注意力图里的”伪影斑点”高度吻合。

📊 L2 范数直方图对比

范数分布对比
Figure 3 (Paper 2): DINO 与 DINOv2 的范数分布差异

1.2 它们喜欢“躺平的地方”

进一步的分析还发现:

📊 范数随层数/模型大小变化

范数变化可视化
Figure 4 (Paper 2)

📊 邻居相似度分布对比

相似度分布
Figure 5a (Paper 2): 伪影 vs 正常 patch

所以直觉图景大概是:

💡 关键洞察:模型似乎在用这些”背景 patch”做某种别的事,而不是老老实实表示像素。


2. 这些 Token 里到底装了什么?——探针实验的答案

Darcet 做了两组很干净的探针实验:本地信息 vs 全局信息

2.1 本地信息:这些 Token 已经“不记得自己是谁”了

他们在冻结的 ViT 上训练线性探针,做两件事:

  1. 用单个 Token 预测它在 (16 \times 16) 网格里的原始位置
  2. 用单个 Token 回归重建它对应 patch 的像素值

结果:

也就是说,从表征角度看:

⚠️ 重要发现:模型 主动抹掉了这些 Token 的本地信息

📊 本地信息探针表现对比

本地信息探针
Figure 5b (Paper 2): 高范数 Token 无法恢复位置和像素信息

2.2 全局信息:它们却非常“知道整张图在干嘛”

接着,作者又做了一个“反直觉”的操作:

结果:

📊 全局分类探针准确率对比

全局分类探针
Table 1 (Paper 2): 高范数 Token 的全局信息保持能力

于是一个很形象的结论出现了:

🎯 核心结论:这些离群 Token 已经不再”代表原 patch”,而是被模型”征用”成了某种全局信息存储单元

Darcet 把它们叫做 “Registers(寄存器)” ——一块被模型从图像上”挖走”出来当 scratchpad 用的记事本。


3. 解决方式(一):给模型显式发几个“寄存器 Token”

既然模型自己在偷用背景 patch 做寄存器,那一个自然的想法是:

干脆在输入里显式多加几个寄存器 Token
告诉模型:“你要 scratchpad,就用这几个,不要动图像 patch。”

3.1 架构改动:加几个 [REG] Tokens

具体做法:

🏗️ 架构示意图:带 Registers 的 ViT

ViT with Registers
Figure 6 (Paper 2): 显式加入寄存器 Token 的架构设计

3.2 效果:伪影从 patch 上“消失”,被吸进 [REG]

重新训练后的结果:

📊 范数分布对比

范数分布对比
Figure 7 (Paper 2): DINOv2 vs DINOv2+reg

📊 各任务性能对比

Table 2
Table 3
Table 2 & 3 (Paper 2): 跨任务性能提升

小结一句:

💡 Darcet 的结论:“ViT 确实需要寄存器,你不给,它就自己薅背景 patch 来用。”

问题是——要重训整个模型,成本极高。
这时,第二篇论文登场了。


4. Jiang:寄存器 Token 是怎么“算”出来的?

Darcet 给了一个“架构 + 经验”层面的解决方案,但并没完全解释:

这些高范数 Token 是怎么在计算图里生成的

Jiang 等人的工作就是追到这个层面:
从具体层、具体神经元,一直解释到 No-Op 需求与注意力的理论结构。

4.1 观察一:高范数不是慢慢涨出来的,而是“一层蹦出来的”

他们对各层的范数做了 tracking,发现在一些模型里:

进一步拆解 MLP 的激活,发现:

于是,这一小撮神经元被命名为:

🔬 Register Neurons(寄存器神经元)

📊 Attention vs MLP 范数变化

范数变化追踪
Figure 2 (Paper 1): MLP 层导致范数突然暴涨

📊 寄存器神经元激活 vs 伪影位置

神经元激活对比
Figure 3 (Paper 1): 激活位置高度吻合

4.2 因果干预:用几个人工操作,把伪影拼成“笑脸”

为了证明这几颗神经元真是“元凶”,Jiang 做了一个非常直观的因果实验:

结果:

🎭 惊人效果:伪影的位置完全被他们控制,想画笑脸有笑脸,想画爱心有爱心。

🎨 因果干预实验:“笑脸”与”爱心”控制

笑脸爱心控制
Figure 1 (Paper 1): 通过操控寄存器神经元精确控制伪影位置

从因果角度,这等于给出了非常强的证据:

因果证明:寄存器神经元是伪影(高范数 Token)的直接生成机制


5. 为何需要这样的机制?——注意力汇与 No-Op

接下来就到了“理论解释”环节。

5.1 Attention 的困境:Softmax + No-Op

Transformer 里有两个约束:

  1. 注意力用 Softmax,每一行的注意力权重之和必须等于 1
  2. 但某些 Token(尤其是 [CLS] 或一些已经编码完的 Token)会有一种“诉求”:

    “我现在的表示已经很好了,我不想再从别人那儿读信息了。”
    这就是所谓的 No-Op(不更新) 需求。

问题来了:

解决这个矛盾的自然方式就是:

造一个专门的 Token,当成注意力的“垃圾桶”
所有“不想看的注意力”都丢给它。

这个垃圾桶 Token,就是 Attention Sink(注意力汇)

5.2 寄存器神经元在干嘛?

Jiang 的解释是:

更关键的一点:

换句话说:

它们在注意力空间里是“黑洞”,
在任务空间里是“透明的”。

Jiang 进一步从数学上证明:

📐 数学等价性:这种”寄存器神经元 + 高范数 Token”的组合,等价于在注意力里显式加上一个偏置项

📐 Attention Bias 等价形式

Equation 1
Figure 7
Equation (1) & Figure 7 (Paper 1): 数学证明等价关系

5.3 如果把寄存器神经元“堵死”会怎样?

一个简单但残酷的实验:

结果:

结论非常直接:

这些伪影背后的高范数机制,不是 bug,而是模型算子的一部分
你不能直接把它关掉,只能想办法重新疏导


6. 解决方式(二):免训练的修复方案

理解了机制之后,Jiang 提出了两个“不用重训”的方案:

6.1 流程 A:测试时寄存器(Test-Time Register)

思路:既然寄存器神经元必需,但它们的位置可以调整,那可以这样:

  1. 在推理时额外加一个“临时寄存器 Token”(比如全零向量);
  2. 在指定层,检测寄存器神经元的激活;
  3. 对每个寄存器神经元:
    • 找到激活的最大值;
    • 把这个值“剪切”到临时寄存器 Token 上;
    • 把所有 patch 上该神经元的激活清零;
  4. 之后正常前向。

这就相当于说:

🔧 核心思路:寄存器神经元还在工作,但它们只把信息写到”专用寄存器 Token”里,而不是在背景 patch 上”乱画伪影”。

⚙️ Test-Time Register 流程

Figure 11
Algorithm 2
Figure 11 & Algorithm 2 (Paper 1): 推理时动态重定向寄存器激活

6.2 流程 B:注意力偏置(Attention Bias)

注意到 Test-Time Register 的本质是在构造一个“有效偏置”。
于是可以进一步把操作“压缩”为:

  1. 用少量校准数据(比如 1000 张图),在 Test-Time Register 设置下跑一遍;
  2. 估计出对应的注意力偏置向量 ((k’, v’));
  3. 在推理时:
    • 直接把寄存器神经元清零;
    • 在注意力计算中显式注入 ((k’, v’))。

⚙️ Attention Bias 效果示意

注意力偏置效果
Figure 9 (Paper 1): 注意力偏置的应用效果

这一步相当于:

🎯 优化策略:把一个”动态的寄存器机制”浓缩成一个”固定的注意力偏置”。

6.3 效果与对比

实验表明:

📊 性能对比表

Table 2
Table 5
Table 2 & 5 (Paper 1): DINOv2 原版 vs Trained Reg vs Test-Time Reg

📊 VLM 伪影修复效果

Figure 6
Figure 32
Figure 6 & 32 (Paper 1): 多模态模型的归因改善


7. 两篇论文的关系:从“症状”到“机制”再到“低成本治疗”

可以把两篇论文看成同一个故事的两个章节:

🔍 视角📄 Darcet, 2024📄 Jiang, 2025
发现注意力伪影 + 高范数离群 Token伪影由少量寄存器神经元在特定 MLP 层触发
解释模型会”征用背景 patch 当寄存器”这些寄存器实现了 Attention Sink + No-Op 需求
方案显式加 Trained Registers(重训)推理时寄存器 / Attention Bias(免训练)
成本🔴 高:要从头训练模型🟢 低:对现有模型即插即用
贡献定义问题,提出”Vision Transformers Need Registers”说明”Don’t Need Trained Registers,机制本身已经在了”

从可解释性的视角,这是一个非常完整的闭环:

🔄 完整的研究闭环

  1. 🔍 发现现象:注意力伪影 → 可解释性退化
  2. 📊 量化问题:高范数离群 Token → 统计结构
  3. 🧪 功能分析:本地信息消失 / 全局信息增强
  4. 💡 提出假说:Token 被 repurpose 为寄存器
  5. 🔬 机制追踪:具体到某一层的少量寄存器神经元
  6. 📐 理论建模:Attention Sink、No-Op、Kernel Space、Attention Bias 等价
  7. 🛠️ 设计修复:从”重训架构”到”免训练 patch”

也算是一个很标准的:

🎓 经典范例:“从奇怪可视化 → 深入模型内部机制 → 反向指导架构与推理修复” 的可解释性研究范式。


主题: ViT based视觉编码器, 训练动态