Noise Contrastive Estimation中,我们详细介绍了 NCE 算法,其实还有很多跟它类似的算法,继续以文本生成为例,基于上下文$\boldsymbol{c}$,要去词表$\mathcal{V}$挑选$\boldsymbol{w}$来生成:

Negative Sampling

其实要说 NCE 的缺点,就是需要花时间调参数,比如说$k$和噪声分布$p_{n}$的选择,而负采样则固定下来这两个参数,不同的负采样对于这两个参数的选择也不尽相同,这里介绍比较简单的一种

我们规定,当$\mathcal{D}=1$时代表从训练集采样,而$\mathcal{D}=0$则代表从噪声中采样,为了表达简便,对$\boldsymbol{c}$进行省略,即$p(\mathcal{D}=1|\boldsymbol{c}, \boldsymbol{w}) = p(\mathcal{D}=1|\boldsymbol{w})$

NCE 会这样求样本来自哪个采样的概率:

$$ \begin{align} p(\mathcal{D}=1|\boldsymbol{w}) & = \frac{p_{\boldsymbol{\theta }}(\boldsymbol{w})}{p_{\boldsymbol{\theta }}(\boldsymbol{w})+kp_{n}(\boldsymbol{w})} \\ p(\mathcal{D}=0|\boldsymbol{w}) & = \frac{kp_{n}(\boldsymbol{w})}{p_{\boldsymbol{\theta }}(\boldsymbol{w})+kp_{n}(\boldsymbol{w})} \end{align} $$

而负采样说,如果词表大小是$|\mathcal{V}|$,不妨就采样$|\mathcal{V}|$个噪声,而且每个噪声是等概率出现的,那么:

$$ \begin{align} p(\mathcal{D}=1|\boldsymbol{w}) & = \frac{p_{\boldsymbol{\theta }}(\boldsymbol{w})}{p_{\boldsymbol{\theta }}(\boldsymbol{w})+1} \\ p(\mathcal{D}=0|\boldsymbol{w}) & = \frac{1}{p_{\boldsymbol{\theta }}(\boldsymbol{w})+1} \end{align} $$

综合上面的式子来看,其实负采样是 NCE 的一种

Importance Sampling

我们记需要计算的分母(配分函数)为$Z(\boldsymbol{\theta })$,注意:$u_{\boldsymbol{\theta}}(\boldsymbol{w}, \boldsymbol{c})=\exp(s_{\boldsymbol{\theta}}(\boldsymbol{w}, \boldsymbol{c}))$$s_{\boldsymbol{\theta}}$为打分函数

$$ p_{\boldsymbol{\theta }}(\boldsymbol{w}|\boldsymbol{c}) = \frac{u_{\boldsymbol{\theta }}(\boldsymbol{w}, \boldsymbol{c})}{\underbrace{ \sum_{\boldsymbol{w}' \in \mathcal{V}}u_{\boldsymbol{\theta }}(\boldsymbol{w}', \boldsymbol{c}) }_{ Z(\boldsymbol{\theta }) }} = \frac{u_{\boldsymbol{\theta }}(\boldsymbol{w}, \boldsymbol{c})}{Z(\boldsymbol{\theta })} $$

那么:

$$ \begin{align} Z(\boldsymbol{\theta }) & = \sum_{\boldsymbol{w}' \in \mathcal{V}} u_{\boldsymbol{\theta }}(\boldsymbol{w}', \boldsymbol{c}) = \sum_{\boldsymbol{w}' \in \mathcal{V}} u_{\boldsymbol{\theta }}(\boldsymbol{w}', \boldsymbol{c}) {\color{#337dff}\frac{p_{n}(\boldsymbol{w}')}{p_{n}(\boldsymbol{w}')}} \\ &= \sum_{\boldsymbol{w}' \in \mathcal{V}} p_{n}(\boldsymbol{w}') \frac{u_{\boldsymbol{\theta }}(\boldsymbol{w}', \boldsymbol{c})}{p_{n}(\boldsymbol{w}')} \\ &= \mathbb{E}_{\boldsymbol{w}' \sim p_{n}} \frac{u_{\boldsymbol{\theta }}(\boldsymbol{w}', \boldsymbol{c})}{p_{n}(\boldsymbol{w}')} \end{align} $$

跟 NCE 不同的是,重要性采样并没有把配分函数当成参数,而是利用噪声数据去拟合它:

$$ p_{\boldsymbol{\theta }}(\boldsymbol{w}|\boldsymbol{c}) = \frac{u_{\boldsymbol{\theta }}(\boldsymbol{w}, \boldsymbol{c})}{Z(\boldsymbol{\theta })} = \frac{u_{\boldsymbol{\theta }}(\boldsymbol{w}, \boldsymbol{c})}{\mathbb{E}_{\boldsymbol{w}' \sim p_{n}} u_{\boldsymbol{\theta }}(\boldsymbol{w}', \boldsymbol{c})/p_{n}(\boldsymbol{w}')} $$

同样地操作,我们可以采样$k$个噪声样本来去近似期望,即:

$$ p_{\boldsymbol{\theta }}(\boldsymbol{w}|\boldsymbol{c}) \approx \frac{u_{\boldsymbol{\theta }}(\boldsymbol{w}, \boldsymbol{c})}{\sum_{i=1}^{k}p_{n}(\boldsymbol{w}_{i})u_{\boldsymbol{\theta }}(\boldsymbol{w}_{i}, \boldsymbol{c})/p_{n}(\boldsymbol{w}_{i})} = \frac{u_{\boldsymbol{\theta }}(\boldsymbol{w}, \boldsymbol{c})}{\sum_{i=1}^{k}u_{\boldsymbol{\theta }}(\boldsymbol{w_{i}}, \boldsymbol{c})} $$

仔细看,其实重要性采样是利用蒙特卡洛采样将分母从一开始的$|\mathcal{V}|$项降低到$k$项,另外还有InfoNCE