词向量
NLP 处理文本,所以在进行处理之前,要先解决文本的表示。文本由词组成,本文讨论了表示词汇的几种方案。
WordNet
这种方法基于如下思想:用词汇的意义来代表词。所以我们可以建立若干个集合,每个集合代表一组同义词,每个词都可以映射到某个集合中,表示这个词汇的意思。
其优点在于可以很好的处理词汇之间的联系,即同义词。但是缺点同样明显:
- 忽略了同义词之间的差异,忽略了一词多义性
- 难以迭代更新,忽略词语的新含义
- 基于主观判断
- 需要专家进行手动构造
- 不能准确计算词汇间的相关性
Discrete Symbols (one-hot code)
这种方法即对词汇进行独热编码,用一个数字来表示一个词,但是这种方法中,任何两个词的编码都是完全独立的,也就是说这种方法无法表征词汇之间的相关性。自然语言中一个词汇和其他词汇的关系对词语意义的解释有着很大的影响,所以这种方法的局限性也很大。
Word Vector
我们希望得到一种既简单又能够很好的表示词汇间关系的编码方式。所以我们可以将先前两种方案的思想结合起来,得到词向量的编码方式。这种方法基于如下假设:一个词汇的含义可以由经常在其边上出现的词汇决定。
思想
基于这种编码方式,我们有Word2Vec框架的核心思想如下:
- 有一个巨大的语料库
- 每个词语都被一个定长的向量表示
- 对语料库中每个词,称其为中心词(center)
,其周围定长距离内的词称为上下文(outside) - 使用词向量来表示
- 迭代每个词对应的向量来优化系统
如图所示,我们可以做出如下陈述,into的词义由problems,turning,banking,crises等其附近的词给出。类似地,随着中心词后移,可以产生多组这种关系。
定义式
接下来给出这种概念的定量描述:
定义整个词汇空间为
为了标准化,可以加入平均值;而log几乎对所有连乘的目标函数都实用,所以可以得到目标函数:
我们希望最大化词向量集对这个语料库的拟合程度,所以可以得到优化目标:
如此便可得到词向量的计算方式。
从语料库到词向量
事实上,我们可以这样解释这个过程,我们考虑词汇空间为一个离散点集,从每个点出发向其他点连一条有向边,对于点
到目前为止,似乎都没有词向量什么事,因为只要设置边权即可。但是需要注意的是,事实上这些边权按照顺序排序即可得到一个长度等长于向量空间的词向量,且天然具有归一化的性质。
特别地说,如果我们对相似性的要求更加严格一些,比如规定为其后特定位置出现的同样的词语,那么我们可以在这个基础上构建更多的边,如下一个词边,下两个词边,上一个词边等等,对应的词向量也会加长。如果要将一些边合并,可以将其加权合到同一条边中。诸如此类。更一般地说,我们可以通过修改对图上边的定义来取得对相似性不同的定义。
这种方法可以在某种程度上刻画词语的相似性,比如
而且但是这样的话,存储这些词向量将需要
即一个softmax函数,其有如下优势:
可以梯度下降法等优化方法求解,对于某个o,可以使用链式法则暴力展开求偏导如下:
这个偏导恰好表示表示o本身的向量,和从c转移一次后的期望向量之差。做梯度下降实质上在降低这个差。
而对于J的偏导数,因为结果上由log,所以直接对所有的o的