Word2vec
背景
word vector是一种在计算机中表达word meaning的方式。在Webster词典中,关于meaning有三种定义:
- the idea that is represented by a word, phrase, etc.
- the idea that a person wants to express by using words, signs, etc.
- the idea that is expressed in a word of writing, art, etc.
这三种定义由具象到抽象,但对于Deep NLP而言,处理的难度却是由难入易。
传统的NLP领域里主要是针对第一种定义——word representation——进行研究。例如,通过在一张描述语义关系的拓扑图(WordNet)上定义的上义词(Hypernyms)和同义词(Synonym),进而给出word在计算机中的表达。但这种方式存在很多问题。
首先,由于大多数词都有着属于自己独特的语境,例如,我们会说某人在某个领域是一个专家(expert),也会称赞某人的语言很流利(proficient)。虽然在WordNet中expert和proficient被定义为是一对同义词,但显然我们不能说某人在某个领域很proficient。这种一刀切的定义上义词和同义词的方式显然不够精细。
其次,语言的变化日新月异。而这种人工定义WordNet的方式显然跟不上变化的步伐。此外,人类对自然语言理解的主观性,以及在标注和维护WordNet时消耗的大量人力,都成为了制约WordNet发展的瓶颈。
最后,也是最糟糕的问题是,对于计算机而言,这种基于WordNet的词义定义方式很难对两个word之间的语义相似度进行准确的计算。我们只能粗劣地对两个词是否同义给出一个二分类的结果。
WordNet的这些问题是词的离散化表达(discrete representation)所带来的通病。除了WordNet,还有很多基于规则或是统计的NLP模型将word视为一个独立的原子单元(atomic symbols)进行处理。例如,在经典的VSM模型里,每一个word都被表示为一个one-hot向量(除了一个索引下标对应的位置是11,其他位置上的元素都是00)。显然,在这种表达方式下,对任意两个word计算出来的相似度都是00。此外,one-hot向量表达还存在着数据稀疏性和维度灾难的问题。
Distributional Representation(分布表示)
于是,人们想出了一种新的word meaning的定义方式:通过一个word相邻的词来定义这个word的meaning。这个定义来源于一个古老的idea(J.R.Firth, 1957):
You shall know a word by the company it keeps
并成为了包括传统NLP模型和今天将要介绍的word2vec模型在内的大部分word representation模型的基础。
具体来说,我们通过从大量的语料文本中构建一个co-occurrence矩阵来定义word representation。矩阵的构造通常有两种方式:基于document和基于windows。
通过统计word与document共现的次数得到的矩阵被称为word-document矩阵。这个矩阵一般被用于主题模型。相同主题的word之间往往有着较高的相似度。但该矩阵很难描述word的语法信息(例如POS tag)。
我们在课堂上主要讲授的是第二类矩阵:word-context矩阵。通过统计一个事先指定大小的窗口内的word共现次数,不仅可以刻画word的语义信息,还在一定程度上反应了word的语法结构信息。
举一个简单的例子。假设我们的语料库由三句话构成:
- I like deep learning.
- I like NLP.
- I enjoy flying.
设置统计窗口的大小为11,并采用对称窗口(与之相对的是非对称窗口,即仅考虑目标词左侧或右侧的上下文),则可以得到word-context矩阵如下:
矩阵里的元素是列向量所代表的word出现在行向量所代表的word的上下文里的次数。(注意,我们并没有对句首或句尾的词做任何特殊的处理:比如增加一个S或E的标记Token作为句首或句尾的padding。)
现在,我们可以用矩阵的行向量来计算word之间的相似度了。
处理得到的离散统计矩阵:
然而, 这种定义方式得到的词向量的维度等于词典的大小。这意味着,我们需要大量的空间来存储这些高维的词向量。同时,伴随着高维向量出现的数据稀疏性问题,也使得基于这些词向量的机器学习模型的训练变得异常困难。
简单来说,co-occurrence矩阵定义的词向量在一定程度上缓解了one-hot向量相似度为00的问题,但没有解决数据稀疏性和维度灾难的问题。
SVD分解:低维词向量的间接学习
既然基于co-occurrence矩阵得到的离散词向量存在着高维和稀疏性的问题,一个自然而然的解决思路是对原始词向量进行降维,从而得到一个稠密的连续词向量。SVD:强大的矩阵奇异值分解
python运行得到的图像
本文系作者 @rinbn 原创发布在 噓だ。未经许可,禁止转载。