动量编码器

发布时间 2023-11-17 21:44:31作者: Laplace蒜子

自监督学习

自监督学习属于无监督学习范式的一种,不需要人工标注的类别信息,直接利用数据本身作为监督信息。自监督学习分为自监督生成式学习和自监督对比学习。

自监督生成式学习的方法

以图片为例,自监督学习可以是将图片的位置信息,旋转角度,以及图片在视频帧中的顺序作为标签。

比如对一张原图,将其旋转90°,得到一张新图,那么这个“旋转90°”就是其标签。

又比一张原图,将其切分为9份patch,随机从图片中采样一个patch,再在其邻居领域里采样一个patch,标签就是邻居位置的标签。

 

以这种方式可以生成无数个样本,然后对模型进行预训练,最后将模型迁移到下游任务的有监督学习中。

自监督对比学习的方法

自监督对比学习有一个编码器q,N个输入样本input i,每个样本有两种数据增强方式。

对于input i,使用数据增强一和数据增强二对其生成新的样本,成为input i1和input i2,此时input i1的正样本就是input i2。

负样本是其他输入样本input j 经过数据增强二得到的样本input j2

学习它们之间的对比损失。

但是这种方式负样本的数量受到batch size的影响,因为原本批次大小为N,也就是N个样本,然后再派生出2N个样本,加上原始样本,一共3N个样本,很容易使得GPU内存溢出。

 

Memory Bank方式

设定一个固定大小为K的队列,为memory bank,初始时队列内的特征是随机初始化的。

开始训练后,对样本生成q1,k1,将k1加入到队列,队列最后一个样本出队。然后q1和队列的随机一个样本进行比较。

之后再生成k2,将k2加入到队列,队列最后一个样本出队,q1再和队列的随机的一个样本比较。

 

整个过程如下:

 

缺陷

每采样一次都会对encoder更新,但是队列中可以有K个样本,其中K-1个样本是使用更新之前的encoder得到的。若K很大,更新了K-1次之后,仍然有可能采样到最开始的样本。

 

动量编码器

整个过程如下:

动量编码器其实就是一个encoder,结构与encoder一致。

每次计算损失使用K个负样本进行计算。

k1是通过动量编码器得到的,而动量编码器的参数更新方式如下:

在实验中,m取0.999。也就是动量编码器更新1000次,才与原来的完全不同,而队列中也是如此,当最先进入的样本出队后才与最开始的完全不同。使用这种缓慢更新策略可以保证key的一致性。

更新步骤

1. 有输入样本x。

2. 送入到编码器得到q和k

3. 将k删除反向传播

4. 计算q和k的互信息作为正样本logit,大小为N

5. 计算q和队列中的所有key的互信息作为负样本logits,大小为N*K

6. 反向传播损失,更新EncoderQ

7. 用动量公式更新EncoderMomentum

8. 将k入队,队列最后一个出队。