NLP-CS224n学习讲义PART 2——Word Vector 2: GloVe, Evaluation and Training

NLP-CS224n学习讲义PART 2——Word Vector 2: GloVe, Evaluation and Training

1 Global Vectors for Word Representation(GloVe)

1.1 方法间的比较

我们之前提到两种查找词汇嵌入的方式。第一种就是基于计数且依赖于矩阵分解的方式,这种方式可以有效地利用了全局统计信息,但是它们未能很好捕捉单词相似性。第二种基于window方式,即skip-gram和CBOW的方式,这种方式能够很好的捕获单词之间的相关性,但是未能利用全局共现统计信息。可见这两种方式是一种互补的,为了能够同时获得两种方式的优点。

1.2 共现矩阵

NLP-CS224n学习讲义PART 2——Word Vector 2: GloVe, Evaluation and Training_第1张图片

生成这个矩阵需要一次遍历整个语料库来收集统计信息。

1.3 最小二乘目标

在skip-gram模型中,使用softmax来计算 w o r d j word_j wordj 出现在上下文 w o r d i word_i wordi 的概率为:
Q i j = e x p ( u j T v i ) ∑ w = 1 W e x p ( u w T v i ) Q_{ij} = \frac{exp(u_j^Tv_i)}{\sum_{w=1}^Wexp(u_w^Tv_i)} Qij=w=1Wexp(uwTvi)exp(ujTvi)
最后的cross-entropy loss为:

J = − ∑ i ∈ c o r p u s ∑ j ∈ c o n t e x t ( i ) l o g Q i j J = -\sum_{i\in corpus}\sum_{j\in context(i)} logQ_{ij} J=icorpusjcontext(i)logQij

因为相同的单词i和j可以在语料库中出现多次,所以首先将相同的值i和j组合在一起会更有效率:

J = − ∑ i = 1 W ∑ j = 1 W X i j l o g Q i j J = -\sum_{i=1}^W\sum_{j=1}^W X_{ij}logQ_{ij} J=i=1Wj=1WXijlogQij

交叉熵损失的一个显著缺点是,它需要对分布Q进行适当的规范化,这涉及到对整个词汇表进行昂贵的求和。相反,我们使用最小二乘法作为目标:
J ^ = ∑ i = 1 W ∑ j = 1 W X i ( P ^ i j − Q ^ i j ) 2 \hat J = \sum_{i=1}^W \sum_{j=1}^W X_i(\hat P_{ij} - \hat Q_{ij})^2 J^=i=1Wj=1WXi(P^ijQ^ij)2

然而 P ^ i j = X i j \hat P_{ij} = X_{ij} P^ij=Xij Q ^ i j = e x p ( u j T v i ) \hat Q_{ij} = exp(u_j^Tv_i) Q^ij=exp(ujTvi)是非规范化分布 。新的问题是 X i j X_{ij} Xij往往值很大会使得优化困难,所以我们使用log:

J ^ = ∑ i = 1 W ∑ j = 1 W X i ( l o g ( P ^ ) i j − l o g ( Q ^ ) i j ) 2 = ∑ i = 1 W ∑ j = 1 W X i ( u j T v i − l o g X i j ) 2 \hat J = \sum_{i=1}^W \sum_{j=1}^W X_i(log(\hat P)_{ij} - log(\hat Q)_{ij})^2 = \sum_{i=1}^W \sum_{j=1}^W X_i(u_j^Tv_i - logX_{ij})^2 J^=i=1Wj=1WXi(log(P^)ijlog(Q^)ij)2=i=1Wj=1WXi(ujTvilogXij)2


2 Word Vectors的评估

将讨论定量地评估Word2Vec和GloVe等技术生成的word vectors的性能。

2.1 内部评估

词向量的内部评估是对一组词向量的评估,这些词向量是由嵌入技术(如Word2Vec或GloVe)在特定的中间子任务上生成的。一个内在的评价通常应该返回一个数字给我们,这个数字表示那些词向量在评价子任务上的表现。

内部评估直接衡量单词之间的句法和语义关系

  1. 相关性度量
  2. 类比度量

2.2 外部评估

而词向量的外部评估是对一组通过嵌入技术在手头的实际任务上生成的词向量的评价。通常,对表现不佳的外部评估系统进行优化是不能让我们确定是哪个子系统出了问题,这就激发了对内部评估的需求。

比如进行可视化评估。


3 Training for Extrinsic Tasks

3.1 问题定义

大多数NLP 外部任务都可以定义为分类任务。

训练集通常定义为 { x ( i ) , y ( i ) } 1 N \{x^{(i)}, y^{(i)}\}_1^N {x(i),y(i)}1N 的形式,其中 x ( i ) x^{(i)} x(i) 为d维词向量, y ( i ) y^{(i)} y(i) 为C维one-hot向量,即我们最后想要预测的标签(比如句子的情感、命名实体、其他词等)

我们知道在传统的机器学习任务中,基本上都固定input和output,然后我们去训练模型的weight,但是在NLP任务中,要注意,当我们训练外部任务时,我们引入了重新训练input词向量的概念。

3.2 重新训练词向量

我们用于外部评估的词向量是通过一个简单的内部评价来进行优化并初始化的。在许多情况下,这些预训练的词向量在外部评价中表现良好。但是,这些预训练的词向量在外部评价的表现仍然有提高的可能。然而,重新训练词向量存在着一定的风险,需要保证训练集足够大并能覆盖词汇表中大部分的单词。

3.3 Softmax分类和正则化

这块是个非常重要的知识点,因为基本上机器学习很多任务都需要用到softmax,softmax就是一种计算概率的函数,而这个往往和多分类问题相关。它的形式如下:

p ( y j = 1 ∣ x ) = e x p ( W j . x ) ∑ c = 1 C e x p ( W c . x ) p(y_j = 1|x) = \frac{exp(W_j.x)}{\sum_{c=1}^Cexp(W_c.x)} p(yj=1x)=c=1Cexp(Wc.x)exp(Wj.x)

上面的式子是在计算词向量x是第 j 类的概率,然后使用Cross-entropy 作为训练的损失函数:

− ∑ j = 1 C y j l o g ( p ( y j = 1 ∣ x ) ) = − ∑ j = 1 C y j l o g ( e x p ( W j . x ) ∑ c = 1 C e x p ( W c . x ) ) ) -\sum_{j=1}^C y_jlog(p(y_j=1|x)) = -\sum_{j=1}^Cy_jlog(\frac{exp(W_j.x)}{\sum_{c=1}^Cexp(W_c.x)})) j=1Cyjlog(p(yj=1x))=j=1Cyjlog(c=1Cexp(Wc.x)exp(Wj.x)))

我们一定要理解这个Cross-entropy loss,这里再做一下解释:

y j y_j yj表示真实结果,而 p ( y j = 1 ∣ x ) p(y_j=1|x) p(yj=1x) 表示计算的结果,刻画的便是通过计算的结果来表达真实结果的困难程度,其实换句话说就是loss越小,这计算结果和真实结果就越接近。

当然,整个求和$ -\sum_{j=1}Cy_jlog(\frac{exp(W_j.x)}{\sum_{c=1}Cexp(W_c.x)}))$ 会有 (C-1) 个0值,这是因为只有在某个下标时 y j y_j yj 才为1,这表示 x x x 只属于某一个类别。这样loss可以简化为:

− l o g ( W k . x ∑ c = 1 C e x p ( W c . x ) ) -log(\frac{W_k.x}{\sum_{c=1}^Cexp(W_c.x)}) log(c=1Cexp(Wc.x)Wk.x)

我们知道训练不仅仅要训练model weights,同时还要训练input word vectors,所以需要更新的参数数量为 C ⋅ d + ∣ V ∣ ⋅ d C \cdot d + |V| \cdot d Cd+Vd 个,即

▽ θ J ( θ ) = [ ▽ W . 1 : ▽ W . d ▽ x a a r d v a r k : ▽ x z e b r a ] \bigtriangledown_\theta J(\theta) = \begin{bmatrix} \bigtriangledown_{W.1}\\:\\\bigtriangledown_{W.d}\\\bigtriangledown_{x_{aardvark}}\\:\\\bigtriangledown_{x_{zebra}} \end{bmatrix} \quad θJ(θ)=W.1:W.dxaardvark:xzebra

这个数量是非常大的,而如此多的参数很容易过度拟合,所以我们需要加一个正则项来减少过拟合的风险:

− l o g ( W k . x ∑ c = 1 C e x p ( W c . x ) ) + λ ∑ k = 1 C ⋅ d + ∣ V ∣ ⋅ d θ k 2 -log(\frac{W_k.x}{\sum_{c=1}^Cexp(W_c.x)}) + \lambda \sum_{k=1}^{C\cdot d+|V|\cdot d}\theta_k^2 log(c=1Cexp(Wc.x)Wk.x)+λk=1Cd+Vdθk2

3.4 window classification

实际上我们不会以一个单词作为输入的,这是因为语言处理基本都是根据上下文进行的,所以我们要以一段序列作为输入,而这个序列就包括中心词和其上下文词,而上下文词的个数就作为window的大小。比如:

x w i n d o w ( i ) = [ x ( i − 2 ) x ( i − 1 ) x ( i ) x ( i + 1 ) x ( i + 2 ) ] x_{window}^{(i)} = \begin{bmatrix} x^{(i-2)} \\ x^{(i-1)} \\ x^{(i)} \\ x^{(i+1)} \\ x^{(i+2)} \end{bmatrix} \quad xwindow(i)=x(i2)x(i1)x(i)x(i+1)x(i+2)

然后我们对其进行求导来更新参数。

你可能感兴趣的:(NLP)