其实事实是这样的,老师这两天突然安排了一个对比学习的任务,其实我之前根本就没有接触过对比学习。所以只好现学现卖,然后顺便跟大家也分享一下我现学现卖的过程。提前说明我是搞文本的,并不是搞图像的,所以这个真的是现学现卖。如果有问题,欢迎大家批评指正。
这部分主要讲MoCo的是和simCLR出来之前的一些工作,那个时候没有实现大一统。所以任务比较局限,也比较杂乱。
先来说一下大前提:预训练+微调的模式在图像领域已经应用很久了,但是在文本领域算是新起之秀。在之前的很长一段时间里,因为文本里没有像ImageNet那样大规模的带有标注的数据集。因此预训练模型这个事情迟迟没有进展。直到GPT等预训练模型的出现打破了僵局,证明我们使用无标签的数据也可以进行预训练模型的探索。所以GPT这个工作算是里程碑之作。
然后图像也开始尝试搞无标注数据的训练了,就比如说今天要讲的对于学习就是使用无标注数据进行的。今天主要要讲4篇论文。因为我是现学现卖嘛,其实我也是看别人讲的。我是结合了李沐老师的对比学习视频以及一些文章,然后自己又粗略看了一下论文的原文。
这个学习的重点呢其实主要就是找出一种对比方法,就是如何确定正负样本。剩下的都大同小异。
InstDisc
论文地址:
[1805.01978] Unsupervised Feature Learning via Non-Parametric Instance-level Discrimination (arxiv.org)
先来看一下这张图。嗯。这张图呢作者说我们通过图上面这个豹子进行学习。得出结果与它相似的图片是左边这一些,什么花豹、猎豹、金钱豹。而右边是和他不相似的。得出这个结果的原因是什么呢?是因为他们的标签相似吗?不是的,是因为图片本身相似。因为图片本身相似而造成的分类结果的差异。所以由这个事情作者就提出了一个个体判别的任务来进行无监督学习。
作者是如何设定这个个体判别任务的呢。使用imagenet来操作,把一张张图片丢进一个CNN里,将其转化为一个2048维的向量表示,这是一个image2Vec的过程。2048维太大了,然后对它进行降维降到128维。然后做一个
normalization之后,再得到一个128维的向量。最后呢把这个向量丢进一个smart分类器里,每一张图片呢我们都会学到一个对应的向量,最后把这些学到的向量拼接起来做成一个字典,称之为memory bank。这个字典长度就是ImageNet的图片数量。其中每一个向量的长度就是128维。这就是为什么我们说2048维的向量太大了。因为作为这样一个矩阵,我们需要很大的存储空间,计算代价也比较大。所以我们不能让这个维度过长,在这里呢作者选择的是128维。
作者的这一番操作就是给每一个图片都学到一个对应的特殊的向量。每张图片学到的向量都是不同的,这就是把一张图片看作一个类。那么在这个任务中呢你要图片多样性足够多。字典足够大,你才能获得比较好的效果。因此作者选的是ImageNet这样数量庞大的数据集。
那对于学习中作者的正负样本是如何确定的呢。在这个实验中作者设定一个mini-batch的size是256。这整个butch中的样本就是正样本。而负样本则是从字典中随机抽取4096个。
有了正样本也有了负样本,就可以进行训练了。文中使用的是NCE loss作为对比学习的目标函数。在训练过程中不断的去更新这个memory bank的字典,学到对应的特征。
InvaSpread
论文地址:
[1904.03436] Unsupervised Embedding Learning via Invariant and Spreading Instance Feature (arxiv.org)
这个工作呢可以视为simCLR的前身,但是这个工作并不出名,因为这个工作比较穷,虽然看作者名好像是叶芒大佬的。但也正是因为自从所以这个工作打开了新思路。
是讲思路之前,我们先说一下他的正样本和副样本是如何设计的。
随机选取一组图片,数量为N作为一个mini batch。然后对其增广得到另一个数量为N的batch。这个图像以及它对应的增强之后的图像作为正样本。剩余的图像作为负样本。在这个实验中增样本数量是2,负样本数量是2N-2。
比如下面这个例子,假设现在我们一个mini batch只有三张图片。我们对这三张图片进行数据增广,得到另外三张图片。像在
以及数据增广之后的
作为正样本。其余的
都是负样本。
这个工作也是做了一个个体判别的任务,看一下图一,作者的想法很清楚,作者说:我们的基本想法是
同一图片在不同数据增强下的特征应该是不变的,而不同图像实例的特征应该是分开的
。这也对应着题目的invariant和spread,即相似图片特征保持不变性,不相似的图片分布尽量分开。
然后看一下它的网络是如何训练的。
我们前面提到。一组图片要对它进行增强,得到数量相等的图片。在这里作者是设计了一个孪生网络,把原图放入一个CNN,把增广之后的图片放入另一个CNN。这两个CNN之间是参数共享的。然后这个虽然也是要进行降维,将为之后也做一遍
normalization,训练之后,某一张图片及其对应的增强之后的图片学到的特征应该是相似的,并且他们在embedding中的分布也应该是接近的。
注意一下,如果大家去看原文的话,在这里可能会遇到一个坑。因为我看的先是讲解视频,那个讲解视频的老师说的有一点口误,然后我我想验证一下是不是口误,所以我就去看了一下论文原文。但是作者这里有写的让我很迷惑,作者说我们把原图丢进孪生网络的第一个网络中。然后把增强之后的图片丢进孪生网络的第二个网络中。但是他在这里写了一个“
Note That
”,然后作者说第一个网络里也会有增广之后的图片。这就会让我觉得他是不是把原图进行增广之后,第一张图片中也要放这些数据。后来我跟同学讨论了一下。同学只是说不是的,作者的意思是如果你数据集不够的话。你可能要对数据集进行增广之后再进行对比学习的实验。也就是说我先将数据集增广,然后再从中抽出一个mini batch。在对mini batch中的图片进行增广,然后再把这两组图片丢进孪生网络中。
CPC
论文地址:
[1807.03748] Representation Learning with Contrastive Predictive Coding (arxiv.org)
接下来看一下cpc,cpc也是一个比较出彩的文章。就是 CPC的论文写得非常好,大家感兴趣的可以去看一下。Cpc是谷歌的工作,大佬写文章就抓住了精髓。试图突出他这个工作的通用性。
作者在这个文章中一上来就把深度学习归纳为判别式和生成式两种任务。我们前面提到的两篇都是判别式任务,而作者在这个文章里做的是一个生成式的任务。并且它做到了一个多域通用。就是说作者说我们的模型可以用在图像、文本、语音以及强化学习之中。
作者提出的方法是找尚处这样的。你可以认为它是一个处理时序序列的东西。我们以时间t作为当前的时间步。作者的意思就是我们把这些输入丢进一个编码器里,然后编码器会学到一个特征,这个特征用紫色的小方块表示。然后把这些特征丢进一个自回归模型中,这个自回归模型用圆圈表示。之后获得输出,用红色的方块表示。
作者认为当你的模型足够好的时候,你学到的这些特征应该是足以表示你前面所有输入信息的。然后这里取最后一个时间步的输出模块用来预测你之后的信息。
在这里他正负样本是如何设置的呢?
你之后时间步的输入,它也会经过这个编码器获得不同的特征表示紫色方块。这些特征表示呢就作为正样本。而你胡乱输入一些其他的东西他们最后表示出来的紫色方块,就作为副样本。
比如你说:
t时间之前的输入是“君不见,黄河之水天上来。”,那你正样本的输入应该是“奔流到海不复回。”。负样本的输入可以是“我家有个小猫咪”。也可以是其他的句子。
CMC
论文地址:
[1906.05849] Contrastive Multiview Coding (arxiv.org)
代码地址:
HobbitLong/CMC: [ECCV 2020] "Contrastive Multiview Coding", also contains implementations for MoCo and InstDis (github.com)
这篇文章呢可以看到,也可以算是谷歌的一个工作。这篇文章的角度清晰,思路特别精明,也是值得我们学习。
作者开篇就说人观察东西是多视角的,不同的视角我们观察到的东西都是带有噪声的,并且还可能存在信息不完整性。但是不论视角怎么变化,最重要的信息是所有视角之间共享。比如一只狗,我们不管是看到了这只狗,还是听到了狗叫声,还是看到了狗头,看到了狗耳朵,我们都能知道这是一只狗。
因此作者提出我们要学习一个具有视角不变性的特征,也就是要增大所有视角之间的互信息。学习一个特征能够抓住所有视角下的关键因素。
在这里呢作者使用的是一个比较特殊的数据集——NYU RGBD。这个数据集呢对于每1个图片都有4个不同的视角。
从上图我们可以看出这4幅图都有什么:
在这个实验里它设计的正样本是不同视角的图片,而负样本就是其他的图片。
这个工作向大家展示了对比学习的灵活性,但是这个工作存在一个弊端,就是在不同的视角下。它的图片差异很大。我们需要使用不同的编码器。这个工作也促进了另一个工作的发展,就是clip,被称为打通了文本和图像领域之间的对比学习,它是进行了一个多模态的研究。Clip呢在图像和文本两方面也是使用了不同的编码器。
原网站版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://xie.infoq.cn/article/eaf63ab9d076f3ff81a24a810