再看NCE

概率语言模型,如最大熵模型和概率神经模型,在参数估计时,都有计算量大的问题,词汇表实在是太大了。这让配分函数的计算量大得就想优化它。

只看NCE和Negative Sampling(以下简写为NS),就不说其他的方法了。

NCE和NS刚接触时,看着好像一样一样的。再看,还真是大意了,不够严谨。(废话真多)

标准开头

假设以下是一个模型,根据上下文 \(c\) 预测词表 \(V\) 中的词 \(w\)\[ p_{\theta}(w \mid c)=\frac{u_{\theta}(w, c)}{\sum_{w^{\prime} \in V} u_{\theta}\left(w^{\prime}, c\right)}=\frac{u_{\theta}(w, c)}{Z_{\theta}(c)} \] 假设 \(u_\theta = \exp(s_\theta(w, c))\)\(Z_\theta(c)\)自然是配分函数。\(s_\theta\) 假设是一个可微的函数。

如果了解概率图模型,应该见过使用 Importance Sampling + MC 的方式近似配分函数的期望的法子。NCE走得就是这条路,只是稍稍改进了些。

其他定义:

经验分布表示为 \(\hat{p}(w|c)\)\(\hat{p}(c)\)

模型表示的分布\(p_\theta(w|c)\)

NCE的目的就是通过一个 噪声分布 \(q(w)\) (w的均匀分布,也可以是对每个概率取幂0< α <1和再normalize得到),得到配分函数的渐进无偏估计。

NCE

方法:通过建立二分类模型,区分来自经验分布(训练数据)和噪声分布的数据,得到最优的模型参数,就是需要的参数求解结果。

数据生成

Label d = {0,1},表示数据属于噪声或者真实数据。分布表示为: \[ p(d, w \mid c)=\left\{\begin{array}{ll} \frac{k}{1+k} \times q(w) & \text { if } d=0 \\ \frac{1}{1+k} \times \tilde{p}(w \mid c) & \text { if } d=1 \end{array}\right. \] 转换成 d 关于 c 和 w 的条件分布(定义直接推导): \[ \begin{aligned} p(d=0 \mid c, w) &=\frac{\frac{k}{1+k} \times q(w)}{\frac{1}{1+k} \times \tilde{p}(w \mid c)+\frac{k}{1+k} \times q(w)} \\ &=\frac{k \times q(w)}{\tilde{p}(w \mid c)+k \times q(w)} \\ p(d=1 \mid c, w) &=\frac{\tilde{p}(w \mid c)}{\tilde{p}(w \mid c)+k \times q(w)} \end{aligned} \] 以上是构建的"proxy corpus"代理的训练数据分布,那么把模型拟合的分布\(p_\theta(w|c)\)带入,替换掉经验分布 \(\hat{p}(w|c)\),就可以得到一个可以操作的目标。

方法

但是,\(\hat{p}(w|c)\)还是有 \(Z_\theta(c)\) 啊,这不相当于构造这么多都白干了?

所以NCE继续改进,将 \(Z_\theta(c)\) 整体但做一个关于 c 的参数,参数化。然后一通操作,发现在神经网络模型这种参数巨多的情况下,将 \(Z_\theta(c)\) 直接设为 1 ,反而是一种有效且高效的做法,文章里叫做 self-normalized。

所以,得到的关于 参数 \(\theta\) 的分布表示为: \[ \begin{aligned} p(d=0 \mid c, w) &=\frac{k \times q(w)}{u_{\theta}(w, c)+k \times q(w)} \\ p(d=1 \mid c, w) &=\frac{u_{\theta}(w, c)}{u_{\theta}(w, c)+k \times q(w)} \end{aligned} \] 直接操作掉了求和配分项。目标也变成了一个二分类: \[ \mathcal{L}_{\mathrm{NCE}_{k}}=\sum_{(w, c) \in \mathcal{D}}\left(\log p(d=1 \mid c, w)+k \mathbb{E}_{\bar{w} \sim q} \log p(d=0 \mid c, \bar{w})\right) \] 只是,其中求期望的部分需要所有单词在噪声分布下求值,得到期望,这显然是低效的。简单的办法,直接MC,期望转Sampling: \[ \begin{aligned} \mathcal{L}_{\mathrm{NCE}_{k}}^{\mathrm{MC}} &=\sum_{(w, c) \in \mathcal{D}}\left(\log p(d=1 \mid c, w)+k \times \sum_{i=1, \bar{w} \sim q}^{k} \frac{1}{k} \times \log p(d=0 \mid c, \bar{w})\right) \\ &=\sum_{(w, c) \in \mathcal{D}}\left(\log p(d=1 \mid c, w)+\sum_{i=1, \bar{w} \sim q}^{k} \log p(d=0 \mid c, \bar{w})\right) \end{aligned} \]

可以证明(求极值点嘛,再分析一波k趋于无穷的极限),这个目标函数的最优时,就是模型所表示的分布和经验分布匹配的时候。

NS(Negative Sampling)

word2vec使用过的方法,直接可以写出目标条件分布: \[ \begin{array}{l} p(d=0 \mid c, w)=\frac{1}{u_{\theta}(w, c)+1} \\ p(d=1 \mid c, w)=\frac{u_{\theta}(w, c)}{u_{\theta}(w, c)+1} \end{array} \] 可以看成 k = |V| 且 q 为均匀分布的NCE特殊情况。在分析一次像 \(\mathcal{L}_{\mathrm{NCE}_{k}}\) 的损失函数,或者是hinge loss形式的损失函数,求导分析极值,可以发现它最优时,模型所表示的分布和经验分布并不匹配,可以不一致。

也就是说,NS虽然在word2vec训练时,可以学习到word的representation,但是它并不适用于语言模型等更general的情景。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!