自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。顾名思义,词向量是用来表示词的向量,也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌入(word embedding)。近年来,词嵌入已逐渐成为自然语言处理的基础知识。

为何不采用one-hot向量

我们在自然语言处理 - 文本表示 (REPRESENTATION)/)了解到可以用one-hot向量表示词(字符为词)。回忆一下,假设词典中不同词的数量(词典大小)为 N ,每个词可以和从0到 N−1 的连续整数一一对应。这些与词对应的整数叫作词的索引。 假设一个词的索引为 i ,为了得到该词的one-hot向量表示,我们创建一个全0的长为 N 的向量,并将其第 i 位设成1。这样一来,每个词就表示成了一个长度为 N 的向量,可以直接被神经网络使用。

虽然one-hot词向量构造起来很容易,但通常并不是一个好选择。一个主要的原因是,one-hot词向量无法准确表达不同词之间的相似度,如我们常常使用的余弦相似度。对于向量 ,它们的余弦相似度是它们之间夹角的余弦值

由于任何两个不同词的one-hot向量的余弦相似度都为0,多个不同词之间的相似度难以通过one-hot向量准确地体现出来。

word2vec工具的提出正是为了解决上面这个问题。它将每个词表示成一个定长的向量,并使得这些向量能较好地表达不同词之间的相似和类比关系。word2vec工具包含了两个模型,即跳字模型(skip-gram)连续词袋模型(continuous bag of words,CBOW)。接下来让我们分别介绍这两个模型以及它们的训练方法。

跳字模型(skip-gram)

跳字模型假设基于某个词来生成它在文本序列周围的词。举个例子,假设文本序列是“the”“man”“loves”“his”“son”。以“loves”作为中心词,设背景窗口大小为2。跳字模型所关心的是,给定中心词“loves”,生成与它距离不超过2个词的背景词“the”“man”“his”“son”的条件概率,即

P("the","man","his","son" ∣ "loves")

假设给定中心词的情况下,背景词的生成是相互独立的,那么上式可以改写成

P("the" ∣ "loves") ⋅ P("man" ∣ "loves") ⋅ P("his" ∣ "loves") ⋅ P("son" ∣ "loves")

在跳字模型中,每个词被表示成两个 d 维向量,用来计算条件概率。假设这个词在词典中索引为 i ,当它为中心词时向量表示为 ,而为背景词时向量表示为 。设中心词 wc 在词典中索引为 c ,背景词 wo 在词典中索引为 o ,给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算而得到:

其中词典索引集 。假设给定一个长度为 T 的文本序列,设时间步 t 的词为 。假设给定中心词的情况下背景词的生成相互独立,当背景窗口大小为 m 时,跳字模型的似然函数即给定任一中心词生成所有背景词的概率

这里小于1或大于 T 的时间步可以被忽略。

训练跳字模型

跳字模型的参数是每个词所对应的中心词向量和背景词向量。训练中我们通过最大化似然函数来学习模型参数,即最大似然估计。这等价于最小化以下损失函数:

如果使用随机梯度下降,那么在每一次迭代里我们随机采样一个较短的子序列来计算有关该子序列的损失,然后计算梯度来更新模型参数。梯度计算的关键是条件概率的对数有关中心词向量和背景词向量的梯度。根据定义,首先看到

通过微分,我们可以得到上式中 vc 的梯度

它的计算需要词典中所有词以 为中心词的条件概率。有关其他词向量的梯度同理可得。

训练结束后,对于词典中的任一索引为 i 的词,我们均得到该词作为中心词和背景词的两组词向量 。在自然语言处理应用中,一般使用跳字模型的中心词向量作为词的表征向量。


参考文章:
词嵌入(word2vec)