噪声对比估计

说到噪声对比估计,或者“负采样”,大家可能立马就想到了Word2Vec。事实上,它的含义远不止于此,噪音对比估计(NCE, Noise Contrastive Estimation)是一个迂回但却异常精美的技巧,它使得我们在没法直接完成归一化因子(也叫配分函数)的计算时,就能够去估算出概率分布的参数。本文就让我们来欣赏一下NCE的曲径通幽般的美妙。

指数族分布

在很多问题中都会出现指数族分布,即对于某个变量x的概率p(x),我们将其写成

其中G(x)是x的某个“能量”函数,而

则是归一化常数,也叫配分函数。这种分布也称为“玻尔兹曼分布”。

在机器学习中,指数族分布的主要来源有两个。第一个来源是softmax:我们做分类预测时,通常最后都会将全连接层的结果用softmax激活,这就是一个离散的、有限个点的玻尔兹曼分布了;第二个则是来源于最大熵原理:当我们引入某个特征并且已经能估算出特征的期望时,最大熵模型告诉我们其分布应该是特征的指数形式。

总的来说,指数族分布是非常实用的一类分布,不论是机器学习、数学还是物理领域,都能够碰见它。然而,它却有一个比较大的问题:不容易算,准确来说是配分函数不容易算。

具体来说,不好算的原因可能有两个。一个是计算量太大,比如语言模型(包括Word2Vec)的场景,因为要通过上下文来预测当前词的分布情况,这就需要对几十万甚至几百万项(取决于词表大小)进行求和来算归一化因子,这种情况下不是不能算,而是计算量大到难以承受了;另一种情况是根本算不出来:

NCE

NCE的思想很简单,它希望我们将真实的样本和一批“噪声样本”进行对比,从中发现真实样本的规律出来。

具体来说,能量还是原来的能量G(x;θ),但这时候我们不直接算概率p(x)了,因为归一化因子很难算。我们去算

这里的θ还是原来的待优化参数,而γ则是新引入的要优化的参数。

然后,NCE的损失函数变为

其中p~(x)是真实样本,U(x)是某个“均匀”分布或者其他的、确定的、方便采样的分布。

说白了,NCE的做法就是将它转化为二分类问题,将真实样本判为1,从另一个分布采样的样本判为0。

等价于原来分布

我们将(5)式中的loss改写为

因为p~(x)和U(x)都跟参数θ,γ没关,因此将loss改为下面的形式,不会影响优化结果

其中

(7) 式是KL散度的积分,而KL散度非负,那么当“假设的分布形式是满足的、并且充分优化”时,(7)式应该为0,从而我们有p~(y|x)=p(y|x),也就是

从中可以解得

如果U(x)取均匀分布,那么U(x)就只是一个常数,所以最终的效果表明γ−logU(x)起到了logZ的作用,而分布还是原来的分布(3),θ还是原来的θ。

这就表明了NCE就是一种间接优化(3)式的巧妙方案:看似迂回,实则结果等价,并且(5)式的计算量也大大减少,因为计算量就只取决于采样的数目了。

Word2Vec

现在我们落实到Word2Vec来分析一些事情。以Skip Gram模型为例,Word2Vec的目标是

其中ui,vj都是待优化参数,代表着上下文和中心词的两套不同的词向量空间。显然地,这里的问题就是归一化因子计算量大,其中应对方案有Huffman Softmax和负采样。这里我们不关心Huffman Softmax,只需要知道它就是原来标准Softmax的一种近似就行了。我们来看负采样的,Word2Vec将优化目标变为了:

这个式子看着有点眼花,总之它就是表达了“语料出现的Skip Gram视为正样本,随机采样的词作为负样本”的意思。

首先最明显的是,(12)式相比(4),(5)式,少引入了γ这个训练参数,或者就是说默认了γ=0,这允许吗?据说确实有人做过对比实验,结果显示训练出来的γ确实在0上下浮动,因此这个默认操作基本上是合理的。

其次,对于负样本,Word2Vec可不是“均匀地采样每一个词”,而是按照每个词本身的总词频来采样的。这样一来,(10)式就变成了

也就是说,最终的拟合效果是

大家可以看到,左边就是两个词的互信息!本来我们的拟合目标是两个词的内积等于条件概率p~(wj|wi)(的对数),现在经过负采样的Word2Vec,两个词的内积就是两个词的互信息。

你可能感兴趣的:(噪声对比估计)