作者丨苏剑林
单位丨广州火焰信息科技有限公司
研究方向丨NLP,神经网络
个人主页丨kexue.fm
说到噪声对比估计,或者“负采样”,大家可能立马就想到了 Word2Vec。事实上,它的含义远不止于此,噪音对比估计(NCE, Noise Contrastive Estimation)是一个迂回但却异常精美的技巧,它使得我们在没法直接完成归一化因子(也叫配分函数)的计算时,就能够去估算出概率分布的参数。本文就让我们来欣赏一下 NCE 的曲径通幽般的美妙。
注:由于出发点不同,本文所介绍的“噪声对比估计”实际上更偏向于所谓的“负采样”技巧,但两者本质上是一样的,在此不作区分。
问题起源
问题的根源是难分难舍的指数概率分布。
指数族分布
在很多问题中都会出现指数族分布,即对于某个变量 x 的概率 p(x),我们将其写成:
其中 G(x) 是 x 的某个“能量”函数,而则是归一化常数,也叫配分函数。这种分布也称为“玻尔兹曼分布”。
在机器学习中,指数族分布的主要来源有两个。第一个来源是 softmax:我们做分类预测时,通常最后都会将全连接层的结果用 softmax 激活,这就是一个离散的、有限个点的玻尔兹曼分布了;第二个则是来源于最大熵原理:当我们引入某个特征并且已经能估算出特征的期望时,最大熵模型告诉我们其分布应该是特征的指数形式。
难算的配分函数
总的来说,指数族分布是非常实用的一类分布,不论是机器学习、数学还是物理领域,都能够碰见它。然而,它却有一个比较大的问题:不容易算,准确来说是配分函数不容易算。
具体来说,不好算的原因可能有两个。一个是计算量太大,比如语言模型(包括 Word2Vec)的场景,因为要通过上下文来预测当前词的分布情况,这就需要对几十万甚至几百万项(取决于词表大小)进行求和来算归一化因子,这种情况下不是不能算,而是计算量大到难以承受了。
另一种情况是根本算不出来,比如假设,那么就有:
这积分根本就没法简单地算出来呀,更不用说更加复杂的函数了。现在我们也许能从这个角度感受到为什么高斯分布那么常用了,因为,因为,因为,换个分布就没法算下去了……
在机器学习中,如果只是分类、预测,那么归一化因子算不算出来都无所谓,因为我们只要相对比较取出最大的那个。但是在预测之前,我们还面临着训练的问题,也就是参数估计,具体来说,G(x) 其实是含有一些位置参数 θ 的,准确来说要写成 G(x;θ),那么概率分布就是:
我们要从 x 的样本中推算出 θ 来,通常我们会用最大似然,但是不算出 Z(θ) 来我们就没法算似然函数,也就没法做下去了。