动量编码器
自监督学习
自监督学习属于无监督学习范式的一种,不需要人工标注的类别信息,直接利用数据本身作为监督信息。自监督学习分为自监督生成式学习和自监督对比学习。
自监督生成式学习的方法
以图片为例,自监督学习可以是将图片的位置信息,旋转角度,以及图片在视频帧中的顺序作为标签。
比如对一张原图,将其旋转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入队,队列最后一个出队。
本文来自博客园,作者:Laplace蒜子,转载请注明原文链接:https://www.cnblogs.com/RedNoseBo/p/17839698.html