Global Vectors for Word Representation(GloVe)

Comparison with Previous Methods

到目前为止,我们已经见过两种主要的词嵌入方法。第一种计算基于统计计算矩阵分解方法(如LSA, HAL)。这些方法有效的使用了全局的统计信息,主要用来捕捉词语相似性,但是对于词类比等任务表现较差。另外一种方法基于滑动窗口(如skip-gram和CBOW),这种方法通过预测滑动窗口内的词来学得词嵌入。这些模型都有捕获超过词语相似度的复杂语言模型的能力,但是不能利用全局共现词语的信息。

相比之下,GloVe包含一个加权最小二乘模型,可以训练全局的单词-单词共现计数,因而也可以更有效的利用这些数据。模型产生一个单词向量空间,有明显的子结构。在单词类比中表现出SOTA,在许多其他与单词相似度有关的任务表现突出。

Co-occurrence Matrix

XX表示单词-单词的共现矩阵,其中Xi,jX_{i,j}表示单词jj出现在单词jj上下文的次数,令Xi=kXikX_i=\sum_kX_{ik}表示任意单词kk出现在ii上下文的次数。令Pij=P(wjwi)=XijXiP_{ij}=P(w_j|w_i)=\frac{X_{ij}}{X_i}为单词jj出现在单词jj上下文的概率。

通过遍历整个语料可以构建出矩阵。对于更大的语料,这样到操作会花费很多时间,但是只需要进行一次。

Least Square Objective

回忆skip-gram模型,我们使用softmax来计算单词jj出现在单词ii上下文的概率:
Qij=exp(ujTvi)w=1Wexp(uwTvi) Q_{ij} = \frac{exp(u_j^Tv_i)}{\sum_{w=1}^Wexp(u_w^Tv_i)}
训练过程使用在线训练,随机梯度下降,最后使用交叉熵作为loss,写为:
J=icorpusjcontext(i)logQij J = -\sum_{i\in corpus} \sum_{j\in context(i)}log Q_{ij}
同样的单词ii和单词jj可能在语料中出现多次,将iijj出现次数放在一起:
J=i=1Wj=1WXijlogQij J = -\sum_{i=1}^W \sum_{j=1}^WX_{ij}logQ_{ij}
其中当共现频率被赋予共现矩阵XX。交叉熵一个显著的缺点是要求分布QQ被适当的归一化,这也需要花费大量的时间计算整个词汇表的和。取而代之,我们使用最小二乘为目标,归一项PPQQ被写为:
J^=j=1Wj=1WXi(P^ijQ^ij)2 \hat{J} = \sum_{j=1}^W\sum_{j=1}^WX_i(\hat{P}_{ij}-\hat{Q}_{ij})^2
其中P^ij=Xij\hat{P}_{ij}=X_{ij}并且Q^ij=exp(ujTvi)\hat{Q}_{ij}=exp(u_j^Tv_i)是未归一化的分布。公式引入了一个新的问题,XijX_{ij}的值经常很大,使得优化过程变得困难。有效的解决方法是将平方误差改对数误差:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲\hat{J} & = \su…
另外个权重因子XiX_i不能保证是最优的,取而代之引入一个更通用的权重函数,可以更自由的依赖上下文。
J^=j=1Wj=1Wf(Xij)(ujTvilogXij)2 \hat{J} = \sum_{j=1}^W\sum_{j=1}^Wf(X_{ij})(u_j^Tv_i-logX_{ij})^2

Conclusion

GloVe模型有效的使用了全局的统计信息,通过训练单词共现矩阵中的非零元素,并且产生一个更有意义的向量空间的子结构。在单词类比任务上比word2vec表现要好。表现更好的同时速度更快。

Evaluation of Word Vectors

到此为止,我们已经讨论了像Word2vec和GloVe来训练和发现自然语言单词潜在向量表示的方法。在这一小节中,我们讨论如何定量评估这些模型产出单词向量的好坏。

Instrinsic Evalution

词向量的内在评价方法为,将一些通过嵌入方法(如Word2Vec或者GloVe)得到的词向量在特定的中间任务(如单词类比推断)进行评估。这些子任务往往简单并且计算迅速,因此可以帮助我们理解产生词向量的系统。内在评价应该返回一个数值,表示这些词向量在评估任务中的表现。

Motivation(动机):考虑一个例子,我们的最终目标是建立一个问答系统,它使用词向量作为输入,一种方法是训练一个机器学习系统,它可以:

  1. 使用单词作为输入
  2. 把单词转换为词向量
  3. 复杂的机器学习系统使用词向量作为输入
  4. 将输出的词向量映射为自然语言单词
  5. 产生单词作为输出

在这个产生SOTA问答系统中,我们将创建一个优化过的词向量表示,因为问答系统作为下游任务(例如深度神经网络)。在实践当中,我们需要调整Word2Vec中的许多超参数(例如每个词向量表示的维度)。然而理想的方式是在调整Word2Vec模型参数之后,重新训练整个系统,这从工程角度来看是不太实际的,因为机器学习系统(在第3步)通常是一个有着数以百万参数的深度神经网络,需要花费很长时间来训练。这样的话,我们需要想出一个简单的内在评价方法,可以提供评估词向量系统好坏的方法。显然,对于内在评价的一个要求是必须和最终任务表现正相关。

Extrinsic Evaluation

词向量的外部评价指的是,评估由词嵌入技术产生的词向量在真实任务中的表现。这些任务通常较为复杂并且计算速度很慢。用上面使用的例子,问答系统产出的答案使用的就是外部评价。更一般的说,优化外部评价表现不好的系统,不允许我们判断具体哪一个子系统有问题,这催生了内部评价指标(也就是说使用外部评价通常都是看最后结果,词嵌入方法只作为其中一小部分,我们只能获得在最终任务的结果,没办法具体判断词嵌入部分的优劣性)。

Intrinsci Evaluation Example: Word Vector Analogies

内部评价指标而言,一个主流的选择是比较在词向量类比任务上的表现。在词向量类比任务重,我们提供如下形式不完整的类比:
a:b::c:? a:b::c:?
(aa之于bb相当于cc之于谁?)

这种内在评价系统实际是在确定哪个词向量使得余弦相似度最大:
d=argmaxi(xbxa+xc)Txixbxa+xc d = argmax_{i} \frac{(x_b-x_a+x_c)^Tx_i}{||x_b-x_a+x_c||}
这个计算方式有更加直观的解释。理想情况下,我们希望xbxa=xdxcx_b-x_a=x_d-x_c(比如,queen-king=actress-actor)。这强调了我们希望xbxa+xc=xdx_b-x_a+x_c=x_d。因此我们最大化两个词向量点乘归一化后的值(其实也就是余弦相似度)。

使用内在评价方法(如词向量类比)是应该谨慎处理(应当使用各个类别的预料作预训练)。例如,考虑如下的类比形式:
City 1: state containing City 1 :: City 2: State containing City 2 \text{City 1: state containing City 1 :: City 2: State containing City 2}
CS224n 深度自然语言处理(二) Note - Word Vectors 2 and Word Senses

在上面的许多样例中,有多个城市/城镇/乡村有同样的名字。因此许多表述都应当认为是正确的。例如,在美国至少有10个地点交Phoenix,因此Arizona也不是唯一的正确答案。现在考虑另外一种类比形式:
Capital City 1: Country 1 :: Capital City 2: Country 2 \text{Capital City 1: Country 1 :: Capital City 2: Country 2}
CS224n 深度自然语言处理(二) Note - Word Vectors 2 and Word Senses

在上面的样例中,产生结果仅仅是近代作为首都的城市。例如早在1997年Kazakhstan的首都是Almyty。因此如果语料库过时了我们可以提前预知其他问题。

之前的两个例子阐述了使用词向量进行予以测试。我们也可以使用词向量推断做语法测试。下面的内部评价测试将使用词向量推断形容词的比较级:

CS224n 深度自然语言处理(二) Note - Word Vectors 2 and Word Senses

类似的,使用词向量来做过去时态的内部评价测试如下:

CS224n 深度自然语言处理(二) Note - Word Vectors 2 and Word Senses

Instrinsic Evaluation Tuning Example: Analogy Evaluations

现在我们探索词向量嵌入中超参数,这些超参数在内部评价系统中可以被调整。首先观察相同的超参数对于不同模型在类比任务中的表现:

CS224n 深度自然语言处理(二) Note - Word Vectors 2 and Word Senses
观察上述表格,可以得出三个主要的结论。

模型表现十分依赖于词嵌入使用的模型。这个结果不出所料,因为不同方法做词嵌入从根本上有不同的特性。

使用大型预料表现更好。因为嵌入技术可以获得更多的样例。如果一个类比样例根本没见过测试词(也就是一个样例对应的答案),那么会输出错误的答案。

特别低纬度词向量表现更差。低维词向量不能够捕捉语料库中不同单词的不同意思。可以看做是一个高偏差问题,模型复杂度不够。例如考虑’king’, ‘queen’, ‘man’, ‘woman’这些词,凭直觉而言,我们使用2bits将词语编码,这两维分别代表’gender’和’leadership’。再低维度的向量都不能捕捉这四个单词语义差别了。

下图阐述了准确率随着语料库则变大而提高。

CS224n 深度自然语言处理(二) Note - Word Vectors 2 and Word Senses

下图阐述了超参数对GloVe模型准确率的影响。

CS224n 深度自然语言处理(二) Note - Word Vectors 2 and Word Senses

Instrinsic Evalution Example: Correlation Evalution

另外一个用来评估词向量质量的方法是询问人类两个词之前的相关性,相关性被限定在一个固定尺度范围(如1-10)。之后用余弦相似度作为指标比较对应的词向量。这种操作已经在很多数据集上实施过。
CS224n 深度自然语言处理(二) Note - Word Vectors 2 and Word Senses

Futher Reading: Dealing With Ambiguity

有人会好奇,如何处理自然语言一词多义的问题。例如’run’即使名词也是动词,在不同语境中有不同的含义。Improving Word Representations Via Global Context And Multiple Word Prototypes (Huang et al, 2012)这篇文章描述了这种请款如何解决。必要的步骤如下:

  1. 通过固定大小上下文窗口获取上下文词(如获取中心词之前的5个词和之后的5个词)
  2. 每一个上下文被表示为上下文词的加权平均(使用idf作为权重)
  3. 应用球形k-means聚类这些上下文表示
  4. 最终每一个单词的出现都被重新标记为与他相关的类别,然后再训练与类别对应的单词表示。

相关文章: