CS224N(三)Word Vectors 2
【笔记3-1】CS224N课程笔记 - 深度自然语言处理
【笔记3-2】CS224N课程笔记 - 词向量表示 word2vec
【笔记3-4】CS224N课程笔记 - 分类与神经网络
【笔记3-5】CS224N课程笔记 - 依存分析
【笔记3-6】CS224N课程笔记 - RNN和语言模型
【笔记3-7】CS224N课程笔记 - 神经机器翻译seq2seq注意力机制
【笔记3-8】CS224N课程笔记 - 卷积神经网络
CS224n:深度学习的自然语言处理(2017年冬季)1080p https://www.bilibili.com/video/av28030942/
涉及到的论文:
GloVe: Global Vectors for Word Representation (Jeffrey Pennington, Richard Socher, and Christopher D. Manning. 2014)
https://nlp.stanford.edu/pubs/glove.pdf
Evaluation methods for unsupervised word embeddings (Schnabel, T. , Labutov, I. , Mimno, D. &Joachims, T. 2015)
http://www.cs.cornell.edu/~schnabts/downloads/schnabel2015embeddings.pdf
Improving Distributional Similarity with Lessons Learned from Word Embeddings(Omer Levy, Yoav Goldberg, and Ido Dagan. TACL 2015)
https://levyomer.files.wordpress.com/2015/03/improving-distributional-similarity-tacl-2015.pdf
关键词:GloVe,内在评价和外在评价,超参数的影响,人类判断与单词向量距离,单词歧义处理,窗口分类
GloVe
全局统计信息+类比功能
在之前的课时中已经学过单词的向量表示方法,包括基于计数的矩阵分解方法,以及基于上下文窗口的方法(word2vec)但是,这两种方法都存在一定的缺点,前者无法处理词汇类比问题,后者无法捕捉整体的统计信息,因此需要提出一个方法来综合两者的优点。
相比之下,GloVe基于全局的词汇共现的计数,通过一个最小二乘模型,生成了一个具有有意义的子结构的词向量空间,可以用于处理单词类比以及相似性问题。
共现矩阵的表示
我们用 X i j X_{ij} Xij来表示单词j在单词i的上下文当中出现的次数,则 X i = ∑ k X i k X_i=\sum_k X_{ik} Xi=∑kXik则为任意一个单词k在单词i的上下文中出现的总次数。进而可以用 P i j = P ( w j ∣ w i ) = X i j X i P_{ij}=P(w_j|w_i)=\frac{X_{ij}}{X_i} Pij=P(wj∣wi)=XiXij来表示单词j在单词i的上下文中出现的概率。
虽然这一概率的计算需要遍历整个文库,在数据量比较大的时候计算量会比较大,但是这是一个只需要进行一次的计算过程,相对来说计算量可以接受。
最小方差目标函数
在skip-gram模型中使用的是softmax函数来计算单词j出现在单词i的上下文中的概率: 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(\vec{u}_j^T\vec{v}_i)}{\sum_{w=1}^{W}exp(\vec{u}_w^T\vec{v}_i)} Qij=∑w=1Wexp(uwTvi)exp(ujTvi)对应的交叉熵损失函数为 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=−i∈corpus∑j∈context(i)∑logQij由于同样的单词i和单词j可能在上下文中出现多次,因此利用前面统计过的共现次数 X i j X_{ij} Xij进行求和效率会更高: 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=1∑Wj=1∑WXijlogQij交叉熵损失存在一个显著的缺点,就是要求对 Q Q Q的分布进行标准化,这样就会涉及到对整个数据集的求和操作,增大计算量,于是提出用最小方差来改进,标准化项 P , Q P,Q P,Q就会消失: J = ∑ i = 1 W ∑ j = 1 W X i ( P ^ i j − Q ^ i j ) 2 J=\sum_{i=1}^{W}\sum_{j=1}^W X_{i}(\hat{P}_{ij}-\hat{Q}_{ij})^2 J=i=1∑Wj=1∑WXi(P^ij−Q^ij)2其中, P ^ i j = X i j , Q ^ i j = e x p ( u ⃗ j T v ⃗ i ) \hat{P}_{ij}=X_{ij},\hat{Q}_{ij}=exp(\vec{u}_j^T\vec{v}_i) P^ij=Xij,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 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}(\vec{u}_j^T\vec{v}_i-logX_{ij})^2 J=i=1∑Wj=1∑WXi(log(P^ij)−log(Q^ij))2=i=1∑Wj=1∑WXi(ujTvi−logXij)2上式中的 X i X_i Xi可视为一个权重系数,但是该权重系数可能并不是最优的,因此实际情况下会使用对应的函数来表示权重: J = ∑ i = 1 W ∑ j = 1 W f ( X i j ) ( u ⃗ j T v ⃗ i − l o g X i j ) 2 J=\sum_{i=1}^{W}\sum_{j=1}^W f(X_{ij})(\vec{u}_j^T\vec{v}_i-logX_{ij})^2 J=i=1∑Wj=1∑Wf(Xij)(ujTvi−logXij)2
GloVe总结
因此,GloVe只需要对单词共现矩阵中的非零项进行训练,就能够捕获数据集整体的统计信息,并且形成一个包含有意义的子结构的词向量空间,相比word2vec而言有更好的表现力。
词向量的评估
本节讨论用来评估词向量模型表现好坏的方法。
内部评估
内部评估方法指的是利用一个明确的中间子任务来评估词向量模型的表现,一般来讲分为以下几个步骤:
- 将单词作为机器学习模型的输入,并将其转化为词向量
- 将词向量输入到特别设计的机器学习模型中,得到对应的词向量输出
- 将输出的词向量转换回单词,作为最终得出的答案
以上步骤构成一个完整的问答系统,在实际运用中,对于评估输出的结果,需要对模型的参数进行调整,然后再从头到尾对模型进行训练,这对于机器学习这一深度神经网络构造的模型而言是不太可行的,因为神经网络中包含的参数过多,训练代价会很大,因此需要用一个简单的评估系统来替代这个较为完备的评估方法,这一替代系统需要具有以下特征:
- 是一个具体的评估任务
- 能够较快地计算出模型的表现
- 有助于理解子系统
- 需要与实际任务需要解决的问题正相关
比如,将下图左边的评估任务替换成右侧的评估任务,简化评估过程的同时满足上述要求。
外部评估
词向量的外在评价是在当前实际任务上生成的。这些任务通常很复杂,计算速度很慢。比如上面左侧的例子中,对问题的答案进行评估的系统是外部评估系统。通常,对性能不佳的外部评估系统进行优化无法确定是哪个子系统出了问题,这就引起了对内部评估的需求。
外部评估一般具有以下特点:
- 在实际任务上进行评估
- 评价模型表现速度慢
- 无法确定模型表现差的具体原因
- 如果改变子系统使得模型整体效果变好,只能说这有一定的可能是一个有效的改进
内部评估方法示例:词向量类比
词向量类比需要完成以下任务:
a
:
b
:
:
c
:
?
a:b::c:?
a:b::c:?内部评估系统会通过计算词向量的余弦相似度来预测空缺词:
d
=
a
r
g
m
a
x
i
(
x
b
−
x
a
+
x
c
)
T
x
i
∣
∣
x
b
−
x
a
+
x
c
∣
∣
d=argmax_i\frac{(x_b-x_a+x_c)^Tx_i}{||x_b-x_a+x_c||}
d=argmaxi∣∣xb−xa+xc∣∣(xb−xa+xc)Txi直观地理解就是希望有
x
b
−
x
a
=
x
d
−
x
c
,
x
d
=
x
b
−
x
a
+
x
c
x_b-x_a=x_d-x_c, x_d=x_b-x_a+x_c
xb−xa=xd−xc,xd=xb−xa+xc,于是得到上述余弦相似度的定义。
词向量类比举例:
用上述评估方法对具有不同超参数以及不同大小数据集的模型进行评估,结果如下图,可以得出以下结论:
- 性能在很大程度上依赖于词嵌入模型
- 数据集越大,模型表现越好
- 对于极低和极高维字向量,模型性能更低
内部评估方法示例:相关性评估
另一种评估词向量模型的方法是让人类在固定的范围内评估两个词之间的相似性(如0-10),然后将其与对应词向量之间的余弦相似性进行比较。
模糊单词的处理
对于同一个单词在不同的上下文中可能有不同的含义,Word Representations Via Global Context And Multiple Word Prototypes (Huang et al, 2012) 提出如下解决方法:
- 收集固定大小的上下文窗口中出现的所有单词
- 每个上下文由上下文单词向量的加权平均值表示(使用idf加权)
- 应用球形k-means对这些上下文表示进行集群
- 每个单词的出现都被重新标记到其关联的集群中,并用于训练该集群的单词表示
外部任务训练
虽然前面指出外部评估的弊端,但是模型最终还是需要被用到外部任务上进行训练,在此对外部训练的常用方法进行介绍。
任务描述
一般而言,自然语言处理的任务都可以被视为分类任务,比如情绪分析,命名实体识别等。对于这类问题,一般而言训练集的形式都为 { 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维的独热码,即预测的目标。
这种类型的任务中,一般都是保持输入和目标不变,通过梯度下降, L-BFGS, 牛顿法等对权重参数进行更新。但是在NLP中,可以对词向量进行再训练。
词向量的再训练
使用内部任务训练得到的模型迁移到外部任务上时会有较好的表现,如果进一步针对外部任务对模型进行调整和训练可能会得到更好的效果,但是这种方法存在一定的风险。
当模型的数据集较小时,不适宜在外部任务上进行再训练,因为小的数据集训练出来的模型泛化能力较差,即便迁移到外部任务上,再训练出来的模型效果也不一定好。因此,数据集足够大是使用外部任务进行训练的一个前提。
在外部任务的词向量训练中,由于要基于目标分类的C个类别以及更新向量的d个维度,以及V个词汇的词向量等待更新,因此更新的过程中需要更新的参数数量巨大,更新速度慢,同时参数数量过多容易造成过拟合(用正则化处理)这就是外部任务用于词向量再训练的困难点。
前面所描述的方法都是使用单个单词向量来预测外部任务。实际上,自然语言倾向于用同一个词来表示不同的意思,通常需要知道这个词的上下文来区分不同的意思。
在大多数情况下,倾向于使用一系列单词作为模型的输入。包含中心词向量,前后是上下文词向量。上下文中的单词数量也称为上下文窗口大小,并且随着要解决的问题的不同而变化。通常,窗口越小,语法测试的性能越好,窗口越大,语义测试的性能越好。