对比学习(Contrastive Learning)综述
作者:光某人摸鱼大师——一个希望学习技术的小学生
1,410 人赞同了该文章
A.引入
A.引入
深度学习的成功往往依赖于海量数据的支持,其中对于数据的标记与否,可以分为监督学习和无监督学习。
1. 监督学习:技术相对成熟,但是对海量的数据进行标记需要花费大量的时间和资源。
2. 无监督学习:自主发现数据中潜在的结构,节省时间以及硬件资源。
2.1 主要思路:自主地从大量数据中学习同类数据的相同特性,并将其编码为高级表征,再根据不同任务进行微调即可。
2.2 分类:
2.2.1生成式学习
生成式学习以自编码器(例如GAN,VAE等等)这类方法为代表,由数据生成数据,使之在整体或者高级语义上与训练数据相近。
2.2.2对比式学习
对比式学习着重于学习同类实例之间的共同特征,区分非同类实例之间的不同之处。
与生成式学习比较,对比式学习不需要关注实例上繁琐的细节,只需要在抽象语义级别的特征空间上学会对数据的区分即可,因此模型以及其优化变得更加简单,且泛化能力更强。
对比学习的目标是学习一个编码器,此编码器对同类数据进行相似的编码,并使不同类的数据的编码结果尽可能的不同。
3. 近况
最近深度学习两巨头 Bengio 和 LeCun 在 ICLR 2020 上点名 Self-Supervised Learning(SSL,自监督学习) 是 AI 的未来,另外,Hinton 和 Kaiming 两位神仙也在这问题上隔空过招,MoCo、SimCLR、MoCo V2 打得火热,这和 BERT 之后,各大公司出 XL-Net、RoBerta 刷榜的场景何其相似。
4.感谢
写这篇综述,花了大概一个多月时间整理【刚大二,有篇复旦的论文确实看不懂,这里就没写】,感谢各位大佬的博客,给了我莫大的帮助,还有学长
和同学
的鼓励,才让我有信心肝完这篇国内资料不那么完善的综述。
本文对目前的对比学习相关,尤其是NLP方面的工作进行较为全面的介绍,希望能够为感兴趣的同学提供一些帮助。
B. 对比引入
【拿我的画举个例子】我们可以看到下面两张图的马头和精细程度都是不同的,但是我们显然能判断这两张是类似的图,这是为什么呢
对于某个固定锚点x来说,其位置是由与其他点相对位置决定的,而不是画布的绝对位置。==》特征抽象
A中与 x 邻近的点在B图中相应点距 x' 距离小,A中与 x 相距较远的点在B图中相应点距 x' 距离大。
在一定误差范围内,二者近似相等。
可以这么认为,通过对比学习,忽略了细节,找到并确定所以关键点相对位置。
C. 聚类思想
在这里,我们将之前的想法进行抽象,用空间考虑对比学习。
最终目标:
缩小与正样本间的距离,扩大与负样本间的距离,使正样本与锚点的距离远远小于负样本与锚点的距离,(或使正样本与锚点的相似度远远大于负样本与锚点的相似度),从而达到他们间原有空间分布的真实距离。
- 丈量二者距离:欧几里得距离,余弦相似度,马氏距离(没人试过,但原理是一样的)
- 目标:给定锚点,通过空间变换,使得锚点与正样本间距离尽可能小,与负样本距离尽可能大==》抽象是如此做的!!!==》从这个实现看,对于图像缩放可能有帮助,但是其他场景CNN做卷积池化效果不更好?==》用在流量分析里咋搞?
D.对比思想
动机:人类不仅能从积极的信号中学习,还能从纠正不良行为中获益。
对比学习其实是无监督学习的一种范式。根据经典的SIMCLR,我在这里就直接提供了对比学习中模型的常见形式。
E. 对比损失【重要*数学警告】
本章的数学公式可以只看结论(NCE可以不看),如果想了解细节请仔细阅读【附录】,如果不懂可以评论私信,或者移步参考博客学习。
1. 欧几里得距离
在线性空间中,上述相似度就可以表示为二者向量间的欧几里得距离:
2.2 过程/主流程
2.3 效果
我们可以看到,和4不那么像的9会被拉远离4,和4相似的9会在交界面上十分接近地分布。这和我们的的对比想法是一致的。
同时,该论文还发现许多对比学习中有趣的现象。
不同光照下,不同角度下,像素间欧氏距离尽管很远,但是能聚集在一个环上。
3. Triplet Loss
4. NCE Loss
【注:后续研究并没有怎么使用原始的NCELoss,而是只使用这里的结论,这里引入是为了说明应该多采用负样本。】
之前从向量空间考虑,NCE从概率角度考虑【原证明为贝叶斯派的证法】,NCE是对于得分函数的估计,那也就是说,是对于你空间距离分配的合理性进行估计。
总之NCE通过对比噪声样本与含噪样本,从而推断真实分布。
【与对比学习思想一致,可以当做是另一角度】
F. 基础论文
1. CPC
论文标题:Representation Learning with Contrastive Predictive Coding
论文链接:https://arxiv.org/abs/1807.03748
代码链接:https://github.com/davidtellez/contrastive-predictive-coding
很多时候,很多数据维度高、label相对少,我们并不希望浪费掉没有label的那部分data。所以在label少的时候,可以利用无监督学习帮助我们学到数据本身的高级信息,从而对下游任务有很大的帮助。
Contrastive Predictive Coding(CPC) 这篇文章就提出以下方法:
- 将高维数据压缩到更紧凑的隐空间中,在其中条件预测更容易建模。
- 用自回归模型在隐空间中预测未来步骤。
- 依靠NCE来计算损失函数(和学习词嵌入方式类似),从而可以对整个模型进行端到端的训练。
- 对于多模态的数据有可以学到高级信息。
1.1 问题描述
1.2 CPC
下图说明了 CPC 的工作过程:
2. MoCo
论文标题:Momentum Contrast for Unsupervised Visual Representation Learning
论文来源:CVPR 2020
论文链接:https://arxiv.org/abs/1911.05722
代码链接:https://github.com/facebookresearch/moco
本文提出了高效的对比学习的结构。使用基于 MoCo 的无监督学习结构学习到的特征用于 ImageNet 分类可以超过监督学习的性能。证明了无监督学习拥有巨大的潜力。
受NLP任务的启发,MOCO将图片数据分别编码成查询向量和键向量,即,查询 q 与键队列 k ,队列包含单个正样本和多个负样本。通过 对比损失来学习特征表示。
主线依旧是不变的:在训练过程中尽量提高每个查询向量与自己相对应的键向量的相似度,同时降低与其他图片的键向量的相似度。
MOCO使用两个神经网络对数据进行编码:encoder和momentum encoder。
encoder负责编码当前实例的抽象表示。
momentum encoder负责编码多个实例(包括当前实例)的抽象表示。
对于当前实例,最大化其encoder与momentum encoder中自身的编码结果,同时最小化与momentum encoder中其他实例的编码结果。
2.1 InfoNCE Loss
2.2 Memory Bank
由于对比学习的特性,参与对比学习损失的实例数往往越多越好,但Memory Bank中存储的都是 encoder 编码的特征,容量很大,导致采样的特征具有不一致性(是由不同的encoder产生的)。
所以,对所有参与过momentum encoder的实例建立动态字典(dynamic dictionary)作为Memory Bank,在之后训练过程中每一个batch会淘汰掉字典中最早被编码的数据。
2.3 Momentum 更新
2.4 代码流程
3. SimCLR
论文标题:A Simple Framework for Contrastive Learning of Visual Representations
论文链接:https://arxiv.org/abs/2002.05709
代码链接:https://github.com/google-research/simclr
写在前面
由于最近开始在看对比学习的一些相关工作,想把学到的东西记录一下。本文前半部分基于Ankesh Anand关于Contrastive Learning的blog中的内容,想看原文的可以移步下面链接:
在学习的过程中也参考了下面两篇文章:
小谢:一文详解最近异常火热的self-supervised learning84 赞同 · 1 评论文章
OUC信院科研狗:Contrastive self-supervised learningzhuanlan.zhihu.com/p/104384194?utm_source=zhihu
好的,下面正式开始~
自监督学习
要说到对比学习,首先要从自监督学习开始讲起。自监督学习属于无监督学习范式的一种,特点是不需要人工标注的类别标签信息,直接利用数据本身作为监督信息,来学习样本数据的特征表达,并用于下游任务。
那么,自监督学习有什么优势呢?
目前机器学习主流的方法大多是监督学习方法,这类方法依赖人工标注的标签,这会带来一些缺陷:
- 数据本身提供的信息远比稀疏的标签更加丰富,因此使用有监督学习方法训练模型需要大量的标签数据,并且得到的模型有时候是“脆弱”的
- 有监督学习通过标签训练得到的模型往往只能学到一些任务特定的知识,而不能学习到一种通用的知识,因此有监督学习学到的特征表示难以迁移到其他任务
而自监督学习能够很好地避免上面的问题,因为自监督学习直接使用数据本身来提供监督信息来指导学习。
自监督学习分类
当前自监督学习可以被大致分为两类:
- Generative Methods
- Contrastive Methods
Generative Methods and Contrastive Methods
Generative Methods(生成式方法)这类方法以自编码器为代表,主要关注pixel label的loss。举例来说,在自编码器中对数据样本编码成特征再解码重构,这里认为重构的效果比较好则说明模型学到了比较好的特征表达,而重构的效果通过pixel label的loss来衡量。
Contrastive Methods(对比式方法)这类方法则是通过将数据分别与正例样本和负例样本在特征空间进行对比,来学习样本的特征表示。Contrastive Methods主要的难点在于如何构造正负样本。
那么,Contrastive Methods有什么优势呢?
这里举一个例子来说明,Epstein在2016年做了一个实验:让受试者画出美元的图像,越详细越好,下图是受试者画出来的美元图像。
左图是受试者根据印象画出来的美元,右图则是让受试者照着美元画出来的。可以看到,左图画出来的美元图虽然不够详细,但已经充分具备一张美元的判别性信息,因此我们可以把它识别成美元。事实上,我们并不需要见到一张美元所有详细的信息,而仅仅通过一些关键的特征就可以识别出来。
同理,相比起Generative Methods需要对像素细节进行重构来学习到样本特征,Contrastive Methods只需要在特征空间上学习到区分性。因此Contrastive Methods不会过分关注像素细节,而能够关注抽象的语义信息,并且相比于像素级别的重构,优化也变得更加简单。
对比学习一般泛式
对比学习相关论文
更新中