概
一种自适应的负样本采样方法.
符号说明
- \(w_{t}^T\) 表示序列 \((w_t, \ldots, w_T)\);
Motivation
-
给定一串文字序列 \(w_1, \ldots, w_T\), 传统的语言模型的任务就是建立这串序列的联合分布:
\[P(w_1^T) = \prod_{t=1}^T P(w_t|w_1^{t-1}), \]这里我们认为每个 word \(w\) 只与前面的 words 有关;
-
即便如此, 依旧难以建模的 (特别是当 \(T\) 很大的时候), 这时惯用的做法是通过截断的方式来逼近:
\[P(w_1^T) = \prod_{t=1}^T P(w_t|w_{t-n+1}^{t-1}), \]即假设仅与前面的 \(n-1\) 个 words 有关;
-
此时, 我们只需要建模出 \(n\) 个 words 的分布即可:
\[P(w_t|w_{t-n+1}^{t-1}) = \frac{P(w_{t-n+1}^t)}{P(w_{t-n+1}^{t-1})}; \] -
作者采用什么方式建模暂且不论, 我们假设获得了目标 word \(w_t\) 和它的历史 words \(h_t=w_{t-n+1}^{t-1}\) 之间的 energy \(\mathcal{E}(w_t, h_t)\), 然后通常我们会采用如下方式去建模条件概率分布 (Boltzmann energy distribution):
\[P(w_t|h_t) = \frac{e^{-\mathcal{E}(w_t, h_t)}}{Z(h_t)}, \: Z(h_t) = \sum_{w \in \mathcal{V}} e^{-\mathcal{E}(w, h_t)}, \]然后通过
\[\tag{1} \min_{\theta}\: -\log P(w_t|h_t) \]的方式来进行优化;
-
但是问题是当 \(\mathcal{V}\) 很大的时候, 即 words 数量很多的时候, 计算 \(Z\) 是很麻烦的一件事情.
本文方法
-
首先, 注意到通过梯度求解的时候, (1) 中的梯度为
\[\nabla_{\theta}(-\log P(x)) = \nabla_{\theta}(\mathcal{E}(x)) - \sum_{x' \in \mathcal{X}} P(x') \nabla_{\theta} (\mathcal{E}(x')) = \nabla_{\theta}(\mathcal{E}(x)) - \mathbb{E}_{P} [\nabla_{\theta'} (\mathcal{E}(x'))], \]故我们现在的任务就是估计
\[\mathbb{E}_{P}[\nabla_{\theta}(\mathcal{E}(x'))]; \] -
一个很自然的想法是从 \(P(x)\) 中采样 \(n\) 个点, 然后
\[\mathbb{E}_{P}[\nabla_{\theta}(\mathcal{E}(x))] \approx \frac{1}{n} \sum_{i=1}^n [\nabla_{\theta}(\mathcal{E}(x_i))], \]但是想要采样的前提必须是知道 \(P\);
-
另一种法子是利用 importance sampling:
\[\mathbb{E}_{P}[\nabla_{\theta}(\mathcal{E}(x))] = \sum_{x \in \mathcal{X}} P(x) \nabla_{\theta} (\mathcal{E}(x)) = \sum_{x \in \mathcal{X}} Q(x) \frac{P(x)}{Q(x)} \nabla_{\theta} (\mathcal{E}(x)) = \mathbb{E}_Q [\frac{P(x)}{Q(x)} \nabla_{\theta} (\mathcal{E}(x))], \]于是我们可以从一个已知的便于采样的分布 \(Q\) 中采样 \(y_1, \ldots, y_n\), 然后
\[\approx \frac{1}{n} \sum_{i=1}^n\frac{P(x_i)}{Q(x_i)} \nabla_{\theta} (\mathcal{E}(x_i)), \]虽然能采样了, 计算规模也降下来了, 但是在不知道 \(Z\) 的前提下, 我们还是没法计算 \(P\) ! 所以很可惜, 这样子还是不行;
-
我们可以用一个有偏的估计, 注意到
\[\tag{2} \begin{array}{ll} \frac{1}{n} \sum_{i=1}^n\frac{P(x_i)}{Q(x_i)} \nabla_{\theta} (\mathcal{E}(x_i)) &=\frac{1}{nZ} \sum_{i=1}^n\frac{e^{-\mathcal{E}(x_i)}}{Q(x_i)} \nabla_{\theta} (\mathcal{E}(x_i)) \\ &=\frac{1}{nZ} \sum_{i=1}^n w(x_i) \nabla_{\theta} (\mathcal{E}(x_i)) \quad \leftarrow w(x_i):= \frac{e^{-\mathcal{E}(x_i)}}{Q(x_i)} \\ &\approx \frac{1}{W} \sum_{i=1}^n w(x_i) \nabla_{\theta} (\mathcal{E}(x_i)) \quad \leftarrow W := \sum_{i=1}^n w(x_i). \\ \end{array} \] -
注意到, 当 \(W \rightarrow +\infty\) 的时候 (\(x_i \sim Q\))
\[\frac{W}{n} = \frac{1}{n} \sum_i w(x_i) \rightarrow \mathbb{E}_Q \frac{e^{-\mathcal{E}(x)}}{Q(x)} = Z \\ \frac{n}{W} \frac{1}{n} \sum_{i=1}^n w(x_i) \nabla_{\theta} (\mathcal{E}(x_i)) \rightarrow \frac{1}{Z} \mathbb{E}_Q [\frac{e^{-\mathcal{E}(x)}}{Q(x)} \nabla_{\theta}(\mathcal{E}(x))] = \mathbb{E}_P [\nabla_{\theta}\mathcal{E}(x)]; \] -
故该方法对应的算法如下:
更简洁的形式
让我们把上述算法的更新写成一个更加简洁的形式 (\(x \sim Q\)):
这里 \(Q\) 就是一个校准的作用, 当然, 它和 \(P\) 越接近是越好的.