一句话定义
MoCo(Momentum Contrast,动量对比学习)是一种自监督视觉表征学习方法,它用一个"负样本队列"加一个"动量编码器",让模型在小批量(batch)下也能拿到成千上万个负样本,不必依赖超大 batch。
为什么需要负样本
对比学习的思路很朴素:同一张图做两次不同的裁剪、调色,得到两个"视角",模型应该把它们编码成相似的向量;而不同图片的向量应该被推开。前一件事靠"正样本对",后一件事靠"负样本"。
问题在于,如果负样本只能从当前 batch 里找,那就得把 batch 开得极大——这就是同期另一条路线的困境:堆硬件、吃显存。
MoCo 换了个思路:为什么要现用现取?把过去若干个 batch 的图片特征存进一个队列(queue),先进先出,用旧的当负样本。队列可以很长,与 batch 大小彻底解耦。
动量编码器:让旧特征不过期
队列里的特征是旧参数算出来的,而编码器每步都在变,用久了就对不上号。MoCo 因此维护两套编码器:查询编码器(query encoder)正常走梯度更新;键编码器(key encoder)不接收梯度,而是做动量更新——新参数是旧参数和查询编码器参数的加权平均,权重通常设得非常接近 1。于是键编码器像一辆缓慢行驶的车,队列里的特征在一段时间内仍然"新鲜"。
打个比方:一家公司要给新员工做背景调查。如果每次只问今天在场的同事,样本太少;MoCo 的做法是建一个档案柜,把过去几百人的评价存进去,同时让"评价标准"每年只微调一点点,这样柜子里的旧评价不会立刻失效。柜子满了就丢掉最老的。
和相邻方法的区别
| 方法 | 负样本来源 | 主要代价 |
|---|---|---|
| SimCLR | 当前 batch 内的其他样本 | 需要极大 batch 和显存 |
| MoCo | 队列中历史样本 | 需要动量更新保持一致性 |
| BYOL | 不使用负样本 | 靠非对称结构和预测器防止坍缩 |
对从业者的意义
MoCo 的价值不只是一个方法,更是一种工程直觉:当某个资源(这里是负样本数量)被硬件卡住时,可以先问一句"它真的必须来自当下吗"。队列、动量、缓存这类手段,本质都是把"即时计算"换成"带维护成本的复用"。
对普通人来说,它解释了一件事:为什么今天的图像检索、以图搜图、视觉预训练模型,能在几乎没有人工标注的情况下学会看懂图片。标注很贵,而"同一张图的两个视角应该相似"这个约束,是免费从数据本身长出来的。具体实现细节与最新进展,以官方论文和代码仓库页面为准。
