本文根据word2vec 中的数学原理详解整理而成。
根据word2vec算法的原理,大概总结如下;
1) 由统计语言模型发展到n-gram模型,再由n-gram模型发展到NNLM模型,最后到word2vec模型;
2) word2vec模型包括CBOW模型和Skip-gram模型;
3) 对于CBOW模型和Skip-gram模型,又分别有基于Hierarchical Softmax的模型和基于Negative Sampling的模型
一 模型发展历程
1. 统计语言模型
统计语言模型是用来计算一个句子出现的概率的模型,它通常基于一个语料库来构建。假设
W=wT1:=(w1,w2,...,wT)
表示由
T
个词
w1,w2,...,wT
按顺序构成的一个句子,则
w1,w2,...,wT
的联合概率
p(W)=p(wT1)=p(w1,w2,...,wT)
即为句子
W
的出现的概率。利用Bayes公式(
P(A|B)=P(AB)P(B)
),上式可以被链式分解为:
p(wT1)=p(w1)⋅p(w2|w1)⋅p(w3|w21)⋯p(wT|wT−11) (1)
其中(条件)概率
p(w1),p(w2|w1),p(w3|w21),⋯,p(wT|wT−11)
就是语言模型的参数,计算这些参数,就可以得到一个句子出现的概率了。
原理很简单,但计算很复杂。假设语料库对应词典D的大小(即词汇量)为N,那么,如果考虑长度为T的任意句子,理论上就有
NT
种可能,而每种可能都要计算T个参数,总共就需要计算
TNT
个参数(不考虑重复参数的情况下),这个计算量是非常大的。
那么,这些参数如何计算呢?常见的方法有n-gram模型,神经网络等方法。首先来看n-gram模型。
2. n-gram模型
考虑
p(wk|wk−11)(k>1)
的近似计算。利用Bayes公式,有
p(wk|wk−11)=p(wk1)p(wk−11),
根据大数定理,当语料库足够大时,
p(wk|wk−11)
可近似表示为
p(wk|wk−11)≈count(wk1)count(C)count(wk−11)count(C)≈count(wk1)count(wk−11), (2)
其中
count(wk1)
和
count(wk−11)
分别表示词串
wk1
和
wk−11
在语料中出现的次数,
count(C)
表示语料库中的单词数量。当k很大时,
count(wk1)
和
count(wk−11)
的统计将会非常耗时。
在统计语言模型中,我们认为一个词出现的概率和它前面的所有词都有关(如公式(1))。n-gram模型的基本思想是:假定一个词出现的概率只与它前面固定数目的词相关。它做了一个n-1阶的Markov假设,认为一个词出现的概率就只与它前面的n-1个词相关,即
p(wk|wk−11)=p(wk|wk−1k−n+1)
因此公式(2)就变成了
p(wk|wk−11)≈count(wkk−n+1)count(wk−1k−n+1)
以n=2时为例,可以得到:
p(wk|wk−11)≈count(wk−1,wk)count(wk−1).
通过这样简化,可以大大减少要统计的参数数量(统计时需要匹配的词串更短)。
至于n-gram中的参数n的取值,请看下图(图片来源:
word2vec 中的数学原理详解)
另外,n-gram模型中还需要做平滑化处理。
训练语料库中有些n元组没有出现过,其对应的条件概率就是0,导致一整句话的概率为0。平滑化处理最简单的方法Laplace平滑:把每个n元组的出现次数加1,那么原来出现k次的某个n元组就会被记为k+1次,原来出现0次的n元组就会被记为1次。
总结起来,n-gram模型的主要工作就是在语料中统计各种词串出现的次数以及平滑化处理。概率值计算好之后就存储起来,下次需要计算一个句子的概率时,只需要找到相关的概率参数,将它们连乘起来就好了。
3. 神经网络语言模型(Neural Network Language Model)
神经网络语言模型涉及到一个词向量的概念:对词典D中的任意词w,指定一个固定长度的向量
v(w)∈Rm
,
v(w)
就称为w的词向量,m为词向量的长度。
神经网络语言模型的框架如下图所示(图片来源:《A Neural Probabilistic Language Model》):
对于语料C中的任意一个词w,将Context(w)取为其前面的n-1个词(类似于n-gram),这样二元对(Context(w),w)就是一个训练样本了。一旦语料C和词向量长度m给定后,输入层和输出层的规模就确定了,前者为
(n−1)m
,后者为
N=|D|
,即语料C的词汇量大小,而隐藏层的大小
nh
是可调参数,由用户指定。
输入层的向量
xw
是这样构造的:将输入层的n-1个词向量按顺序首尾相接地拼起来形成一个长向量,因此其长度就是
(n−1)m
。因此,NNLM模型的框架实现过程如下:
⎧⎩⎨⎪⎪⎪⎪zw=tanh(Wxw+p),yw=Uzw+q,p(w|Context(w))=eyw,iw∑Ni=1eyw,i
NNLM模型相对n-gram模型的优势是:
(1)词语之间的相似性可以由词向量来体现;
(2)不需要再做平滑化处理(softmax函数保证
p(w|Context(w))
不会为0).
那么,NNLM模型待确定的参数有哪些呢?
(1)词向量:
v(w)∈Rm,w∈D
以及填充向量;
(2)神经网络参数:
W∈Rnh×(n−1)m,p∈Rnh;U∈RN×nh,q∈RN
这些参数都可以通过训练得到。要特别注意的是,通常的机器学习算法中,输入都是已知的,而在NNLM中,输入
v(w)
也需要通过训练才能得到。
接下来我们分析一下模型的运算量。输入层,隐藏层,输出层的规模分别是
(n−1)m,nh,N
,其中:
(1)n是一个词的上下文中包含的词数,通常不超过5;
(2)m是词向量长度,通常是10-100的量级;
(3)
nh
由用户指定,通常不需要取得太大,如100量级;
(4)N是语料库词汇量的大小,与语料库有关,通常是
104−105
量级。
通过分析,我们可以发现,整个模型的大部分计算集中在隐藏层和输出层之间的矩阵向量运算,以及输出层上的softmax归一化处理。word2vec就是针对这部分进行优化。
4. word2vec模型
word2vec包括两个重要的模型:CBOW模型(Continuous Bag-of-Words Model)和Skip-gram模型(Continuous Skip-gram Model),如下图所示(图片来源:word2vec 中的数学原理详解):
两个模型都包含三层:输入层,投影层和输出层。CBOW模型是在已知当前词
wt
的上下文
wt−2,wt−1,wt+1,wt+2
的前提下预测当前词
wt
;而Skip-gram模型与其相反,是在已知当前词
wt
的前提下,预测其上下文
wt−2,wt−1,wt+1,wt+2
.
二 基于Hierarchical Softmax的模型
基于Hierarchical Softmax的模型跟NNLM模型的一个比较大的区别是在输出层采用了基于Huffman树的树形结构,因此,在讲基于Hierarchical Softmax的模型之前,先简单介绍一下Huffman树。
结点的权和带权路径长度:若为树中结点赋予一个具有某种含义的非负数值,则这个数值称为该结点的权。结点的带权路径长度是指,从根结点到该结点之间的路径长度与该结点的权的乘积。
具体Huffman树的构造请看下图(图片来源:word2vec 中的数学原理详解):
2.1 CBOW模型
CBOW模型的网络结构如下图所示(图片来源:word2vec 中的数学原理详解),它包含三层:输入层,投影层和输出层。下面以样本
(Context(w),w)
为例(这里假设Context(w)由w前后各c个词构成),对这三个层做简单说明:
(1)输入层:包含Context(w)中2c个词的词向量
v(Context(w)1),v(Context(w)2),...,v(Context(w)2c)∈Rm.
),...,v(Context(w)2c)∈Rm.
m表示词向量的长度;
(2)投影层:将输入层的2c个向量做求和累加,即
xw=∑2ci=1