
【3D点云暑期学习】精读笔记(2)ViT — An Image is Worth 16x16 Words研0暑期进组学习 · 3D点云多模态方向 · 论文精读系列第 2 篇论文信息标题An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale作者Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, et al.发表venueICLR 2021阅读日期2026年6月写在前面如果说 Transformer2017证明了注意力机制可以做序列建模那么 ViT2020就证明了图像也可以变成序列用同一套 Transformer 来处理。这篇论文打破了一个根深蒂固的信念——CV 必须用 CNN。在 ViT 之前所有人都认为卷积的局部性和平移等变性是视觉任务的必需品。ViT 说不只要数据够多纯 Transformer 也能做得更好。为什么这篇论文对我的 3D 点云主线至关重要因为 CLIP 的图像编码器用的是 ViTUni3D 的 3D 编码器直接用 2D 预训练的 ViT 初始化。理解 ViT就是理解后续所有多模态模型的视觉骨架。一、关于 Patch Embedding图像块嵌入1.1 为什么要进行 Patch Embedding两个原因1Transformer 天生吃的是 1D 序列比如句子里的单词。Patch Embedding 就是把 2D 的图像强行转化成 1D 的视觉句子其中每个 Patch 等价于一个视觉单词。2解决计算量爆炸问题如果以每个像素作为一个 Token224×224 就有50,176个 Token自注意力机制复杂度 O(N²)根本算不动。切成 16×16 后Token 数骤降为196个计算量变得可以接受。1.2 如何做 Patch Embedding输入图像 x ∈ R^{H×W×C}H 为高度W 为宽度C 为通道数彩色图像为 3。以 224×224 图像为例切成 16×16 的 patch。第一步切分Patches将图像分成互不重叠的 N 个小块。每个小块的空间尺寸是 P×P这里 P16。224/1614所以横竖各有 14 个格子总共 N 14×14 196个 Patch。第二步展平Flattening把每个小 Patch 里面的所有像素值拉平成一个一维向量。每个 Patch 原本是 16×16×3 768个数值。拉平后得到 196 个长度为 768 的向量。公式表达为x_p ∈ R^{N×(P²·C)}在这里就是 R^{196×768}。第三步线性投影Linear Projection使用一个可训练的权重矩阵 E维度为 (P²·C)×D即 768×D将每个 768 维的原始像素向量乘以这个矩阵映射成一个 D 维的嵌入向量。这个 D 就是 Transformer 整个网络内部使用的恒定隐向量维度比如 ViT-Base 中 D768。最终输出196 个 D 维向量这些就是 Patch Embeddings图像块嵌入也就是送入 Transformer 的 Token。224×224 图像 ↓ 切分成 16×16 的 Patch 14×14 196 个 Patch ↓ 每个 Patch 展平 196 个 768 维向量 ↓ 线性投影 (768→D) 196 个 D 维 Token → 送入 Transformer1.3 这样做的缺陷是什么做完 Patch Embedding 后原本 2D 的空间结构哪个 patch 在左上哪个在右下被彻底抹平了序列中所有的 patch 都是平权的。为了弥补这一点论文紧接着会加上 Position Embeddings位置嵌入。这也是论文强调的关键点ViT 几乎没有 CNN 那样的局部性和平移等变性先验。它把空间结构完全交给位置编码去学习而 Patch Embedding 本身只负责把像素变成向量。二、可学习的 1D 位置编码2.1 为什么是 1D论文明确指出他们试过更复杂的 2D 感知编码分别学横坐标和纵坐标但发现性能没有显著提升所以为了简洁和高效直接选用了 NLP 中最通用的 1D 编码。2.2 为什么是可学习的Learnable在原始的 NLP Transformer 中位置编码有两种做法固定的正弦波Sinusoidal不需要训练用数学公式生成可学习的Learnable像神经网络的权重一样通过梯度下降学出来ViT 选择了后者。这些位置向量不是人为设定好的数学公式而是随着 JFT-300M 等大数据集的预训练通过梯度下降慢慢学出来的。好处模型可以根据数据分布自由地调整位置向量之间的距离感和方向感比死板的固定公式更加灵活。2.3 它是怎么加上去的关键机制一定要注意代码实现中的细节Position Embedding 是**“加”**在 Patch Embedding 上的而不是拼接。公式为z 0 [ x c l a s s ; x p 1 E ; … ; x p N E ] E p o s z_0 [x_{class}; x_p^1 E; \dots ; x_p^N E] E_{pos}z0[xclass;xp1E;…;xpNE]Epos这意味着每个 Patch 的最终输入向量 图像像素映射来的语义特征该位置的空间坐标特征。因为两者维度都是 D比如 768 维直接相加后Transformer 的每一层就都能同时利用这个 Patch 是什么内容和这个 Patch 在哪这两种信息了。2.4 惊人的发现1D 编码自学出了 2D 布局研究者计算了 196 个位置编码之间的余弦相似度越相似说明编码越接近。结果发现虽然我们只给了它一维的序号0~195但模型硬是自学出了二维的空间拓扑结构邻近性物理位置上越近的 Patch它们的位置编码余弦相似度越高左上角附近的几个格子颜色很接近。行列结构同一行或同一列的 Patch位置编码呈现出明显的规律性甚至隐隐约约有类似正弦波的周期性结构。结论1D 可学习位置编码完全有能力隐含地表征 2D 图像的空间布局不需要人工去设计复杂的 2D 编码。这从侧面说明了 Transformer 的强大——给它最简单的输入它能自己悟出结构。三、为何 ViT 需要在大数据预训练后表现更好这是 ViT 最常被讨论的问题为什么在小数据集上 ViT 打不过 CNN但在大数据上却反超3.1 CNN 自带的归纳偏置Inductive Bias归纳偏置可以理解为模型自带的、不用学就会的先验知识。CNN 有两个强大的归纳偏置归纳偏置含义作用局部性Locality卷积核默认只关注相邻区域如 3×3 的邻居天生认为像素挨得近就是有关系平移等变性Translation Equivariance一个特征无论在图片哪个位置同一个卷积核都能识别猫耳朵在左上角或右下角都能被检测到这些先验极其强大意味着 CNN 哪怕只给 100 万张图ImageNet也能很快学会识别物体因为它不需要去学空间是什么——它天生就知道。3.2 ViT 缺乏归纳偏置ViT 只在切分 Patch 和微调插值位置编码时用到了 2D 结构。在真正的 Transformer 层中自注意力是全局的第一个 Patch 可以直接和最后一个 Patch 计算相似度。ViT 一开始并不知道相邻很重要。MLP 是局部的但只作用于单个 Token。位置编码是加进去的不是天生的虽然加了 1D 可学习位置编码但这些编码最初只是随机的数字模型必须从头去背诵哪几个编码代表上下、哪几个代表左右。3.3 小数据ViT 不如 CNN如果只给 ViT 喂 100 万张图ImageNet它的泛化能力很差。因为它会把大量的算力浪费在猜测空间拓扑结构上而不是去学物体长什么样。论文原话“在没有强正则化的情况下ViT 比同等大小的 ResNet 低几个百分点。”3.4 大数据ViT 超越 CNN当见过 3 亿张千奇百怪的图片后JFT-300M发生了质变从背诵到理解空间ViT 不再需要去猜测空间关系了。它通过海量数据硬生生地在注意力权重中悟出了 2D 拓扑结构。容量Capacity优势释放ViT 的 Transformer 架构比 CNN 拥有更大的模型容量和更灵活的感受野。CNN 的局部性是一种强制约束——在小数据时是福音但在大数据时成了枷锁。它永远看不到全局的长程依赖。而 ViT 在大数据下不仅学会了局部纹理还能轻松捕捉到远距离像素之间的关联比如狗的鼻子和狗的尾巴之间的关系这是 CNN 很难做到的。一句话总结CNN 的归纳偏置是一种提前透支——用先验换数据效率ViT 用数据换自由度——大数据下自由度的优势碾压了先验的便利。四、模型架构解析论文 Figure 1ViT 模型概览。将图像切分为固定大小的 Patch线性嵌入后加位置编码送入标准 Transformer Encoder。分类时使用可学习的 [CLS] Token。4.1 数据流原始图像 (224×224×3) ↓ 切分 展平 196 个 Patch (每个 768 维) ↓ 线性投影 196 个 D 维 Token ↓ 前面拼接 [CLS] Token 197 个 D 维 Token (1 CLS 196 Patch) ↓ 位置编码 197 个 D 维 Token (含位置信息) ↓ Transformer Encoder × L (如 12 层) 197 个 D 维输出 Token ↓ 取 [CLS] Token 的输出 1 个 D 维全局特征 ↓ MLP Head 分类结果4.2 关键设计决策设计选择理由Patch 大小16×16平衡计算量与信息保留196 个 Token位置编码1D 可学习2D 无显著提升选最简方案[CLS] Token借鉴 BERT汇聚全局信息用于分类归一化顺序Pre-Norm先 LayerNorm 再 Attention训练更稳定架构仅 Encoder分类任务不需要 Decoder五、实验亮点预训练数据JFT-300M3 亿张图、ImageNet-21k1400 万张、ImageNet-1k130 万张主要结果ViT-H/14 在 ImageNet-21k 上达到 88.55% Top-1 准确率超越所有 CNN关键发现数据规模 vs 性能曲线显示ViT 在大数据下性能饱和更慢潜力更大小数据下 ViT 不如 ResNet迁移学习大规模预训练后ViT 在 CIFAR-100、VTAB 等 5 个下游任务上均达 SOTA六、个人思考局限性数据饥渴需要海量数据预训练才能发挥优势对数据量有限的研究场景不友好计算成本高大规模预训练需要大量 TPU/GPU 资源Patch 粒度固定16×16 的 Patch 大小是预设的对细粒度识别如密集场景可能信息损失与 3D 点云主线的联系ViT 对我的 3D 主线有直接且关键的意义CLIP 的图像编码器就是 ViT第二周精读理解 ViT 的 Patch Embedding 和 CLS Token才能理解 CLIP 如何编码图像Uni3D 直接用 ViT 做 3D 编码器第六周精读用 2D 预训练的 ViT 初始化把 3D 点云当成序列输入——这是 2D 知识迁移到 3D 的核心思路点云与图像的本质相似性点云是 3D 空间中的无序点集图像是 2D 空间中的像素阵列。ViT 证明了把空间数据序列化后用 Transformer 处理是可行的这为 PointNet → Transformer 的演进提供了理论依据特别值得注意的是ViT 的 Patch Embedding 思路把连续空间切分成离散 Token与 PointNet 的逐点编码把每个 3D 点作为一个 Token在哲学上是相通的。后续的 Point-Bind 正是沿着这条路走的。可改进点可以探索动态 Patch 大小类似动态分辨率在不同区域用不同粒度3D 点云能否借鉴 Patch Embedding把点云分簇后每簇作为一个 Token这与 PointNet 的分组策略有异曲同工之妙本周系列博文精读笔记(1)Attention Is All You Need精读笔记(2)ViT ← 当前对比学习(1)Transformer vs ViT 架构对比周报(1)第一周学习总结上一篇精读笔记(1)Attention Is All You Need下一篇对比学习(1)Transformer vs ViT 架构对比