来自 | 知乎
作者 | 光某人
地址 | https://zhuanlan.zhihu.com/p/346686467
编辑 | 机器学习算法与自然语言处理公众号
本文仅作学术分享,若侵权,请联系后台删文处理
深度学习的成功往往依赖于海量数据的支持,其中对于数据的标记与否,可以分为监督学习和无监督学习。
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方面的工作进行较为全面的介绍,希望能够为感兴趣的同学提供一些帮助。
我们的核心就是要学习一个映射函数 f ,把实例 x 编码成其表示 f(x) ,对比学习的核心就是使得这个 f 满足下面这个式子:
这里的 就是和 相似实例, 就是和 不相似实例, 这是一个度量实例之间相似度(similarity)的函数。
最终目标就是不断最大化 和 互信息的下界,让二者的表示更为接近。
本章的数学公式可以只看结论(NCE可以不看),如果想了解细节请仔细阅读【附录】,如果不懂可以评论私信,或者移步参考博客学习。
在线性空间中,上述相似度就可以表示为二者向量间的欧几里得距离:
由Hadsell, R. , Chopra, S. , & Lecun, Y. . (2006)提出[1]
为了下文方便解释,这里的参数详细解释如下:
:网络权重;
:标志符,
:是 与 在潜变量空间的欧几里德距离。
:表示第i组向量对。
:研究中常常在这里做文章,定义合理的能够完成最终目标的损失函数往往就成功了大半。
原文的L定义为:
当Y=0,调整参数最小化 。
当Y=1,设二者向量最大距离为m,
如果 , 则增大两者距离到m;
如果 ,则不做优化。
我们将三元组重新描述为 。
那么最小化损失就是使 。
那么三元组的总体距离可以表示为:【近年论文好像也有沿用的,比较经典】
直观上理解,就是希望正实例对和负实例对隔开至少的距离。
这样,让正实例对和负实例对采用不同的 函数,也就衍生出各种变种。
例如:
越大,约接近NCE 对于噪声分布的依赖程度也就越小,越接近真实期望。
后续研究的核心往往就聚焦于的两个方面:
如何定义目标函数?【详见附录】
简单内积函数
InfoNCE【近年火热】
triplet 【近年火热】 【知乎的问题,后边的s函数的负号上标可能消失】
如何构建正实例对和负实例对?
这个问题是目前很多 paper 关注的一个方向,设计出合理的正实例与负实例对,并且尽可能提升实例对,才能表现的更好。
论文标题:Representation Learning with Contrastive Predictive Coding
论文链接:arxiv.org/abs/1807.0374
代码链接:github.com/davidtellez/
很多时候,很多数据维度高、label相对少,我们并不希望浪费掉没有label的那部分data。所以在label少的时候,可以利用无监督学习帮助我们学到数据本身的高级信息,从而对下游任务有很大的帮助。
Contrastive Predictive Coding(CPC) 这篇文章就提出以下方法:
将高维数据压缩到更紧凑的隐空间中,在其中条件预测更容易建模。
用自回归模型在隐空间中预测未来步骤。
依靠NCE来计算损失函数(和学习词嵌入方式类似),从而可以对整个模型进行端到端的训练。
对于多模态的数据有可以学到高级信息。
可以利用一定窗口内的 和 作为正实例对,并从输入序列之中随机采样一个输入作为 负实例。
在预测未来信息时,我们将目标 x (预测)和上下文 c (已知)编码成一个紧凑的分布式向量表示(通过非线性学习映射),其方式最大限度地保留了定义为的原始信号x和c的互信息
通过最大化编码之间互信息(它以输入信号之间的MI为界),提取输入中的隐变量。
下图说明了 CPC 的工作过程:
首先我们在原信号上选取一些时间窗口,对每一个窗口,通过encoder ,得到表示向量
通过自回归模型: ,从而生成上下文隐变量 。
然后通过Bi-linear:【采用 和 从而能够压缩高维数据,并且计算 和 的未来值是否符合】
CPC用到了NCE Loss, 并推广为InfoNCE:(证明见【附录】)
选取 ,这里面只有1个正样本对 来自于 ,即声音原本的信号,其他N-1个均是负样本(噪声样本)来自于 ,即随机选取的信号片段。
损失函数定义如下:【这里的f可以自己定义】
我们用softmax的思路来理解这个损失函数, 越大, 应该越接近于0(越接近最大值),而损失就越小。
论文标题:Momentum Contrast for Unsupervised Visual Representation Learning
论文来源:CVPR 2020
论文链接:arxiv.org/abs/1911.0572
代码链接:github.com/facebookrese
本文提出了高效的对比学习的结构。使用基于 MoCo 的无监督学习结构学习到的特征用于 ImageNet 分类可以超过监督学习的性能。证明了无监督学习拥有巨大的潜力。
受NLP任务的启发,MOCO将图片数据分别编码成查询向量和键向量,即,查询 q 与键队列 k ,队列包含单个正样本和多个负样本。通过 对比损失来学习特征表示。
主线依旧是不变的:在训练过程中尽量提高每个查询向量与自己相对应的键向量的相似度,同时降低与其他图片的键向量的相似度。
MOCO使用两个神经网络对数据进行编码:encoder和momentum encoder。
encoder负责编码当前实例的抽象表示。
momentum encoder负责编码多个实例(包括当前实例)的抽象表示。
对于当前实例,最大化其encoder与momentum encoder中自身的编码结果,同时最小化与momentum encoder中其他实例的编码结果。
对比损失:假设其中有一个正样本其余均是负样本,则根据 InfoNCE Loss表示为:
其中 和可以有多种构造方式,比如对图像进行裁剪变色等随机变化。
由于对比学习的特性,参与对比学习损失的实例数往往越多越好,但Memory Bank中存储的都是 encoder 编码的特征,容量很大,导致采样的特征具有不一致性(是由不同的encoder产生的)。
所以,对所有参与过momentum encoder的实例建立动态字典(dynamic dictionary)作为Memory Bank,在之后训练过程中每一个batch会淘汰掉字典中最早被编码的数据。
在参数更新阶段,MOCO只会对encoder中的参数进行更新。
由于Memory Bank,导致引入大量实例的同时,会使反向传播十分困难,而momentum encoder参数更新就依赖于Momentum 更新法,使momentum encoder的参数逐步向encoder参数逼近:
其中 , 指encoder部分的参数。
下图形式化的表示了三种结构,end-to-end,memory-bank和MoCo的区别。MoCo的特点是:
(1)用于负采样的队列是动态的
(2)用于负样本特征提取的编码器与用于query提取的编码器不一致,是一种Momentum更新的关系。
(3)与Memory Bank类似,NCE Loss只影响 Query ,不更新key。
论文标题:A Simple Framework for Contrastive Learning of Visual Representations
论文链接:arxiv.org/abs/2002.0570
代码链接:github.com/google-resea
simCLR背后的思想非常简单:
视觉表征对于同一目标不同视角的输入都应具有不变性。
simCLR对输入的图片进行数据增强,以此来模拟图片不同视角下的输入。之后采用对比损失最大化相同目标在不同数据增强下的相似度,并最小化不同目标之间的相似度。
用下面这张图来说明:
simCLR的架构由两个相同的网络模块组成。对于每一个输入网络的minibatch:
对mini batch中每张输入的图片进行两次随机数据增强(随机剪裁、滤镜、颜色过滤、灰度化等)来得到图片两种不同的视角;
将得到的两个表征送入两个卷积编码器(如resnet)获得抽象表示,之后对这些表示形式应用非线性变换进行投影得到投影表示;
使用余弦相似度来度量投影的相似度。
由此可以得到优化目标:对于minibatch中同一图片,最大化其两个数据增强投影的相似度,并最小化不同图片之间的投影相似度。
SimCLR的batch-size也达到了8192,用了128块TPU,又是算力党的一大胜利。
MoCo v2 也是利用了上面的第一点和第三点,在 MoCo 基础上得到了进一步的提升,然后作者还也明确的点名了 SimCLR,称不需要使用那么大的 batch size 也能超过它,可能这就是神仙打架吧。
读了几篇论文发现,近些年的对比学习大致可由下图概括:
重兴原因:
BERT等预训练模型成效显著
提出了更好的Loss函数【可以用其他模型给出的评分作为scoring函数提高Loss的性能】
其他模型的改进效应
论文标题:Reducing Word Omission Errors in Neural Machine Translation: A Contrastive Learning Approach
论文链接:aclweb.org/anthology/P1
神经机器翻译(NMT)近几年发展迅速,成果喜人,但仍然存在一些问题:NMT系统容易省略基本单词,恶化了机器翻译的充分性。
由于神经网络缺乏可解释性,很难解释这些遗漏错误是如何发生的,也很难用逻辑规则的方式来消除它们。
用对比学习的思想解决该问题,其基本思想仍然与对比学习的思想是一致的:
使NMT模型能够将更高的概率分配给真实(ground-truth)翻译,而将较低的概率分配给错误翻译。
根据真实翻译进行省略词数、改变词频和词性设计不同类型的负实例,进行数据增强。
输入:并行训练集 ,包含已翻译好的句子对
输出:无缺漏翻译的句子
找到一组模型参数 ,使训练集的对数似然最大化:
基于并行语料库中的真实实例对构建负实例。
基于以下几种规则对数据构建负实例:
随意省略。
按单词频率省略。
按词性省略。
最后联合即可
论文标题:Contrastive Self-Supervised Learning for Commonsense Reasoning
论文链接:aclweb.org/anthology/20
代码链接:github.com/SAP-samples/
该文章提出了一种自监督的方法来解决指代消解(Pronoun Disambiguation)和 Winograd Schema Challenge 问题,减少目前监督方法对常识推理的限制 。
该文章利用了与所谓的触发词相关的训练语料库的特征结构,它负责在代词消解中翻转答案,从而构造两两对比的辅助预测来实现这样的常识推理。
在上面的例子中,big,small充当触发词。考虑到触发词所建立的上下文,候选答案A在第一句中要么是对的,要么在第二句中是对的【另一句是错的】。
由于答案在第一句中要么是对的,要么在第二句中是对的【另一句是错的】,则有关系
所以
从例子中可以看出,触发词产生了训练对的相互排斥关系。该方法的目标是将这种成对关系作为训练阶段的唯一监督信号。所以这里引入 互斥损失(Mutual Exclusive (MEx) loss ),最大限度地提高这两个看似合理的候选项的相互排斥概率。
具体来说,给定一对训练句子,将要解决的代词从句子中屏蔽(mask)掉,并使用语言模型来预测这样的候选词中只有一个可以填充mask的位置,而填充互斥条件。
然后是对比损失:
所以二者联合即可
论文标题:Unsupervised Reference-Free Summary Quality Evaluation via Contrastive Learning
论文链接:aclweb.org/anthology/20
代码链接:github.com/whl97/LS-Sco
本文设计了一种新的度量,它既涵盖了基于BERT的语言质量,也涵盖了语义信息性。
为了学习度量,对于每个总结,我们针对总结质量的不同方面构造了不同类型的负采样,并对我们的模型进行了rank loss(即Contrastive Loss)的训练。
评价可以分为三类:
语义质量评估
语义质量表示摘要是否表达了原始文件的最重要信息;它一般包括信息性、相关性和冗余性等。
语言质量评估
语言质量表明生成的摘要是多么自然;它通常包括每个句子的流畅性、实体/连续句子的一致性以及语法的正确性。
其他评估
我们在下面的章节中考虑了这两个方面并设计了我们的方法。我们的模型架构如图1所示。图包含两个部分,首先,我们设计了我们的评估器,根据BERT编码器将分数分配给摘要。然后,我们创建负样本,并使用对比学习框架来训练评估器。
这里我们使用 来表示 。
为了更好地评价语义质量,我们利用了BERT的上下文嵌入。BERT接收一个序列,该序列总是以一个特殊的分类token[CLS]作为输入,并输出该序列的表示。
每个令牌都有自己的隐状态,对应于[CLS]的隐状态应该是从整个序列中聚合信息。
形式上,让 和 是摘要 和源文档 中的令牌序列。通过BERT编码器将令牌序列编码到令牌嵌入H序列中。
我们通过计算x与其源文档d之间的语义相似性来度量目标摘要x的语义质量。因此,语义质量评分为:
其中Sim指余弦相似度, 表示令牌[CLS]对应的隐藏状态。
为了同时捕捉语言和语义方面,我们通过线性组合S评分和L评分来开发我们的最终度量。我们称之为LS评分,这是语义评分和语言评分之间的权衡。
用 =0.01和 =1【实验证明】来缩放 和
评估器训练好后,那么在评估器基础上,就可以定义二者现成的scoring函数。
对于给定的良好摘要,发出一些噪音,例如打乱单词/句子的顺序,来创建一个质量更差的摘要。
然后,比较这两个摘要,以获得一个对比损失。
在给定一个基本的摘要集合R,
对于R中的一个摘要 r 有生成相应噪声变体集$\hat X_r$,损失函数如下:
论文标题:Group-wise Contrastive Learning for Neural Dialogue Generation
论文链接:aclweb.org/anthology/20
代码地址:github.com/hengyicai/Co
本文将对比学习引入对话生成,模型明确感知积极和消极话语之间的差异。
在对比学习过程中,训练目标对话模型,仍然满足这样一条主线——使正样本具有更高的条件概率,负样本具有更低的条件概率。
为了处理人类对话中普遍存在的多映射关系,本文采用分组对偶抽样的方法来增强对比学习。
从对比学习的角度来看,鉴别器在对抗性学习中,能够设定地认为人的回复为正样本,合成的回复是负样本。然后,通过对话生成模型,将匹配的正样本对拉在一起,并将不匹配的负样本对在潜在空间中分开,这样就能明确考虑人类对话中的多映射关系。
即,对于上下文 c 及其回复 r ,训练目标对话模型,使正样本具有更高的条件概率$p(r|c)$,
给定一个训练上下文-回复对 ,对于上下文“What are your hobbies? I love to cook.“,多个高度匹配的回复被组织为正样本 ,不匹配的对话被认为是负样本 。
反过来,关于“Reading is my favorite hobby”的回应,多个抽样的上下文话语类似地分为 和 。这样就可以把句子完全的分为两类进行对比学习了。
输入:
给定包含上下文回复对 的训练数据 D 。
输出:
生成对话
利用预训练的基线模型 ,为目标对话模型 提供了有力的参考。
直观地说,与参考模型相比,目标对话模型对正样本的条件概率 较高,对负样本的条件概率较低。为此,我们将$p_m(c,\theta)$和$p_n(c,\phi)$之间的距离定义为:
具体而言,我们将以下损失降到最低:
是 sigmoid激活函数,给定的训练对 可以作为正样本 ,用给定的实例 可以通过负采样得到负样本 。
注:
用上述目标函数优化对话模型,使人联想到噪声对比估计(NCE)中的非线性Logistic回归。
本文和NCE的潜在动机本质上是不同的。本文中参考模型被用来约束目标模型的行为,而不是作为噪声分布来提供噪声数据。另一个不同之处是,引入函数 来描述相对于参考的内在对话性质的区别,并鼓励生成正样本,并通过最小化损失来惩罚负样本。
在人类对话中存在多映射关系的情况下,有效地对会话中的正对和负对进行抽样并不是那么简单,甚至有引入虚假学习样本的风险。为了管理人类会话中复杂的多映射现象,提高训练的稳定性,我们用分组对偶抽样来增强对比学习,其中分别对上下文和回复进行了一组正实例和负实例的抽样。
具体地说,对于每个训练实例(c,r),使用现成的预训练匹配网络进行匹配,匹配出一组具有最高匹配度的正实例 和一组具有最低匹配度的负实例 。
模型计算给定上下文和候选回复之间的匹配分数。同样, 和 也从训练集中检索,作为上下文对比。本文采用基于多跳选择的上下文回复对匹配网络MSN作为现成的匹配模型。
由上一部分,所得到的精心选择的样本 和 组成,并利用每个样本所附的匹配分数来适应其对分组对比对话学习的匹配效果。
具体地,对于给定的训练示例 ,其正对匹配分数 位于(0,1],负匹配分数 位于[-1,0]。从而能够进行判别不同匹配度的样本对的模型学习,损失函数为:
头疼的数学都放在这里啦!!
我们将三元组重新描述为 。
那么最小化损失就是使 。
那么三元组的总体距离可以表示为:【近年论文好像也有沿用的,比较经典】
Triplet Loss,即三元组损失,是Google在2015年发表的FaceNet论文中提出[2]。
定义:最小化锚点和具有相同身份的正样本之间的距离,最小化锚点和具有不同身份的负样本之间的距离。
主线:使相同标签的特征在空间位置上尽量靠近,同时不同标签的特征在空间位置上尽量远离。
同时为了不让样本的特征聚合到一个非常小的空间中,要求对于同一类的两个正实例和一个负实例,负例应该比正例的距离至少为margin值 。如下图所示:
因为我们期望的是下式成立,即:【给不记得欧几里得范数的兄弟补个知识: 】
为样本容量为N的数据集的各种三元组。
根据上式,Triplet Loss可以写成:
对应的针对三个样本的梯度计算公式为:
这样我们可以看到这些个三元组的关系是联系紧密,又对称的。
【这部分证明参考[b]博客,这位大佬写的非常详细,这里做了一些简化方便讲解。】
NCE,也就是 Noise Contrastive Estimate(噪声对比估计)[3]中提出,不过是连续的概率密度函数。由[4]提出了其离散分布时的表现形式,将 NCE 应用到 NLP 领域。
对于n-grams语言模型(n元语法),设单词序列为 , 为上下文 ,满足:
设
那么上式的最大似然函数为
那么最关键的F该怎么求呢?
设 为量化 w与c 匹配性的scoring函数,经过softmax,则可表示如下:
式子中 表示下一个单词是w在单词库中的概率; 表示当前单词库中所有单词的概率的累和(即“归一化因子“)
一般来说,单词库 的数量是非常巨大的,因此计算“归一化因子“是非常昂贵、耗时的一件事,这也就是 NCE 要解决的问题。
根本方法:通过最大化同一个目标函数来估计模型参数 和归一化常数。
核心思想:通过学习数据分布样本和噪声分布样本之间的区别,从而发现数据中的一些特性。
更具体来说,NCE 将问题转换成了一个二分类问题,分类器能够对数据样本和噪声样本进行二分类。
现在假设一个特定上下文 c 的数据分布为 ,称从它里面取出的样本为正样本,令其类别 ;而另一个与 c 无关的噪声分布为,称从里面取出的样本为负样本,令其类别为 。
假设现在取出了 个正样本和 个负样本。
我们得到下面这些概率:
所以根据贝叶斯公式,可以计算后验概率:
设 :
同理
好了,现在就是求(3)式中 的问题了。
NCE将问题进行了转换,引入了噪声分布:
将 作为一个参数 来进行估计,相当于引进了一个新参数。
由[4]中实验证明,我们将 固定为 1 对每个c仍是有效的。
所以(3)可化简为
所以(4),(5),(6)联合,可得
现在我们有了参数为 的二元分类问题。标签 可近似为伯努利分布,那么很容易写出条件对数似然 。
实际上在它前面加上负号后,也就等价于交叉熵损失函数:
NCE 的目标函数还需要在(9)式的基础上除以正样本的数量 ,即
根据大数定律,上式可化为:
要最大化上述对数似然函数,也就是最大化如下目标函数:
可以看到实际上这个比例k对我们的 NCE 优化是有影响的。
根据[5]的结论:对于设置的噪声分布 ,当负样本和正样本数量之比 越大,那么NCE 对于噪声分布的依赖程度也就越小。换句话说,尽可能增大比值 。也许这也就是大家都默认将正样本数量设置为 1 的原因:正样本至少取要 1 个,所以最大化比值k,也就是尽可能取更多负样本的同时,将正样本数量取最小值 1。
另外,如果我们希望目标函数不是只针对一个特定的上下文 ,而是使不同的上下文可以共享参数,也就是设置一批上下文的全局目标函数:
总结:
从上下文 中取出单词作为正样本,从噪声分布中取出单词作为负样本,正负样本数量比为
训练一个二分类器,通过一个类似于交叉熵损失函数的目标函数进行训练(如果取正样本数量为 1,那么(9)与(10) 式等价,NCE 目标函数就等价于交叉熵损失函数)。
上面虽然推导了那么多公式,但实际只是按照 NCE 的思想进行问题的转换,那么这样做究竟是否正确呢?
我们再看回(12)式,我们对它关于 进行求导:
分布对上面的两项分别进行求导:
(15),(16)代入(14)中,可得:
如果负样本与正样本比例 ,那么:
可以看到,(18)与(2)中 MLE 对数似然函数梯度是等价的,也就是说我们通过 NCE 转换后的优化目标,本质上就是对极大似然估计方法的一种近似,并且随着负样本和正样本数量比k的增大,这种近似越精确,这也解释了为什么作者建议我们将 k 设置的越大越好。
【建议看完CPC介绍再来看这里】
InfoNCE 是在[6]CPC中提出的。CPC(对比预测编码) 就是一种通过无监督任务来学习高维数据的特征表示,而通常采取的无监督策略就是根据上下文预测未来或者缺失的信息。
原文引入了互信息的思想,认为我们可以通过最大化当前上下文 和下 个时刻的数据 之间的互信息来构建预测任务,互信息的定义表示如下:
我们无法知道 和 之间的联合分布 ,因此要最大化 ,就需要最大化 。
把这个比例定义为密度比,那么,分子 就相当于 ,是想得到的目标函数;分母就相 当于 ,是用来进行对比的噪声。
因此,我们就可以根据NCE中提供的思路,将问题转换为一个二分类的问题,更具体来解释:
从条件中取出数据称为“正样本”,它是根据上下文 所做出的预测数据,将它和这个上下文一起组成“正样本对”,类别标签设为 1。
将从中取出的样本称为“负样本”,它是与当前上下文没有必然关系的随机数据,将它和这个上下文 一起组成“负样本对”,类别标签设为 0。
正样本也就是与 间隔固定步长 的数据,根据 NCE 中说明的设定,正样本选取 1 个;
因为在 NCE 中证明了噪声分布与数据分布越接近越好,所以负样本就直接在当前序列中随机选取(只要不是那一个正样本就行),负样本数量越多越好。
所以要做的就是训练一个 logistics 分类模型,来区分这两个正负样本对。问题转换后,训练的模型能够“成功分辨出每个正负样本的能力”就等价于“根据 预测 的能力”。
根据 NCE 中的设置,现在假设给出一组大小为N的 ,其中包含1个从 中取的正样本和N-1个 中取得负样本。
设 是正样本,上下文表示 之前的数据,那么能够正确的同时找到那一个正样本和和 N-1 个负样本的情况可以写成如下形式:
【相当于把t+k的位置mask】
即
我们最大化上面这个式子,即最大化模型“成功分辨出每个正负样本的能力”,也就是最大化我们定义的密度比,也就是最大化 和 的互信息。
根据(3)式:
在上式中,我们知道 是一个scoring函数,CPC 文章中用余弦相似度来量化,定义为
那么(21)式可化为:
对比(20)和(22),我们可以发现:
现在我们的优化目标就是使(20)或(22) 式的结果最大,所以可以写出对应形式的交叉熵损失如下:
即
上式就是最终得到的 InfoNCE 损失函数了,并且最小化 InfoNCE,也就等价于最大化 和 的互信息的下限,从而做到了我们所要求的最大化 。
为什么最小化InfoNCE等价于最大化 和 的互信息的下限?
证明如下:
对于(20)式,我们可以代入(24),并且,已知,除了 其余均是负样本:
如果正负样本距离能够拉的足够远,那么所有的负样本期望都会在margin 附近,且近乎相等。那么,就有下列式子成立:
代入(19)式即可算出互信息的下限:
在使用 InfoNCE 时把它当作一个对比损失,那么分子上的 表示正样本对, 分母上的 表示负样本对,我们只要构建好正负样本对,然后利用 InfoNCE 的优化过程,就可以使正样本对之间的互信息最大,使负样本对之间的互信息最小了:
[1]Raia Hadsell, Sumit Chopra, and Yann LeCun. 2006. Dimensionality reduction by learning an invariant mapping. In CVPR.
[2]Schroff, F. Kalenichenko, D.and Philbin, J. 2015. Facenet: A unified embedding for face recognition and clustering. In Proc. IEEE Conf. Comput. Vis. Pattern Recognit.
[3] Michael Gutmann and Aapo Hyvärinen. 2010. Noise-contrastive estimation: A new estimation principle for unnormalized statistical models. In Proc. AISTATS.
[4]Andriy Mnih and Y ee Whye Teh. 2012. A fast and simple algorithm for training neural probabilistic language models. In Proc. ICML.
[5]Gutmann, M.U. and Hyv¨ arinen, A. Noise-contrastive estimation of unnormalized statistical models, with applications to natural image statistics. Journal of Machine Learning Research, 13:307–361, 2012.
[6]Aaron van den Oord, Yazhe Li, and Oriol Vinyals. Representation learning with contrastive predictive coding. arXiv preprint arXiv:1807.03748, 2018.
下载1:四件套
在机器学习算法与自然语言处理公众号后台回复“四件套”,
即可获取学习TensorFlow,Pytorch,机器学习,深度学习四件套!
下载2:仓库地址共享
在机器学习算法与自然语言处理公众号后台回复“代码”,
即可获取195篇NAACL+295篇ACL2019有代码开源的论文。开源地址如下:https://github.com/yizhen20133868/NLP-Conferences-Code
重磅!机器学习算法与自然语言处理交流群已正式成立!
群内有大量资源,欢迎大家进群学习!
额外赠送福利资源!深度学习与神经网络,pytorch官方中文教程,利用Python进行数据分析,机器学习学习笔记,pandas官方文档中文版,effective java(中文版)等20项福利资源
获取方式:进入群后点开群公告即可领取下载链接
注意:请大家添加时修改备注为 [学校/公司 + 姓名 + 方向]
例如 —— 哈工大+张三+对话系统。
号主,微商请自觉绕道。谢谢!
推荐阅读: