草庐IT

诸神黄昏时代的对比学习

51Ann 2023-03-28 原文

其实事实是这样的,老师这两天突然安排了一个对比学习的任务,其实我之前根本就没有接触过对比学习。所以只好现学现卖,然后顺便跟大家也分享一下我现学现卖的过程。提前说明我是搞文本的,并不是搞图像的,所以这个真的是现学现卖。如果有问题,欢迎大家批评指正。


部分主要讲MoCo的是和simCLR出来之前的一些工作,那个时候没有实现“大一统”。所以任务比较局限,也比较杂乱。**之后会更新后续部分一直更新到MAE(如果我有时间写的话)**。

先来说一下大前提:预训练+微调的模式在图像领域已经应用很久了,但是在文本领域算是新起之秀。在之前的很长一段时间里,因为文本里没有像ImageNet那样大规模的带有标注的数据集。因此预训练模型这个事情迟迟没有进展。直到GPT等预训练模型的出现打破了僵局,证明我们使用无标签的数据也可以进行预训练模型的探索。所以GPT这个工作算是里程碑之作。

然后图像也开始尝试搞无标注数据的训练了,就比如说今天要讲的对于学习就是使用无标注数据进行的。今天主要要讲4篇论文。因为我是现学现卖嘛,其实我也是看别人讲的。我是结合了李沐老师的对比学习视频以及一些文章,然后自己又粗略看了一下论文的原文。

这个学习的重点呢其实主要就是找出一种对比方法,就是如何确定正负样本。剩下的都大同小异。

InstDisc

论文地址:[1805.01978] Unsupervised Feature Learning via Non-Parametric Instance-level Discrimination (arxiv.org)

先来看一下这张图。嗯。这张图呢作者说我们通过图上面这个豹子进行学习。得出结果与它相似的图片是左边这一些,什么花豹、猎豹、金钱豹。而右边是和他不相似的。得出这个结果的原因是什么呢?是因为他们的标签相似吗?不是的,是因为图片本身相似。因为图片本身相似而造成的分类结果的差异。所以由这个事情作者就提出了一个个体判别的任务来进行无监督学习。

作者是如何设定这个个体判别任务的呢。使用imagenet来操作,把一张张图片丢进一个CNN里,将其转化为一个2048维的向量表示,这是一个image2Vec的过程。2048维太大了,然后对它进行降维降到128维。然后做一个$L2$ 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只有三张图片。我们对这三张图片进行数据增广,得到另外三张图片。像在$x_1$以及数据增广之后的$\hat{x_1}$作为正样本。其余的$x_2 \quad x_3 \quad \hat{x_2} \quad \hat{x_3}$都是负样本。

这个工作也是做了一个个体判别的任务,看一下图一,作者的想法很清楚,作者说:我们的基本想法是同一图片在不同数据增强下的特征应该是不变的,而不同图像实例的特征应该是分开的。这也对应着题目的invariant和spread,即相似图片特征保持不变性,不相似的图片分布尽量分开。

然后看一下它的网络是如何训练的。

我们前面提到。一组图片要对它进行增强,得到数量相等的图片。在这里作者是设计了一个孪生网络,把原图放入一个CNN,把增广之后的图片放入另一个CNN。这两个CNN之间是参数共享的。然后这个虽然也是要进行降维,将为之后也做一遍$L2$ 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呢在图像和文本两方面也是使用了不同的编码器。

有关诸神黄昏时代的对比学习的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  4. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  5. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  6. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  7. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

  8. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  9. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  10. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

随机推荐