视觉自监督学习
概述
视觉自监督学习(Visual Self-Supervised Learning)从无标注图像中学习强大的视觉表示,是计算机视觉基础模型的核心预训练范式。主要分为三大流派:对比学习、掩码图像建模和自蒸馏。
graph TD
A[视觉自监督学习] --> B[对比学习]
A --> C[掩码图像建模]
A --> D[自蒸馏]
B --> B1[SimCLR]
B --> B2[MoCo v1/v2/v3]
B --> B3[BYOL]
B --> B4[SwAV]
B --> B5[Barlow Twins]
C --> C1[MAE]
C --> C2[BEiT]
C --> C3[SimMIM]
C --> C4[I-JEPA]
D --> D1[DINO]
D --> D2[DINOv2]
D --> D3[EMA Teacher]
1. 对比学习(Contrastive Learning)
1.1 核心思想
对比学习的目标是拉近正样本对,推远负样本对:
- 正样本对:同一图像的不同增强视图
- 负样本对:不同图像的视图
1.2 SimCLR
SimCLR(Chen et al., 2020)是对比学习的经典框架。
流程:
- 对每张图像 \(x\) 随机应用两组数据增强,得到 \(\tilde{x}_i\) 和 \(\tilde{x}_j\)
- 编码器 \(f(\cdot)\)(如ResNet)提取表示
- 投影头 \(g(\cdot)\)(MLP)映射到对比空间
- 在投影空间计算NT-Xent损失
NT-Xent损失(Normalized Temperature-scaled Cross Entropy):
其中:
- \(z_i = g(f(\tilde{x}_i))\) 是投影后的表示
- \(\text{sim}(u, v) = \frac{u^\top v}{\|u\| \|v\|}\) 是余弦相似度
- \(\tau\) 是温度超参数
- \(N\) 是batch中的图像数
关键发现:
- 数据增强的组合至关重要(随机裁剪 + 颜色扭曲最有效)
- 投影头 \(g\) 对下游任务性能很重要(但下游使用 \(f\) 的输出)
- 更大的batch size效果更好(SimCLR使用4096+)
1.3 MoCo(Momentum Contrast)
动机:SimCLR需要极大的batch size,MoCo通过动量队列解耦了batch size和负样本数量。
MoCo v1(He et al., 2020):
- 动量编码器:\(\theta_k \leftarrow m \theta_k + (1-m) \theta_q\),\(m=0.999\)
- 队列:维护一个大的负样本队列(65536个)
- 查询编码器通过梯度更新,键编码器通过动量更新
MoCo v2:加入MLP投影头 + 更强的数据增强
MoCo v3:去掉队列,改用batch内对比(类似SimCLR),结合ViT
1.4 BYOL(Bootstrap Your Own Latent)
突破:不需要负样本的自监督方法!
架构:
- 在线网络:编码器 + 投影器 + 预测器
- 目标网络:编码器 + 投影器(EMA更新)
损失函数:
其中 \(\bar{q}\) 和 \(\bar{z}'\) 是 \(L_2\) 归一化后的向量。
为什么不崩塌(collapse)?
- 预测器的不对称性
- EMA更新的目标网络提供缓慢变化的目标
- 批归一化的隐式正则化
1.5 其他对比方法
| 方法 | 关键创新 | 是否需要负样本 |
|---|---|---|
| SimCLR | 简洁框架,强增强 | 是(大batch) |
| MoCo | 动量队列 | 是(队列) |
| BYOL | 预测器+EMA | 否 |
| SwAV | 在线聚类 | 否(聚类替代) |
| Barlow Twins | 交叉相关矩阵 → 单位矩阵 | 否 |
| VICReg | 方差-不变性-协方差正则化 | 否 |
2. 掩码图像建模(Masked Image Modeling)
2.1 核心思想
受NLP中掩码语言模型(BERT)启发,随机遮挡图像的一部分,让模型预测被遮挡的内容。
2.2 MAE(Masked Autoencoders)
MAE(He et al., 2022)是掩码图像建模的里程碑。
设计:
- 将图像分为 \(16 \times 16\) 的patch
- 随机遮挡 75% 的patch(极高的遮挡比例)
- 编码器(ViT)仅处理可见patch
- 轻量解码器重建被遮挡的像素
损失函数:在被遮挡patch上计算MSE:
其中 \(\mathcal{M}\) 是被遮挡patch的集合。
关键设计选择:
- 75%遮挡比例 >> NLP中的15%,因为图像冗余度更高
- 编码器不处理mask token → 大幅节省计算
- 解码器很浅(1-2层Transformer)→ 迫使编码器学习语义
2.3 BEiT
BEiT(Bao et al., 2022):不预测原始像素,而是预测离散视觉token。
两阶段流程:
- 预训练一个dVAE(discrete VAE)作为视觉tokenizer
- 遮挡patch → 预测对应的dVAE token
BEiT v2:使用VQ-KD(向量量化知识蒸馏)替代dVAE
2.4 其他掩码建模方法
| 方法 | 预测目标 | 编码器 |
|---|---|---|
| MAE | 原始像素 | ViT |
| BEiT | dVAE token | ViT |
| SimMIM | 原始像素(简单头) | Swin Transformer |
| I-JEPA | 抽象表示(非像素) | ViT |
| data2vec | 教师模型表示 | 多模态 |
2.5 I-JEPA
I-JEPA(Assran et al., 2023)预测的是抽象表示而非像素或token:
- 不使用数据增强(与对比学习不同)
- 在表示空间中预测目标区域的表示
- 避免了像素级预测的低级偏差
3. 自蒸馏(Self-Distillation)
3.1 DINO
DINO(Caron et al., 2021):自蒸馏 + 无标签ViT。
架构:学生-教师框架
- 学生网络:梯度更新
- 教师网络:EMA更新 \(\theta_t \leftarrow \lambda \theta_t + (1-\lambda) \theta_s\)
多裁剪策略:
- 2个全局视图(224×224)→ 教师
- N个局部视图(96×96)→ 学生
- 学生预测教师的全局视图输出
损失函数(交叉熵):
Centering 防止崩塌:\(P_t(x) = \text{softmax}((g_t(x) - c) / \tau_t)\)
DINO的涌现特性:
- 注意力图自动分割前景物体
- 无监督学会了语义分割能力
- k-NN分类器即可达到很好的效果
3.2 DINOv2
DINOv2(Oustalet et al., 2023):视觉基础模型。
关键改进:
- 结合DINO的自蒸馏 + iBOT的掩码建模
- 大规模自动策展的数据集(LVD-142M)
- 更大的模型(ViT-g, 1.1B参数)
- KoLeo正则化保持表示均匀分布
DINOv2损失:
DINOv2作为特征提取器:
- 直接冻结DINOv2 + 线性探测即可在多个任务上达到SOTA
- 包括:分类、分割、深度估计、检索
4. 方法对比
4.1 总体比较
| 维度 | 对比学习 | 掩码建模 | 自蒸馏 |
|---|---|---|---|
| 预训练任务 | 实例判别 | 像素/token重建 | 知识蒸馏 |
| 数据增强 | 关键 | 不太依赖 | 多裁剪 |
| 负样本 | 需要/替代方案 | 不需要 | 不需要 |
| 适合架构 | CNN/ViT | ViT为主 | ViT为主 |
| 学到的特征 | 全局判别 | 局部+全局 | 全局语义 |
| 代表方法 | SimCLR, MoCo | MAE, BEiT | DINO, DINOv2 |
4.2 下游任务性能
| 方法 | ImageNet Linear | ImageNet k-NN | ADE20K Seg |
|---|---|---|---|
| MoCo v3 (ViT-B) | 76.7 | - | - |
| MAE (ViT-B) | 68.0 | - | 48.1 |
| DINO (ViT-B) | 78.2 | 76.1 | - |
| DINOv2 (ViT-g) | 86.5 | 83.5 | 49.0 |
4.3 选择指南
graph TD
A[选择自监督方法] --> B{数据量?}
B -->|小规模| C[MAE/DINO]
B -->|大规模| D{目标任务?}
D -->|分类/检索| E[DINOv2]
D -->|密集预测| F{有ViT?}
F -->|是| G[MAE + 微调]
F -->|否/CNN| H[MoCo/BYOL]
5. 数据增强策略
数据增强是对比学习成功的核心:
| 增强方式 | SimCLR | MoCo v2 | DINO |
|---|---|---|---|
| 随机裁剪 | ✓ | ✓ | ✓(多裁剪) |
| 颜色扰动 | ✓ | ✓ | ✓ |
| 高斯模糊 | ✓ | ✓ | ✓ |
| 水平翻转 | ✓ | ✓ | ✓ |
| 灰度化 | ✓ | ✓ | - |
| Solarization | - | - | ✓ |
| 多尺度裁剪 | - | - | ✓ |
6. 实践指南
6.1 预训练设置
# MAE预训练示例(伪代码)
class MAE(nn.Module):
def __init__(self, encoder, decoder, mask_ratio=0.75):
self.encoder = encoder # ViT
self.decoder = decoder # 浅层Transformer
self.mask_ratio = mask_ratio
def forward(self, x):
# 1. Patch embedding
patches = self.patchify(x)
# 2. 随机遮挡
visible, masked, ids = self.random_mask(patches)
# 3. 编码可见patch
latent = self.encoder(visible)
# 4. 解码重建
pred = self.decoder(latent, ids)
# 5. MSE损失(仅在遮挡区域)
loss = F.mse_loss(pred[masked], patches[masked])
return loss
6.2 微调建议
- 线性探测:冻结编码器,只训练线性层(评估表示质量)
- 端到端微调:解冻编码器,较小学习率
- 适配器微调:LoRA等参数高效方法
7. 总结与展望
历史演进:
- 2020: SimCLR, MoCo → 对比学习爆发
- 2020: BYOL → 无负样本方法
- 2021: DINO → 自蒸馏 + ViT涌现特性
- 2022: MAE → 掩码图像建模兴起
- 2023: DINOv2, I-JEPA → 视觉基础模型
- 2024+: 多模态自监督、视频自监督
未来方向:
- 视频自监督学习(时序一致性)
- 多模态联合自监督(图像+文本+音频)
- 更高效的预训练方法
- 自监督与大规模生成模型的融合
参考文献
- Chen et al., "A Simple Framework for Contrastive Learning of Visual Representations," ICML 2020
- He et al., "Momentum Contrast for Unsupervised Visual Representation Learning," CVPR 2020
- Grill et al., "Bootstrap Your Own Latent," NeurIPS 2020
- He et al., "Masked Autoencoders Are Scalable Vision Learners," CVPR 2022
- Caron et al., "Emerging Properties in Self-Supervised Vision Transformers," ICCV 2021
- Oquab et al., "DINOv2: Learning Robust Visual Features without Supervision," TMLR 2024