-欢迎加入AI技术专家社群>>
自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。在机器学习中,如何使用向量表示词?
顾名思义,词向量是用来表示词的向量,通常也被认为是词的特征向量。近年来,词向量已逐渐成为自然语言处理的基础知识。
我们在循环神经网络中介绍过one-hot向量来表示词。假设词典中不同词的数量为 ,每个词可以和从0到 的连续整数一一对应。假设一个词的相应整数表示为,为了得到该词的one-hot向量表示,我们创建一个全0的长为 的向量,并将其第位设成1。
然而,使用one-hot词向量并不是一个好选择。一个主要的原因是,one-hot词向量无法表达不同词之间的相似度。例如,任何一对词的one-hot向量的余弦相似度都为0。
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。
我们来描述一下跳字模型。
假设词典大小为 ,我们将词典中的每个词与从0到的整数一一对应:词典索引集。一个词在该词典中所对应的整数称为词的索引。给定一个长度为的文本序列中,时刻的词为。当时间窗口大小为时,跳字模型需要最大化给定任一中心词生成背景词的概率:
上式的最大似然估计与最小化以下损失函数等价
我们可以用和分别代表中心词和背景词的向量。换言之,对于词典中一个索引为的词,它在作为中心词和背景词时的向量表示分别是和。而词典中所有词的这两种向量正是跳字模型所要学习的模型参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的中心词生成背景词的概率。假设中心词生成各个背景词的概率是相互独立的。给定中心词在词典中索引为,背景词在词典中索引为,损失函数中的中心词生成背景词的概率可以使用softmax函数定义为
当序列长度 较大时,我们通常随机采样一个较小的子序列来计算损失函数并使用随机梯度下降优化该损失函数。通过微分,我们可以计算出上式生成概率的对数关于中心词向量的梯度为:
而上式与下式等价:
通过上面计算得到梯度后,我们可以使用随机梯度下降来不断迭代模型参。其他模型参数的迭代方式同理可得。最终,对于词典中的任一索引为的词,我们均得到该词作为中心词和背景词的两组词向量和。
连续词袋模型与跳字模型类似。与跳字模型最大的不同是,连续词袋模型中用一个中心词在文本序列周围的词来预测该中心词。例如,给定文本序列”the”, “man”, “hit”, “his”, 和”son”,连续词袋模型所关心的是,邻近词“the”, “man”, “his”, 和”son”一起生成中心词”hit”的概率。
假设词典大小为,我们将词典中的每个词与从0到|的整数一一对应:词典索引集。一个词在该词典中所对应的整数称为词的索引。给定一个长度为的文本序列中,t时刻的词为。当时间窗口大小为m时,连续词袋模型需要最大化由背景词生成任一中心词的概率:
上式的最大似然估计与最小化以下损失函数等价
我们可以用v和u分别代表背景词和中心词的向量(注意符号和跳字模型中的不同)。换言之,对于词典中一个索引为的词,它在作为背景词和中心词时的向量表示分别是和。而词典中所有词的这两种向量正是连续词袋模型所要学习的模型参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的中心词生成背景词的概率。给定中心词在词典中索引为,背景词在词典中索引为,损失函数中的背景词生成中心词的概率可以使用softmax函数定义为
当序列长度较大时,我们通常随机采样一个较小的子序列来计算损失函数并使用随机梯度下降优化该损失函数。通过微分,我们可以计算出上式生成概率的对数关于任一背景词向量)的梯度为:
通过上面计算得到梯度后,我们可以使用随机梯度下降来不断迭代各个模型参数)。其他模型参数的迭代方式同理可得。最终,对于词典中的任一索引为
的词,我们均得到该词作为背景词和中心词的两组词向量和。
我们可以看到,无论是跳字模型还是连续词袋模型,每一步梯度计算的开销与词典的大小相关。显然,当词典较大时,例如几十万到上百万,这种训练方法的计算开销会较大。所以,使用上述训练方法在实践中是有难度的。
我们将使用近似的方法来计算这些梯度,从而减小计算开销。常用的近似训练法包括负采样和层序softmax。
我们以跳字模型为例讨论负采样。
词典大小之所以会在目标函数中出现,是因为中心词 生成背景词 的概率 使用了softmax,而softmax正是考虑了背景词可能是词典中的任一词,并体现在softmax的分母上。
我们不妨换个角度,假设中心词w生成背景词由以下相互独立事件联合组成来近似
中心词和背景词同时出现在该训练数据窗口
中心词和第1个噪声词不同时出现在该训练数据窗口(噪声词按噪声词分布随机生成,假设一定和不同时出现在该训练数据窗口)
…
中心词和第k个噪声词不同时出现在该训练数据窗口(噪声词按噪声词分布随机生成,假设一定和不同时出现在该训练数据窗口)
我们可以使用函数来表达中心词和背景词同时出现在该训练数据窗口的概率:
当我们把取较小值时,每次随机梯度下降的梯度计算开销将由降为。
同样地,当我们把取较小值时,每次随机梯度下降的梯度计算开销将由降为。
层序softmax利用了二叉树。树的每个叶子节点代表着词典中的每个词。每个词相应的词向量为。我们以下图为例,来描述层序softmax的工作机制。
假设l为从二叉树的根到代表词w的叶子节点的路径上的节点数,并设n为该路径上第 个节点,该节点的向量为。以上图为例,l。那么,跳字模型和连续词袋模型所需要计算的任意词生成词的概率为:
我们可以使用随机梯度下降在跳字模型和连续词袋模型中不断迭代计算字典中所有词向量v和非叶子节点的向量。每次迭代的计算开销由降为二叉树的高度。
word2vec工具中的跳字模型和连续词袋模型可以使用两种负采样和层序softmax减小训练开销。
噪声词 ℙ(w)在实际中被建议设为的单字概率的3/4次方。为什么?(想想的大小)
一些”the”和”a”之类的英文高频词会对结果产生什么影响?该如何处理?(可参考word2vec论文第2.3节)
如何训练包括例如”new york”在内的词组向量?(可参考word2vec论文第4节)。
原文:http://zh.gluon.ai/chapter_natural-language-processing/word2vec.html
或点击“阅读原文”,查看详情