1 摘要
在自然语言处理中,计算机往往难以处理复杂的文字系统。因此,如何把“文字”转换成计算机易处理的形式成为了一个亟需解决的问题。为解决这一问题,word2vec
提出了一种把“词”映射到实数域向量的思路。其中这个转换过程被称为word embedding,转换出来的向量也叫词向量。本文将从原理上简要介绍word2vec
模型中包含的两个经典算法:CBOW与Skip-gram模型,并对两者的相同点,不同点作分析。
2 word2vec 简介
word2vec
的目的是根据具体任务,把 “词”转换成合适的向量(也就是说同一个词,在新闻类任务和在散文类任务中的向量表示可能是不一样)。通常的做法是,把每一个词对应的词向量 v i v_i vi作为模型的训练参数,然后通过一定的规则对模型进行训练,最终得到的参数矩阵就是词向量。
注:这个地方与分类任务有点不一样,分类任务是希望通过模型来预测分类,目的获取模型的输出结果,而word2vec
目的是获取模型的训练参数。
3 one-hot编码
在介绍CBOW与Skip-gram模型之前有必要介绍一下one-hot编码。one-hot编码的原理很简单,它让每一个词占一个维度,如果该词出现了,则该维度的值为1,其余维度的值为0。举个例子,假设我们的语言中只有三个词,分别是“who”,“are”,“you”,那么根据编码规则会有以下编码:
词 | 向量 |
---|---|
who | [1,0,0] |
are | [0,1,0] |
you | [0,0,1] |
虽然one-hot编码的原理简单,却在实践中很少被运用,原因有二:
- 维度爆炸:从上面的例子来看,每个词被编码成3维的向量,可见编码的维度取决于词库中词的数目。在实际应用中,大规模的词库往往会导致维度爆炸的问题。
- 完全割裂了词与词之间的联系:one-hot编码的编码方式使得两词之间相互正交(词向量内积永远为0),因此无法保留两词之间的相关性,这说明这编码方式的表达能力并不强。如 nice和good在语义上是应该有较高的相关,而nice和bike之间应该具有较低的相关性。
为了改善上述两个缺点,word2vec
提出了CBOW与Skip-gram模型。
4 Skip-gram模型
4.1 原理推导
Skip-gram模型利用中心词来生成周边的词。假设有一句子:·
为了用 w c w_c wc预测词窗中的背景词 w o w_o wo,Skip-gram首先利用条件概率对 w c w_c wc, w o w_o wo进行建模,即 P ( “you" , “are" , “good" , “friend" ∣ “my" ) . P(\textrm{``you"},\textrm{``are"},\textrm{``good"},\textrm{``friend"}\mid\textrm{``my"}). P(“you",“are",“good",“friend"∣“my").
假设背景词之间相互独立(类似于朴素贝叶斯模型中的假设条件),可以把上述概率写成:
P ( “You" ∣ “my" ) ⋅ P ( “are" ∣ “my" ) ⋅ P ( “good" ∣ “my" ) ⋅ P ( “friend" ∣ “my" ) . P(\textrm{``You"}\mid\textrm{``my"})\cdot P(\textrm{``are"}\mid\textrm{``my"})\cdot P(\textrm{``good"}\mid\textrm{``my"})\cdot P(\textrm{``friend"}\mid\textrm{``my"}). P(“You"∣“my")⋅P(“are"∣“my")⋅P(“good"∣“my")⋅P(“friend"∣“my").
其中, w c w_c wc与 w o w_o wo的表达式为:
P ( w o ∣ w c ) = exp ( u o ⊤ v c ) ∑ i ∈ V exp ( u i ⊤ v c ) , P(w_o \mid w_c) = \frac{\text{exp}(\boldsymbol{u}_o^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}, P(wo∣wc)=∑i∈Vexp(ui⊤vc)exp(uo⊤vc),
在skip-gram模型中,一个词往往会保存两种形式的向量,一个是作为中心词的向量(用 v v v表示),一个是作为背景的向量(用 u u u来表示)。上式本质上是一个softmax的表达式,其中