word2vec
word2vec
2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。随着深度学习(Deep Learning)在自然语言处理中应用的普及,很多人误以为word2vec是一种深度学习算法。其实word2vec算法的背后是一个浅层神经网络。另外需要强调的一点是,word2vec是一个计算word vector的开源工具。当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBoW模型和Skip-gram模型。很多人以为word2vec指的是一个算法或模型,这也是一种谬误。接下来,本文将从统计语言模型出发,尽可能详细地介绍word2vec工具背后的算法模型的来龙去脉。
word2vec作为神经概率语言模型的输入,其本身其实是神经概率模型的副产品,是为了通过神经网络学习某个语言模型而产生的中间结果。具体来说,“某个语言模型”指的是“CBOW”和“Skip-gram”。具体学习过程会用到两个降低复杂度的近似方法——Hierarchical Softmax或Negative Sampling。两个模型乘以两种方法,一共有四种实现。这些内容就是本文理论部分要详细阐明的全部了。
Neural Network Language Model
NNLM模型的基本思想可以概括如下:
- 假定词表中的每一个word都对应着一个连续的特征向量;
- 假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;
- 同时学习词向量的权重和概率模型里的参数。
值得注意的一点是,这里的词向量也是要学习的参数。
在03年的论文里,Bengio等人采用了一个简单的前向反馈神经网络f(wt−n+1,...,wt)f(wt−n+1,...,wt)来拟合一个词序列的条件概率p(wt|w1,w2,...,wt−1)p(wt|w1,w2,...,wt−1)。整个模型的网络结构见下图:
我们可以将整个模型拆分成两部分加以理解:
-
首先是一个线性的Embedding层。它将输入的N−1个one-hot词向量,通过一个共享的D×V的矩阵C,映射为N−1个分布式的词向量(distributed vector)。其中,V是词典的大小,D是Embedding向量的维度(一个先验参数)。C矩阵里存储了要学习的word vector。
-
其次是一个简单的前向反馈神经网络g。它由一个tanh隐层和一个softmax输出层组成。通过将Embedding层输出的N−1个词向量映射为一个长度为V的概率分布向量,从而对词典中的word在输入context下的条件概率做出预估:
p(wi|w1,w2,...,wt−1)≈f(wi,wt−1,...,wt−n+1)=g(wi,C(wt−n+1),...,C(wt−1))p(wi|w1,w2,...,wt−1)≈f(wi,wt−1,...,wt−n+1)=g(wi,C(wt−n+1),...,C(wt−1))
我们可以通过最小化一个cross-entropy的正则化损失函数来调整模型的参数θ:
L(θ)=1T∑tlogf(wt,wt−1,...,wt−n+1)+R(θ)L(θ)=1T∑tlogf(wt,wt−1,...,wt−n+1)+R(θ)
其中,模型的参数θ包括了Embedding层矩阵C的元素,和前向反馈神经网络模型g里的权重。这是一个巨大的参数空间。不过,在用SGD学习更新模型的参数时,并不是所有的参数都需要调整(例如未在输入的context中出现的词对应的词向量)。计算的瓶颈主要是在softmax层的归一化函数上(需要对词典中所有的word计算一遍条件概率)。
word2vec两种训练方式:
- Continuous Bag of Words Model和Skip-Gram
CBoW & Skip-gram Model
CBoW
首先,我们对原始的NNLM模型做如下改造:
- 移除前向反馈神经网络中非线性的hidden layer,直接将中间层的Embedding layer与输出层的softmax layer连接;
- 忽略上下文环境的序列信息:输入的所有词向量均汇总到同一个Embedding layer;
- 将Future words纳入上下文环境
得到的模型称之为CBoW模型(Continuous Bag-of-Words Model),也是word2vec算法的第一个模型:
网络结构:
语言模型还是那个问题,映射函数的构造,这里根据任务不同 CBOW 需要构造的是 ,而 Skip-gram 需要构造的是
,在CBOW 中,改进了 NNLM 中计算复杂的环节,去掉了 NNLM 中的隐藏层,且最后的 softmax 层在CBOW中也变成了一个 Huffman 树的结构。整个网络如下图所示:
原理:
CBOW 是 Continuous Bag-of-Words Model 的缩写,是一种根据上下文的词语预测当前词语的出现概率的模型。其图示如上图左。
CBOW是已知上下文,估算当前词语的语言模型。其学习目标是最大化对数似然函数:
其中,w表示语料库C中任意一个词。从上图可以看出,对于CBOW,
输入层是上下文的词语的词向量(什么!我们不是在训练词向量吗?不不不,我们是在训练CBOW模型,词向量只是个副产品,确切来说,是CBOW模型的一个参数。训练开始的时候,词向量是个随机值,随着训练的进行不断被更新)。
投影层对其求和,所谓求和,就是简单的向量加法。
输出层输出最可能的w。由于语料库中词汇量是固定的|C|个,所以上述过程其实可以看做一个多分类问题。给定特征,从|C|个分类中挑一个。
对于神经网络模型多分类,最朴素的做法是softmax回归:
Skip-gram
skip_gram模型框架
Skip-gram 的任务是给出词 ww 来预测其前后各 cc 个词语 context(w)context(w) ,其推倒与 CBOW 大同小异,网络结构也是大体相同,如下图:
输入层对于输入词语 ww ,转化为词向量的形式 v(w)∈Rmv(w)∈Rm 当做输入
投影层由于只有一个词向量 v(w)v(w) ,投影层其实是多于的,只是为了和 CBOW 做对比
输出层同 CBOW 一样为 一颗 Huffman 树
CBOW 的任务是给定 context(w)context(w) 计算 ww, 对应概率为 p(w|context(w))p(w|context(w)) ,而 Skip-gram 的任务是给定 ww ,来预测 context(w)context(w) ,其对应的概率为 p(w|context(w))p(w|context(w)) , Skip-gram将 p(w|context(w))p(w|context(w)) 定义为如下的形式:
类似于 CBOW 中 Hierarchical Softmax 的思想,每个 w′w′ 的概率可以表达为 ,其中:
word2vec两种优化方式:
- hierarchical softmax 和negative sampling
我们知道无论是CBOW还是Skip-gram模型,其实都是分类模型。对于机器学习中的分类任务,在训练的时候不但要给正例,还要给负例。对于Hierarchical Softmax,负例是二叉树的其他路径。对于Negative Sampling,负例是随机挑选出来的。据说Negative Sampling能提高速度、改进模型质量。
word2vec词向量练习
输出: