Momentum Contrast for Unsupervised Visual Representation Learning

MOCO

一、对比学习

Momentum Contrast for Unsupervised Visual Representation Learning_第1张图片
简单来描述一下对比学习:机器通过学习特征知道上面图一和图二是相似的,而图三和他们俩是不相似的。机器不需要知道具体的label是什么,经过网络之后得到图片对应的特征,我们希望通过对比学习能够把相似图片的特征拉近,不相似的远离。(像聚类一样)

如何得到相似的图片、不相似的图片?通过设置代理任务 — pretext task

pretext task

利用pretext task来定义图片是否相似的规则。pretext task一般来说都是人们不感兴趣的任务,比如instance discrimination(个体判别)。

二、算法流程

Momentum Contrast for Unsupervised Visual Representation Learning_第2张图片
MOCO将对比学习看做是一个字典查询(如图所示,xquery表示要查的,xikey表示字典里面有的key)任务,字典由两部分组成:队列(queue ki)和移动平均的编码器(momentum encoder)。

队列是什么?momentum encoder是什么?

首先对比学习的动态字典需要具备两个特性:

  • 大 : 为什么需要大?因为大就代表你的字典里面拥有的特征信息就越多,这样子就可能学习到真的能够把物体区分开来的特征
  • 稳定性 : 就是要key和其他的所有负例需要是同一个编码器编码的,这样子才能保证公平性

不具备上面两个特征,机器就很容易学习到捷径。
那么MOCO是怎么实现大+一致性?

  • MOCO将字典和batch size彻底分离开(这里是对比memory bank),字典大小(存储特征的量)能够不再受限于batch size的大小就是因为使用了队列这种数据结构。(队列的大小为超参)每次将batch size大小的数据加入队列,最早的那批batch size数据出队,保证了运行速度(队列FIFO的性质)。
  • 同时在每个时刻,队列中每个batch size大小的数据都是由不同的momentum encoder得来,为了保证一致性,使用动量更新编码器的方式:yt = myt-1+(1-m)xt,即当前时刻的输出不完全取决于当前时刻的输入,还与上一时刻的状态有关。

1. 输入

MOCO的输入为一张图片经过不同的Data augmentation,得到xquery和x0key为什么是x0key不是其他xikey 这个和MOCO的代码实现有关,在代码中是放在0位置的)。(MOCO的pretext task选择的是个体判别)

2. 编码

在MOCO中momentum encoder由encoder初始化赋值。encoder编码xquery,momentum encoder编码xikey,经过一轮梯度回传更新encoder后,encoder(即yt = myt-1+(1-m)xt中的xt)更新momentum encoder。

3. InfoNCE

L q = − log ⁡ e x p ( q ⋅ k + / τ ) ∑ i = 0 K e x p ( q ⋅ k i / τ ) L_q = -\log\frac{exp(q\cdot k_+/\tau)}{\sum_{i=0}^K exp(q\cdot k_i/\tau)} Lq=logi=0Kexp(qki/τ)exp(qk+/τ)
首先形式上看来就是soft-max,但是soft-max里面的k是k个类别,对于个体判别任务来说,每张图片是一个类就是百万级的类别数量,那么soft-max就不能用了。那既然这么多类,就把他看做二分类问题,所有的负例(noise)看做一类,这就是NCE(noise contrastive estimation):
L q = − log ⁡ e x p ( z + ) ∑ i = 0 K e x p ( z i ) L_q = -\log\frac{exp(z_+)}{\sum_{i=0}^K exp(z_i)} Lq=logi=0Kexp(zi)exp(z+)

但是选择所有数据集的样本当做负样本,计算量还是很大。只能取近似了,所以这也是为什么MOCO要强调字典要足够大,只有字典足够大,才能够去近似整个数据集。
InfoNCE就是基于NCE,但是同时认为那么多噪声毕竟不是一个类,所以把一个队列里面的K个数据看做K分类问题然后去计算

τ \tau τ:温度控制超参。 τ \tau τ越大,整个分布就越平滑,那么对所有负样本一视同仁,导致学习没有轻重; τ \tau τ越小,模型就只会关注特别困难的样本,但是一些负样本也很有可能是正样本,学习到的特征不好泛化。

三、总结

MOCO提出,对比学习从两个方面入手

  1. pretext task
  2. 目标函数

pretext task选择个体判别,目标函数选择InfoNCE,同时应用动量更新和队列解决特征数量问题。

你可能感兴趣的:(对比学习,算法,python)