词向量,顾名思义,就是使用向量来表达词。最常见的表达方式就是"one-hot",其向量维度为整个语料库中词的总数,每一维代表语料库中的一个词(出现为1,不出现为0)。假设语料库为:
那么该语料库的字符集为:{I, like, deep, learning, NLP, enjoy, flying},其对应的"one-hot"表达方式为:
“one-hot”表达方式的最大问题在于其只能表达词本身是否出现,而无法表达词与词之间的关系。为了解决此问题,便有了使用相邻词来表达词本身的方式。
基于窗口的共现矩阵是对词与词相邻关系的最直接表达。还是以上面的语料库为例,假设窗口大小为1(即以每一个词为中心,向左/右延伸长度为1),那对应的共现矩阵为:
由于共现是双向的,所以上述矩阵是对称的。随着语料库变大,该共现矩阵将会变的非常巨大,于是便需要通过SVD(Singular Value Decomposition)进行降维,相关理论在此不进行展开。但共现矩阵还是存在很多问题,如无法处理新词等。
另外一种基于词相邻关系的表达方式就是word2vec(Mikolov et al. 2013),其主题思想是通过每一个词本身来预测其相邻的词。
回顾一下大部分机器学习模型的训练过程,先设定 Objective Function ,然后随机设定初始状态,再通过 Gradient Descent 进行迭代,逐步逼近最优解。 word2vec 模型本质上也一样,还是从 Objective Function 入手
第一个 Sigma 表示从头到尾过一遍语料库中的每一个词,第二个 Sigma 表示对于每一个词,过一遍其窗口内的所有词(除自己外)。最后一部分表示基于中心词预测其窗口内上下文的概率。如果基于本文开头的简短语料库,设定窗口大小为1,将 Objective Function 展开就会是这个样子
从 Objective Funection 的具体形式,可以看出 word2vec 与先前表达方式的本质区别,在这里引用一段英文资料的解释:
接下来,我们需要弄清楚 p 究竟是什么。首先,我们的目标是得到语料库中每一个词的向量表示方法,所以相应的变量应该是词向量;然后,在上述 Objective Function 中,语料库中每一个词既有可能做为中心词,也有可能做为上下文,为了区分这两种情况,我们会对每一个词分别维护两个向量。
继续,我们已经有了两个向量,那么最简单直接的想法就是 Cosine Similarity ,但它的结果区间是从-1到1,需要把它转化成0到1的概率区间,于是原论文中使用了 Softmax 函数。
至此,我们完成了最简单版本 word2vec 模型的 Objective Function 。接下来是迭代过程,迭代过程相对比较简单,分别两个向量进行求导,然后对语料库中每一个实例进行迭代
关于上述公式中的求导过程,感兴趣的同学可以看看 斯坦福的公开课 ,自己也在纸上演算了一遍:
上述 word2vec 推导只是原论文中最简单的模型,后续我会针对复杂模型单独进行整理分析。
上面,我们已经梳理了基于共现矩阵与 word2vec 的词向量表达方式。相比而言,基于共现矩阵的词向量表达方式训练速度快、充分利用了统计信息,主要用于计算词与词的相似度;而 word2vec 词向量表达方式训练速度相对较慢,并没有充分利用统计信息,但能表达出更加复杂的信息。 GloVe 模型结合了两者的优势,训练速度比 word2vec 更快,其效果与 word2vec 相当,甚至更好一些。其 Objective Function 为:
其中 P 为两个词在原语料库中的共现次数, f 为共现次数与权重的函数关系, Objective Function 的主体思想为:
基于上面的思想,便有了下述 f 函数形式:
这个 是斯坦福的官方链接,包含了论文以及实现,感兴趣的同学可以试试。