状态:草稿(2026-10-13),部分实测。 示例是在笔记本电脑 CPU 上直接运行的值(
code/07_vit.py,1 秒以内)。论文中的数据来自原文并连同条件一并复制,硬件则按等级记录。 编写规则:实测数据为基本原则,无法测量的数据标记为「未实测」。
目录
- 1. 注意力:观察所有配对的关系
- 2. ViT:将图像视作图块组成的句子
- 3. 分辨率的代价
- 4. 为什么需要大量的数据
- 5. DeiT:仅使用 ImageNet 进行训练
- 6. 回归层级结构:Swin、Hiera
- 7. 局限性与我们的项目
- 参考文献
1. 注意力:观察所有配对的关系
Transformer(2017)是为翻译而创建的模型。其核心运算是 自注意力机制。它为句子中的每个单词创建三个向量。
- 查询(Q):「我在寻找什么」
- 键(K):「我拥有什么信息」
- 值(V):「如果选择了我,就会给出这个」
通过单词 i 的查询与单词 j 的键进行点积来决定「i 应该关注 j 多少」,并按该比例混合值。
Attention(Q, K, V) = softmax( Q·Kᵀ / √d_k ) · V
论文这样解释了除以 √d_k 的原因。如果维度 d_k 很大,点积值就会变大(如果各分量均值为 0,方差为 1,则点积的方差为 d_k),这会导致 softmax 偏向一侧,从而使梯度变得非常小。通过相除将方差拉回 1 附近。
与卷积相比,差异非常明显。卷积的一个输出单元仅查看 3×3 的邻域,若要看远处则必须堆叠层(第 1 篇中的感受野)。而注意力机制 从第一层开始就查看所有位置。 关注谁不是由固定的窗口决定的,而是由数据(Q·K)决定的。
2. ViT:将图像视作图块组成的句子
Dosovitskiy 等人的 ViT 将图像变得像句子一样。
- 将 224×224 的图像切分为 16×16 的图块。14×14 = 196 个图块。
- 将单个图块(16×16×3 = 768 个数字)展平,并通过 线性投影转换为 D 维向量(标记)。
- 在最前面附加一个可学习的 CLS 标记。在最后一层中,使用该标记的输出来表示整幅图像并进行分类。
- 为每个标记加上 位置嵌入(可学习的向量)。
- 堆叠 L 层标准的 Transformer 编码器(自注意力机制 + MLP,均带有残差连接和层归一化)。
| 模型 | 层数 | 隐藏维度 D | MLP | 头数 | 参数量 |
|---|---|---|---|---|---|
| ViT-Base | 12 | 768 | 3072 | 12 | 8600万 |
| ViT-Large | 24 | 1024 | 4096 | 16 | 3.07亿 |
| ViT-Huge | 32 | 1280 | 5120 | 16 | 6.32亿 |
名称中的「/16」、「/14」表示图块大小。第 9 篇中的 SAM 所使用的图像编码器就是这个 ViT-Huge(图块大小 16)。
动手实践 1:图块 + 线性投影 = 步幅 16 的卷积
将图像切成图块并与矩阵相乘,与用步幅 16 滑动 16×16 滤镜的卷积是相同的计算。我们用相同的权重计算并比较了这两种方法(实测)。
224×224 → 패치 196개(14×14), 패치 하나 768개 숫자 → 64차원 토큰
「잘라서 선형 변환」과 「보폭 16 합성곱」의 최대 차 2.7e-15
唯一的差异是浮点数四舍五入带来的误差。实际实现中,这部分绝大多数也都是用单层卷积编写的。ViT 的第一层是「窗口不重叠的超大卷积」,而具备卷积特性的部分也就仅此而已。
动手实践 2:如果没有位置嵌入,就无法知道顺序
自注意力机制 不关心标记的顺序。 如果打乱输入标记,输出也只会跟着被同样打乱(置换等变性)。因此,即使将图像左上角的图块和右下角的图块互换,模型也无从知晓(实测)。
토큰 순서를 섞어 넣은 출력 == 원래 출력을 같은 순서로 섞은 것: 최대 차 1.3e-15
위치 임베딩을 더하면 같은 패치를 섞었을 때 출력이 달라진다: 상대 차 0.28
这就是为什么需要位置嵌入。在 ViT 论文的实验中(ViT-B/16,基于 ImageNet 每类 5 张图进行线性评估),如果没有位置嵌入则是 0.614,1D 可学习嵌入为 0.642,2D 嵌入为 0.640,相对位置为 0.640。 有与没有的差距很大,但具体是哪种类型则几乎没有区别。 这意味着在图块级别(14×14)下,即便只给出 1D 编号,模型也能自己学会 2D 布局。
3. 分辨率的代价
由于注意力机制会查看所有标记对,因此其开销是标记数量 N 的 平方(实测计算)。
| 输入单边长度 | 标记数量 N | 注意力矩阵 N² | 相比 224px |
|---|---|---|---|
| 224 | 196 | 38,416 | 1.0倍 |
| 384 | 576 | 331,776 | 8.6倍 |
| 512 | 1,024 | 1,048,576 | 27.3倍 |
| 1024 | 4,096 | 16,777,216 | 436.7倍 |
SAM 的输入是 1024×1024。因此 SAM 的 ViT-H 在绝大多数层中仅在 14×14 窗口内部 进行注意力计算,而全局注意力仅保留在 4 层中(第 9 篇)。如果在分辨率很重要的任务中使用 ViT,就需要做出这种折中。
4. 为什么需要大量数据
ViT 论文最重要的结果不是准确率的数字,而是 随数据规模大小而发生的逆转。
- 如果仅使用 ImageNet-1k(约 130 万张图片)进行预训练,大 ViT 的表现不如 ResNet(BiT),而 ViT-Large 的表现甚至不如 ViT-Base。
- 在 ImageNet-21k(约 1400 万张图片)上,Large 和 Base 变得不相上下。
- 只有在 JFT-300M(约 3 亿张图片)上,大模型的优势才完全显现出来,ViT 超越了 ResNet。
| 模型(预训练数据) | ImageNet top-1 | 预训练成本(TPUv3 核心·天) |
|---|---|---|
| ViT-H/14(JFT-300M) | 88.55% | 2,500 |
| ViT-L/16(JFT-300M) | 87.76% | 680 |
| ViT-L/16(ImageNet-21k) | 85.30% | 230 |
| BiT-L(ResNet152×4, JFT-300M) | 87.54% | 9,900 |
| Noisy Student(EfficientNet-L2) | 88.4–88.5% | 12,300 |
(论文表 2. ViT-H/14 微调分辨率为 518px,ViT-L/16 为 512px。)
论文用 归纳偏置来解释这个原因。卷积天生具有“相邻像素之间关系密切(局部性)”和“相同的图案在任何地方都一样(平移等变性)”的结构(第 1 篇)。在 ViT 中,具有这种性质的只有图像块(patch)内部的 MLP,而自注意力是全局的。因此,“多关注相邻图像块”这一规则 必须从数据中自行学习 ,如果数据较少,它会在学会该规则之前就把训练数据死记硬背下来。相反,如果数据充足,这种自由度就会变成优势。由于结构没有强制限定,它能够找到更适合数据的规则。
仔细观察实际训练好的 ViT,“ 即使在最底层 ”,一些注意力头也会观察整张图片的大部分区域,而另一些注意力头只关注附近区域,并且层数越深,观察的距离越远(论文第 4.5 节)。这相当于它自己生成了类似卷积那样进行局部观察的注意力头。
成本方面也很有趣。在上表中,ViT-H/14 比 BiT-L 更准确,而预训练成本约为后者的 1/4。只要数据充足,Transformer 在计算效率上也具有优势。
5. DeiT:仅使用 ImageNet 进行训练
大多数人无法获取 3 亿张私有数据。Touvron 等人提出的 DeiT(2021)展示了 仅使用 ImageNet-1k 就能很好地训练 ViT 的方法。秘诀有两个。
- 强数据增强与正则化。 全面使用了 RandAugment、mixup、CutMix、随机擦除(Random Erasing)、随机深度(Stochastic Depth)和重复增强(Repeated Augmentation)。在消融实验(DeiT-B,224px)中,同时去掉 mixup 和 CutMix 会使准确率从 81.8% 下降到 75.8%,去掉重复增强会下降到 76.5%,而去掉随机擦除或随机深度则会导致训练直接失败。这相当于通过扩大数据量来教给模型原本需要从数据中学习的归纳偏置。
- 蒸馏标记(Distillation Token)。 在 CLS 标记旁额外添加一个“模仿教师模型答案”的标记。教师模型是卷积网络(RegNetY-16GF,82.9%)。可以说,这是通过教师模型的答案继承了卷积的归纳偏置。
| 模型(仅 ImageNet-1k) | 224px | 384px |
|---|---|---|
| DeiT-B | 81.8% | 83.1% |
| DeiT-B + 蒸馏 | 83.4% | 84.5% |
训练仅需一台配备 8 张 GPU 的服务器 2–3 天(300 个轮次耗时 53 小时)。论文的其他地方也有“4 张 GPU 训练 3 天”的表述,原文中的条件前后略有出入。
6. 回归分层结构:Swin、Hiera
ViT 从头到尾都保持 14×14 的单一分辨率。对于检测和分割这样需要处理不同大小物体的任务,人们开始怀念卷积的 金字塔结构(高分辨率 → 低分辨率)。
- Swin Transformer(2021):仅在小窗口内部进行注意力计算,并在不同层之间 平移 半个窗口,从而混合窗口间的信息。计算成本随图像大小呈 线性增长,并且在每个阶段合并 token 以构建金字塔。其 COCO test-dev box AP 为 58.7,ADE20K 分割 mIoU 为 53.5。
- Hiera(2023):去掉了依附于分层 ViT 的各种组件(相对位置嵌入、卷积、重叠池化等),转而通过强大的 MAE 预训练(遮挡部分图像并进行重建)来学习这些功能。它在保持准确率的同时提高了速度(Hiera-L 的吞吐量约为对比对象 MViTv2-L 的 2.4 倍,使用数据中心 GPU 和 FP16)。Hiera-H 在 ImageNet-1k 上的准确率为 86.9%。 SAM 2 的图像编码器正是 Hiera (第 10 篇)。
诸如 MAE 等自监督预训练的原理将在姊妹系列(自监督·视频·姿态·体育)中进行探讨。
7. 局限性与我们的项目
- 数据与计算。 由于归纳偏置较弱,它需要海量数据、强数据增强或预训练。
- 分辨率成本。 由于 N² 的计算成本,高分辨率图像需要采用窗口注意力之类的折中方案。
- 小物体。 比单个 16×16 图像块更小的物体会被淹没在一个 token 内部。在模型输入中,直径为 3px 的乒乓球甚至占不到图像块的 1%。
因此,在 TT Score 中分工明确。 寻找球由卷积(HRNet 系列)负责, ,分割球台由 Transformer(SAM 2.1 的 Hiera)负责 。球台很大且结构简单,比赛开始时找一次即可,因此可以使用较重的 Transformer;而球很小且每帧都需要寻找,所以轻量且局部的卷积更为合适(TT Score 模型解剖第 1 篇)。
接下来的文章是使用 Transformer 重写检测的 DETR。它没有 Anchor,也没有 NMS。
TT 总结: 如果打乱拼图块的顺序,如果没有位置嵌入(Position Embedding),模型就察觉不到。这就好比把图像看作一堆拼图块。只有贴上编号标签,拼图才能拼好。
参考文献
- Vaswani, A. et al. (2017). Attention Is All You Need. NeurIPS 2017. https://arxiv.org/abs/1706.03762
- Dosovitskiy, A. et al. (2021). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR 2021. https://arxiv.org/abs/2010.11929
- Touvron, H. et al. (2021). Training data-efficient image transformers & distillation through attention. ICML 2021. https://arxiv.org/abs/2012.12877
- Liu, Z. et al. (2021). Swin Transformer: Hierarchical Vision Transformer using Shifted Windows. ICCV 2021. https://arxiv.org/abs/2103.14030
- Ryali, C. et al. (2023). Hiera: A Hierarchical Vision Transformer without the Bells-and-Whistles. ICML 2023. https://arxiv.org/abs/2306.00989
- 示例代码和输出:此文件夹中的
code/07_vit.py,code/07_vit.out.txt