Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add nce_cost example with Readme #43

Merged
merged 8 commits into from
Jun 8, 2017

Conversation

pakchoi
Copy link
Contributor

@pakchoi pakchoi commented May 16, 2017

resolve #6

Copy link
Collaborator

@lcy-seso lcy-seso left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请重写README,太简单了。

TBD
# NCE加速词向量训练
## 背景介绍
在自然语言处理领域中,传统做法通常使用one-hot向量来表示词,比如词典为['我', '你', '喜欢'],可以用[1,0,0]、[0,1,0]和[0,0,1]这三个向量分别表示'我'、'你'和'喜欢'。这种表示方式比较简洁,但是当词表很大时,容易产生维度爆炸问题;而且任意两个词的向量是正交的,向量包含的信息有限。为了避免或减轻one-hot表示的缺点,目前通常使用词向量来取代one-hot表示,词向量也就是word embedding,即使用一个低维稠密的实向量取代高维稀疏的one-hot向量。训练词向量的方法有很多种,神经网络模型是其中之一,包括CBOW、Skip-gram等,这些模型本质上都是一个分类模型,当词表较大即类别较多时,传统的softmax将非常消耗时间。PaddlePaddle提供了Hsigmoid Layer、NCE Layer,来加速模型的训练过程。本文主要介绍如何使用NCE Layer来加速训练,词向量相关内容请查阅PaddlePaddle Book中的[词向量章节](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请不要直接抄其它篇目的一整段。。。

  1. 请解释一下大词表训练的性能瓶颈
  2. 即使是翻译论文的Introduction 部分。这个背景介绍请不要直接复制粘贴已有内容。已有内容请直接加交叉引用。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

在自然语言处理领域中,传统做法通常使用one-hot向量来表示词,比如词典为['我', '你', '喜欢'],可以用[1,0,0]、[0,1,0]和[0,0,1]这三个向量分别表示'我'、'你'和'喜欢'。这种表示方式比较简洁,但是当词表很大时,容易产生维度爆炸问题;而且任意两个词的向量是正交的,向量包含的信息有限。为了避免或减轻one-hot表示的缺点,目前通常使用词向量来取代one-hot表示,词向量也就是word embedding,即使用一个低维稠密的实向量取代高维稀疏的one-hot向量。训练词向量的方法有很多种,神经网络模型是其中之一,包括CBOW、Skip-gram等,这些模型本质上都是一个分类模型,当词表较大即类别较多时,传统的softmax将非常消耗时间。PaddlePaddle提供了Hsigmoid Layer、NCE Layer,来加速模型的训练过程。本文主要介绍如何使用NCE Layer来加速训练,词向量相关内容请查阅PaddlePaddle Book中的[词向量章节](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)。

## NCE Layer
NCE Layer引用自论文\[[1](#参考文献)\],NCE是指Noise-contrastive estimation,原理是通过构造一个逻辑回归(logistic regression),对正样例和负样例做二分类,对于每一个样本,将自身的label作为正样例,同时采样出K个其他的label作为负样例,从而只需要计算样本在这K+1个label上的概率,原始的softmax分类需要计算每个类别的分数,然后归一化得到概率,这个计算过程是十分耗时的。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里写的太简单了。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

关于这里,我一直在考虑怎么表述,这里可以通过公式来表达吗?或者有没有描述比较清楚的文档?

## 训练阶段
训练直接运行``` python train.py ```。程序第一次运行会检测用户缓存文件夹中是否包含imikolov数据集,如果未包含,则自动下载。运行过程中,每1000个iteration会打印模型训练信息,主要包含训练损失,每个pass计算一次测试损失,并会保存一次模型。

## 预测阶段
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NCE 预测没有讲清楚。

  1. 为什么训练和预测不一样,要换层?
  2. 怎么共享参数?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

图1. 网络配置结构
</p>

## 训练阶段
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里面没有任何详细的信息。请参考其它demo,

  1. 请参考文本分类,词向量两个PR的写作方式。
  2. 请解释一下NCE层如何使用,几个参数如何设置,如何影响模型的学习效果。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整个训练阶段和预测阶段,请重新修改。

  1. NCE层的使用和参数仍然不够清晰,请列点来表达。
  2. 描述过于口语化,请修改。

@lcy-seso lcy-seso requested a review from xinghai-sun May 18, 2017 04:39
Copy link
Contributor

@xinghai-sun xinghai-sun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 总体感觉用语偏口语化,表述较随意,不严谨,有语病。
  2. NCE的原理是重点,建议用更多的篇幅,更清晰地解释描述。
  3. 使用指导部分(如何使用自有数据,参数如何设置),描述仍不够具体清晰。

辛苦修改!

@@ -1,26 +1,71 @@
# NCE加速词向量训练
## 背景介绍
在自然语言处理领域中,传统做法通常使用one-hot向量来表示词,比如词典为['我', '你', '喜欢'],可以用[1,0,0]、[0,1,0]和[0,0,1]这三个向量分别表示'我'、'你'和'喜欢'。这种表示方式比较简洁,但是当词表很大时,容易产生维度爆炸问题;而且任意两个词的向量是正交的,向量包含的信息有限。为了避免或减轻one-hot表示的缺点,目前通常使用词向量来取代one-hot表示,词向量也就是word embedding,即使用一个低维稠密的实向量取代高维稀疏的one-hot向量。训练词向量的方法有很多种,神经网络模型是其中之一,包括CBOW、Skip-gram等,这些模型本质上都是一个分类模型,当词表较大即类别较多时,传统的softmax将非常消耗时间。PaddlePaddle提供了Hsigmoid Layer、NCE Layer,来加速模型的训练过程。本文主要介绍如何使用NCE Layer来加速训练,词向量相关内容请查阅PaddlePaddle Book中的[词向量章节](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)。
神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 本文NPLM模型也是n-gram, 这里所知的“n-gram传统模型”是特指table-lookup形式的LM?描述上请和book中的 n-gram neural model 区分。并且请注意,NCE不仅仅用于语言模型,该表述容易让人有歧义。
  2. (NPLM) 改为(Neural Probabilistic Language Model, NPLM)
  3. 性能包括训练效率,“优异的性能”和“漫长的训练时间”前后矛盾?
  4. 使用率低于n-gram, 不仅仅是因为训练缓慢,infer费时也是一个原因。所以最好说训练时间漫长是其中的一个原因。
  5. 词汇--》字典?
  6. 第一次提到”神经概率语言模型“,最好简要描述下是什么样的模型,用来干什么。
  7. 英文和中文之间除非有标点,否则建议增加一个空格,例如n-gram前后增加空格,下同。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

@@ -1,26 +1,71 @@
# NCE加速词向量训练
## 背景介绍
在自然语言处理领域中,传统做法通常使用one-hot向量来表示词,比如词典为['我', '你', '喜欢'],可以用[1,0,0]、[0,1,0]和[0,0,1]这三个向量分别表示'我'、'你'和'喜欢'。这种表示方式比较简洁,但是当词表很大时,容易产生维度爆炸问题;而且任意两个词的向量是正交的,向量包含的信息有限。为了避免或减轻one-hot表示的缺点,目前通常使用词向量来取代one-hot表示,词向量也就是word embedding,即使用一个低维稠密的实向量取代高维稀疏的one-hot向量。训练词向量的方法有很多种,神经网络模型是其中之一,包括CBOW、Skip-gram等,这些模型本质上都是一个分类模型,当词表较大即类别较多时,传统的softmax将非常消耗时间。PaddlePaddle提供了Hsigmoid Layer、NCE Layer,来加速模型的训练过程。本文主要介绍如何使用NCE Layer来加速训练,词向量相关内容请查阅PaddlePaddle Book中的[词向量章节](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)。
神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。
NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法,一种新的连续分布估计方法。这里我们使用了ptb数据来训练神经语言模型,并表明它减少了训练时间超过一个数量级, 而不影响所产生的模型的质量。该算法比重要性采样更有效而且更稳定, 因为它需要的噪音样本要少得多\[[1](#参考文献)\]。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 连续分布还是离散分布?
  2. 去掉”所产生的“
  3. ”重要性采样“,专有名词的出现,请加参考论文。
  4. ”需要的噪音样本“容易有歧义,”噪音“不被需要。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

## 数据准备
### PTB数据
本文采用Penn Treebank (PTB)数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)),共包含train、valid和test三个文件。其中使用train作为训练数据,valid作为测试数据。本文训练的是5-gram模型,即用每条数据的前4个词来预测第5个词。PaddlePaddle提供了对应PTB数据集的python包[paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py) ,自动做数据的下载与预处理。预处理会把数据集中的每一句话前后加上开始符号\<s>以及结束符号\<e>,然后依据窗口大小(本文为5),从头到尾每次向右滑动窗口并生成一条数据。如"I have a dream that one day"可以生成\<s> I have a dream、I have a dream that、have a dream that one、a dream that one day、dream that one day \<e>,PaddlePaddle会把词转换成id数据作为预处理的输出。
NCE Layer引用自论文\[[1](#参考文献)\],NCE是指Noise-contrastive estimation,目的是用来提高训练速度并改善所得词向量的质量。与h-sigmoid[[2](#参考文献)\]相比,NCE不再使用复杂的Huffman树来构造目标函数,而是采用相对简单的随机负采样,这样能够大幅度提升计算性能。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Noise-contrastive estimation (NCE) [1]
  2. h-sigmoid 首次使用,最好用全称,较为正式
  3. ”这样能够大幅度提升计算性能“ 避免口语化,建议”以大幅提升计算效率”。其他地方也请注意避免口语化。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。
NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法,一种新的连续分布估计方法。这里我们使用了ptb数据来训练神经语言模型,并表明它减少了训练时间超过一个数量级, 而不影响所产生的模型的质量。该算法比重要性采样更有效而且更稳定, 因为它需要的噪音样本要少得多\[[1](#参考文献)\]。

## 实验数据
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

数据描述建议放到原理说明后

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法,一种新的连续分布估计方法。这里我们使用了ptb数据来训练神经语言模型,并表明它减少了训练时间超过一个数量级, 而不影响所产生的模型的质量。该算法比重要性采样更有效而且更稳定, 因为它需要的噪音样本要少得多\[[1](#参考文献)\]。

## 实验数据
本文采用Penn Treebank (PTB)数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)),这是一个用来训练语言模型的数据集,给出前4个词让语言模型预测第5个词。PaddlePaddle提供[paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py)接口来方便调用数据,其中实现了数据自动下载,字典生成,滑动窗口等功能。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

对PTB的描述有偏:PTB本身不是用来”给出前4个词让语言模型预测第5个词“,仅仅是这里的n-gram neural language model 这么预处理数据。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done


- **输入层**:ptb的样本由原始的英文单词组成,将每个英文单词转换为字典中的id表示。

- **词向量层**:使用定义好的embedding矩阵,将原先的id表示转换为向量表示。这种将英文单词转换为词向量的方法,比传统的one-hot表示更能体现词语的语义内容,关于词向量的更多信息请参考PaddleBook中的[词向量](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)一节。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

“定义好的” 描述不严谨,它是”tranable“的。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done


- **词向量层**:使用定义好的embedding矩阵,将原先的id表示转换为向量表示。这种将英文单词转换为词向量的方法,比传统的one-hot表示更能体现词语的语义内容,关于词向量的更多信息请参考PaddleBook中的[词向量](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)一节。

- **词向量拼接层**:将词向量进行并联,就是将向量沿feature边依次拼接在一起形成一个矩阵。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

向量拼接是指收尾相连,形成一个长向量,非矩阵。同时这里的描述过于口语化。
feature --》 注意不要随意使用英文,能用中文则使用中文,有必要时可括号注明对应英文。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done


- **词向量拼接层**:将词向量进行并联,就是将向量沿feature边依次拼接在一起形成一个矩阵。

- **全连接隐层**:将上一层获得的词向量矩阵输入一层隐层的神经网络,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

后面的描述没有任何信息量。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done


- **全连接隐层**:将上一层获得的词向量矩阵输入一层隐层的神经网络,

- **NCE层**:推断时,输出层的神经元数量和样本的类别数一致,在这里就是整个字典的大小,最后使用softmax对每个类别的概率做一个归一化操作,因此第$i$个神经元的输出就可以认为是样本属于第$i$类的预测概率。训练时,我们需要构造一个二分类分类器,万幸的是paddle已经帮助我们实现了这一切。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. ”万幸的是paddle已经帮助我们实现了这一切。“ 请避免口语化。
  2. 请更为严谨的表达在train和infer时,NCE层的不同。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

图1. 网络配置结构
</p>

## 训练阶段
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整个训练阶段和预测阶段,请重新修改。

  1. NCE层的使用和参数仍然不够清晰,请列点来表达。
  2. 描述过于口语化,请修改。

Copy link
Collaborator

@lcy-seso lcy-seso left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

README需要重写。

@@ -1 +1,71 @@
TBD
# NCE加速词向量训练
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NCE 在标题里改成中文。

使用噪声对比估计加速词向量训练。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

TBD
# NCE加速词向量训练
## 背景介绍
神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。
Copy link
Collaborator

@lcy-seso lcy-seso May 22, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. NPLM ,请在第一次出现的时候给英文全词拼接 + 逗号 + 英文缩写
  2. 但是其使用率仍然远远低于n-gram传统模型的使用 --> 这句话不通顺
  3. 这一段话请重写。
    • 神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。----> 请不要立这样简单粗暴的结论。
    • 因为softmax需要全局的计算,必须考虑词汇中的所有单词。 --> 这句话没有信息量,什么叫“全局计算”,请保证在技术上是精确无歧义,可以被任何读者理解的。“全局计算”教科书和通用的技术文献中,不是一个广泛被接受的技术上精确的概念,请展开来解释。

Copy link
Contributor Author

@pakchoi pakchoi May 22, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

多谢指点~~
3.1 不是个人观点,是论文:A Fast and Simple Algorithm for Training Neural Probabilistic Language Models 摘要中的内容,考虑严谨性,已经删去。
问题done

# NCE加速词向量训练
## 背景介绍
神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。
NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法,一种新的连续分布估计方法。这里我们使用了ptb数据来训练神经语言模型,并表明它减少了训练时间超过一个数量级, 而不影响所产生的模型的质量。该算法比重要性采样更有效而且更稳定, 因为它需要的噪音样本要少得多\[[1](#参考文献)\]。
Copy link
Collaborator

@lcy-seso lcy-seso May 22, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请务必保证技术的精确性和可推敲性。

  1. NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法

    • NCE 并不是专门为了训练LM而出现的,它涵盖的范围超过LM,请不要将它与LM强绑定在一起。
    • NCE 不是一种“快速简便的训练 NPLM 的算法” 这个结论会令人误解。
    • 快速简便的训练 --> 地,请区分 “的“”地“”得“。
  2. 并表明它减少了训练时间超过一个数量级, --> 我并没有在下文看到有所表明。

  3. 而不影响所产生的模型的质量 --> ”模型的质量“是如何度量的?请不要在没有给出数据的情况下,给出这种结论。这些近似估计都是有某些性能损失的。

  4. 因为它需要的噪音样本要少得多 --> 行文至此,”噪声样本“是一个前置概念。作为读者,至此我并不了解什么是噪音样本,在NCE里面有什么作用,为什么”噪音样本要少得多“ NCE 就比重要性采样效果好?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

多谢指点~~
3 不是个人观点,是论文:A Fast and Simple Algorithm for Training Neural Probabilistic Language Models 摘要中的内容,考虑严谨性,已经删去。
其他done

本文采用Penn Treebank (PTB)数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)),这是一个用来训练语言模型的数据集,给出前4个词让语言模型预测第5个词。PaddlePaddle提供[paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py)接口来方便调用数据,其中实现了数据自动下载,字典生成,滑动窗口等功能。

## NCE Layer
NCE Layer引用自论文\[[1](#参考文献)\],NCE是指Noise-contrastive estimation,目的是用来提高训练速度并改善所得词向量的质量。与h-sigmoid[[2](#参考文献)\]相比,NCE不再使用复杂的Huffman树来构造目标函数,而是采用相对简单的随机负采样,这样能够大幅度提升计算性能。
Copy link
Collaborator

@lcy-seso lcy-seso May 22, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. NCE是指Noise-contrastive estimation --> 请在第一次出现技术名词的时候给出全词和缩写,这里不要重复解释。
  2. 目的是用来提高训练速度并改善所得词向量的质量。
    • 我不认为NCE能”改善所得词向量的质量“
    • 这个质量是怎么度量的?有没有参考文献?有没有自己测试的数据呢?
  3. NCE不再使用复杂的Huffman树来构造目标函数,而是采用相对简单的随机负采样,这样能够大幅度提升计算性能。
    • hsigmoid没有使用Huffman 树,而是直接构建了一棵平衡二叉树。
    • 相对简单的随机负采样,怎么简单?采样什么?怎采样?对学习效果一点影响都没有吗?采样有没有什么指导建议?
    • 最后一句话,不如放在介绍完NCE之后来比较。

Copy link
Contributor Author

@pakchoi pakchoi May 22, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 引用于word2vec中的数学原理详解,考虑严谨性已经删去。
3 引用于word2vec中的数学原理详解,是否需要保留?不排除引用文的错误

## NCE Layer
NCE Layer引用自论文\[[1](#参考文献)\],NCE是指Noise-contrastive estimation,目的是用来提高训练速度并改善所得词向量的质量。与h-sigmoid[[2](#参考文献)\]相比,NCE不再使用复杂的Huffman树来构造目标函数,而是采用相对简单的随机负采样,这样能够大幅度提升计算性能。

NCE原理是通过构造一个逻辑回归(logistic regression),对正样例和负样例做二分类,对于每一个样本,将自身的预测词label作为正样例,同时采样出K个其他词label作为负样例,从而只需要计算样本在这K+1个label上的概率。整体目标函数的目的就是增大正样本的概率同时降低负样本的概率。相比原始的softmax分类需要计算每个类别的分数,然后归一化得到概率,这个计算过程是十分耗时的。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ”NCE原理是通过构造一个逻辑回归(logistic regression),对正样例和负样例做二分类,对于每一个样本,将自身的预测词label作为正样例,同时采样出K个其他词label作为负样例,从而只需要计算样本在这K+1个label上的概率。“ --> 请调整说话/行文的顺序,概念和定义先行,其后才是基于概念/定义描述流程。

  • 为什么NCE这样的估计方式可以近似逼近Softmax?复采样多少的时候近似效果比较好?

  • 这里对比了softmax,上文对比hsigmoid,这些对比请放在一起,否则逻辑是分散散乱的。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

关于问题2 ,负采用个数这是一个经验性问题,本人并没有大量地做过实验,不敢下结论。我找下相关文献,然后添加进来。
其他问题done

## 网络结构
**模型的总体结构:**

本文通过训练N-gram语言模型来获得词向量,具体地使用前4个词来预测当前词。网络输入为词在字典中的id,然后查询词向量词表获取词向量,接着拼接4个词的词向量,然后接入一个全连接隐层,最后是NCE Layer层。详细网络结构见图1:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. N-gram语言模型来获得词向量 --> 如果不不准备解释这个模型的细节,请引导至BOOK。
  2. 请把流程描述变成以 1. 2. 3 这样以序号引导的步骤

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

## 训练阶段
训练直接运行``` python train.py ```。程序第一次运行会检测用户缓存文件夹中是否包含imikolov数据集,如果未包含,则自动下载。运行过程中,每1000个iteration会打印模型训练信息,主要包含训练损失,每个pass计算一次测试损失,并会保存一次模型。

在PaddlePaddle中也有已经实现好的nce layer,这里有一些参数需要自行根据实际场景进行设计,例如param\_attr和bias\_attr这两个参数,这是用来设置参数名字,这是为了后面预测阶段好来实现网络的参数共享,具体内容下一个章节里会称述。num\_neg\_samples参数负责控制对负样例的采样个数,同时也是相对正样例的采样倍数。neg\_distribution可以控制生成负样例标签的分布,默认是一个均匀分布。act参数表示激活函数,根据NCE的原理,这里应该使用sigmoid函数。
Copy link
Collaborator

@lcy-seso lcy-seso May 22, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 在PaddlePaddle中也有已经实现好的nce layer --> PaddlePaddle中的NCE layer。全文请统一, NCE这个简写出现时,全部用大写。
  2. 称述 --> 陈述
  3. 例如param_attr和bias_attr这两个参数,这是用来设置参数名字,这是为了后面预测阶段好来实现网络的参数共享
    • 口语化太严重。改为:例如: param_attr设置了参数名字,因为,……
    • 为什么后面预测阶段好来实现网络的参数共享,请不要直接抛出这样的概念/做法,请统筹行文的逻辑,给出原因。
  4. 同时也是相对正样例的采样倍数。 ----> 这句话没懂
  5. 请把每一个要解释的点用 list 列表的形式列清楚,保证条理性
  6. 口语化太严重,请重新完善

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

在PaddlePaddle中也有已经实现好的nce layer,这里有一些参数需要自行根据实际场景进行设计,例如param\_attr和bias\_attr这两个参数,这是用来设置参数名字,这是为了后面预测阶段好来实现网络的参数共享,具体内容下一个章节里会称述。num\_neg\_samples参数负责控制对负样例的采样个数,同时也是相对正样例的采样倍数。neg\_distribution可以控制生成负样例标签的分布,默认是一个均匀分布。act参数表示激活函数,根据NCE的原理,这里应该使用sigmoid函数。

## 预测阶段
预测直接运行``` python infer.py ```,程序会首先load最新模型,然后按照batch方式进行预测,并打印预测结果。预测阶段最重要的就是共享NCE layer中的逻辑回归训练得到的参数,因为PaddlePaddle里的NCE层并不支持直接用在预测时进行输出,所以必须自己重新写一个推断层,推断层的参数为训练时的参数,所以需要参数共享。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • 因为PaddlePaddle里的NCE层并不支持直接用在预测时进行输出,所以必须自己重新写一个推断层,推断层的参数为训练时的参数,所以需要参数共享。
    1. 不是因为Paddle不支持,是因为训练和预测计算逻辑本来就不一样
    2. 不是”必须自己重新写“,而是只需要换层+参数共享,这和重写不一样。
    3. ”重新写一个推断层“这种表述让人会问:怎么写?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

## 预测阶段
预测直接运行``` python infer.py ```,程序会首先load最新模型,然后按照batch方式进行预测,并打印预测结果。预测阶段最重要的就是共享NCE layer中的逻辑回归训练得到的参数,因为PaddlePaddle里的NCE层并不支持直接用在预测时进行输出,所以必须自己重新写一个推断层,推断层的参数为训练时的参数,所以需要参数共享。

参数分享的方法,通过paddle.attr.Param方法获取参数值,并参数值传入paddle.layer.trans\_full\_matrix\_projection对隐层输出向量hidden\_layer做一个矩阵右乘,从而得到最后的类别向量,将类别向量输入softmax做一个归一操作,从而得到最后的类别概率分布。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 分享-->共享
  2. 通过paddle.attr.Param方法获取参数值,并参数值传入 --> 没有获取参数这个步骤,直接硬性指定参数名
  3. 配置里为什么引入了transpose_full_matrix_projection 这里没解释。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 Paddle会自行在模型寻找这个参数名的参数,并获取,我表达没清楚。。

参数分享的方法,通过paddle.attr.Param方法获取参数值,并参数值传入paddle.layer.trans\_full\_matrix\_projection对隐层输出向量hidden\_layer做一个矩阵右乘,从而得到最后的类别向量,将类别向量输入softmax做一个归一操作,从而得到最后的类别概率分布。

代码实现如下:

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请在解释NCE 参数的时候贴这段代码,然后针对代码一一解释。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感谢 @lcy-seso 的悉心指导,辛苦了~~


$$
{ P }^{ h }(D=1|w,\theta )=\frac { { P }_{ \theta }^{ h }(w) }{ { P }^{ h }_{ \theta }(w)+k{ P }_{ n }(w) } =\sigma (\Delta { s }_{ \theta }^{ }(w,h))
$$
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个公式太长了,在github中无法显示。19行和22行的公式都是同样的问题。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

在我本地上显示并没有问题啊?要不要换成图片?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done. 将公式简化,可以解决这个问题

Copy link
Collaborator

@lcy-seso lcy-seso left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM and I will further refine this demo.

@lcy-seso lcy-seso merged commit a2f2a56 into PaddlePaddle:develop Jun 8, 2017
wojtuss pushed a commit to wojtuss/models that referenced this pull request Mar 4, 2019
Deleted unnecessary mkldnn parameter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

example configuration for nce_cost.
4 participants