跳转到内容
English

Vision Transformers Need Registers:给 ViT 增加内部计算位置

交互教程

为何有些图像位置变成全局计算空间?先看证据,再追踪新增 token。

前置阅读:ViT · 语义表征

Patch token 可能不再只表示原来的 patch

Section titled “Patch token 可能不再只表示原来的 patch”

ViT 最初为每块图像建立一个向量。经过注意力后,每个向量都可能包含整图信息。因此,输出仍呈网格状,不保证每个位置都保留原来的局部像素。CLS 是单独的可学习读出 token;register 则是额外的可学习输入向量,用来提供内部计算位置。

DINO 通过不同图像视图的教师与学生预测学习表征;CLIP 类方法对齐图像与文字,DeiT 使用类别标签。Registers 是论文在这些训练目标上研究的架构增量,不是一种新的自监督损失或量化码本。

阅读顺序从左到右。点击模块,将它与计算和代码对应。代码为教学伪代码;来源链接提供论文方法或已核查的实现。

把可学习 registers 放进共享编码器

令 N 为 patch 数、D 为特征宽度、R 为 register 数。输入共有 N+R+1 个位置。Register 初值在不同图像间共享,但经过注意力后的激活随输入图像变化。同一组 Transformer blocks 共同处理 CLS、registers 和 patches。

z = concat(cls, patch_embed(image))
z = z + interpolated_positions
z = concat(z[:, :1], registers, z[:, 1:])
z = transformer(z)

训练状态:静态实现审计;训练状态见下文。

Z0=[c;r1;…;rR;p1;…;pN]∈R(N+R+1)×DZ_0=[c; r_1;\ldots;r_R;p_1;\ldots;p_N]\in\mathbb R^{(N+R+1)\times D}

逐步讲解:把可学习 registers 放进共享编码器

丢弃计算位置的输出,保留图像位置

最终归一化后,CLS 位于 0,registers 占据 [1,1+R),图像 patches 占据 [1+R,N+R+1)。只有 patch 特征应还原为空间网格。把 register 向量也放进 reshape,会破坏序列索引与图像位置的对应。

normalized = norm(z)
cls = normalized[:, 0]
reg = normalized[:, 1:1+R]
patch = normalized[:, 1+R:]
image_grid = patch.reshape(B, H_patch, W_patch, D)

训练状态:静态实现审计;训练状态见下文。

ΔP=RD,ρscores=(N+R+1)2(N+1)2\Delta P=RD,\qquad \rho_{\rm scores}=\frac{(N+R+1)^2}{(N+1)^2}

逐步讲解:丢弃计算位置的输出,保留图像位置

查看固定版本来源

Nencoder=N+R+1,Nimage output=NN_{\rm encoder}=N+R+1,\quad N_{\rm image\ output}=N

论文发现少量输出 patch 向量具有异常高的范数。在所分析的 DINOv2-g 中,2.37% 超过人为选择的阈值 150。这个阈值是特定模型上的诊断规则,不是通用检测器。异常位置常对应局部信息重复的背景 patch。

线性探针给出两类观察:异常 token 恢复局部位置和像素较差,却比普通 patch 更善于预测整图类别。作者据此解释为:模型复用部分空间位置进行全局计算。这是实验支持的解释,不是“所有高范数向量都有害”的证明。

∥zi∥2=∑d=1Dzi,d2,aij=softmax⁡j(qiTkj/dh)\|z_i\|_2=\sqrt{\sum_{d=1}^{D}z_{i,d}^2},\qquad a_{ij}=\operatorname{softmax}_j(q_i^Tk_j/\sqrt{d_h})

范数与注意力是不同量。Q/K 投影、归一化和向量方向也影响注意力。特征图更平滑与任务分数更高,应分别检验。

把可学习 registers 放进共享编码器

Section titled “把可学习 registers 放进共享编码器”
Registers 参与编码器计算;图像读出仍保留原 patch 网格。
教学重绘 · 把可学习 registers 放进共享编码器 每条有名称的路径从左向右阅读。不同行表示独立路径或比较方案。 · 方法来源点击图片查看全尺寸。

令 N 为 patch 数、D 为特征宽度、R 为 register 数。输入共有 N+R+1 个位置。Register 初值在不同图像间共享,但经过注意力后的激活随输入图像变化。同一组 Transformer blocks 共同处理 CLS、registers 和 patches。

固定 DINOv2 代码先给 CLS 与 patches 加绝对位置,再在 CLS 后插入 registers。论文图中的排列不同;本页切片按代码顺序讲解。先前 memory-token 工作已提供一般机制,本文增量是视觉问题诊断及针对该修复的对照证据。

Z0=[c;r1;…;rR;p1;…;pN]∈R(N+R+1)×DZ_0=[c; r_1;\ldots;r_R;p_1;\ldots;p_N]\in\mathbb R^{(N+R+1)\times D}
z = concat(cls, patch_embed(image))
z = z + interpolated_positions
z = concat(z[:, :1], registers, z[:, 1:])
z = transformer(z)

丢弃计算位置的输出,保留图像位置

Section titled “丢弃计算位置的输出,保留图像位置”
Registers 增加内部位置,空间 merger 减少输出位置。
教学重绘 · 丢弃计算位置的输出,保留图像位置 每条有名称的路径从左向右阅读。不同行表示独立路径或比较方案。 · 方法来源点击图片查看全尺寸。

最终归一化后,CLS 位于 0,registers 占据 [1,1+R),图像 patches 占据 [1+R,N+R+1)。只有 patch 特征应还原为空间网格。把 register 向量也放进 reshape,会破坏序列索引与图像位置的对应。

256 个 patches 加四个 registers 时,编码器处理 261 个位置,仍返回 256 个图像位置。四个 768 维输入向量新增 3072 个参数;每头注意力分数矩阵从 257² 增至 261² 项。这个计算不包括投影、MLP 和硬件影响。

ΔP=RD,ρscores=(N+R+1)2(N+1)2\Delta P=RD,\qquad \rho_{\rm scores}=\frac{(N+R+1)^2}{(N+1)^2}
normalized = norm(z)
cls = normalized[:, 0]
reg = normalized[:, 1:1+R]
patch = normalized[:, 1+R:]
image_grid = patch.reshape(B, H_patch, W_patch, D)

增加计算位置,保留图像网格

解析示例:固定 16×16=256 个 patch、宽度 768 和一个 CLS。改变 register 数量,只计算序列结构和注意力分数项;不模拟特征质量或训练效果。

CLS × 1REG × 4PATCH × 256
计算项结果
主干序列长度261
保留的图像位置256
Python patch 切片[:, 5:261, :]
新增可学习参数3072
每头注意力分数项68121
相对 R=0 的项数比1.0314

输出切片遵循固定 DINOv2 实现中的 CLS → REG → PATCH 顺序。计算代价比只针对注意力矩阵,不是总 FLOPs 或时延。

按新序列训练,核对真实对照条件

Section titled “按新序列训练,核对真实对照条件”

实验训练了带 registers 的模型。在现有 checkpoint 上添加未训练向量,不是论文报告的流程。研究在 ImageNet-22k 上使用 DeiT-III ViT-B 和 DINOv2 ViT-L,OpenCLIP ViT-B/16 则使用许可的 Shutterstock 图文语料。这些训练条件不同。

多数实验采用四个 registers,数量消融涵盖 0、1、2、4、8、16。附录还为 DINOv2 位置插值启用 antialiasing。忠实对照应记录该设置、主干规模、训练数据、读出类型和下游协议。数量滑块不能代替这些训练实验。

条件指标数值解释
DINOv2 → +reg,Table 2ADE20k mIoU46.6 → 47.9冻结特征线性评估
DINOv2 → +reg,Table 3VOC2007 CorLoc35.3 → 55.4LOST
OpenCLIP → +reg,Table 3VOC2007 CorLoc38.8 → 37.1并非普遍改善的反例

报告的 LOST 目标发现对照中,DINOv2 改善,而 OpenCLIP 略有下降。因此去除伪影不保证普遍收益。局部线性像素探针不是完整图像解码器,本文也没有证明 registers 能改善 RAE 重建。

对 UAR,先核对冻结编码器返回哪些 token,解码器读取哪些位置,再按需做匹配的编解码对照。Registers 也不是 TiTok 的压缩 latent slots:这里保留原图像网格,并增加内部位置。

丢弃 register 输出,是否意味着它们没有作用?

不是。它们在输出筛选前,已通过共享 blocks 与其他位置交换信息。

返回学习地图

自绘图和伪代码用于教学;原论文图片单独标注来源。论文报告、固定实现观察和解析示例分别标记;未运行研究模型。