Noise Contrastive Estimation 前世今生——从 NCE 到 InfoNCE
0
『前言』
作为刚入门自监督学习的小白,在阅读其中 Contrastive Based 方法的自监督论文时,经常会看到 InfoNCE 这个 loss(在 CPC 的论文中提出),之前只知道它的思想来自于 NCE 以及代表什么含义,但是对其背后的理论推导、以及如何从 NCE 迁移到 InfoNCE 的不太清楚,因此这篇文章就是通过理论推导和自己的理解来对 NCE 和 InfoNCE 的来龙去脉有个了解。(这篇文章着重于原理,因此公式和推导较多)
1
『从 NLP 入手』
1.1 背景
NCE,也就是 Noise Contrastive Estimation(噪声对比估计), 在 [2] 这篇论文中被提出,但是这篇论文的阐述的不太便于理解,并且论文中估计的是概率密度函数(pdf, probability density function)。而 NLP 中的 word 或 vision 中的 pixel 都是离散的,且我们感兴趣的是的概率质量函数(pmf, probability mass function),因此我主要参考了 [4] 这篇论文,它就是在使用 NCE 时假设了离散分布,并用 pmf 代替其中 pdf,然后将 NCE 应用到 NLP 领域。(我对 NLP 领域不是很了解,所以部分阐述方式可能会不严谨)。
1.2 n-gram
语言模型 (language model) 就是假设一门语言所有可能的句子服从一个概率分布, 每个句子出现的概率加起来是1, 那么语言模型的任务就是预测每个句子在语言中出现的概率。如果把句子 看成单词 的序列 , 那么语言模型就是建模一个 来计算这个句子 出现的概率, 直观上我们要得到这个语言模型, 基于链式法则可以表示为每个单词出现的条件概率的乘积, 我们将条件概率的条件 称为单词 的上下文, 用 表示。
可以看到, language model 就是条件概率 的集合, 但是直接计算每个 在语料库中的条件概率是需要很大计算量的。因此在统计语言模型中, 引入了马尔可夫假设, 即"一个词出现的概率只与它前面出现的有限的一个或者 个词有关", 将这 个词称为一个 gram, 这就是著名的 gram 模型,因此可以将模型简化为:
1.3 最大似然估计
上面的 n-gram 构建语言模型的方法实际上就是, 将一个训练语料库中的每个 和它的 (也就 是由前面 个 构成)的条件概率计算出来并储存(实际操作上是统计每个gram出现的次数), 然后下一次计算某个句子的出现的概率时, 即 (2) 式, 就在存储中找到这个句子中出现的 和 的条件概率,然后乘起来即可。
因此, 我们是否可以不事先计算并存储每个 和 条件概率, 而是建立一个模型(或者说函数), 给这个模型一组 和 就能输出它们的条件概率。
在机器学习领域有一个方法是:对所要考虑的问题建模后为其构造一个目标函数,然后对这个目标函数进行优化,从而求得一组最优的参数,最后利用这组最优参数对应的模型进行预测,也就是最大似然估计。
在建模统计语言模型时,利用最大似然估计,根据 (1) 式目标函数,我们可以写出其对数似然函数如下:
然后最大化对数似然函数 , 实际上这样就是将 看成 和 的函数, 为待定参数集:
这样一旦最优参数集 可以确定, 函数 就被唯一确定, 那么对于任何概率 都可以用函 数 来计算了。
1.4 神经概率语言模型
上面的方法似然看起来很美好,但其中有两个问题:
如何构造一个好的函数 。 最大似然估计虽然理论上简单可行,但对于某些模型,在实际计算时可能需要很大的计算量,因此未必容易。
首先来看第一个问题,这也就是我们为什么引入神经网络,因为神经网络理论上可以表示任何函数,那么通过训练,肯定能找到这个合适的 ,因此 Bengio 等人在 2003 年 A Neural Probabilistic Language Model [8] 中提出了神经概率语言模型(NPLM)。其不在受限于 gram 的大小,可以在包含任意大小上下文的情况下建模 www 的条件概率。
具体来看, 它把语言模型的建立当作一个多分类问题, 我们用 表示一个包含所有单词的单词库, 其大小为 , 将 当成一对训练样本 (实际上 会转换成词向量, 这里不做详解), 通过神经网络后和 softmax 后, 输出一个向量 ,其中每一维 表示上下文为 时 第 个单词 是单词库中第 个单词 的概率, 训练过程要求最后单词库中概率最大的单词就是训练样本对中的 。这样训练结束后, 给神经网络一个上下文 , 神经网络就能预测在当前上下文 时, 下一个单词 是单词库中的各个词的概率 , 通过这个我们也就可以构建语言模型。
我们知道, 这种方法本质上就是拟合一个 和 的函数 , 或者说建立一个参数集为 条件概率分布 , 只要给出当前上下文 , 我们就能够直接计算下一个单词 的概率。
假设输入到 softmax 前的结果用 表示, 实际上 是有含义的, 它是一个 socring function, 输出的分数用来量化 在上下文 中匹配性, 那么 条件概率可以表示为以下形式:
式中, 表示下一个单词是这个 在单词库中的概率; 令 表示当前单词库中所有单词的概率的累和, 通常将这一项叫做"配分函数"或"归一化因子"。一般来说, 单词库 的数量是非常巨大的, 因此计算 是非常 昂贵、耗时的一件事,这也就是 NCE 要解决的问题。(见附录1)
如果我们不考虑 的具体形式, 那么 式实际上就可以当作我们在 式中所构造的函 数 的表达式, 既然如此, 那我们接着用 中提到的最大似然估计的方式来试着求解 的参数 。我们将从句子 中取样的 看成经验分布(数据分布) 式中的 可以写成(最大期望算法_百度百科 (baidu.com)):
现在要最大化 , 那么将其关于 求导:
这里解释一下上面到最后一步的转换, 因为 , 其中 为单词库 中所有的单词, 而单词库其中每个单词的概率由 产生, 因此 , 与经验分布 不相关, 所以可以把期望 去掉。
(7) 式结果中的 计算如下:
将 (8)式结果带回 (7) 式中得:
最大似然好像很容易,但是实际上还是绕不开对“归一化常数”的计算,所以就需要 NCE 登场了。
2
『什么是 NCE』
上一节中说明了计算 非常昂贵这个问题需要解决, 一个简单的思路是将 也看出模型的一个参数 来进行训练, 但是这种方法不适合于上面提到的最大似然估计, 因为由 (6) 式可以看出来, 它会直接将 趋于 0 来获得最大似然。因此, 有人提利用这个思想提出了一些不定义 , 直接用 估计模型的方法, 如 contrastive divergence (Hinton, 2002) 和 score matching (Hyvarinen, 2005)。(见附录2)
而 NCE 不同于上面两种方法,它是通过最大化同一个目标函数来估计模型参数 和归一化常数,NCE 的核心思想就是通过学习数据分布样本和噪声分布样本之间的区别,从而发现数据中的一些特性,因为这个方法需要依靠与噪声数据进行对比,所以称为“噪声对比估计(Noise Contrastive Estimation)”。更具体来说,NCE 将问题转换成了一个二分类问题,分类器能够对数据样本和噪声样本进行二分类,而这个分类器的参数 就等价于1.4中我们想要得到 。(见附录3)
现在假设一个特定上下文 的数据分布为 , 我们称从它里面取出的样本为正样本,令类别 ; 而另一个与 无关的噪声分布为 , 我们称从里面取出的样本为负样本,令类别为 。遵循 Gutmann and Hyvrinen (2012) [3] 中的设置, 假设现在取出了 个正样本和 个负样本, 将这些正负样本混合形成一个混合分布 。
我们得到下面这些概率:
所以可以计算后验概率:
我们令负样本和正样本的比例为: ,则有:
现在我们观察 (12) 式, NCE 所做的事情就是将式中的经验分布 替换成概率模型 , 使后验概率成为参数为 的函数。但问题是这样现在这样的形式还是需要计算 , 我们只是将原来问题进行了一定的转换从而引入了噪声分布。为了解决这个问题, NCE 做了两个设定:
一个就是前面提到的, 将 作为一个参数 来进行估计, 相当于引进了一个新的参数。 第二个是, 事实证明(Mnih and Teh, 2012), 对于参数很多的神经网络来说, 我们将 固定为 1 对每个 仍是有效的。
第二个设定, 即减少了参数的数量, 又使模型的输出符合"归一化"的性质(即 ), 是很 合理的, 如果 , 由 式可以得到 ,那么 (12) 式可以写成如下 形式, 即具有参数 的后验概率:
现在我们有了参数为 的二元分类问题, 假设标签 为伯努利分布, 那么很容易写出他的条件对数似然 如下, 实际上在它前面加上负号后, 也就等价于 logistics 分类里的 log loss,或者说交叉嫡损失函数:
而 NCE 的目标函数还需要在 (14)(14)(14) 式的基础上除以正样本的数量 ,即
当数据数量很大时,根据大数定律,上式也可以写成:
要最大化上述对数似然函数,也就是最大化如下目标函数:
NCE 目标函数中的 实际上就是在设置“二分类问题”时,选取的负样本与正样本的比例,通常的做法会默认正样本数量为 1 ,然后将负样本的数量 作为一个手动输入的参数,从而确定这个比例 。在 TensorFlow 的相关源码 中,正样本的数量 num_true 默认值为1,如果设置大于 1,那么会进行一个 1/num_ture 的归一化。
可以看到实际上这个比例 对我们的 NCE 优化是有影响的,所以 NCE 的作者也考虑了什么样的比例 是最好的,我这里就直接说结论了,有兴趣的可以看详细看下这篇论文 Gutmann and Hyvrinen (2012) [3]。
结论是:对于设置的噪声分布 , 我们实际上是希望它尽量接近数据分布 ,否则这个二分类任务就过于简单了,也就无法很好的学到数据特性。而作者通过实验和推导证明(我在第三节中也会简单的证明),当负样本和正样本数量之比 越大,那么我们的 NCE 对于噪声分布好坏的依赖程度也就越小。换句话说,作者建议我们在计算能力运行的条件下,尽可能的增大比值 。也许这也就是大家都默认将正样本数量设置为 1 的原因:正样本至少取要 1 个,所以最大化比值 ,也就是尽可能取更多负样本的同时,将正样本数量取最小值 1。
另外,如果我们希望目标函数不是只针对一个特定的上下文 ,而是使不同的上下文可以共享参数,也就是设置一批上下文的全局目标函数:
到这,NCE 的构建就完成了,总结一下就是:从上下文 c 中取出单词作为正样本,从噪声分布中取出单词作为负样本,正负样本数量比为 1:k ,然后训练一个二分类器,通过一个类似于交叉熵损失函数的目标函数进行训练(如果取正样本数量为 1,那么 (14) 式与 (15) 式等价,NCE 目标函数就等价于交叉熵损失函数)。
3
『NCE 的原理』
上面虽然推导了那么多公式,但实际只是按照 NCE 的思想进行问题的转换,那么这样做究竟是否正确呢?根据附录 3 的描述,直觉上看好像是没有问题的。
我们再看回 (17) 式,我们对它关于 进行求导:
分布对上面的两项进行求导:
将上面两个结果再带回 (19) 式中,并根据前面 的设定, 也就是 :
上一节中我们设定了 , 也就是 , 因此:
这里的参数 依然指的是负样本与正样本数量的比例, 如果我们令 的话, 那么:
可以看到,当 趋于无穷时, (24) 式中 NCE 目标函数的梯度和 (9)式中 MLE 对数似然函数梯度是等价的,也就是说我们通过 NCE 转换后的优化目标,本质上就是对极大似然估计方法的一种近似,并且随着负样本和正样本数量比 的增大,这种近似越精确,这也解释了为什么作者建议我们将 设置的越大越好。
4
『从 NCE 到 InfoNCE』
到目前为止,应该对 NCE 的来龙去脉比较清楚了(公式太多,不知道多少人有耐心看到这里了...)。
InfoNCE 是在 Representation Learning with Contrastive Predictive Coding 这篇论文中提出的,这里不会具体介绍 CPC ,而是着重说明如何借鉴 NCE 的思想提出 InfoNCE 并用于 CPC 中的,如果还不太了解的可以看我的这篇文章 ”对 CPC (对比预测编码) 的理解“。
简单来说,CPC(对比预测编码) 就是一种通过无监督任务来学习(编码)高维数据的特征表示(representation),而通常采取的无监督策略就是根据上下文预测未来或者缺失的信息,NLP 中已经利用这种思想来学习 word 的 representation [1]。
要构建这样的预测任务, 一个方法是直接建模条件生成模型 根据当前上下文 预测 个时刻后的数据 (假设是像文本、语音中那样的序列数据);但作者觉得这样的方法过于针对细节进行重建, 并不是很好, 于是引入了互信息的思想, 认为我们可以通过最大化当前上下文 和要末来的数据 之间的互信息来构建预测任务, 互信息的表示如下:
我们没办法知道 和 之间的联合分布 , 因此要最大化 , 就需要从 入手, 即最大化 。
那么如何训练 呢? 我们可以把这个比例定义为密度比, 那么根据附录3中的思想, 分子 就相当于 , 是我们想得到的目标函数; 分母 就相当于 , 是用来进行对比的参考分布(噪声)。因此, 我们就可以根据 NCE 中提供的思路, 将问题转换为一个二分类的问题, 更具体来解释:
从条件 中取出数据称为"正样本", 它是根据上下文 所做出的预测数据, 将它和 这个上下文一起组成"正样本对", 类别标签设为 1 。 将从 中取出的样本称为"负样本", 它是与当前上下文 没有必然关系的随机数据, 将 它和这个上下文 一起组成“负样本对", 类别标签设为 0 。 正样本也就是与 间隔固定步长 的数据, 根据 NCE 中说明的设定, 正样本选取 1 个; 因为在 NCE 中证明了噪声分布与数据分布越接近越好, 所以负样本就直接在当前序列中随机选取 (只要不是那一个正样本就行), 负样本数量越多越好。
所以要做的就是训练一个 logistics 分类模型, 来区分这两个正负样本对。问题转换后, 训练的模型能够"成功分辨出每个正负样本的能力"就等价于“根据 预测 的能力"。
根据 NCE 中的设置, 现在假设给出一组大小为 的 , 其中包含 1 个从 中取样正样本和 从一个指定分布(用于对比的噪声分布) , 假设第 是正样本, 且 , 上下文 表示 之前的数据, 那么能够正确的同时找到那一个正样本 和 个负样本的情况可以写成如下形式:
我们最大化上面这个式子, 即最大化模型“成功分辨出每个正负样本的能力”, 也就是最大化我们定 义的密度比, 也就是最大化 与 的互信息。
参考 式, 可以写出根据 预测 的形式:
在上式中, 我们知道 是一个 socring function, 输出的分数用来量化 在上下文 中匹 配性; 放在这里 也就是量化对 预测的结果和真实结果的相似程度, CPC 文章中用余弦相似度来量化, 并且将 定义为 , 也就是:
现在对比 两个式子, 这两个式子的目标是一致的, 也就意味着 实际上就 可以作为密度比 的一种表示形式, 它们之间虽不直接等价, 但是含义上是正相关的, 即:
现在我们的优化目标就是使 (26) 或 (28)式的结果最大,所以可以写出对应形式的交叉熵损失如下:
上式就是最终得到的 InfoNCE 损失函数了, 并且最小化 InfoNCE, 也就等价于最大化 和 之间互信息的下限, 从而做到了我们所要求的最大化 , 证明如下,
到底为止,如何从由 NCE 结合互信息的思想构建 (29) 式中的 InfoNCE 也清楚了,现在 InfoNCE 主要用在自监督学习中作为一个对比损失函数,实际上 InfoNCE 的这个思想也是可以作为互信息的一个估计器,在论文中也有证明它和另一个互信息估计器 MINE 之间的关系,这里就不再详细说明了。
在使用 InfoNCE 时把它当作一个对比损失, 那么分子上的 表示正样本对, 分母上的 表示负样本对, 我们只要构建好正负样本对, 然后利用 InfoNCE 的优化过程, 就可以做到 使正样本对之间的互信息最大, 使负样本对之间的互信息最小这件事情了:
5
『后记』
最初目的只是因为看到很多地方直接使用了 InfoNCE(实际上就是 CPC),但没有说明详细的原理,网上除了磊 爷的文章[6]之外,很多都是浮于表面的解释,远不能解答我的疑惑 ,所以作为一个刚入门的小白,我还是想亲自推导一下 InfoNCE 的以及它的来源 NCE 的原理,没想到这个坑越挖越深,最后花的时间远远超出我的预期,主要是网上没有什么相关信息,只能去翻论文导致一堆其他事情没有做....好在最终还是按照我的理解基本弄清楚了(如果有哪里理解错的地方,请告诉我),也不知道这样做有没有意义。
6
『附录 1——NCE 要解决的问题』
实际上NCE 要解决的是归一化参数密度估计问题。
假设现在有一组观测样本 , 它遵循一个末知的参数化概率密度函数 , 参数密度估计问题就是根据观测样本 找到一组最优参数 , 通常使用极大似然估计的方法。对于这个密度函数 的估计还需要满足下面两个约束条件:
如果同时满足上面两个约束条件, 那么称建模的密度函数是归一化的; 如果只满足第 2 个正约束条件, 那么称其末归一化。语言模型中说的 在 NCE 实际上指的就是 partition function, 这里用 表示, 假设 为估计的末归一化模型, 则 , 而将模型归一化的方式就是: 。
而对于 , 除非 的形式特别简单, 否则是没办法写出积分的解析解形式 的, 只能通过数值积分的方法来近似。这种数值积分对于低维问题是有较高的精度的, 但是对于实 际应用中的很多高维问题, 在计算上就是非常昂贵甚至不可接受的。
7
『附录 2——将归一化常数作为参数』
这里解释一下为什么可以将归一化常数作为一个附加的参数。
附录1中提到可以通过 来对 进行归一化, 实际上可以看作对 进行了一定的缩放, 假设归一化后的密度函数为 , 则:
因此我们可以把 当成一个参数 , 也就是:
也就是学习一个参数 , 来对末归一化的 进行大小为 的缩放, 最终达到归一化的效果。
8
『附录 3——用噪声进行对比的直觉』
这里解释一下用噪声的分布进行对比的直觉。
按照 Gutmann and Hyvrinen(2012) [3] 中的解释(如果真的想弄懂 NCE,强烈推荐阅读一下这篇 论文), 估计数据的密度函数 实际上是确定观测数据 的属性, 而这种属性一般需要相对于另一些参考数据(噪声) 的属性来体现(描述)出来的。如果我们参考(噪声)数据 是从概率密度函数为 的分布中独立同分布采样出来的, 相对于 的属性用它们的密度比 来描述。那么如果相对数据 的分布 已知, 也就能通过 获得 的密度函数 。话句话说, 如果我们知道 的属性, 也知道了 和 之间的差异, 那么我们也就知道了 的属性。
所以 NCE 中通过训练一个二分类器来对 和 中的数据进行比较, 为了区分出这两个数据, 分类器就会比较它们属性的不同, 换句话说, 这个二分类也就学到了 和 之间的差异, 而这个差异根据 式的推导, 也确实符合 的形式的, 实际上也就是训练了 logistic 分类器。
参考文献
[1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781, 2013.
[2] Michael Gutmann and Aapo Hyvärinen. 2010. Noise-contrastive estimation: A new estimation principle for unnormalized statistical models. In Proc. AISTATS.
[3] 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.
[4] Andriy Mnih and Y ee Whye Teh. 2012. A fast and simple algorithm for training neural probabilistic language models. In Proc. ICML.
[5] Aaron van den Oord, Yazhe Li, and Oriol Vinyals. Representation learning with contrastive predictive coding. arXiv preprint arXiv:1807.03748, 2018.
[6] Leo Mao. 2019. "Noise-Contrastive-Estimation". [online]. https://leimao.github.io/article/Noise-Contrastive-Estimation/
[7] Dyer, C. (2014). Notes on Noise Contrastive Estimation and Negative Sampling. arXiv:1410.8251 [cs].
[8] Y. Bengio, R. Ducharme, P. Vincent, and C. Jauvin, “A Neural Probabilistic Language Model,” p. 19.
扫描二维码添加小助手微信
关于我们
微信扫码关注该文公众号作者