干货|自然语言处理中的词向量 — word2vec!

自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。在机器学习中,如何使用向量表示词?

顾名思义,词向量是用来表示词的向量,通常也被认为是词的特征向量。近年来,词向量已逐渐成为自然语言处理的基础知识。

为何不采用one-hot向量

我们在循环神经网络中介绍过one-hot向量来表示词。假设词典中不同词的数量为N,每个词可以和从0到N−1的连续整数一一对应。假设一个词的相应整数表示为i,为了得到该词的one-hot向量表示,我们创建一个全0的长为N的向量,并将其第i位设成1。

然而,使用one-hot词向量并不是一个好选择。一个主要的原因是,one-hot词向量无法表达不同词之间的相似度。例如,任何一对词的one-hot向量的余弦相似度都为0。

word2vec

2013年,Google团队发表了word2vec工具。word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax)。值得一提的是,word2vec词向量可以较好地表达不同词之间的相似和类比关系。

word2vec自提出后被广泛应用在自然语言处理任务中。它的模型和训练方法也启发了很多后续的词向量模型。本节将重点介绍word2vec的模型和训练方法。

模型

跳字模型

在跳字模型中,我们用一个词来预测它在文本序列周围的词。例如,给定文本序列”the”, “man”, “hit”, “his”, 和”son”,跳字模型所关心的是,给定”hit”,生成它邻近词“the”, “man”, “his”, 和”son”的概率。在这个例子中,”hit”叫中心词,“the”, “man”, “his”, 和”son”叫背景词。由于”hit”只生成与它距离不超过2的背景词,该时间窗口的大小为2。

我们来描述一下跳字模型。

假设词典大小为|V|,我们将词典中的每个词与从0到|V|−1的整数一一对应:词典索引集V={0,1,…,|V|−1}。一个词在该词典中所对应的整数称为词的索引。给定一个长度为T的文本序列中,t时刻的词为w(t)。当时间窗口大小为m时,跳字模型需要最大化给定任一中心词生成背景词的概率:

上式的最大似然估计与最小化以下损失函数等价

我们可以用v和u分别代表中心词和背景词的向量。换言之,对于词典中一个索引为i的词,它在作为中心词和背景词时的向量表示分别是vi和ui。而词典中所有词的这两种向量正是跳字模型所要学习的模型参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的中心词生成背景词的概率。假设中心词生成各个背景词的概率是相互独立的。给定中心词wc在词典中索引为c,背景词wo在词典中索引为o,损失函数中的中心词生成背景词的概率可以使用softmax函数定义为

当序列长度T较大时,我们通常随机采样一个较小的子序列来计算损失函数并使用随机梯度下降优化该损失函数。通过微分,我们可以计算出上式生成概率的对数关于中心词向量vc的梯度为:

而上式与下式等价:

通过上面计算得到梯度后,我们可以使用随机梯度下降来不断迭代模型参vc。其他模型参数uo的迭代方式同理可得。最终,对于词典中的任一索引为i的词,我们均得到该词作为中心词和背景词的两组词向量vi和ui。

连续词袋模型

连续词袋模型与跳字模型类似。与跳字模型最大的不同是,连续词袋模型中用一个中心词在文本序列周围的词来预测该中心词。例如,给定文本序列”the”, “man”, “hit”, “his”, 和”son”,连续词袋模型所关心的是,邻近词“the”, “man”, “his”, 和”son”一起生成中心词”hit”的概率。

假设词典大小为|V|,我们将词典中的每个词与从0到|V|−1的整数一一对应:词典索引集V={0,1,…,|V|−1}。一个词在该词典中所对应的整数称为词的索引。给定一个长度为T的文本序列中,t时刻的词为w(t)。当时间窗口大小为m时,连续词袋模型需要最大化由背景词生成任一中心词的概率:

上式的最大似然估计与最小化以下损失函数等价

我们可以用v和u分别代表背景词和中心词的向量(注意符号和跳字模型中的不同)。换言之,对于词典中一个索引为i的词,它在作为背景词和中心词时的向量表示分别是vi和ui。而词典中所有词的这两种向量正是连续词袋模型所要学习的模型参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的中心词生成背景词的概率。给定中心词wc在词典中索引为c,背景词wo1,…,wo2m在词典中索引为o1,…,o2m,损失函数中的背景词生成中心词的概率可以使用softmax函数定义为

当序列长度T较大时,我们通常随机采样一个较小的子序列来计算损失函数并使用随机梯度下降优化该损失函数。通过微分,我们可以计算出上式生成概率的对数关于任一背景词向量voi(i=1,…,2m)的梯度为:

通过上面计算得到梯度后,我们可以使用随机梯度下降来不断迭代各个模型参数voi(i=1,…,2m)。其他模型参数uc的迭代方式同理可得。最终,对于词典中的任一索引为i的词,我们均得到该词作为背景词和中心词的两组词向量vi和ui。

近似训练法

我们可以看到,无论是跳字模型还是连续词袋模型,每一步梯度计算的开销与词典V的大小相关。显然,当词典较大时,例如几十万到上百万,这种训练方法的计算开销会较大。所以,使用上述训练方法在实践中是有难度的。

我们将使用近似的方法来计算这些梯度,从而减小计算开销。常用的近似训练法包括负采样和层序softmax。

负采样

我们以跳字模型为例讨论负采样。

词典V大小之所以会在目标函数中出现,是因为中心词wc生成背景词wo的概率P(wo∣wc)使用了softmax,而softmax正是考虑了背景词可能是词典中的任一词,并体现在softmax的分母上。

我们不妨换个角度,假设中心词wc生成背景词wo由以下相互独立事件联合组成来近似

  • 中心词wc和背景词wo同时出现在该训练数据窗口
  • 中心词wc和第1个噪声词w1不同时出现在该训练数据窗口(噪声词w1按噪声词分布P(w)随机生成,假设一定和wc不同时出现在该训练数据窗口)
  • 中心词wc和第k个噪声词wK不同时出现在该训练数据窗口(噪声词wK按噪声词分布P(w)随机生成,假设一定和wc不同时出现在该训练数据窗口)

我们可以使用σ(x)=1/(1+exp(−x))函数来表达中心词wc和背景词wo同时出现在该训练数据窗口的概率:

当我们把K取较小值时,每次随机梯度下降的梯度计算开销将由O(|V|)降为O(K)。

同样地,当我们把K取较小值时,每次随机梯度下降的梯度计算开销将由O(|V|)降为O(K)。

层序softmax

层序softmax利用了二叉树。树的每个叶子节点代表着词典V中的每个词。每个词wi相应的词向量为vi。我们以下图为例,来描述层序softmax的工作机制。

假设l(w)为从二叉树的根到代表词w的叶子节点的路径上的节点数,并设n(w,i)为该路径上第i个节点,该节点的向量为un(w,i)。以上图为例,l(w3)=4。那么,跳字模型和连续词袋模型所需要计算的任意词wi生成词w的概率为:

我们可以使用随机梯度下降在跳字模型和连续词袋模型中不断迭代计算字典中所有词向量v和非叶子节点的向量u。每次迭代的计算开销由O(|V|)降为二叉树的高度O(log|V|)。

结论

word2vec工具中的跳字模型和连续词袋模型可以使用两种负采样和层序softmax减小训练开销。

练习

  • 噪声词ℙ(w)P(w)在实际中被建议设为w的单字概率的3/4次方。为什么?(想想的大小)
  • 一些”the”和”a”之类的英文高频词会对结果产生什么影响?该如何处理?(可参考word2vec论文第2.3节)
  • 如何训练包括例如”new york”在内的词组向量?(可参考word2vec论文第4节)。

END

碧茂课堂精彩课程推荐:

1.Cloudera数据分析课;

2.Spark和Hadoop开发员培训;

3.大数据机器学习之推荐系统;

4.Python数据分析与机器学习实战;

详情请关注我们公众号:碧茂大数据-课程产品-碧茂课堂

现在注册互动得海量学币,大量精品课程免费送!

猜你喜欢

转载自blog.csdn.net/ShuYunBIGDATA/article/details/89309302
今日推荐