Word Embedding
Table of Contents
1. 词向量
自然语言理解的问题要转化为机器学习的问题,第一步是要找一种方法把这些符号数学化。
在众多表式方法中,最直观、最常用的词表示方法是 One-hot 编码,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
比如:“话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …],“麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …],等等。每个词都是茫茫 0 海中的一个 1。
由于每个词对应的向量中仅有一位为 1,也可以直接用非零维度的下标表示,比如刚才的例子中,话筒记为 3,麦克记为 8(假设下标从 0 开始记)。如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。
One-hot 表示方法存在下面缺点:
1、“词汇鸿沟”:任意两个词之间都是孤立的。仅从这两个向量中看不出两个词是否有关系,比如“话筒”和“麦克”是同义词,但从它们的 One-hot 编码中体现不出这一点。
2、“维度灾难”:One-hot 每个词对应编码向量中只有一个值为 1,其余都为 0。这在 Deep Learning 中,其复杂度几乎是难以接受的。
Deep Learning 中一般用到的“词向量”并不是刚才提到的用 One-hot 编码所表示的那种很长很长的词向量,而是用 Distributed Representation(注:Distributed representation 最早是 Hinton 在 1986 年的论文《Learning distributed representations of concepts》中提出的),它是一种“低维向量”。 这种向量一般长成这个样子:[0.792, −0.177, −0.107, 0.109, −0.542, …]。维度以 50 维和 100 维比较常见。
Distributed Representation 通常也称为“Word Representation”。生成相应低维向量的过程被称为“Word Embedding”,中文可称为“词嵌入”(表示高维词向量嵌入到一个低维空间)。
2. 词向量的训练
要介绍词向量是怎么训练得到的,就不得不提到“语言模型”。这是因为 所有训练方法都是在训练语言模型的同时,顺便得到词向量的。
2.1. 语言模型
什么是“语言模型”(Language Model)呢? 语言模型就是评价一句话是不是正常人说出来的。这玩意很有用,比如机器翻译、语音识别得到若干候选之后,可以利用语言模型挑一个尽量靠谱的结果。
一个语言模型通常构建为字符串
设
其中,概率
2.2. n-gram 语言模型
一般地,我们把前
假设句子
假设句子
假设句子
所以,n-gram 模型的基本思想,就是作为一个
关于 n-gram 模型,可以参考《统计自然语言处理(第2版, 宗成庆)》第 5 章,语言模型。
2.2.1. 2-gram 实例
以二元文法模型为例,一个词的概率只依赖于它前面的一个词,那么:
为了使
为了估计
上式是
请看下面的例子。假设训练语料库由下面 3 个句子构成:
用最大似然估计的方法计算概率
先计算下面几个概率:
因此,有:
2.2.2. n-gram 模型的缺点
n-gram 模型有下面缺点:
第一,需要设计“平滑方法”处理零值。在特定语料库中按照前面公式计算概率时,可能遇到很多的零值。例如,对于前面例子中的训练语料库,计算句子“DAVID READ A BOOK”的概率,有如下公式:
从而,有
第二,我们无法把
第三,n-gram 模型无法表征词语之间的相似性。
2.3. 神经概率语言模型(Neural Network Language Model)
Bengio 等人在论文“A Neural Probabilistic Language Model. Journal of Machine Learning Research (2003)”中提出了一种“神经概率语言模型”。
既然名为神经概率语言模型,其中当然用到了“神经网络”。Bengio 用了一个三层的神经网络来构建语言模型,如图 1 所示。
Figure 1: Bengio 用了一个三层的神经网络来构建语言模型
在语料库中词
网络的第一层(输入层)是将
网络的第二层(隐藏层)就如同普通的神经网络,直接使用
网络的第三层(输出层)一共有
式子中的
式子中还有一个矩阵
训练结束后,得到了语言模型的同时,也得到了参数
2.3.1. 神经概率语言模型的优点
神经概率语言模型克服了 n-gram 模型有三个缺点。
1、神经概率语言模型自带平滑,无需传统 n-gram 模型中那些复杂的平滑算法。
2、神经概率语言模型能够对更长的依赖关系进行建模。
3、神经概率语言模型可以表征词语之间的相似性,“相似的”词对应的词向量也是相似的。
3. word2vec
word2vec 是 Google 于 2013 年开源推出的一个用于生成“词向量”的工具包。word2vec 背后的模型是 CBOW (Continuous Bag-of-Words) 或者 Skip-gram,并且使用了 Hierarchical Softmax 或者 Negative Sampling 优化方法。
用 word2vec 生成词向量时,可以选择 CBOW 模型或者 Skip-gram 模型,这两个模型都属于前面介绍的“神经概率语言模型”。
word2vec 原始论文不是很易懂,更推荐 Xin Rong 的论文:word2vec Parameter Learning Explained
3.1. CBOW (Continuous Bag-of-Words)
CBOW (Continuous bag-of-words) 模型如图 2 所示。
Figure 2: Continuous bag-of-words model
CBOW 模型的训练原理是由上下文单词来估计当前单词,其输入层是“上下文单词”的 One-hot,输出是当前单词。 如图 3 所示。
Figure 3: An example of CBOW model
假设训练结束(也就是说参数已经得到),现在要计算句子“I drink XXX everyday”中的 XXX 最可能是什么?会得到图 4 所示结果,也就是说最可能为“coffee”。
Figure 4: I drink XXX everyday
训练结束后,输入层的每个单词与矩阵
参考:
https://www.zhihu.com/question/44832436/answer/266068967
https://yanpuli.github.io/posts/2018/12/blog-post-17/
3.2. Skip-gram
3.3. word2vec 实践
spark 中的 word2vec 采用的是 skip-gram 模型(没有采用 CBOW 模型)。训练得到模型后,spark 提供了查找“相似词”(findSynonyms)等基本功能。