要理解 ViT(Vision Transformer)的预训练,我们可以先从「ViT的基本逻辑」入手,再拆解「预训练的目的」和「具体方法」,全程用小白能懂的语言,避免复杂公式。
一、先搞懂:ViT 是怎么"看"图的?
预训练的核心是让 ViT 学会通用的视觉特征,而它的"看图逻辑"和传统 CNN 不一样,这是预训练方法的基础。
- 图像切块(Patch Partition)
把一张完整的图片,像切蛋糕一样切成很多大小相同的小方块,比如 224×224 的图切成 16×16 的 patch,就能得到 196 个小方块。
这一步的目的是:把二维的图像,变成一维的"序列数据"(就像一句话里的一个个单词),因为 Transformer 天生是处理序列的。 - 加"位置信息"(Positional Encoding)
Transformer 本身不知道每个 patch 在原图的位置,所以要给每个 patch 加一个位置编码向量,告诉模型"这个小方块在图片的左上角""那个在右下角"。 - 送进 Transformer Encoder
把加了位置编码的 patch 序列,输入到一堆 Transformer 编码器里。编码器通过 自注意力机制 ,计算每个 patch 和其他所有 patch 的关联(比如"这个狗的头 patch 和身体 patch 是连在一起的"),最终得到整张图的全局特征。 - 加一个"任务头"
预训练时,会在 Transformer 输出的特征后面,加一个简单的神经网络(比如 MLP),用来完成预训练任务(比如分类、猜被挡住的 patch)。
二、预训练的核心目的:让 ViT 学会"通用视觉知识"
我们可以把预训练理解成 "给 ViT 上通识课":
- 不用让它学"怎么识别猫、怎么识别狗"这种具体任务,只需要让它学最基础的视觉规律:比如"边缘、纹理是什么""物体的局部和全局怎么关联""不同颜色搭配的常见模式"。
- 预训练好的 ViT,就像一个"有基础视觉认知的学生",之后再学具体任务(比如检测、分割),只需要"针对性补课"(微调)就行,效率和效果都会大幅提升。
三、ViT 预训练的两种主流方法(从简单到复杂)
ViT 的预训练分 监督预训练 和 自监督预训练 两大类,后者是现在的主流。
方法1:监督预训练(最简单,适合小白理解)
核心逻辑 :用 带人工标注标签的大规模数据集 训练,让 ViT 学"输入图片→输出类别"。
类比:就像给你一堆带名字的动物照片,让你记住"长耳朵、红眼睛的是兔子"。
具体步骤
- 选数据集 :必须用超大数据集 (这是关键!)。
ViT 不像 CNN 有"局部感受野"的先验知识,小数据集根本学不会,反而会过拟合。
常用数据集:比如 ImageNet-1k(1000 类,120 万张图)、JFT-300M(3 亿张图,谷歌内部数据集)。 - 构建训练任务 :
- 在 Transformer 输出的全局特征后,加一个 分类头(MLP)。
- 输入一张图片,模型输出"这张图属于哪一类"的概率。
- 计算损失+优化 :
用 交叉熵损失函数,衡量模型预测的类别和真实标签的差距,然后用梯度下降更新模型参数。
优缺点
- ✅ 优点:逻辑简单,容易理解和实现。
- ❌ 缺点:太依赖人工标注数据(标注 3 亿张图的成本是天文数字),而且学到的特征通用性有限。
方法2:自监督预训练(现在的主流,更牛!)
核心逻辑 :不用人工标签,让模型 "自己跟自己学" 。通过设计一个"伪装任务"( pretext task),逼模型去学图像的本质特征。
类比:就像把一张动物照片的一部分挡住,让你猜挡住的部分是什么样子------你要猜对,就必须先理解这个动物的整体结构。
ViT 最经典的自监督预训练方法是 MAE(Masked Autoencoder,掩码自编码器),也是最适合 ViT 的方法,我们重点讲它。
MAE 预训练的具体步骤(大白话版)
- 随机"挡住"大部分 patch
输入图片切块后,随机 mask 掉 75% 的 patch (直接扔掉,不让模型看到)。比如 196 个 patch 只留 49 个。
这里的关键是:mask 比例要高(75% 效果最好),而且是随机的------这样才能逼模型用少量可见 patch,推断整张图的全局结构。 - 模型"猜"被挡住的 patch
- 把剩下的 25% 可见 patch 加位置编码,送进 Transformer Encoder。
- 模型输出的特征,会被送到一个 解码器 (Decoder)里。解码器的任务是:根据这些特征,还原出被 mask 的 patch 的像素值(比如"这个被挡住的 patch 应该是蓝色的天空,像素值大概是多少")。
- 计算损失+优化
用 MSE 损失函数(均方误差),衡量模型预测的像素值和真实像素值的差距,然后更新参数。
为什么 MAE 对 ViT 这么友好?
- 计算效率高:只处理 25% 的 patch,训练速度比监督预训练快很多。
- 学到的特征更通用:模型必须理解图像的全局结构,才能猜对被挡住的部分------比如猜"狗的尾巴 patch",得先知道"狗的身体长什么样"。
- 不挑数据集:不需要标注,随便找海量无标签图片就能训练(比如互联网上的图片)。
其他常见自监督方法(简单提)
除了 MAE,还有 MoCo、SimCLR 等方法,核心逻辑都是"让模型学图片的不变特征":
- SimCLR:给同一张图做不同的增强(比如裁剪、翻转、调色),让模型认为"这两个增强后的图是同一个东西"。
- MoCo:把图片做成"字典",让模型在字典里找和当前图最像的图。
四、预训练之后:微调(Fine-tuning)
预训练只是第一步,预训练好的 ViT 不能直接用,还要 微调------相当于"通识课后上专业课"。
- 换任务头:把预训练时的分类头/解码器,换成下游任务需要的头。比如做目标检测,就换成检测头;做语义分割,就换成分割头。
- 小数据集训练:用下游任务的小批量标注数据,训练模型。此时只需要用很小的学习率,稍微调整模型参数就行------因为预训练已经学了通用特征,不用从头学。
五、小白必记的 ViT 预训练关键要点
- 数据量是王道:ViT 对数据量要求极高,小数据集预训练的 ViT,效果不如普通 CNN。
- MAE 是首选:自监督的 MAE 方法,又快又好,是现在 ViT 预训练的标配。
- 位置编码很重要:没有位置编码,ViT 不知道 patch 的位置,预训练效果会直接崩盘。
总结
ViT 预训练的逻辑可以浓缩成一句话:
把图片切成小方块,加位置信息,让模型在海量数据上要么"按标签分类",要么"猜被挡住的方块",学完通用视觉特征后,再微调做具体任务。