了解 ViT(Vision Transformer)吗?
了解 ViT(Vision Transformer)吗?
这道题考的是把 Transformer 思想迁移到视觉领域的创新理解。面试官想看你能不能说清楚 ViT 的核心创新点、它和 CNN 的本质区别、以及实际应用中的考量。
我从四个方面来讲:ViT 是什么、怎么工作、和 CNN 的核心差异、应用场景。
ViT 是什么——把图像切成"视觉单词"
ViT(Vision Transformer)是 2020 年 Google 提出的把 Transformer 架构用到图像分类的模型。它的核心创新特别简单:把图像切成一块一块的"碎片",每块当成一个"单词"来处理。
怎么切?224×224 的图片,切成 16×16 的小块,横竖各 14 块,总共 196 个 patch。每个 patch 原本是 16×16×3(RGB 三通道)的像素矩阵,展平后是 768 维向量,再通过一个线性投影变成固定长度的 embedding。
这波操作在干啥?把图像"文字化"。
NLP 里一句话切成单词,每个单词编码成向量。ViT 把这个思路搬过来了——把图像切成 patch,每个 patch 当成一个"视觉单词"。
类比一下:一张图片就像一篇文章,patch 就是单词,整个 ViT 在"读图"而不是"看图"。
为什么要有这个转换?因为 Transformer 天生擅长处理序列数据,注意力机制可以让序列中任意两个位置直接交互。但图像是二维的像素阵列,直接拉成一维喂给 Transformer 计算量爆炸。切成固定大小的 patch 之后,输入变成了一个"可处理的序列",后面的 Transformer Encoder 就能直接用了。
ViT 怎么工作——四步走完图像理解
整体流程就四步:
第一步:Patch Embedding
每个 16×16×3 的 patch 展平成 768 维向量,通过一个线性层投影成 P 维 embedding。这一步把像素信息变成了模型能处理的向量表示。
第二步:加入 Position Embedding
展平切片会丢失空间位置信息。你把一张图切成 9 块,模型分不清哪块是左上角、哪块是右下角。所以要给每个 patch 的 embedding 加上一个位置编码,告诉模型"这是第几行第几列"。
ViT 用的是可学习的位置 embedding,每个 patch 对应一个位置向量,加到 patch embedding 上。位置信息保留之后,Transformer 才能理解图像的空间结构。
第三步:添加 [CLS] Token
NLP 里的 [CLS] token 用来聚合整句话的语义。ViT 借鉴了这个做法:在输入序列最前面加一个单独的 [CLS] token,它的 embedding 会和所有 patch 的 embedding 一起参与注意力计算。最后用 [CLS] token 的输出向量做分类。
为什么不用所有 patch 的平均?因为 [CLS] token 经过注意力机制聚合了全局信息,效果比简单平均好得多。
第四步:送入 Transformer Encoder
处理好的序列送进标准的 Transformer Encoder block:多头自注意力(MSA)+ MLP + LayerNorm + 残差连接。ViT-Base 用 12 层 Encoder,每层 12 个注意力头。
[CLS] token 经过层层 Encoder 的信息融合,最后输出接一个分类头(线性层 + Softmax),得到类别概率。
整个流程就是:patch 化 → 投影 → 加位置 → 加 [CLS] → 过 Transformer → 分类。
ViT vs CNN——两种范式的核心差异
这是面试里必问的对比。说白了就是两句话:CNN 从局部到全局,ViT 一步到位全局感知;CNN 有先验假设,ViT 靠数据驱动。
局部 vs 全局
CNN 用卷积核扫图,每次只处理一个局部窗口。靠层层堆叠,感受野从小变大,第三层能看 3×3 的像素,第十层能看到更大范围。但这个扩展是渐进式的,信息要一层一层往上传。
ViT 从第一层就能让任意两个 patch 直接交互。全局注意力嘛,每个位置都能"看到"所有其他位置,第一层就具备全局感知能力。
类比一下:CNN 像逐级汇报的领导,基层先处理局部信息,层层上报才形成全局认知。ViT 像一次会议所有人同时参与,每个人都能听到所有人的意见。
归纳偏置
归纳偏置就是模型对数据分布的先验假设。
CNN 有两个强归纳偏置:局部性(只关注局部区域)和平移不变性(物体挪到哪都一样识别)。这些假设让 CNN 在小数据场景下也能工作,因为模型"天生就知道"图像的局部结构很重要。
ViT 几乎没有归纳偏置。它假设数据之间通过注意力交互,至于什么是局部、什么是全局,全靠从数据里学。这意味着 ViT 需要更多数据才能学出有效的模式。
规模效应
这也是 ViT 论文的核心发现:ViT 吃数据,越多越好。
在 ImageNet(130 万张图)上从头训练,ViT 不如 ResNet。在 ImageNet-21k(1400 万张)上预训练再微调,ViT 追平 ResNet。在 JFT-300M(3 亿张)上预训练,ViT 大幅超越 CNN。
原因就是:没有归纳偏置的"束缚",ViT 的上限更高,只要数据够多,就能突破 CNN 的性能天花板。
CNN 的归纳偏置在小数据时是优势(帮模型快速收敛),但大数据时会限制模型的表达能力。ViT 相反,数据少时吃亏,数据多了直接把天花板掀掉。
ViT 用在哪——从分类到多模态
ViT 最早是解决图像分类问题的,但在分类任务上取得成功之后,迅速扩散到了其他视觉任务。
分割任务
语义分割、实例分割、全景分割,ViT 都能搞定。SETR、SegFormer 这些模型把 ViT 的思路用到像素级预测。ViT 的全局注意力让模型在分割时能更好地理解物体边界和上下文关系。
医学影像
医学图像往往结构复杂、对局部细节和全局上下文都有要求。ViT 能捕捉细微的病灶特征,在 X 光、CT、病理切片分析上表现不错。
机器人视觉
要让机器人理解"把蓝色方块递给我"这种指令,需要同时理解视觉信息和语言指令。ViT 的架构和 NLP 的 Transformer 一致,非常适合和多模态模型结合。
多模态大模型
这是 ViT 最重要的应用方向。CLIP、GPT-4V、Gemini 这些多模态模型,视觉编码器都是 ViT 及其变体。ViT 提供了视觉和语言在表示空间上的统一,让两个模态的模型能"对话"。
MAE(Masked Autoencoder)进一步证明了 ViT 的潜力:用自监督方式预训练,ViT 能在大量无标注图像上学习到强大的视觉表示,然后在下游任务上微调。
ViT 的局限
ViT 很强,但也不是万能的。
计算量问题。全局注意力让 ViT 的计算复杂度随图像尺寸平方增长。224×224 还能接受,但高分辨率图像(比如 1024×1024)直接爆显存。解决方案包括:Swin Transformer 的滑动窗口注意力、DeiT 的知识蒸馏轻量化、MobileViT 的移动端适配。
对数据量的依赖。弱归纳偏置的代价就是要用更多数据喂饱模型。如果数据不够,ViT 很可能不如一个调好的 ResNet。MAE 等自监督预训练缓解了这个问题,但部署时还是要考虑场景的数据规模。
实际选型时,数据量决定你能不能用 ViT,场景决定你用哪种 ViT 变体。云端大模型可以用大 ViT,边缘部署就要上 MobileViT。
面试怎么答
基础版(100-150字):
ViT 是把 Transformer 架构用到视觉任务的模型,核心思想是把图像切成 16×16 的 patch,每个 patch 当成"视觉单词"处理。流程是:patch 投影 + 位置编码 + [CLS] token + Transformer Encoder。它和 CNN 的本质区别是:CNN 靠局部卷积层层递进,ViT 用全局注意力一步到位获取全局信息。ViT 在大数据下效果更好,但小数据场景 CNN 更稳。
加分版(再补充几点):
关键要提到 ViT 的规模效应:弱归纳偏置让它上限更高,数据越大优势越明显,这也是为什么多模态大模型都用 ViT 做视觉编码器。如果面试官追问,可以聊聊 MAE 自监督预训练解决了数据依赖问题,以及 Swin Transformer、MobileViT 等变体在实际部署中的权衡。
一句话总结
ViT 的核心就是把图像切成 patch 当 token,用 Transformer 的全局注意力替代 CNN 的局部卷积,用数据换先验,大数据下上限更高。
