知行编程网知行编程网  2022-07-18 18:00 知行编程网 隐藏边栏 |   抢沙发  159 
文章评分 0 次,平均分 0.0
对比学习的概念很早就有了,但真正成为热门方向是在2020年的2月份,Hinton组的Ting Chen提出了SimCLR,用该框架训练出的表示以7%的提升刷爆了之前的SOTA,甚至接近有监督模型的效果。在SimCLR推出后,各路大佬们又陆续提出了不少有意义的工作,本文将对2020年的一些对比学习经典研究进行总结,方便大家快速掌握这个方向的原理和发展脉络。
首先再简要说下对比学习的基本原理,先从无监督表示学习讲起。表示学习的目标是为输入 学习一个表示 ,最好的情况就是知道 就能知道 。这就引出了无监督表示学习的第一种做法:生成式自监督学习。比如还原句子中被mask的字,或者还原图像中被mask的像素。但这种方式的前提需要假设被mask的元素是相互独立的,不符合真实情况。另一方面,研究者们也质疑如此细粒度的还原是否真正必要
举个例子,假如有人让你凭空画一张一美元,你可能只画成这样[1]
一文梳理2020年大热的对比学习模型
而如果给你一张美元照着临摹,可能还能画好看点,比如这样:
一文梳理2020年大热的对比学习模型
所以说我们记住的事物特征,不一定是像素级别的,而是更高维度的。更具体来说,比如用编码去做分类任务,我们不需要知道每个数据的细节,只要抓住每个类别的主要特征,自然就能把他们分开了:
一文梳理2020年大热的对比学习模型
不重构数据,那如何衡量表示 的好坏呢?这时也可以用互信息 ,代表我们知道了 之后, 的信息量减少了多少。 如果对最大化互信息的目标进行推导[2],就会得到对比学习的loss(也称InfoNCE),其核心是通过计算样本表示间的距离,拉近正样本,拉远负样本。也就是说,当我们能够区分该样本的正负例时,得到的表示就够用了
具体的做法是,输入N个图片,用不同的数据增强方法为每个图片生成两个view,分别对它们编码得到y和y'。我们对上下两批表示两两计算cosine,得到NxN的矩阵,每一行的对角线位置代表y和y'的相似度,其余代表y和N-1个负例的相似度。
一文梳理2020年大热的对比学习模型
对每一行做softmax分类,采用交叉熵损失作为loss,就得到对比学习的损失了:

其中 是可调节的系数。
对比学习的原理很简单,比较粗暴的优化方向就是增加view难度、增加更多负例、提升encoder表现等。下面就让我们看看大佬们在这一年里是如何花式优化的。

MoCo(CVPR20)

既然对比是在正负例之间进行的,那负例越多,这个任务就越难,于是一个优化方向就是增加负例。
纯粹的增大batch size是不行的,总会受到GPU内存限制。一个可行的办法就是增加memory bank,把之前编码好的样本存储起来,计算loss的时候一起作为负例:
一文梳理2020年大热的对比学习模型
但这样有个问题是存储好的编码都是之前的编码器计算的,而 的编码器一直在更新,会有两侧不一致的情况,影响目标优化。一个可行方法之一就是用最新的左侧encoder更新编码再放入memory bank,但这依然避免不了memory bank中表示不一致的情况,实验效果很差。
所以何凯明大佬在2019年底推出了MoCo(Momentum Contrast)模型[3],延续memory bank的思想,使用动量的方式更新encoder参数,解决新旧候选样本编码不一致的问题:
一文梳理2020年大热的对比学习模型
对于每个batch x:
  1. 随机增强出 两种view
  2. 分别用 对输入进行编码得到归一化的 q 和 k,并去掉 k 的梯度更新
  3. 将 q 和 k 一一对应相乘得到正例的cosine(Nx1),再将 q 和队列中存储的K个负样本相乘(NxK),拼接起来的到 Nx(1+K) 大小的矩阵,这时第一个元素就是正例,直接计算交叉熵损失,更新 的参数
  4. 动量更新 的参数:
  5. 将 k 加入队列,把队首的旧编码出队,负例最多时有65536个
这样每次入队的新编码都是上一步更新后的编码器输出,以很低的速度慢慢迭代,与旧编码尽量保持一致。实验发现,m=0.999时比m=0.9好上很多。最终在ImageNet的实验效果也远超前人,成为当时的SOTA:
一文梳理2020年大热的对比学习模型

SimCLR(ICML20)

SimCLR是Hinton组的Chen Ting在20年2月提出的工作,直接比MoCo高出了7个点,并直逼监督模型的结果:
一文梳理2020年大热的对比学习模型
框架结构还是采用双塔:
一文梳理2020年大热的对比学习模型
主要做了以下改动:
  1. 探究了不同的数据增强组合方式,选取了最优的
  2. 在encoder之后增加了一个非线性映射 。研究发现encoder编码后的 会保留和数据增强变换相关的信息,而非线性层的作用就是去掉这些信息,让表示回归数据的本质。注意非线性层只在无监督训练时用,在迁移到其他任务时不使用
  3. 计算loss时多加了负例。以前都是拿右侧数据的N-1个作为负例,SimCLR将左侧的N-1个也加入了进来,总计2(N-1)个负例。另外SImCLR不采用memory bank,而是用更大的batch size,最多的时候bsz为8192,有16382个负例

MoCo v2

SimCLR推出后一个月,何凯明和Chen Xinlei同学对MoCo进行了一些小改动:
  1. 改进了数据增强方法
  2. 训练时在encoder的表示上增加了相同的非线性层
  3. 为了对比,学习率采用SimCLR的cosine衰减
一文梳理2020年大热的对比学习模型
经过改动后,以更小的batch size就超过了SimCLR的表现:
一文梳理2020年大热的对比学习模型

SimCLR v2(NIPS20)

在2020年中,Hinton组的Chen Ting同学又提出了SimCLR v2[4],主要做了以下改动:
  1. 采用更深但维度略小的encoder,从 ResNet-50 (4×) 改到了 ResNet-152 (3×+SK),在1%的监督数据下提升了29个点
  2. 采用更深的3层MLP,并在迁移到下游任务时保留第一层(以前是完全舍弃),在1%的监督数据下提升了14个点
  3. 参考了MoCo使用memory,但由于batch已经足够大了,只有1%左右的提升
最终模型比之前的SOTA好了不少:
一文梳理2020年大热的对比学习模型

SwAV(NIPS20)

对比学习需要很多负例进行比较,既耗时又耗内存,于是FAIR联合Inria也推出了一个新的方法SwAV。作者提出了一个新的想法:对各类样本进行聚类,然后去区分每类的类簇。模型结构如下:
一文梳理2020年大热的对比学习模型
具体的做法是,先用K个点 表示聚类中心(prototypes),给定一个batch的编码 ,将其通过 映射到一组新的向量 。这里假设向量都是d维的[5],那C的维度就是 dxK,Z的维度是 dxB,Q的维度则是KxB,每个元素 相当于第k个聚类中心与第b个样本的相似度,理想情况下,样本与自己的类簇中心相似度为1,与其他的为0,其实就是一个one-hot label。不过作者发现soft label效果会好一些。这样每个样本又获得了一个新的表示(Codes)。
有了 之后,理论上同一张图片不同view所产生的 也可以相互预测,作者便定义了新的loss:

其中

同时SwAV也提出了一种新的数据增强方法,将不同分辨率的view进行mix。最终两种方法的结合带来了4.2个点的提升:
一文梳理2020年大热的对比学习模型

BYOL

上文讲的方法来回都逃不过“对比”这个范式,而DeepMind提出的BYOL则给了我们一个不同视角。
在表示学习中,我们现在采用的框架本质是通过一个view的表示去预测相同图像其他view,能预测对说明抓住了图像的本质特征。但在做这样的预测时会有坍缩(collapse)的风险,意思是全都变成一个表示,那也可以做到预测自己。对比学习为了解决这个问题,将表示预测问题转换为了正负例判别问题,这样就迫使模型的输出是多样的,避免坍缩。
于是BYOL的作者想:如何不用负例,也能学到好的表示呢?如果共用encoder,用MSE作为损失,缩小相同图像不同view的距离,肯定会坍缩。而作者发现如果把其中一个encoder变成随机初始化的固定下来(stop gradient),就能达到18.8%的准确率。为了得到更好的encoder,作者参考动量的方法对其中一个encoder做了改进:
一文梳理2020年大热的对比学习模型
这里我们按照论文,称上半部分为online(更新梯度),下半部分为target(不更新梯度)。BYOL的优化目的是用online表示预测target表示,采用MSE作为损失函数。Online梯度回传后,使用滑动平均对targe的encoder和MLP参数进行更新。在预测阶段只使用
虽然BYOL没有显示地使用对比学习loss,但一篇博主在实验[6]中发现BYOL依靠的还是“对比”。他们在复现BYOL的时候直接基于了MoCo的代码,结果发现效果还没有随机的好,原来是因为MLP中没有加BN。如果深究BN的作用,就会发现它重新调整了输出的分布,避免坍缩,同时BN也在隐式地进行对比,去除batch内样本相同的部分,保留不同的特征
同时,在不依赖负样本后,BYOL对于数据增强方法的选择更加鲁棒,下面是它的效果:
一文梳理2020年大热的对比学习模型

SimSiam

延续BYOL的思想,Chen Xinlei与何凯明大佬又对孪生网络进行了研究,发现stop-gradient是避免坍缩的关键,于是提出了SimSiam。
SimSiam的结构非常简单:
一文梳理2020年大热的对比学习模型
  1. 左侧的编码器生成 ,经过MLP后输出
  2. 右侧的编码器生成
  3. 计算 的cosine相似度
  4. 左右调换,再计算 的cosine相似度
  5. 最大化3、4两个步骤的和,且右侧永远不传播梯度
训练步骤虽然简洁,但为什么work却有很多学问。简单的解释是,对于整体目标的优化可以看作一个EM过程,左右两边交替更新,所以在更新左侧encoder时可以将右侧看成常数。更多的细节可以参考Andy的详解。
最终SimSiam的效果超过了众多前辈,但仍比BYOL差3个点:
一文梳理2020年大热的对比学习模型
同时他们提到,孪生网络自带建模不变性(invariance)的归纳偏置(inductive bias):
two observations of the same concept should produce the same outputs
这个发现可以帮我们理解为什么孪生网络效果很好,表示学习就是要建模数据中的不变性。

其他细节

1. 数据增强方法

一文梳理2020年大热的对比学习模型
SimCLR中对数据增强方法进行了研究,得到了两个结论:
  1. 不同的数据增强方式组合起来会更好,单一增强的任务太简单
  2. Crop和Color组合的方式最好,因为大多数图像中的颜色是比较一致的,即使裁剪也会容易辨认,如果去掉颜色会增加任务难度

2. BatchNorm导致的信息泄露

在分布式训练中,BN都是分别在各个设备上做的。而对比学习的正例对在一个机器上计算,会出现信息泄露。个人认为,在BN去除batch内共同特征时,很可能被归一化到相似的分布,降低任务难度。
MoCo的解决办法是把一边的样本重新shuffle再并行,另一边顺序不变,这样batch的统计量就不同了;SimCLR的解法是计算一个全局的BN值。

3. MLP

在SimCLR以后的工作中都使用了MLP,SimSiam也对它的作用进行了探究:
一文梳理2020年大热的对比学习模型
可以看到不使用MLP基本没效果可言。作者通过实验发现:MLP可能承担了估计整体期望的功能。这同SimCLR最初增加MLP时的发现是一致的,核心思想还是过滤表示中的无效特征,得到本质,服务于“对比”任务。

总结

对比学习在2020年异常火爆,CV领域的高质量研究层出不穷,很多都超过了有监督学习的表现。这次我们只介绍了无监督对比学习,实际上它在有监督任务上也有应用,同时NLP、Graph领域也都看得到它的身影。期待CV与NLP领域相互借鉴,碰撞出更好的工作。


参考资料
[1]Contrastive Self-Supervised Learning: https://ankeshanand.com/blog/2020/01/26/contrative-self-supervised-learning.html
[2]深度学习的互信息:无监督提取特: https://kexue.fm/archives/6024
[3]Momentum Contrast for Unsupervised Visual Representation Learning: https://arxiv.org/pdf/1911.05722.pdf
[4]Big Self-Supervised Models are Strong Semi-Supervised Learners: https://arxiv.org/pdf/2006.10029.pdf
[5]representation learning与clustering的结合(3): SwAV: https://zhuanlan.zhihu.com/p/259975814
[6]Understanding self-supervised and contrastive learning with BYOL: https://untitled-ai.github.io/understanding-self-supervised-contrastive-learning.html


<section data-brushtype="text" style="padding-right: 0em;padding-left: 0em;white-space: normal;letter-spacing: 0.544px;color: rgb(62, 62, 62);font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;widows: 1;word-spacing: 2px;caret-color: rgb(255, 0, 0);text-align: center;"><strong style="color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;font-size: 14px;"><strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;">—</span></strong>完<strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;font-size: 14px;"><strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;">—</span></strong></span></strong></span></strong></section><pre><pre><section style="letter-spacing: 0.544px;white-space: normal;font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;"><section powered-by="xiumi.us"><section style="margin-top: 15px;margin-bottom: 25px;opacity: 0.8;"><section><section style="letter-spacing: 0.544px;"><section powered-by="xiumi.us"><section style="margin-top: 15px;margin-bottom: 25px;opacity: 0.8;"><section><section style="margin-bottom: 15px;padding-right: 0em;padding-left: 0em;color: rgb(127, 127, 127);font-size: 12px;font-family: sans-serif;line-height: 25.5938px;letter-spacing: 3px;text-align: center;"><span style="color: rgb(0, 0, 0);"><strong><span style="font-size: 16px;font-family: 微软雅黑;caret-color: red;">为您推荐</span></strong></span></section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;">一文了解深度推荐算法的演进</section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;"><span style="font-size: 14px;">13个算法工程师必须掌握的PyTorch Tricks</span></section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;"><span style="font-size: 14px;">吴恩达上新:生成对抗网络(GAN)专项课程</span></section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;">图像算法可以稳定处理视频了!| NeurIPS 2020</section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;">从SGD到NadaMax,十种优化算法原理及实现</section></section></section></section></section></section></section></section></section>

一文梳理2020年大热的对比学习模型

本篇文章来源于: 深度学习这件小事

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享