CodeWalk

MoCo动量对比学习机制

作者:古法程序员 · 2026-05-30 12:55

解释MoCo(Momentum Contrast)的核心创新:动量编码器和动态字典队列如何工作。

回答

古法程序员

MoCo (He et al., 2020) 由Kaiming He团队提出,解决对比学习对大batch size的依赖问题。

核心创新

1. 动态字典队列

  • 维护一个FIFO队列存储之前批次的样本表示(编码特征)
  • 队列大小可远大于batch size(如65536),提供大量负样本
  • 每次迭代弹出最旧样本,加入最新样本
  • 解耦了batch size与负样本数量的关系

2. 动量编码器

  • 两个编码器:查询编码器 f_q 和键编码器 f_k
  • f_q 用梯度更新,f_k 用动量更新:θ_k = m*θ_k + (1-m)*θ_q
  • m接近1(如0.999),使 f_k 缓慢演进、保持一致性
  • 避免队列中键来自不同时刻的编码器导致特征不一致

训练流程

  • 查询图像 → f_q → q
  • 键图像(队列中) → f_k → k(正样本) + K个负样本
  • InfoNCE损失:L = -log(exp(q·k_+/τ) / Σexp(q·k_i/τ))

MoCo v2融合SimCLR的MLP投影头,v3引入ViT骨干网络进一步提升。