# 【纯新手向】我的深度学习打怪升级之路(七):让 Transformer 学会“看”——ViT 与视觉大模型入门
前言:上一篇我们啃下了 Transformer 这块硬骨头,知道了它靠自注意力机制在 NLP 领域大杀四方。那么一个很自然的疑问就来了:Transformer 这种为文本设计的架构,能用来处理图像吗?答案是——不仅能,而且效果惊人。这篇我们就把 Transformer 从 NLP 搬到 CV(计算机视觉),聊聊 ViT、CLIP、DINO 这些视觉大模型的基本原理。
目录
1. 写在前面:Transformer 如何跨界到视觉
上篇我们学 Transformer 时,它的输入是「一个句子 = 一串单词」,每个词对应一个向量。这个套路对文本天然适用。
但图像怎么办?图像是一个三维矩阵(宽 × 高 × 通道),没法直接喂给 Transformer。核心问题只有一个:
怎么把一张图片变成 Transformer 能消化的「一串向量」?
ViT(Vision Transformer)的答案极其简单粗暴:把图切成小方块,每个方块当成一个“单词”。这就是 ViT 的核心思想。听起来简单,但 2020 年 Google 提出时,效果直接对标甚至超越了当时的 SOTA CNN。
新手类比:CNN 处理图像时是从局部卷积一步步提取特征,就像从像素→边缘→轮廓→完整物体,一层层往上抽象。而 ViT 是一开始就把整张图切成 patch,然后让 Self-Attention 直接学习任意两个 patch 之间的关系,像人类看图一样先有整体印象。
2. ViT 详解:把图片当成“句子”来处理
2.1 Part 1 | ViT 概览:CNN 的挑战者
ViT 的整体架构和 NLP Transformer 几乎一模一样,唯一的区别在输入层:
图像
→ 切成 Patches → 每个 Patch 转成一个向量 → 加位置编码
→ Encoder × N 层(和 Transformer Encoder 一样)
→ MLP Head → 分类结果(猫?狗?车?)
ViT 没有 Decoder,只用了 Encoder。因为它做的是图像分类,不是序列生成。
为什么 ViT 能挑战 CNN?
| CNN | ViT | |
|---|---|---|
| 核心操作 | 卷积核滑动,局部感受野 | Self-Attention,全局感受野 |
| 归纳偏置 | 强(局部性、平移不变性) | 弱(全靠数据学) |
| 长距离依赖 | 需要堆很多层 | 第一层就能看到整张图 |
| 数据需求 | 中等数据量可行 | 需要大规模数据训练 |
| 解释性 | CAM 等可视化 | Attention 矩阵可视化 |
关键结论: CNN 自带「局部连接」「平移不变性」等先验假设,小数据集上更容易学。ViT 没有这些假设,所以更需要大数据来学,但数据量足够时,ViT 能学到更灵活的特征。
2.2 Part 2 | Embedding 层:一张图怎么变成一串 token
这是 ViT 最巧妙的部分。以标准 ImageNet 图像(224×224×3)为例,一步步来看:
2.2.1 Patch Embedding(图块嵌入)
原始图像: 224 × 224 × 3
切分 Patch: 每个 Patch = 16 × 16 × 3
Patch 数量: 224/16 = 14,14 × 14 = 196 个 patch
每个 Patch: 展平 → 16×16×3 = 768 维向量
线性投影: 768 → 768(论文中,D=768)
总结果:196 个 token,每个 token 是 768 维向量。
新手理解:从前 Transformer 处理「每个词」的向量,现在 ViT 处理「每个图块」的向量。只不过词向量是查表查出来的,图块向量是通过一个线性层算出来的。
2.2.2 CLS Token(分类令牌)
Borrowed from BERT 的做法:在序列最前面加一个特殊的 [CLS] token。
Token 序列: [CLS] + [Patch_1] + [Patch_2] + ... + [Patch_196]
Token 数量: 197
最后用 [CLS] token 的输出向量来做分类。它相当于一个「信息收集器」,Self-Attention 会把整张图的信息汇聚到它身上。
2.2.3 Position Embedding(位置编码)
和原版 Transformer 一样,告诉模型每个 patch 在图中哪个位置。ViT 用的也是可学习的 1D 位置编码:
位置向量的维度也是 768,
直接加到 patch embedding 上:197 个 token × 768 维
注意:ViT 在论文中用的是标准可学习位置嵌入,不是固定 sin/cos。实验发现固定 sin/cos 也能用,但效果略差。
2.2.4 一张图总结 Embedding 层
224×224×3 图片
↓ 切成 16×16 的块
196 个 patch,每个展平成 768 维
↓ 加 [CLS] token
197 个 token,每个 768 维
↓ 加位置编码
最终输入 Transformer Encoder:197 × 768 的矩阵
2.3 Part 3 | ViT Encoder:照搬 Transformer
ViT 的 Encoder 就是原汁原味的 Transformer Encoder,公式如下:
z₀ = [x_class; x¹_patch_E; x²_patch_E; ...; x^N_patch_E] + E_pos
z'_ℓ = MSA(LN(z_{ℓ-1})) + z_{ℓ-1} // 多头自注意力 + 残差
z_ℓ = MLP(LN(z'_ℓ)) + z'_ℓ // 前馈网络 + 残差
y = LN(z⁰_L) // 取出 CLS token,做分类
逐层解释:
- LN:Layer Normalization,层归一化,放到子层前面(Pre-Norm,这是 ViT 与原始 Transformer 的一个小区别)
- MSA:Multi-Head Self-Attention,让 197 个 token 互相看
- MLP:两层全连接,中间用 GELU 激活函数
GELU 激活函数
ViT/Transformer 中普遍使用 GELU 替代 ReLU:
GELU(x) = x × Φ(x) Φ 是标准正态分布的累积分布函数
≈ x × sigmoid(1.702 × x)
GELU 比 ReLU 更平滑,在接近 0 的区域不是直接截断,而是有个概率性的过渡。实验证明在大规模 Transformer 中 GELU 效果更好。
QKV 在 ViT 中的直观理解
虽然计算过程和在 NLP 中一模一样,但在图像任务中:
- Q(Query):「我这个小方块在找什么?」
- K(Key):「我的特征是什么?」
- V(Value):「我有哪些信息可以提供?」
举个例子:一个 patch 包含「猫的耳朵尖端」,它的 Query 可能会匹配到另一个 patch 的 Key(猫的眼睛),然后从眼睛的 Value 获取信息。
新手理解:ViT 的第一层 Self-Attention,就是让每个 16×16 的小方块去问整个图中哪些方块和自己有关系。这比 CNN 的 3×3 卷积视野大多了。
2.4 Part 4 | MLP Head:分类头
Encoder 输出后,取 [CLS] token 的最终表示,过一层 LayerNorm,再通过一个简单的 MLP 输出分类概率:
[CLS] token → LayerNorm → Linear → 分类输出(如 1000 类)
注意:预训练时用 MLP Head 分类,微调时换一个新的分类头即可。
2.5 Part 5 | 实验结果:ViT 行不行?
ViT 论文的核心发现:
数据规模是决定性因素:
- 在中等数据集(如 ImageNet 130 万张)上:ViT 不如同等规模的 CNN
- 在大数据集(如 JFT-300M 3 亿张)上:ViT 超越了 CNN,且计算效率更高
这验证了一个结论:Transformer 的归纳偏置弱,需要更多数据才能发挥优势。一旦数据量够,全局自注意力的优势就体现出来了。
新手小笔记:ViT 是大数据的宠儿。数据量小的时候别急着换 ViT,CNN 可能更好训。
2.6 Part 6 | 微调:在大模型上“精装修”
ViT 的标准使用方式:
- 预训练:用大规模数据集(如 JFT-300M)从头训练
- 微调:在自己的小数据集上用预训练权重继续训练
- 换分类头:把预训练模型的 MLP Head 换成适合自己任务分类数的头
预训练 → 微调的范式现在已经是 CV 领域的主流做法,和 NLP 中「BERT 预训练 + 下游任务微调」的思路完全一致。
3. 视觉大模型全景:不止 ViT
第二个 PDF 把视野从 ViT 一个模型,扩展到了整个「视觉大模型」的生态。这一部分让我对 AI 视觉的整体格局有了更清晰的认识。
3.1 Part 1 | 大模型时代的背景
从 2022 年底 ChatGPT 横空出世,大模型正式进入公众视野。背后的关键技术:
-
大规模预训练:海量数据 + 海量参数
-
RLHF(人类反馈强化学习):
- 收集人类偏好数据(Prompts → 模型回答 → 人工排序)
- 训练 Reward Model(奖励模型,学习人类偏好)
- 用 PPO 算法优化模型,让模型生成人类更喜欢的回答
-
关键趋势:
- 模型越来越大 → 涌现能力
- 从单模态到多模态(文本 + 图像 + 音频…)
新手理解:RLHF 就像「老师给分 → 学习打分标准 → 按标准自我优化」这样一个循环。
3.2 Part 2 | 多模态大模型:图文融合
传统模型:CV 模型处理图像,NLP 模型处理文本,井水不犯河水。
多模态大模型:让模型同时理解图片和文字,能看图说话、按文找图。
关键问题是:
怎么让「图片的表示」和「文字的表示」处于同一个语义空间里?
让「猫」这张图和「猫」这个词,在向量空间里的位置尽可能靠近。
这个方向催生了 CLIP 这样的里程碑模型。
3.3 Part 4 | CLIP:用文字监督来学图像
CLIP(Contrastive Language-Image Pre-training)是 OpenAI 在 2021 年提出的,它的核心思路极其优雅:
传统做法 vs CLIP:
传统:人工标注分类标签 → 训练分类器(类别固定,扩展性差)
CLIP:图文配对数据 → 训练图文匹配 => 学习开放的视觉概念
CLIP 的训练方式:对比学习
一批图文对:[图A, 文字A], [图B, 文字B], [图C, 文字C], ...
↓
图像编码器 文字编码器
(ViT/ResNet) (Transformer)
↓ ↓
图A向量 图B向量 ... 文A向量 文B向量 ...
↓ ↓
计算所有图文对之间的相似度矩阵
↓
优化目标:配对的相似度最高,不配对的相似度低
这就是对比学习:拉近正样本对,拉远负样本对。
CLIP 训练后能做到:
- 给出「一张猫的图」+「一句话:“a photo of a cat”」→ 高相似度
- 给出「一张猫的图」+「一句话:“a photo of a dog”」→ 低相似度
- 零样本分类:不需要针对特定类别重新训练
- 给出图 + 所有可能的文字标签(“cat”, “dog”, “car”…)
- 选相似度最高的标签
这在当时是革命性的:一个 CLIP 模型不用任何微调,就能在任何图像分类任务上有不错的表现。彻底摆脱了「有几类就得训练几类」的限制。
3.4 Part 5 | DINO 与知识蒸馏:不用标签也能学
DINO(DIstillation with NO labels)更进一步——连文字标签都不用。
DINO 的核心:Self-Distillation(自蒸馏)
输入一张图 → 两个不同的随机裁剪
↓ ↓
学生网络(S) 教师网络(T)
(小裁剪) (大裁剪/全局图)
↓ ↓
让 S 的输出去匹配 T 的输出
↓
教师网络用学生的动量(EMA)更新
关键点:
- 不需要任何人工标签,纯粹自监督学习
- 教师网络用学生参数的指数移动平均(EMA)更新
- 不同视角下同一物体的特征被拉近,不同物体的特征被推开
一个惊艳的结果
DINO 学到的注意力图(Attention Map)能自动「分割」出前景物体,即使训练过程中从没标注过什么前景/背景。
这意味着模型通过自监督自己学会了什么是「物体」,而不需要人类教它。
知识蒸馏的本质
教师模型(大而强)
↓ 提供「软标签」(输出概率分布,不只给硬答案)
学生模型(小而快)
↓ 不仅学正确答案,还学教师的「思维方式」
蒸馏的关键在于「软标签」包含了丰富的信息:
- 硬标签:这是「猫」= [0, 0, 1, 0, 0]
- 软标签:可能是「猫」= [0.02, 0.05, 0.82, 0.08, 0.03],告诉你猫和老虎相似度高,和汽车不沾边
4. 总结:新人必知的视觉大模型图谱
一张图串起视觉大模型的进化
CNN 时代
│
├── ResNet / EfficientNet(监督学习,有标签)
│
Transformer 跨界(2020)
│
├── ViT:Transformer 直接做图像分类
│ 思路:图 → Patches → Tokens → Self-Attention
│ 关键:需要大数据集才能发挥优势
│
├── CLIP(2021):图文对比学习
│ 思路:图 → 编码器 ⇄ 文字 → 编码器 → 对比学习
│ 突破:零样本分类,开放的视觉概念
│
├── DINO(2021):自监督自蒸馏
│ 思路:同一张图的不同视角 → 学生匹配教师
│ 突破:不用任何标签,自学会分割物体
│
└── 多模态大模型(2023+)
思路:LLM + 视觉编码器 → 看图说话 / 理解
核心概念对照表
| 概念 | 一句话解释 | 为什么重要 |
|---|---|---|
| Patch Embedding | 把图切块,每块当词处理 | 让 Transformer 进入视觉的钥匙 |
| CLS Token | 专门用来汇总整图信息的全局 token | 类似阅读理解的中心句 |
| GELU | 比 ReLU 更平滑的激活函数 | Transformer 标配 |
| 对比学习 | 拉近正样本,推远负样本 | CLIP 的灵魂 |
| 零样本分类 | 不训练就能分类新类别 | 让模型有了「理解力」而非死记硬背 |
| 知识蒸馏 | 大模型教小模型 | 模型压缩 + 自监督学习 |
| Pre-Norm | LayerNorm 放在子层前面 | ViT 的细节改进 |
| 自蒸馏 | 模型自己教自己 | DINO 不需要标签的秘密 |
学习心得
-
先学 Transformer,再学 ViT 就轻松多了。ViT 的 Encoder 几乎就是原版 Transformer Encoder 的复制粘贴。上一篇文章的积累在这里直接兑现。
-
数据规模是关键变量。CNN 用了大量人工设计的归纳偏置(卷积的局部性),在小数据上是优势;Transformer 全靠数据驱动,在大数据上才释放威力。
-
CLIP 让「图片理解」变得通用。传统的分类模型(猫→猫标签)学的是死记硬背,CLIP 学的是图文之间的关系,这是一种更接近人类理解的方式。
-
自监督学习是大势所趋。标注数据成本太高,DINO 这种不用标签就能学到有用表征的方法,才是真正走向通用智能的必经之路。
-
多模态是终局。未来的 AI 不会是孤立的 CV 模型或 NLP 模型,而是真正能同时理解图文音视频的统一模型。ViT、CLIP、DINO 都是通往这个终局的里程碑。
新手学习路线建议
CNN 基础(ResNet)
→ Transformer(Attention 机制)
→ ViT(Transformer 怎么处理图像)
→ CLIP(图文对比学习)
→ DINO(自监督学习)
→ 多模态大模型(GPT-4V / LLaVA 等)
写在最后
从 CNN 到 Transformer,从单模态到多模态,从监督学习到自监督学习——视觉 AI 的发展速度让人目不暇接。但沉下心来,会发现这些看似不同的模型,底层的核心思想是相通的:
- 表示学习:把图像/文字变成有意义的向量
- 注意力机制:让模型知道哪些信息是重要的
- 对比学习:在比较中学会什么是相似的、什么是不同的
这三条主线串起了 CV 领域的黄金链条。
如果这篇文章对你有帮助,欢迎留言交流,一起打怪升级~
上一篇:【纯新手向】我的深度学习打怪升级之路(六):Transformer——让机器「读懂」上下文的注意力奇迹
下一篇: 敬请期待~
不积跬步,无以至千里。共勉 💪
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)