Contrastive Learning, MoCo 对比学习 2021-05-09

深度神经网络有着强大的表征能力
一张输入图片经过层层变换表达为一个特征向量
如果是监督学习,特征的预测结果可以和标签比对作为损失函数;那如果是无监督学习,没有label,损失函数该如何构建?该如何判断一个好的表征?


学习不同分类的特征

Contrastive Learning给出的答案很简单,同类图像最后得到的特征向量应该在特征空间是相似的,而不同类之间应该尽可能的远,这就是对比学习。但是没有label,还是不知道哪些类别是同一个,解决方法就是, 每个实例当作同一类,用数据增广创造出该类别的其他实例。

contrastive learning基本思想可以被理解为一个查字典的过程,输入是query,用于对比的是key, 但是这个字典的大小限制于用于训练的GPU内存,那么对于图象这样的高维数据,如果字典不够大,用于对比的数据不够多,可能就达不到训练效果。

左边的是原版的对比学习

然后就可以使用Softmax得到两张图片相似的概率,
然后再转化为对数似然代价函数。温度系数设置 为0.07。


来源博客https://amitness.com/2020/03/illustrated-simclr/

Loss 是一个关于q和k的函数,这样,原图和变形之后的图片的特征相似度越高,不同的图片特征相似度越低, 整体的loss就越低, 就越接近我们的理想模型。

MoCo作者认为,字典一要大,二key之间应该保持一致性。但是用图二左端对端的方法,字典大小限制于显存。
MoCo用于解决字典大小限制的方法,来源于下面这篇论文。


https://arxiv.org/abs/1805.01978 通过非参数化实例判别进行非监督的特征学习

memory bank, 储存的是所有key的编码,初始值是随机归一化的,不存在梯度回传,所以这个空间不受限于GPU的内存。每次产生Loss的时候只要在这个空间采样一部分就好了,memory bank的编码在每次经过查询后, 得到的q的值才会更新到相应的k上面,所以存储的编码实际上来自该epoch 的每个step(一次epoch训练所有数据,每个step迭代一次,训练一个batch)。

这个方法使得用来对比的负样本可以足够多,但是又出现了新的问题:因为 memory bank中的 k更新得很慢,产生k的encoder来自于不同的step,这样就打破了k之间的一致性。

中memorybank不受字典限制,但是编码k的参数是不统一的,而右边MoCo没有选择更新k,而是更新编码k的参数,这样出来的 k就是来自同一组参数。

那可能比较的想法是,直接把最新的q的encoder直接作为k的encoder, 而k 这一路不更新。MoCo中做过这样的实验,也就是这个式子m=0的情况,但是发现不能收敛。作者给出的猜想是因为encoder的迭代更新很快,那么同样的 队列中的k又会是产生于不同参数,遭遇和memory bank一样的问题, 虽然每一组k 的编码参数是一致的,组和组之间却相差太大。但是用一个比较大的惯性参数就能比较好的解决这个问题。

不同m取值的实验

MoCo的做法是用了储存key特征用的是先进先出的队列结构,把两个encoder的参数用 0
K代表负样本的数量, 端到端的方法,K是受限制的, 而Moco和memorybank通过增加K提升表现 MoCo因为保证了q和k之间的一致性,表现更好

在具体实现的方案上,MoCo使用了shuffling BN,因为BN会打破minibatch里样本的独立性,可以参考我的另一篇关于NFNet的博客。

总结一下,端对端方法字典大小受限于显存,memory bank 方法将 k 存储起来,碰到相应的q更新一次,字典大小不受限制,但是key之间是不一致的。MoCo用缓慢更新 k的编码器的方式 保证了队列中k 的一致性。

MoCoV2

https://arxiv.org/abs/2003.04297

用两层MLP检测头代替一层全连接。
使用模糊图像增广。

你可能感兴趣的:(Contrastive Learning, MoCo 对比学习 2021-05-09)