文章目录
前言:
本文在介绍word2vec原理的基础上,着重介绍了其所采用的一种非常有启发性的优化技巧,即基于哈夫曼树的hierarchical softmax。这也是这里从数种word embedding算法中选择word2vec进行介绍的原因。因此,本文重心会放在对这部分的介绍上,不会对word2vec在NLP领域的应用以及其他优化方法做过多展开。如果你想了解的更深入,可以跳过本文直接看一下参考资料中的文章。
一、什么是word2vec?
word2vec是一种词嵌入(word embedding)算法,由Google提出并于2013年发表(见Paper)。要介绍word2vec就不得不先介绍一下什么是word embedding。
1.1 词嵌入(word embedding)介绍
在NLP建模中,常常面临的一个难题是如何表示单词以便对文本进行建模。对于神经网络等基于数学模型的机器学习模型而言,直接用ASCII码(或GBK编码)表示词作为模型输入显然是不可行的,因为ASCII码和其词语义之间是没什么关联的,两个词的ASCII码之间是非语义连续的、不可比的(或者其差值是没有意义的),而对于需要训练得到一个平滑的数学函数的数学模型而言,这一点是致命的(直接用ASCII码去训练一个数学模型,比如神经网络,有点类似于用神经网络建模一个跳跃函数,比如目标函数对有理数取值是1,无理数取值是0,显然是几乎不可能得到一个令人满意的训练结果的)。
word embedding即词嵌入正是为了解决这一难题而生,其意在为每个词生成一个连续的、包含语义的、可比较的n维数学向量:
v w o r d = ( x 1 , x 2 , ⋯ , x n ) v_{word} = (x_1,x_2,{\cdots},x_n) vword=(x1,x2,⋯,xn)
所谓的可比较是指,可以用两个词向量的距离度量两个词的语义相似度(距离可以用欧式距离或向量夹角表示,通常选择向量夹角巨多,此时向量的方向即代表了词的含义)。例如dog、cat、today、tomorrow等4个词的词向量分别为 v d o g v_{dog} vdog、 v c a t v_{cat} vcat、 v t o d a y v_{today} vtoday、 v t o m o r r o w v_{tomorrow} vtomorrow。对于这4个词显然有,dog和cat相比其他词含义更接近,因此 v d o g v_{dog} vdog和KaTeX parse error: Expected '}', got 'EOF' at end of input: {v_{cat}之间的距离应该比其他向量更小,同样地对于 v t o d a y v_{today} vtoday和 v t o m o r r o w v_{tomorrow} vtomorrow亦是如此。假设选择二维向量表示词向量,则一种可能的词向量表示如下图:
当然,维度n的选择通常不会这么小,因为如果维度太小通常不足以表征词之间立体的相似性关系。例如,假设有3个词:白猫、黑猫、黄猫,其含义两两相似,这意味着其词向量两两间的距离也应该是相近的,但是二维向量显然无法表征出这种多个向量两两相似的关系,所以维度一般会选择一个较大的值(需要和性能做好平衡,因为维度越大通常意味着计算过程的时空复杂度也越大)。
对于任意两个词,可以通过计算其词向量之间的距离来衡量其语义相似性,而且这些向量之间可以做各类包含语义的运算(Google的word2vec团队研究发现,其训练的词向量,vector(”King”) - vector(”Man") + vector(“Woman”) ≈ vector(“Queen”)[2]),而这正是我们在NLP建模中所需要的。生成词向量的算法有很多种,除了最简单的one-hot之外,还有word2vec、GloVe、以及较新的ELMo和BERT等等(其中ELMo和BERT之后会有专题介绍)。有了这些词向量后,就可以基于它们进行复杂模型的建模,比如计算两个文档间的相似度,或者用于训练各类高阶语言模型等等。
1.2 word2vec概述
word2vec采用无监督学习的方式,利用词之间的上下文共现关系来学习词之间的语义关系,并采用神经网络建模训练得到每个词的词向量。什么是上下文共现?看下边的例子(随便想的,轻拍-_-!!):
- 美人鱼 是
周星驰拍 的 星爷拍过 美人鱼- 功夫 的 主演 是
周星驰 星爷主演 过 功夫- …
假设我们有很多这样的语料,统计发现周星驰和星爷经常出现在相似的上下文(Context)语境里,这会不会就意味着这两个词大概率就表示一个意思或者至少意思是相近的?从语言学角度来讲,答案是肯定的。各类词向量训练算法也大多是基于这一现象来设计的,包括word2vec。因此,word2vec实际上就是利用了统计语言模型的思想(感兴趣的可以看一下吴军的《数学之美》第三章,对此有一些通俗易懂的介绍),基于统计信息对词和上下文之间的预测关系进行建模,并借助对这个模型的训练得到词向量。也就是说,word2vec建模的实际上是上下文词和中心词之间的预测关系,而词向量可以说是这个预测过程的副产物(当然,这个副产物正是word2vec要求解的东西)。
根据word2vec建模的预测方向的不同,word2vec可以分为两种:
- CBOW:即Continuous Bag-of-Word Model的简写,根据上下文的词预测中心词(表示为C → W)
- 例如:【今天__不错,适合出游】,根据上下文预测空白处的词
- Skip-gram:根据中心词预测上下文的词(表示为W → C)
- 例如:【__
天气__,适合出游】,根据中心词天气预测上下文的词
- 例如:【__
本文仅介绍CBOW模型,skip-gram本质上是类似的,本文不再赘述,想深入了解的可以看一下参考资料中的文章。
二、CBOW模型
如前所述,CBOW(Continuous Bag-of-Word)实际上是对由上下文词(Context)预测中心词进行建模。
2.1 Context滑动窗口
为了便于计算,对于句子中心词的上下文,无论是CBOW还是skip-gram都是设置一个固定大小的滑动窗口,预测过程仅观察窗口内出现的词,而非所有的词。假设滑动窗口大小设定为C=4,则对于句子中每个词,将只观察前后的各2个词共4个词。例如对于句子【小度/智能/音箱/给你/最好/陪伴】,其滑动观察过程为:
- 【
小度/智能/音箱】/给/你/最佳/陪伴 - 【小度/
智能/音箱/给】/你/最佳/陪伴 - 【小度/智能/
音箱/给/你】/最佳/陪伴 - 小度/【智能/音箱/
给/你/最佳】/陪伴 - 小度/智能/【音箱/给/
你/最佳/陪伴】 - 小度/智能/音箱/【给/你/
最佳/陪伴】 - 小度/智能/音箱/给/【你/最佳/
陪伴】
其中【】表示Context的滑动窗口,飘红词表示中心词,飘蓝词表示Context词。此外,由首尾词的窗口位置可以看到,滑动窗口同时还限定了最大观察距离。
了解了这些,接下来我们就可以利用神经网络对其进行建模了。
2.2 模型结构
CBOW的神经网络结构如下:
这是一个具有一个隐藏层的全连接神经网络,输入层是上下文窗口内各个词的M维one-hot向量(给每个词编个号,向量中对应维度取值为1,其他维度维0)的线性叠加,输出层是一个m维向量Y。其中m为词的数量,n为设定的欲训练的词向量的维度。隐藏层和输出层的计算公式如下(矩阵表示):
H = 1 C W × V i = W × 1 C V i H=\frac{1}{C}W \times V_i = W \times \frac{1}{C}V_i H=C1W×Vi=W×C1Vi Y = S o f t m a x ( W ′ × H )

最低0.47元/天 解锁文章

1531

被折叠的 条评论
为什么被折叠?



