Word2vec词向量本质

秒懂Word2vec词向量

  • 1 正文
    • 1.1 什么是Word2vec?
    • 1.2 Skip-gram和CBOW模型
      • 1.2.1 Skip-gram和CBOW模型的简单情形
      • 1.2.2 Skip-gram更一般的情形
      • 1.2.3 CBOW更一般的情形
    • 1.3 Word2vec训练trick
    • 1.4 扩展

1 正文

1.1 什么是Word2vec?

在聊Word2vec之前,先聊聊NLP。NLP里面,最细粒度的是词语,词语组成句子,句子再组成段落、篇章、文档等。所以处理NLP问题,首先拿词语开到。
举一个简单例子,判断一个词的词性,是动词还是名词。用机器学习的思路,我们有一系列的(x,y),这里x是词语,y是它的词性,我们要构建f(x)->y的映射,但这里的数学模型f(比如神经网路、SVM)只接受数值输入,而NLP里的词语,是人类抽象总结,是符号形式的(比如中文、英文、拉丁文等),所以需要把它们转化为数值形式,或者说——嵌入到一个数学空间里,这种嵌入方式,叫词嵌入(word embedding),而word2vec,就是词嵌入的一种。
大部分的有监督机器学习模型,都可以归纳为:f(x) - >y

在NLP中,把x看作一个句子里的一个词语,y是这个词语的上下文词语,那么这里的f,便是NLP中经常出现的语言模型(language model),这个模型的目的,就是判断(x,y)这个样本,是否符合自然语言的法则,更通俗点的说:词语x和词语y放在一起,是不是人话。

Word2vec正式来源于这个思想,但它最终的目的,不是要把f训练的多么完美,而是只关心模型训练完后的副产物——模型参数(这里特指神经网路的权重),并将这些参数,作为输入x的某种向量化的表示,这个向量便叫做词向量。

我们来看个例子,如何用 Word2vec 寻找相似词:

  • 对于一句话:『她们 夸 吴彦祖 帅 到 没朋友』,如果输入 x 是『吴彦祖』,那么 y 可以是『她们』、『夸』、『帅』、『没朋友』这些词
  • 现有另一句话:『她们 夸 我 帅 到 没朋友』,如果输入 x 是『我』,那么不难发现,这里的上下文 y 跟上面一句话一样
  • 从而 f(吴彦祖) = f(我) = y,所以大数据告诉我们:我 = 吴彦祖(完美的结论)

1.2 Skip-gram和CBOW模型

上面我们提到了语言模型

  • 如果是用一个词语作为输入,来预测它周围的上下文,那这个模型叫做Skip-gram模型。
  • 如果是用一个词语的上下文作为输入,来预测这个词语本身,则是CBOW模型。

1.2.1 Skip-gram和CBOW模型的简单情形

我们先来看个简单的例子。上面硕大,y是x的上下文,所以y只取上下文里一个词语时,语言模型就变成:
用当前词x预测它的下一个词y。
但如上面所说,一般的数学模型只接受数值型输入,这里的x该怎么表示呢?显然不能用word2vec,因为这是我们训练完模型的产物,现在我们想要的是x的一个原始输入形式。
答案是:one-hot encoder
所谓one-hot encoder,其思想跟特征工程里处理类别变量的one-hot一样。本质上是用一个只含一个1、其他都是0的向量来唯一表示词语。

例如:假设全世界所有的词语总共有V个,这V个词语有自己的先后顺序,假设《吴彦祖》这个词是第一个词,《我》这个词是第二个词,那么《吴彦祖》就可以表示为一个V维全零向量,把第一个位置的0变成1,而《我》同样表示维V维的全零向量、把第二个位置的0变为1.这样,每个词语都可以找到属于自己的唯一表示。

OK,那么接下来就可以看Skip-gram的网络结构了,x就是上面提到的one-hot encoder形式的输入,y是在这V个词上输出的概率,我们希望跟真实的y的one-hot encoder一样。
Word2vec词向量本质_第1张图片
首先寿命一点:隐层的激活函数其实是线性的,相当于没有做任何处理(这也是word2vec简化之前语言模型的独到之处),我们要训练这个神经网络,用反向传播算法,本质上是链式求导。

当模型训练完后,最后得到的其实是神经网络权重,比如现在输入一个x的one-hot encoder[1,0,0,0],对应刚说的那个词语《吴彦祖》,则在输入层到隐含层的权重里,只有对应1这个位置的权重被激活,这些权重的个数,跟隐含层节点数就是一直的,从而这些权重组成一个向量vx来表示x,而因为每个词语的one-hot encoder里面1的位置是不同的,所以,这个向量vx就可以用来唯一宝石x。

注意:上面这段话谁的就是word2vec的精髓!!
此外,我们刚说了,输出y也是用V个节点表示的,对应V个词语,所以其实,我们把输出节点置成[1,0,0,0],它也能表示《吴彦祖》这个单词,但是激活的是隐含层到输出层的权重,这些权重的个数,跟隐含层一样,也可以组成一个向量vy,跟上面提到的vx维度一样,并且可以看作是词语《吴彦祖》的另一种词向量。而这两种词向量vx和vy,正式Mikolov在论文里提到的《输入向量》和《输出向量》,一般我们用《输入向量》。

需要提到一点的是,这个词向量的维度(与隐含层节点数一致)一般情况下要远远小于词语综述V的大小,所以Word2vec本质上是一种降维操作——把词语从one-hot encoder形式的表示降维到Word2vec形式的表示。

1.2.2 Skip-gram更一般的情形

上面讨论的是最简单情形,即y只有一个词,当y有多个词时,网络结构如下:
Word2vec词向量本质_第2张图片
可以看成单个x->单个y模型的并联,cost function是单个cost function的累加(取log之后)

1.2.3 CBOW更一般的情形

跟skip-gram相似,只不过,skip-gram是预测一个词的上下文,而CBOW是用上下文预测这个词
网络结构如下:
Word2vec词向量本质_第3张图片
跟 Skip-gram 的模型并联不同,这里是输入变成了多个单词,所以要对输入处理下(一般是求和然后平均),输出的 cost function 不变

1.3 Word2vec训练trick

相信很多初次踩坑的同学,会跟我一样陷入 Mikolov 那篇论文(参考资料1.)里提到的 hierarchical softmax 和 negative sampling 里不能自拔,但其实,它们并不是 Word2vec 的精髓,只是它的训练技巧,但也不是它独有的训练技巧。 Hierarchical softmax 只是 softmax 的一种近似形式(详见参考资料7.),而 negative sampling 也是从其他方法借鉴而来。
为什么要用训练技巧呢? 如我们刚提到的,Word2vec 本质上是一个语言模型,它的输出节点数是 V 个,对应了 V 个词语,本质上是一个多分类问题,但实际当中,词语的个数非常非常多,会给计算造成很大困难,所以需要用技巧来加速训练。
这里我总结了一下这两个 trick 的本质,有助于大家更好地理解:

  • hierarchical softmax(本质是把 N 分类问题变成 log(N)次二分类)
  • negative sampling(本质是预测总体类别的一个子集)

1.4 扩展

很多时候,当我们面对林林总总的模型、方法时,我们总希望总结出一些本质的、共性的东西,以构建我们的知识体系,比如我在前作『分类和回归的本质』里,原创性地梳理了分类模型和回归模型的本质联系,比如在词嵌入领域,除了 Word2vec之外,还有基于共现矩阵分解的 GloVe 等等词嵌入方法。

深入进去我们会发现,神经网络形式表示的模型(如 Word2vec),跟共现矩阵分解模型(如 GloVe),有理论上的相通性,这里我推荐大家阅读参考资料5. ——来斯惟博士在它的博士论文附录部分,证明了 Skip-gram 模型和 GloVe 的 cost fucntion 本质上是一样的。是不是一个很有意思的结论? 所以在实际应用当中,这两者的差别并不算很大,尤其在很多 high-level 的 NLP 任务(如句子表示、命名体识别、文档表示)当中,经常把词向量作为原始输入,而到了 high-level 层面,差别就更小了。

鉴于词语是 NLP 里最细粒度的表达,所以词向量的应用很广泛,既可以执行词语层面的任务,也可以作为很多模型的输入,执行 high-level 如句子、文档层面的任务,包括但不限于:

  • 计算相似度
  • 寻找相似词
  • 信息检索
  • 作为 SVM/LSTM 等模型的输入
  • 中文分词
  • 命名体识别
  • 句子表示
  • 情感分析
  • 文档表示
  • 文档主题判别

更多请见:秒懂词向量的本质

你可能感兴趣的:(自然语言处理,word2vec,自然语言处理,深度学习)