jiaoshengha 2018-09-06
说明:本文为斯坦福大学CS224d课程的中文版内容笔记,已得到斯坦福大学课程@Richard Socher教授的授权翻译与发表
课堂笔记:第2部分
——————————————————————————————————–
关键词:内部任务评价(Intrinsic Evaluation)和 外部任务评价(extrinsic evaluations)。超参数影响下的类比评价任务。人类决策和词向量距离的相关性。结合上下文处理歧义。窗口分类。
这个课堂笔记我们将会对词向量(也就是词嵌入)的内部任务评价和外部任务评价方法进行讨论。主要的内容是单词类比(word analogies)技术,我们会把它当做内部任务评价的技术并展示其相关示例,它会在词向量的调谐(tune)中发挥重要作用。我们还会讨论如何训练模型的权重/参数,并关注用来进行外部任务评价的词向量。最后,我们会简单地提到人工神经网络,它在自然语言处理中表现极好。
在前面的Lecture1中,我们讨论了Word2Vec和GloVe等词嵌入的方法。它们用来训练和发现词汇在语义空间中的向量表示。今天我们来探讨如何对词向量的效果进行评价。
内部任务评价是对在特定子任务(如完成单词类比)中生成的词向量进行的评价,这些词向量可以由词嵌入技术(如Word2Vec和GloVe)生成。这些子任务往往很简单,计算速度很快,可以帮助我们理解生成这些词向量的系统。一个内部任务评价往往返回一个数值,来表示这些词向量在子任务上的表现。
图1:左侧子系统(红)训练消耗较大,通过替换为一个简单的内部任务评价子系统(绿)来优化。
内部任务评价的特点如下:
咱们考虑一个例子,比如我们的目标是要建立一个以词向量为输入,能够回答问题的系统。一种方法是训练一个机器学习的模型,主要步骤如下:
显然,为了训练这样一个问答系统,我们需要为下游机器学习系统(比如深度神经网络)建立一个最优的词向量表示。这在实际操作中,就需要我们调节Word2Vec 子系统中的许多超参数(如向量维度)。 尽管最理想的方法是每次调整参数后重新训练整个系统,但这在工程上是不现实的。因为这里的机器学习系统(第3步)一般都是一个含有几百万参数的深度神经网络,需要极长时间去训练。等得花儿都谢了。 所以,我们希望有一个简单的内部任务评价方法来评价词向量生成系统的好坏。显然,其中一个要求是内部任务评价结果和整个系统的最终精度是正相关的。
外部任务评价是对在实际任务中产生的词向量进行的评价。这些任务通常是很复杂的,且它们的计算过程比较缓慢。在我们前面使用的例子中,允许基于问题对答案进行评估的系统是一种外部任务评价系统。一般来讲, 优化外部评价系统的时候我们无从知晓是哪个子系统除了问题,所以需要进一步进行内部任务评价。
外部任务评价的特点如下:
一个比较流行的内部任务评价是词向量类比的。 在词向量类比中,我们先输入一组不完整的类比:
a:b::c:?
a:b::c:?
内部任务评价系统找出最大化余弦相似度的词向量
d=argmax
i
(x
b
−x
a
+x
c
)
T
x
i
∥x
b
−x
a
+x
c
∥
d=argmaxi(xb−xa+xc)Txi‖xb−xa+xc‖
我们可以直观地解释这个衡量指标。理想情况下,我们想得到x
b
−x
a
=x
d
−x
c
xb−xa=xd−xc(例如,王后–国王 = 女演员 – 男演员)。于是x
b
−x
a
+x
c
=x
d
xb−xa+xc=xd, 所以我们只需要找出一个与x
b
−x
a
+x
c
xb−xa+xc的标准化内积(比如余弦相似度)取最大值的词向量就可以了 。
使用内部任务评价的时候需要比较谨慎,要考虑到训练文集的各个方面。例如,如下形式的类比
城市1 : 城市 1所属州 : : 城市2 : 城市2所属州
表1:语义词向量类比(内部评价)会因为同名城市而产生问题
美国有许多同名村镇,所以很多州都符合正确答案。比如在美国至少有十个地方叫Phonix,所以Arizona不一定是唯一的正确答案。 再看以下类比形式:
首都城市1 : 国家1 : : 首都城市2 : 国家2
表2: 这些是语义词向量类比(内部任务评价),此类比存在的问题在于国家在不同时期会有不同的首都
上面这个例子中的城市只是近期的国家首都。比如,1997年之前Kazakhstan的首都是Almaty。如果我们用来训练的文集比较旧,就很容易出现问题。
之前的两个例子说明了如何使用词向量进行语义测试。我们还可以使用词向量类比进行语法测试。下面的内部任务评价能够评估词向量获取形容词最高级的能力。
表3:语法词向量类比(内部评价)在形容词最高级上的测试
类似的,下面的内部任务评价能够测试词向量捕捉过去式的能力
表 4: 这些是语法词向量类比(内部任务评价),此类比可评估获取过去式的能力
我们在内部任务评价任务中调整(tuning)一个词嵌入技术时,可能会考虑一些参数:
• 词向量的维度
• 资料库的大小
• 资料源/类型
• 上下文窗口的大小
• 上下文的对称性
大家还能想到其他在这个阶段可以调整的超参数吗?
我们现在探索一些词向量生成技术(如Word2Vec和GloVe)中可以用内部任务评价调节的参数。我们先看一下在超参数相同的情况下,词向量生成方法在类比评测中的表现。
表5:比较不同参数和数据集情况下各种模型的性能
我们从上表中主要可以看到3点:
tip3: GloVe 一般在使用中间词的两侧大小为8的窗口时表现较好
图2:图中能看出训练时间对训练精度的帮助
图3:我们可以看到随着文集增大精度的改善
图4:我们可以看到GloVe的精度随着向量维度及上下文窗口大小的改变而改变
另外一个评测词向量质量的简单方法是人为对两个词的相似度在一个固定区间内打分(比如说 0-10),再跟对应向量的余弦相适度进行对比。这个方法曾在多个包含人为评价的数据集上实施过。
表6:这里我们看到不同生成方法产生的词向量的相似度,与人为评价的相关性。
可能有些同学也想到了,有时候我们会遇到一些特殊的情况:在我们生活中,有时候同一个单词在它的不同上下文和语境下,有着不同的含义/用法,这时候我们希望我们希望用不同的词向量来捕捉到这个单词的不同用法。举个例子说,“跑(run)”既是一个名词又是一个动词,在不同语境中,它可能是不同的词性。Huang等人(2012)在论文《Improving Word Representations Via Global Context And Multiple Word Prototypes》中描述了如何在自然语言处理中解决上面提到的问题。他们提出的方法本质在于以下几点:
前面我们着重讨论了内在性任务,并且强调了它们在生成优质词嵌入技术(词向量)中的重要性。当然,最终目的是利用词向量解决外部的实际问题。 这里我们讨论处理外部任务的一般方法。
大多数的NLP外部任务都可以被描述成分类任务。比如说,我们可以对句子做情感分类,判断其指代的情况是褒义,贬义还是中性的。 类似的,在命名实体识别(NER)中,我们需要找出上下文中的中心词所属的类别。例如输入为“Jim bought 300 shares of Acme Corp. in 2006”, 我们期望分类完成后的输出是, “”[Jim]人名bought 300 shares of [Acme Corp.]机构名in [2006]时间.”
图5:针对词向量的分类问题,上图是一个二维词向量分类问题,用简单的线性分类器,比如逻辑回归和支持向量机完成分类
对于这样的问题,我们一般有以下形式的训练集:
{x
(i)
,y
(i)
}
N
1
{x(i),y(i)}1N
其中x
(i)
x(i)是用某种方法生成的d纬词向量。y
(i)
y(i) 是一个C维 one-hot 编码向量(译者注:one-hot,“独热”,意为只有一个元素为1,其余元素均为0),用来表示我们最终要预测的标签(感情色彩, 其他词, 专名, 买/卖决策, 等)。在一般的机器学习任务中, 我们通常固定输入数据和目标标签,然后用最优化技术(诸如梯度下降法,L-BFGS法,牛顿法等)训练权重。在自然语言处理中,我们引入了重训练的想法,也就是针对外在性任务时,重新训练输入的词向量。接下来我们讨论何时需要进行这样的操作,以及为什么考虑这么做。
应用贴士:在训练集比较大的时候,才需要进行词向量重训练,否则反而会影响精度。
我们一般先用一个简单的内部任务评价来初始化用于外部任务评价的词向量。在很多情况下,这些预训练的词向量的在外部任务中的表现已经非常好了。 然而,一些情况下,这些词向量在外部任务中的表现仍然有提升空间。不过,重训练词向量是由风险的。
图6:我们看到”Telly”, “TV”, 和 “Television” 在重训练之前的分类是准确的。”Telly” 和 “TV” 在外部任务训练集中,而”Television”只出现在测试集中。
如果要在外部任务上重新训练词向量,我们需要保证训练集的大小足够覆盖词库中的大多数单词。因为Word2Vec或GloVe 生成的语义相关的词会在词空间中落在同一部分位置。如果我们用一个比较小的训练集去重训练,这些词在词空间中的位置就会发生变化,在最终任务上的精确度反而可能降低。我们看一个例子。图6中预训练的2维词向量在某个外部分类任务重被正确分类了。 我们如果只重新训练其中两个词向量,因为训练集较小,从图7中我们可以看到,由于词向量的更新,分类边界的变化,其中一个单词被错误的分类了。
因此,如果训练集较小,则最好不好重训练词向量。如果训练集很大,重训练也许能够提升精度。
图7:我们看到”Telly”和”TV”在重训练之后的分类是准确的。而”Television”的分类错了,因为它只出现在测试集中,训练集中没见着。
我们知道Softmax分类函数形式大概是下面这个样子:
p(y
j
=1|x)=exp(W
j
.x)
∑
C
(c=1)
exp(W
c
.x)
p(yj=1|x)=exp(Wj.x)∑(c=1)Cexp(Wc.x)
上面我们计算了词向量x属于类别j的概率。然后根据互熵损失函数,一个单词在模型中的损失如下:
−∑
j=1
C
y
j
log(p(y
j
=1|x))=−∑
j=1
C
y
j
log(exp(W
j
.x)
∑
C
(c=1)
exp(W
c
.x)
)
−∑j=1Cyjlog(p(yj=1|x))=−∑j=1Cyjlog(exp(Wj.x)∑(c=1)Cexp(Wc.x))
因为上式中的y
j
yj只有在x属于正确的类时才等于1,其他均为0。如果我们假设k是那个正确的类,那上式可以简化为:
−log(exp(W
k
.x)
∑
C
(c=1)
exp(W
c
.x)
)
−log(exp(Wk.x)∑(c=1)Cexp(Wc.x))
当然,我们数据集内不止这一个单词,假设我们的训练集是有N个数据点的数据集,那总损失应该有如下的形式:
−∑
i=1
N
log(exp(W
k(i)
.x
(i)
)
∑
C
(c=1)
exp(W
c
.x
(i)
)
)
−∑i=1Nlog(exp(Wk(i).x(i))∑(c=1)Cexp(Wc.x(i)))
这个公式有一点点不同,注意到其实这里的k(i)
k(i)现在是个函数,返回每个x
(i)
x(i)所对应的正确的类。
咱们来估一估,如果我们同时要训练模型中的权重参数(W)和词向量(x), 需要训练多少个参数呢? 一个以d-维词向量为输入,输出一个其在C 个类上的分布的简单的线性模型需要C·d个参数。如果我们训练时更新词库中每个单词的词向量,则需要更新|V|个词向量,而每一个都是d维。综合一下,我们知道,一个简单的线性分类模型需要更新C⋅d+∣V∣⋅d
C⋅d+∣V∣⋅d个参数。
▽
θ
J(θ)=⎡
⎣
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
▽
W⋅1
⋮
▽
W⋅d
▽
x
aardvark
⋮
▽
x
zebra
⎤
⎦
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
▽θJ(θ)=[▽W⋅1⋮▽W⋅d▽xaardvark⋮▽xzebra]
对于一个简单的线性模型来说,这个参数量就显得非常大了,带来的问题是模型很容易在数据集上过拟合。为了缓解过拟合,我们需要引入一个正则项,用贝耶斯的角度来讲,这个正则项其实就是一个给模型的参数加上了一个先验分布,从而希望他们的值更接近0。
$$
−∑
i=1
N
log(exp(W
k(i)
.x
(i)
)
∑
C
(c=1)
exp(W
c
.x
(i)
)
+λ∑
k=1
c⋅d+∣V∣⋅d
θ
2
k
−∑i=1Nlog(exp(Wk(i).x(i))∑(c=1)Cexp(Wc.x(i))+λ∑k=1c⋅d+∣V∣⋅dθk2
如果咱们找到合适的正则项权重λ,那最小化上面的损失函数得到的模型,不会出现某些权重特别大的情况,同时模型的泛化能力也很不错。需要多说一句的是,正则化这个操作,在我们接触到神经网络这种复杂的模型的时候,更加重要,咱们更应该约束一下,不让模型那么容易过拟合。
图8:我们这里看到的是一个中心词,和长度为2的左右窗口内的词。 这种上下文可以帮助我们分辨Paris是一个地点,还是一个人名
我们前面提到的外部任务都是以单个单词为输入的。实际上,由于自然语言的特性,这种情况很少会出现。在自然语言中,有很多一词多义的情况,这时候我们一般会参考上下文来判断。 比如说,如果你要给别人解释”真有你的”是什么意思。你马上就知道根据上下文的不同,”真有你的” 可以是称赞,也可以是生气。 所以在大多数的情况下,我们给模型输入的是一个词序列。这个词序列由一个中心词向量和它上下文的词向量组成。上下文中词的数量又叫词窗大小,任务不同这个参数的取值也不同。一般来讲,小窗口在句法上的精度较高,大窗口在语义上的表现较好。如果我们要把词窗作为Softmax模型的输入,我们只要把x
(i)
x(i)换成以下形式的 x
(i)
window
xwindow(i)
x
(i)
window
=⎡
⎣
⎢
⎢
⎢
⎢
⎢
⎢
⎢
x
(i−2)
x
(i−1)
x
(i)
x
(i+1)
x
(i+2)
⎤
⎦
⎥
⎥
⎥
⎥
⎥
⎥
⎥
xwindow(i)=[x(i−2)x(i−1)x(i)x(i+1)x(i+2)]
那相应的,我们计算损失函数梯度的时候,得到的就是如下形式的向量了:
δ
window
=⎡
⎣
⎢
⎢
⎢
⎢
⎢
⎢
▽
x
(i−2)
▽
x
(i−1)
▽
x
(i)
▽
x
(i+1)
▽
x
(i+2)
⎤
⎦
⎥
⎥
⎥
⎥
⎥
⎥
δwindow=[▽x(i−2)▽x(i−1)▽x(i)▽x(i+1)▽x(i+2)]
多说一句的是,这个过程中的每一项其实都是独立的,因此在现在工业界的实际操作中,这一步是可以进行分布式计算的。
图9图10
最后我们简单提一下非线性的分类模型,如神经网络。在图9中我们可以看到很多点被错误的分类了。在图10中,如果使用非线性的决策边界,我们发现训练集中的样本就可以被分对了(因为分界线可以弯曲了嘛)。这是一个简化的例子,但是已经足以说明,为什么实际应用中很多时候需要非线性的决策边界。接下来的课程里,我们会逐步讲到神经网络,这个在深度学习中表现尤为出色的非线性模型。