@author: Panverson
背景和诞生
在word2vec诞生之前,利用机器学习方法解决自然语言处理问题使,一般都是用one-hot编码(可以翻译成“独热编码”)去表征词语。one-hot编码是一种稀疏矩阵,计算时会带来很多麻烦,因为:
- 向量的维度会随着句子的词的数量类型增大而增大;
- 任意两个词之间都是孤立的,无法表示语义层面上词汇之间的相关信息.
PS:当然,在深度学习中涉及到矩阵相乘,有人会说one-hot编码算起来十分麻烦(有多少单词这个矩阵就有多少维数)。事实上,one-hot编码算起来一点也不麻烦,因为它是稀疏的,矩阵中只有一个数字是1,其他都是0。学过线代的都知道,这种相乘的计算其实是很方便的。
传统的独热表示仅仅将词符号化,不包含任何语义信息。如何将语义融入到词表示中?Harris 在 1954 年提出的“分布假说”为这一设想提供了理论基础:上下文相似的词,其语义也相似。Firth 在 1957年对分布假说进行了进一步阐述和明确:词的语义由其上下文决定。
所以我们可以将我们的任务拆解成两部分:
- 选择一种方式描述上下文;
- 选择一种“模型”刻画某个词(即“目标词”)与其上下文之间的关系。
什么意思呢?可以这么理解:
以CBOW模型为例,如果有一个句子“我今天听了周杰伦的歌”,在训练的时候,将“我今天听了周杰伦的”作为输入,预测出最后一个词是“歌”。
分布式表示的较大优点在于它具有非常强大的表征能力,比如n维向量每维k个值,可以表征k的n次方个概念。下图的神经网络语言模型(NNLM)采用的就是文本分布式表示。而词向量(word embedding)是训练该语言模型的一个附加产物,即图中的矩阵C。
这个时候,word2vec就诞生了。其实,word2vec是词嵌入(word embedding)的一种方式。它将上文提到的one-hot的两个缺点解决了:
- 将vector每一个元素由整形改为浮点型,变为整个实数范围的表示。将原来稀疏的巨大维度压缩嵌入到一个更小维度的空间。
-
矩阵的每个维度都代表一定的语义。
例如:
对于训练好的几个词语,可能是这样的:
可以得出这个结论:
这就是word2vec的神奇所在。这个特性意味着Word2Vec所生成的词向量具有了语义推理能力。
但很遗憾,我们自己去训练词向量的时候,其实很难复现这个结果出来(需要的计算资源实在是太庞大了)。幸运的是,对于小型的预料库,还是有一定的效果的。
两种模型
两个训练方案分别是CBOW和Skip-Gram,如图所示
其中,CBOW通过上下文来预测当前词;而Skip-gram通过当前词预测上下文。至于原理,咱们下次再说。
参考资料
博客:
苏剑林. (2017, Apr 02). 《【不可思议的Word2Vec】 1.数学原理 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/4299
word2vec原始论文:
[1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013.
[2] Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. Distributed Representations of Words and Phrases and their Compositionality. In Proceedings of NIPS, 2013.