Skip to content

Commit

Permalink
update introduction for NCE.
Browse files Browse the repository at this point in the history
  • Loading branch information
lcy-seso committed Nov 10, 2017
1 parent ddd3619 commit 757c91b
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 32 deletions.
38 changes: 22 additions & 16 deletions nce_cost/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ $$ P(\omega_1^T) \approx \prod P(\omega_t|\omega_{t-n-1}^{t-1}) \tag{1}$$

$$P_\theta^h(\omega) = \frac{\text{exp}{s_\theta(\omega, h)}}{Z},Z=\sum_{\omega'} \exp{s_\theta(\omega', h)}\tag{2}$$

极大似然估计(MLE,Maximum Likelihood Estimation)是求解概率($2$)最常用的学习准则。然而,不论是估计概率 $P_\theta^h(\omega)$ 还是计算似然(likelihood)的梯度时,都要计算归一化因子$Z$。$Z$ 的计算随着词典大小线性增长,当训练大规模语言模型,例如当词典增长到百万甚至更大级别时,训练时间将变得十分漫长,因此,我们 **需要一种新的学习准则,他的求解过程从计算上应该更加轻便可解。**
极大似然估计(MLE,Maximum Likelihood Estimation)是求解概率($2$)最常用的学习准则。然而,不论是估计概率 $P_\theta^h(\omega)$ 还是计算似然(likelihood)的梯度时,都要计算归一化因子$Z$。$Z$ 的计算随着词典大小线性增长,当训练大规模语言模型,例如当词典增长到百万甚至更大级别时,训练时间将变得十分漫长,因此,我们 **需要一种新的学习准则,他的求解过程从计算上应该更加轻便可解。**

models 的另一篇介绍了使用[Hsigmoid加速词向量训练](https://github.com/PaddlePaddle/models/tree/develop/hsigmoid)这里我们介绍另一种基于采样的加速词向量训练的方法:使用噪声对比估计(Noise-contrastive estimation, NCE)\[[1](#参考文献)\]
models 的另一篇介绍了使用[Hsigmoid加速词向量训练](https://github.com/PaddlePaddle/models/tree/develop/hsigmoid)这里我们介绍另一种基于采样的提高语言模型训练速度的方法:使用噪声对比估计(Noise-contrastive estimation, NCE)\[[1](#参考文献)\]

## 什么是噪声对比估计

Expand All @@ -31,40 +31,48 @@ $$P(D=1|h,\omega) = \frac{P_\theta(h, \omega)}{P_\theta (h, \omega) + kP_n} \tag

$$P(D=1|h,\omega) \triangleq \sigma (\Delta s_\theta(w,h)) \tag{4}$$

有了上面的问题定义之后,我们就可以基于二分类来进行极大似然估计,增大正样本的概率同时降低负样本的概率[[2](#参考文献)],也就是最小化下面这样一个损失函数:
有了上面的问题设置后,便可以基于二分类来进行极大似然估计:增大正样本的概率同时降低负样本的概率[[2,3](#参考文献)],也就是最小化下面这样一个损失函数:

$$
J^h(\theta )=E_{ P_d^h }\left[ \log { P^h(D=1|w,\theta ) } \right] +kE_{ P_n }\left[ \log P^h (D=0|w,\theta ) \right]$$
$$
\\\\\qquad =E_{ P_d^h }\left[ \log { \sigma (\Delta s_\theta(w,h)) } \right] +kE_{ P_n }\left[ \log (1-\sigma (\Delta s_\theta(w,h))) \right] \tag{5}$$

式($5$)便是基于噪声对比估计定义的NCE损失函数。
式($5$)便是基于噪声对比估计而定义的NCE损失函数。我们还剩下两个问题:
1. 式($5$)中的 $s_\theta(w,h)$ 是什么?
- 在神经网络的实现中,$s_\theta(h,\omega)$ 是未归一化的分值。
- NCE cost 层可学习参数 $W$ 是一个 $|V| \times d$ 维度的矩阵,$|V|$ 是词典大小,$d$ 是上下文向量$h$的维度;
- 训练时下一个词的真实类别$t$是正类,从指定的噪声分布中采样 $k$ 个负类样本它们的类别分分别记作: $\{n_1, ..., n_k\}$;
- 抽取 $W$ 中第 $\{t, n_1, ..., n_k\}$ 列(共计 $k + 1$ 行)分别与 $h$ 计算分值 $s_\theta(w,h)$ ,再通过($5$)式计算最终的损失;
2. 噪声分布如何选择?
- 实践中,可以任意选择合适的噪声分布(噪声分布暗含着一定的先验)。
- 最常用选择有:使用基于全词典之上的`unigram`分布(词频统计),无偏的均匀分布。
- 在PaddlePaddle中用户如果用户未指定噪声分布,默认采用均匀分布。

实践中,可以任意选择合适的噪声分布(噪声分布暗含着一定的先验),最常用选择有:使用基于全词典之上的`unigram`分布(词频统计),无偏的均匀分布。在PaddlePaddle中用户如果用户未指定噪声分布,默认采用均匀分布。

简单来讲,NCE 是通过构造逻辑回归(logistic regression),对正样例和负样例做二分类,对于每一个样本,将自身的预测词 label 作为正样例,同时采样出 $k$ 个其他词 label 作为负样例,从而只需要计算样本在这 $k+1$ 个 label 上的概率。相比原始的 `softmax ` 分类需要计算每个类别的分数,然后归一化得到概率,节约了大量的计算时间。
可以看到,使用NCE准确训练时,最后一层的计算代价只与负采样数目线性相关,当负采样数目逐渐增大时,NCE 估计准则会收敛到极大似然估计。因此,在使用NCE准则训练时,可以通过控制负采样数目来控制对归一化的概率分布近似的质量。

## 实验数据
本文采用 Penn Treebank (PTB) 数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)来训练语言模型。PaddlePaddle 提供 [paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py) 接口来方便调用这些数据,如果当前目录没有找到数据它会自动下载并验证文件的完整性。并提供大小为5的滑动窗口对数据做预处理工作,方便后期处理。语料语种为英文,共有42068句训练数据,3761句测试数据。
本例采用 Penn Treebank (PTB) 数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)来训练一个 5-gram 语言模型。PaddlePaddle 提供了 [paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py) 接口来方便地使用PTB数据。当没有找到下载好的数据时,脚本会自动下载并验证文件的完整性。语料语种为英文,共有42068句训练数据,3761句测试数据。

## 网络结构
N-gram 神经概率语言模型详细网络结构见图1:
在 5-gram 神经概率语言模型详细网络结构见图1:

<p align="center">
<img src="images/network_conf.png" width = "70%" align="center"/><br/>
图1. 网络配置结构
图1. 5-gram 网络配置结构
</p>
可以看到,模型主要分为如下几个部分构成:

1. **输入层**:输入的 ptb 样本由原始的英文单词组成,将每个英文单词转换为字典中的 id 表示,使用唯一的 id 表示可以区分每个单词。
模型主要分为如下几个部分构成:

1. **输入层**:输入样本由原始英文单词组成,每个英文单词首先被转换为字典中的 id 表示。

2. **词向量层**比起原先的 id 表示,词向量表示更能体现词与词之间的语义关系。这里使用可更新的 embedding 矩阵,将原先的 id 表示转换为固定维度的词向量表示。训练完成之后,词语之间的语义相似度可以使用词向量之间的距离来表示,语义越相似,距离越近。
2. **词向量层**:id 表示通过词向量层作用得到连续表示的词向量表示,能够更好地体现词与词之间的语义关系。训练完成之后,词语之间的语义相似度可以使用词向量之间的距离来表示,语义越相似,距离越近。

3. **词向量拼接层**:将词向量进行串联,并将词向量首尾相接形成一个长向量。这样可以方便后面全连接层的处理。

4. **全连接隐层**:将上一层获得的长向量输入到一层隐层的神经网络,输出特征向量。全连接的隐层可以增强网络的学习能力。

5. **NCE层**:训练时可以直接实用 PaddlePaddle 提供的 NCE Layer
5. **NCE层**:训练时可以直接实用 PaddlePaddle 提供的 `paddle.layer.nce` 作为损失函数


## 训练
Expand Down Expand Up @@ -139,6 +147,4 @@ NCE 层的一些重要参数解释如下:

1. Mnih A, Kavukcuoglu K. [Learning word embeddings efficiently with noise-contrastive estimation](https://papers.nips.cc/paper/5165-learning-word-embeddings-efficiently-with-noise-contrastive-estimation.pdf)[C]//Advances in neural information processing systems. 2013: 2265-2273.

1. Morin, F., & Bengio, Y. (2005, January). [Hierarchical Probabilistic Neural Network Language Model](http://www.iro.umontreal.ca/~lisa/pointeurs/hierarchical-nnlm-aistats05.pdf). In Aistats (Vol. 5, pp. 246-252).

1. Mnih A, Teh Y W. [A Fast and Simple Algorithm for Training Neural Probabilistic Language Models](http://xueshu.baidu.com/s?wd=paperuri%3A%280735b97df93976efb333ac8c266a1eb2%29&filter=sc_long_sign&tn=SE_xueshusource_2kduw22v&sc_vurl=http%3A%2F%2Farxiv.org%2Fabs%2F1206.6426&ie=utf-8&sc_us=5770715420073315630)[J]. Computer Science, 2012:1751-1758.
38 changes: 22 additions & 16 deletions nce_cost/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@

$$P_\theta^h(\omega) = \frac{\text{exp}{s_\theta(\omega, h)}}{Z},Z=\sum_{\omega'} \exp{s_\theta(\omega', h)}\tag{2}$$

极大似然估计(MLE,Maximum Likelihood Estimation)是求解概率($2$)最常用的学习准则。然而,不论是估计概率 $P_\theta^h(\omega)$ 还是计算似然(likelihood)的梯度时,都要计算归一化因子$Z$。$Z$ 的计算随着词典大小线性增长,当训练大规模语言模型,例如当词典增长到百万甚至更大级别时,训练时间将变得十分漫长,因此,我们 **需要一种新的学习准则,他的求解过程从计算上应该更加轻便可解。**
极大似然估计(MLE,Maximum Likelihood Estimation)是求解概率($2$)最常用的学习准则。然而,不论是估计概率 $P_\theta^h(\omega)$ 还是计算似然(likelihood)的梯度时,都要计算归一化因子$Z$。$Z$ 的计算随着词典大小线性增长,当训练大规模语言模型,例如当词典增长到百万甚至更大级别时,训练时间将变得十分漫长,因此,我们 **需要一种新的学习准则,他的求解过程从计算上应该更加轻便可解。**

models 的另一篇介绍了使用[Hsigmoid加速词向量训练](https://github.com/PaddlePaddle/models/tree/develop/hsigmoid) ,这里我们介绍另一种基于采样的加速词向量训练的方法:使用噪声对比估计(Noise-contrastive estimation, NCE)\[[1](#参考文献)\]。
models 的另一篇介绍了使用[Hsigmoid加速词向量训练](https://github.com/PaddlePaddle/models/tree/develop/hsigmoid) ,这里我们介绍另一种基于采样的提高语言模型训练速度的方法:使用噪声对比估计(Noise-contrastive estimation, NCE)\[[1](#参考文献)\]。

## 什么是噪声对比估计

Expand All @@ -73,40 +73,48 @@

$$P(D=1|h,\omega) \triangleq \sigma (\Delta s_\theta(w,h)) \tag{4}$$

有了上面的问题定义之后,我们就可以基于二分类来进行极大似然估计,增大正样本的概率同时降低负样本的概率[[2](#参考文献)],也就是最小化下面这样一个损失函数:
有了上面的问题设置后,便可以基于二分类来进行极大似然估计:增大正样本的概率同时降低负样本的概率[[2,3](#参考文献)],也就是最小化下面这样一个损失函数:

$$
J^h(\theta )=E_{ P_d^h }\left[ \log { P^h(D=1|w,\theta ) } \right] +kE_{ P_n }\left[ \log P^h (D=0|w,\theta ) \right]$$
$$
\\\\\qquad =E_{ P_d^h }\left[ \log { \sigma (\Delta s_\theta(w,h)) } \right] +kE_{ P_n }\left[ \log (1-\sigma (\Delta s_\theta(w,h))) \right] \tag{5}$$

式($5$)便是基于噪声对比估计定义的NCE损失函数。
式($5$)便是基于噪声对比估计而定义的NCE损失函数。我们还剩下两个问题:
1. 式($5$)中的 $s_\theta(w,h)$ 是什么?
- 在神经网络的实现中,$s_\theta(h,\omega)$ 是未归一化的分值。
- NCE cost 层可学习参数 $W$ 是一个 $|V| \times d$ 维度的矩阵,$|V|$ 是词典大小,$d$ 是上下文向量$h$的维度;
- 训练时下一个词的真实类别$t$是正类,从指定的噪声分布中采样 $k$ 个负类样本它们的类别分分别记作: $\{n_1, ..., n_k\}$;
- 抽取 $W$ 中第 $\{t, n_1, ..., n_k\}$ 列(共计 $k + 1$ 行)分别与 $h$ 计算分值 $s_\theta(w,h)$ ,再通过($5$)式计算最终的损失;
2. 噪声分布如何选择?
- 实践中,可以任意选择合适的噪声分布(噪声分布暗含着一定的先验)。
- 最常用选择有:使用基于全词典之上的`unigram`分布(词频统计),无偏的均匀分布。
- 在PaddlePaddle中用户如果用户未指定噪声分布,默认采用均匀分布。

实践中,可以任意选择合适的噪声分布(噪声分布暗含着一定的先验),最常用选择有:使用基于全词典之上的`unigram`分布(词频统计),无偏的均匀分布。在PaddlePaddle中用户如果用户未指定噪声分布,默认采用均匀分布。

简单来讲,NCE 是通过构造逻辑回归(logistic regression),对正样例和负样例做二分类,对于每一个样本,将自身的预测词 label 作为正样例,同时采样出 $k$ 个其他词 label 作为负样例,从而只需要计算样本在这 $k+1$ 个 label 上的概率。相比原始的 `softmax ` 分类需要计算每个类别的分数,然后归一化得到概率,节约了大量的计算时间。
可以看到,使用NCE准确训练时,最后一层的计算代价只与负采样数目线性相关,当负采样数目逐渐增大时,NCE 估计准则会收敛到极大似然估计。因此,在使用NCE准则训练时,可以通过控制负采样数目来控制对归一化的概率分布近似的质量。

## 实验数据
本文采用 Penn Treebank (PTB) 数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz))来训练语言模型。PaddlePaddle 提供 [paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py) 接口来方便调用这些数据,如果当前目录没有找到数据它会自动下载并验证文件的完整性。并提供大小为5的滑动窗口对数据做预处理工作,方便后期处理。语料语种为英文,共有42068句训练数据,3761句测试数据。
本例采用 Penn Treebank (PTB) 数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz))来训练一个 5-gram 语言模型。PaddlePaddle 提供了 [paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py) 接口来方便地使用PTB数据。当没有找到下载好的数据时,脚本会自动下载并验证文件的完整性。语料语种为英文,共有42068句训练数据,3761句测试数据。

## 网络结构
N-gram 神经概率语言模型详细网络结构见图1:
在 5-gram 神经概率语言模型详细网络结构见图1:

<p align="center">
<img src="images/network_conf.png" width = "70%" align="center"/><br/>
图1. 网络配置结构
图1. 5-gram 网络配置结构
</p>
可以看到,模型主要分为如下几个部分构成:

1. **输入层**:输入的 ptb 样本由原始的英文单词组成,将每个英文单词转换为字典中的 id 表示,使用唯一的 id 表示可以区分每个单词。
模型主要分为如下几个部分构成:

1. **输入层**:输入样本由原始英文单词组成,每个英文单词首先被转换为字典中的 id 表示。

2. **词向量层**:比起原先的 id 表示,词向量表示更能体现词与词之间的语义关系。这里使用可更新的 embedding 矩阵,将原先的 id 表示转换为固定维度的词向量表示。训练完成之后,词语之间的语义相似度可以使用词向量之间的距离来表示,语义越相似,距离越近。
2. **词向量层**:id 表示通过词向量层作用得到连续表示的词向量表示,能够更好地体现词与词之间的语义关系。训练完成之后,词语之间的语义相似度可以使用词向量之间的距离来表示,语义越相似,距离越近。

3. **词向量拼接层**:将词向量进行串联,并将词向量首尾相接形成一个长向量。这样可以方便后面全连接层的处理。

4. **全连接隐层**:将上一层获得的长向量输入到一层隐层的神经网络,输出特征向量。全连接的隐层可以增强网络的学习能力。

5. **NCE层**:训练时可以直接实用 PaddlePaddle 提供的 NCE Layer
5. **NCE层**:训练时可以直接实用 PaddlePaddle 提供的 `paddle.layer.nce` 作为损失函数


## 训练
Expand Down Expand Up @@ -181,8 +189,6 @@

1. Mnih A, Kavukcuoglu K. [Learning word embeddings efficiently with noise-contrastive estimation](https://papers.nips.cc/paper/5165-learning-word-embeddings-efficiently-with-noise-contrastive-estimation.pdf)[C]//Advances in neural information processing systems. 2013: 2265-2273.

1. Morin, F., & Bengio, Y. (2005, January). [Hierarchical Probabilistic Neural Network Language Model](http://www.iro.umontreal.ca/~lisa/pointeurs/hierarchical-nnlm-aistats05.pdf). In Aistats (Vol. 5, pp. 246-252).

1. Mnih A, Teh Y W. [A Fast and Simple Algorithm for Training Neural Probabilistic Language Models](http://xueshu.baidu.com/s?wd=paperuri%3A%280735b97df93976efb333ac8c266a1eb2%29&filter=sc_long_sign&tn=SE_xueshusource_2kduw22v&sc_vurl=http%3A%2F%2Farxiv.org%2Fabs%2F1206.6426&ie=utf-8&sc_us=5770715420073315630)[J]. Computer Science, 2012:1751-1758.

</div>
Expand Down

0 comments on commit 757c91b

Please sign in to comment.