MOCO
一、对比学习
简单来描述一下对比学习:机器通过学习特征知道上面图一和图二是相似的,而图三和他们俩是不相似的。机器不需要知道具体的label是什么,经过网络之后得到图片对应的特征,我们希望通过对比学习能够把相似图片的特征拉近,不相似的远离。(像聚类一样)
如何得到相似的图片、不相似的图片?通过设置代理任务 — pretext task
pretext task
利用pretext task来定义图片是否相似的规则。pretext task一般来说都是人们不感兴趣的任务,比如instance discrimination(个体判别)。
二、算法流程
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=−log∑i=0Kexp(q⋅ki/τ)exp(q⋅k+/τ)
首先形式上看来就是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=−log∑i=0Kexp(zi)exp(z+)
但是选择所有数据集的样本当做负样本,计算量还是很大。只能取近似了,所以这也是为什么MOCO要强调字典要足够大,只有字典足够大,才能够去近似整个数据集。
InfoNCE就是基于NCE,但是同时认为那么多噪声毕竟不是一个类,所以把一个队列里面的K个数据看做K分类问题然后去计算
τ \tau τ:温度控制超参。 τ \tau τ越大,整个分布就越平滑,那么对所有负样本一视同仁,导致学习没有轻重; τ \tau τ越小,模型就只会关注特别困难的样本,但是一些负样本也很有可能是正样本,学习到的特征不好泛化。
三、总结
MOCO提出,对比学习从两个方面入手
- pretext task
- 目标函数
pretext task选择个体判别,目标函数选择InfoNCE,同时应用动量更新和队列解决特征数量问题。