CVPR 2020 Contrastive Learning Facebook AI Research Milestone Paper

Momentum Contrast for Unsupervised Visual Representation Learning

Kaiming He, Haoqi Fan, Yuxin Wu, Saining Xie, Ross Girshick

本文将对比学习建模为字典查询问题,提出 MoCo(Momentum Contrast)框架——通过动态队列维护大型负样本字典,通过动量编码器保持表示一致性。在 ImageNet 线性评估和多个下游任务上,MoCo 的无监督表示首次超越了有监督预训练基线。

研究动机与问题背景

无监督视觉表示学习在 NLP 领域(BERT、GPT)取得巨大成功后,CV 领域的对比学习方法展现出缩小差距的潜力。MoCo 从字典查询的视角统一理解对比学习:

  • Query 与 Key:对同一图像做两种数据增强,一个视图编码为 query $q$,另一个编码为 key $k^+$(正样本)。其他图像编码为 $k_1^-, k_2^-, \ldots$(负样本)。
  • 字典查询目标:让 $q$ 与其匹配的 $k^+$ 相似度最高,与所有 $k_i^-$ 相似度最低。
  • 核心矛盾:好的对比学习需要一个既大又一致的字典——大字典提供更丰富的负样本,一致性保证对比信号不失真。
💡

核心洞见:现有方法在"大"和"一致"之间只能二选一。端到端方法(如 SimCLR)字典一致但受限于 batch size;Memory Bank 字典很大但表示不一致。MoCo 的突破在于:用动态队列解决"大",用动量编码器解决"一致"。

核心方法:动态队列 + 动量编码器

65,536
队列大小 K
0.999
动量系数 m
0.07
温度参数 τ
60.6%
ImageNet Top-1

1. 动态队列(Dynamic Queue)

MoCo 设计了一个 FIFO 队列作为负样本字典。每个 mini-batch 编码后的键入队,最早入队的键出队,字典大小固定为 $K$(默认 65,536)。

  • 解耦字典与 batch:字典大小不再受 GPU 内存限制,可以远大于 mini-batch size。
  • 保持新鲜度:最旧的键被移除,避免过时的表示污染对比信号。

2. 动量编码器(Momentum Encoder)

队列中的键来自不同时间步,若编码器参数变化过快会导致表示不一致。MoCo 引入动量更新策略:

$$ \theta_k \leftarrow m \cdot \theta_k + (1 - m) \cdot \theta_q $$
  • 查询编码器 $f_q$:参数 $\theta_q$ 通过反向传播正常更新。
  • 键编码器 $f_k$:参数 $\theta_k$ 通过动量更新,$m=0.999$ 意味着每步仅吸收 0.1% 的 $\theta_q$,缓慢演变以保持一致性。
MoCo 架构流程 图像 x 数据增强 $x^q$ $x^k$ Query Encoder $f_q$(梯度更新) Key Encoder $f_k$(动量更新) 动量更新 q k 动态队列 Queue k+ $k_1^-$ $k_2^-$ ... $k_K^-$ 入队 → → 出队 InfoNCE Loss 对比 q 与 {k+, k1-, ..., kK-} 反向传播 梯度更新 动量更新 负样本队列 损失 & 梯度 无梯度 / 间接更新

MoCo 完整架构:图像经两次增强后分别送入 query encoder 和 momentum key encoder,生成 $q$ 和 $k$。$k$ 入队形成负样本字典,InfoNCE 损失驱动 $f_q$ 更新,$f_k$ 通过动量公式间接更新。

训练伪代码关键设计
  • labels = zeros(N)正样本 $k^+$ 始终被拼接在 logits 的第 0 列,因此 Cross Entropy 的 ground-truth 标签全为 0。
  • k = k.detach()确保梯度不回传到键编码器,键编码器仅通过动量公式更新。
  • 严格的更新顺序:前向传播 → 计算 loss → backward 更新 $f_q$ → 动量更新 $f_k$ → 入队新 key、出队旧 key。

三种对比学习架构对比

对比学习的核心问题是如何构建负样本字典。三种主流方案在字典大小与一致性之间做出了不同权衡:

(a) 端到端 Enc_q Enc_k ↓ 梯度 ↓ 梯度 字典 = mini-batch ✓ 高一致性 ✗ 字典小(受 GPU 限制) ✗ 需要大 batch 代表:SimCLR (b) Memory Bank Encoder ↓ 梯度 Memory Bank(全量) ✓ 字典极大 ✗ 低一致性(异步更新) ✗ 内存开销大 代表:InstDisc (c) MoCo Enc_q Enc_k ↓ 梯度 ↓ 动量 动态队列 (FIFO) ✓ 字典大(65,536) ✓ 高一致性(动量保证) ✓ 低硬件需求 Best of both worlds

三种对比学习架构的核心区别:端到端方法字典=batch size,一致但小;Memory Bank 字典大但不一致;MoCo 通过队列+动量编码器同时实现大字典和高一致性。

方法字典大小一致性硬件需求代表工作
端到端= batch size高(需大 batch)SimCLR
Memory Bank全量数据集InstDisc
MoCo65,536(可调)本文

损失函数:InfoNCE

MoCo 采用 InfoNCE Loss,将对比学习转化为 $(K+1)$ 类 softmax 分类任务。

InfoNCE 公式

$$ \mathcal{L}_q = -\log \frac{\exp(q \cdot k^+ / \tau)}{\exp(q \cdot k^+ / \tau) + \sum_{i=1}^{K} \exp(q \cdot k_i^- / \tau)} $$
  • $q$:当前样本的 query 表征(来自 $f_q$)。
  • $k^+$:正样本(同一图像的不同增强视图,来自 $f_k$)。
  • $k_i^-$:负样本(队列中其他图像的表征)。
  • $\tau = 0.07$:温度参数,控制分布尖锐程度。
InfoNCE Logits 构造:正样本在第 0 位 q · pos=0 k+ $k_1^-$ $k_2^-$ ... $k_K^-$ = $q \cdot k^+$ ... label = 0(正样本始终在 index 0) logits ÷ τ → softmax → CrossEntropy(logits, label=0)

InfoNCE 的实现:正样本 $k^+$ 的点积放在 logits 第 0 位,$K$ 个负样本的点积跟在后面。标签全为 0,本质是 $(K\!+\!1)$ 类分类任务。

温度参数 $\tau$ 的影响

  • $\tau$ 较大(如 0.5):分布平滑,模型平等对待所有负样本,学习更稳健但不够精细。SimCLR 使用 $\tau=0.5$(因负样本少,需更平滑的梯度信号)。
  • $\tau$ 较小(如 0.07):分布尖锐,模型更关注最困难的负样本,学习更精细但训练可能不稳定。MoCo 使用 $\tau=0.07$(有大量负样本支撑)。

实验结果与核心结论

ImageNet 线性评估

在 ImageNet 上预训练后冻结编码器,仅训练线性分类头(linear probing):

方法架构参数量Top-1 (%)
InstDisc (Memory Bank)ResNet-5024M54.0
LocalAggResNet-5024M58.8
MoCoResNet-5024M60.6
有监督基线ResNet-5024M76.5

下游任务迁移

MoCo 预训练的特征在 PASCAL VOC 和 COCO 上的目标检测和分割任务中,首次超越了 ImageNet 有监督预训练基线

任务数据集指标有监督预训练MoCo 预训练
目标检测VOC 07+12AP5081.381.5
目标检测COCOAP38.939.4 (+0.5)
实例分割COCOAPmk35.435.7 (+0.3)
🔍

关键发现:MoCo 的消融实验表明,动量系数 $m=0.999$ 的效果远优于 $m=0.9$(后者使键编码器更新过快,一致性下降)。队列大小从 256 增加到 65,536 时,线性评估准确率持续提升,验证了"大字典"的重要性。

犀利短评

优点

  • 统一视角:将对比学习建模为字典查询问题,提供了清晰的分析框架。动态队列 + 动量编码器的设计简洁优雅,从工程和理论上都易于理解。
  • 硬件友好:不需要大 batch(SimCLR 需 8192),单机 8 GPU 即可训练。首次证明自监督预训练在下游任务上可以超越有监督预训练。
  • 通用性强:MoCo 框架可以与不同的代理任务结合,不限于实例判别。后续 MoCo v2 仅加入少量改进即大幅提升性能。

局限性

  • 仍需大量负样本:MoCo 的成功依赖大量负样本,后续 BYOL 和 SimSiam 证明无需负样本也能训练,质疑了"对比"的必要性。
  • 线性评估瓶颈:在 ImageNet 线性评估上(60.6%),与有监督基线(76.5%)仍有显著差距。
  • 数据增强依赖:对比学习的性能高度依赖数据增强策略的设计,这实质上引入了人工先验知识。

One More Thing:从 MoCo 到 MAE 的演化之路

MoCo 不仅是一篇论文,而是开启了何恺明在自监督学习领域的系统性探索——一条从"对比"到"生成"的技术演化路线:

  • MoCo v2 (2020):引入 SimCLR 的 MLP 投影头和更强数据增强,仅用几行代码改动即将线性评估提升至 71.1%。
  • MoCo v3 (2021):将 MoCo 推广到 Vision Transformer(ViT),证明对比学习框架的架构通用性。
  • DINO (2021):基于自蒸馏的自监督方法,继承了 MoCo 动量编码器的思想(在 DINO 中称为 teacher network),无需负样本。
  • MAE (2022):何恺明最终跳出对比学习范式,转向掩码自编码——通过重建被掩码的图像 patch 学习表示,简洁至极且效果惊人。
🌊

深层启示:MoCo 的动量编码器思想(缓慢演变的教师模型)已经成为自监督学习的通用技巧,渗透到 DINO、EMA、知识蒸馏等多个方向。从 MoCo → MoCo v2 → MoCo v3 → MAE 的研究轨迹,展现了从"判别式对比学习"到"生成式掩码建模"的范式跃迁——而这一切的起点,正是 MoCo 对"字典查询"这一基本问题的深刻洞察。