Word Embedding总结
1. 前言
word representation有两种方式
传统方法Knowledge-based representation
词的离散表示corpus-based representation
词的分布式表达word embedding
1.1 Knowledge-based representation
- 简介
Knowledge-based representation根据语言学家们制定的 WordNet ,其中包含了字与字之间的关联。来对文字进行表示。
- 调用方法
from nltk.corpus import wordnet
-
局限性
文字会不断地发展
主观性较强,不同的人之间有不同的理解
工作量比较大
字与字之间的相似性很难定义
1.2 Corpus-based representation
1.2.1 Atomic symbols: one-hot representation
-
定义
One-Hot编码,又称为一位有效编码,独热编码,将所有需计算的文字组成一个向量,给出一个文字,它在向量中的位置标为1,其余都为0。
-
限制
无法捕捉两个word之间的关系,也就是没有办法捕捉语义信息
例如:car和motorcycle,无论怎样计算相似度都为0。
期望:用另一种方式捕捉真正有关字义的部分。
-
方法:当car与motorcycle以及它们相邻的单词(neighbor)存在某些关系时,可以认为这两个单词之间具有相关性。即Neighbors,如何确定neighbor的范围呢?
方式1,full document 。full document可以认为在同一篇文章中出现过,文章中的文字之间可以根据文章确定一个相关的主题。
方式2,windows 。windows限定在某个窗口内,可以是几句话或者几个单词之内范围,这种方式可以获得词性等信息。
1.2.2 High-dimensional sparse word vector
-
思想
基于neighbour,设置Co-occurrence Matrix共现矩阵
-
限制
随着文章字数增加矩阵的大小也会迅速增加;
计算量会迅速增加。之前one-hot形式,由于只有一列存在非0数字,所以维度即使再大,计算量也不会增加太多。而现在则不同,每列都有可能有数个非0数字;
大部分的有效信息,集中在少数区域。没有有效地“散开”,所以robustness会比较差
当增加一个word的时候整个矩阵都要更新
-
期望
找到一个低维向量
1.2.3 Low-dimensional sparse word vector
-
思想
降维dimension reduction,例如通过SVD等,从k维降为r维
-
限制
计算量比较大
新增文字后,需要重建矩阵并重新计算矩阵和降维
-
期望
- 直接学习出低维向量,而不是从资料中学习到高维矩阵再进行降维
1.2.4 Word Embedding
- 思想
directly learn low-dimensional word vectors
-
两种方法
-
word2vec (Mikolov et al. 2013)
skip-gram
CBOW
Glove (Pennington et al., 2014)
-
-
优点
任意两个词语之间的相似性很容易计算
可以使用在任何NLP监督任务上作为input,vector包含了语义信息
可以利用NN通过训练更新word representation(word embedding不是固定的,可以根据task微调)
2. Word2Vec
CBOW和Skip-Gram是著名的词嵌入工具word2vec中包含的两种模型,与标准语言模型不同,在上下文可以同时取左右两边的n个字,而标准语言模型中认为,当前词语仅仅依赖于前文
2.1 Skip-Gram Model
-
目标
给定一个单词
,预测出词汇表中每个词在其上下文中的概率。也就是给定一个word,推算出其周围的word的能力。
是target word,
是指定窗口大小C 范围内的其他 word。 例如上图中,
其实就代表
,窗口大小 C 为m 。
,共2m个。
在指定的 word 条件下,指定窗口内其他 word 发生的概率计算公式如下:
根据最大似然估计,应该使得上面的概率结果最大。对上面公式进行取 后添加负号,得到损失函数的表示公式,目标使损失函数最小。
其中,
数值越大,越相关,对于同一个word当他是target word的时候和他是context word时表示不一样。模型图如下:
-
模型结构
模型的结构很简单,如上图,是一个只有一个隐藏层的神经网络。由于要得到输入的每个word 出现的概率,所以输入层与输出层神经元数需一致。下图中,输入 x和输出层s数量为10000,隐藏层 h 神经元数为300。
如果对隐藏层权重 W转换思想,(注意转换的仅仅是我们的思想,实际上没有对隐藏层做任何改变)。 上面的例子中,输入的 x 是10000行,后面的隐藏层共300个神经元,所以W 是 10000×300 的矩阵。 实际
计算的过程,思想其实是像下图左中的样子,W 每一列与
对应相乘后再相加。如何将想法转换成下图右中的模式呢?请看接下来的例子。
由于x是one-hot转换后的,所以在指定的word上是1,其余都是0。这样的话,经过计算后,实际的结果中是把 W 相应的一行数据给完整保留下来了,其余的都乘以0后都没了,具体见下图。所以,也可以从行的角度看 W。
综上所述,h 的计算结果,其实也就是从 W中抽取出来相乘不为0的一行当成结果,可以用向量表示。
上面说了隐藏层 h,接下来分析输出层s 。从 h 到 s之间的系数为W' 。 上面说道 s输出层共10000个神经元,每个神经元的计算方法如下:
得到 s_j后,还需要做最后的转换才是最终输出的结果。转换公式如下,这也是一般多分类 softmax 的计算方法。
下图就上对上面所讲的,从隐藏层到最后输出概率的一个总结。 h与W' 的计算结果,经过公式转换得到最后每个 word 的概率。
如果把计算过程放在整体上看,如下图。
-
损失函数和梯度下降前文有讲到,给定一个target word,Loss Function是:
使用梯度下降的方法对损失函数进行优化。从右向左,首先看W' 这边。
整理后得到如下公式。
然后是 W这边,
整理后得到。把公式进行简化,简化之后得到下图中红色部分的公式。
其中 j是 输入X 中 words总数量。从上面的公式中可以看出来,计算量和j 相关。当 j 比较大的时候,计算量会非常大。
为了解决计算的问题,有两种常用的方法:层次化softmax(hierarchical softmax )和 负采样(negative sampling) 。常用的是后者。
-
层次化softmax
-
负采样
抽样是更为常用的减少计算量的方法。可以有效的减少计算量,而且表现效果并不会下降太多。因为是随机选取,每个被选取到的概率相同。不停的迭代后,可以有效地得到结果。
一些不常出现的word有时有着一定作用,但在随机抽样中,却很难被抽到。所以有时就需要增加低频词汇出现的概率。
下面这个方法是一个比较好的经验。将每个word出现概率加上3/4 的指数。比如“is”出现的概率为0.9,那么进行次方处理后变成了0.92 ,涨了一点。但是看下面的“bombastic”出现概率原来是0.01,处理后变成了0.032,概率涨了3倍多。可以看出,小概率经过处理后增加的比大概率的要高得多。通过这种方法,可以有效地处理小概率时间很难被抽到的问题。
2.2 Word2Vec Variants
Word2Vec 还有一些其他的方式,比如CBOW、LM 。具体方法请看下图,其实LM是最早被提出来的,而Skip-gram是不断完善后的样子,所以现在Skip-gram应用是最广泛的。CBOW和Skip-gram正好相反,Skip-gram是给定一个word,预测窗口内其他words,而CBOW是给定窗口内其他words的概率,预测指定word。
2.3 方法比较
这里主要是count-based和Direct-prediction之间的比较,之前并没有把所有的方法都讲到。 首先说一下,count-based,顾名思义,这个主要是通过统计学的方法进行计算,这种计算是比较快的。但是得到的结果也只是 “words之间是否同时出现”、“word出现频率” 等信息,无法得到word之间更复杂的关系。 Direct-prediction是通过神经网络方法去自动的估计结果。可以考虑到word之间语义相关的更复杂的关系。但是,并没有应用上统计学的信息,在统计信息上面有所欠缺。
- Glove方法既利用了统计的资讯,还利用了神经网络,在一些数据量比较小的任务上表现很好。
3.Glove
co-occurrence probability,意思是一个word
也出现的概率。公式如下,其中 X表示出现的次数。
与
,将这两个结果相除
,就得到了ratio。通过下面的例子可以看出,这个公式结果具有一些明显的规律。当
含义比较接近时,他们的ratio就接近1。当含义不接近时,ratio就会较大或较小。
与
之间的关系,可以通过它们共有的另一个word
,经过计算得到ratio值,从而判断 w_i与w_j 之间的关联。
。 将它们转化成向量表示
。
如果 w_i 与 w_j 比较接近,则结果趋向于1,否则会偏大或者偏小,正好可以通过exp 的公式可以进行转换。
当成一个常数项,整理进公式。同样也给 w_j 添加一个常数项。
整理后的损失函数中还添加了 ,就相当与把统计相关的数据也添加进来进行优化。在比较小的数据集中,也有较好的表现效果。
Word Vector Evaluation
上面讲了word vector构建的方法,接下来说一下word vector的评估方法。
Intrinsic Evaluation 内在
Word Analogies 类比
首先是单词类比,给定两个相关的words “A”和“B”,例如“man”“woman”。是否能推测出“king”对应的是“queen”? 或者给出“king”与其复数“kings”,是否能推测出“queen”对应的“queens”。类比可以分成语义上的和语法上的。
首先语义上的, 这种方法存在一些问题: \1. 同一个word在不同句子中可能有不同的意思; \2. 随着时间的改变,word含义有可能会改变。
在语法上,主要是同一个单词的不同形式转换。
Word Correlation 关联
主要是由人标记出来的关系得分,这种方法其实也存在一些模糊不清的可能。Extrinsic Evaluation 外在
Subsequent Task
之前的评估是直接对word进行的,Extrinsic 是指不直接进行评估,而是通过后面的task看看结果,从而对其进行判断。 这样做有一些优点,首先,可以将两个看似不相干但实际有关联的word联系起来,比如地区名称。还有可以得到words合并后的信息,比如在情感分析方面的应用。Softmax & Cross-Entropy
Softmax
之前有简单讲过使用softmax进行转换,这里又详细讲解了softmax的定义。 权重 W_y与 x 相乘后得到 f_y ,经过exp 转换成 exp(f_y)。所有的 y 都经过这种转换后求和,最后将每个exp(f_y) 除以总和得到最终的结果。。 真实结果是f_i ,当预测结果f_j 不正确时,f_i 此时会小于 第二项。我们的目的是使得
最小,所以会不断地优化,直到找出结果正确时的参数。
Cross-Entropy 交叉熵
交叉熵用来定义目标与预测结果的概率分布的差异。其中p 就是one-hot-encode表示的target word,而 q 是预测的概率分布。如果 H(p,q) 结果越大,说明两者差异越大;反之,结果越小,说明差异越小。总结
代码参考:
https://github.com/tensorflow/tensorflow/tree/r0.11/tensorflow/models/embedding