2018-01-20 | CS244n | UNLOCK

CS244n Lecture Notes2:Word Embedding Part 2

与之前方法对比

目前为止我们有两类方法获得词向量。一类是基于count-based和矩阵分解技术(LSA,HAL)的方式.这种方式可以充分利用全据统计信息,主要用于捕获单词的相似性,但在单词类比任务表现不佳,因为它只是一个次优的空间向量结构。另一种是基于浅层窗口的方式如(Skip-gram,CBOW),通过利用当前窗口上下文进行预测和学习word embedding,这些模型展示了超越词相似度以为的复杂语言学模式,却不能够充分利用全局共现统计信息。</br>
相比之下,Glove由一个加权的最小二乘模型构成,它基于全局词-词的共现频次进行训练,充分利用全局统计信息。【Glove,把最小二乘作为目标函数,预测在词i上下文中出现的词j的概率】该方法能够生成具有结构意义的词向量,在词类比任务上能够达到最优效果,同时在其他词相似度任务上也比现有方法好。

共现矩阵

令X代表词-词共现矩阵,X_ij表示此j在词i上下文中出现的次数(此时,词i的上下文可理解为一个doc),Xi = ∑k Xik 表示任意词k在词i上下文中出现的总次数,那我们有
image.png
,表示词j在词i上下文中出现的概率。
在实际计算时,构建这样的矩阵需要遍历整个语料库来得到这些统计数据。如果预料很大,这种统计代价很大,但只需要遍历一次即可。

最小二乘目标函数

对于skip-gram模型,采用softmax词j在词i上下文中出现的概率,
image.png
训练是以随机在线方式进行,但隐含的的交叉熵可以通过如下公式计算,
image.png对于同一个词i和词j可以在整个语料库中出现很多次,更高效的做法将i和j相同的指聚合在一起计算损失,
image.png
,在这个式子中,共现次数X_ij的值来源于词前面所述的共现矩阵。交叉熵一个重要缺点是,它需要分布Q(预测出词j的分布)必须进行合适的归一化,这就需要在整个词典上进行求和,这个计算代价很大。相反,我们使用最小二乘最为目标函数,省去了P和Q中需要的归一化操作,新的目标函数如下。
image.png
这个式子中,image.png
,是未归一化的分布。这就引入另一个问题,X_ij词频数通常会很大,这使得归一化很难进行(因为,有的词频很大,有的很小,差距很大)。进一步的改进是采用P和Q的log形式计算误差,如下,image.png,在这个式子中,权重X_i不能保证是最优的,因此我们采用更加一般的形式,它能够更加灵活的依赖于上下文词。image.png

结论

GloVe模型对词-词的矩阵中非零元素进行训练,能够有效利用全据统计信息,生成具有意义的子结构向量。在相同语料库、词典、窗口大小、训练时间上,它在词类比任务上由于word2vec。它能更快地取得更好的结果,而且不管速度如何,都能得到最好的结果。

词向量评价

目前为止我们能够通过word2vec和GloVe方法获得词在语义空间中的表示,这一节我们会探讨如何去对这些方法进行评价。

内部评价

内部评价是指在内部子任务如词类比任务上对词向量进行评价。这些子任务通常简单且计算速度快,能够帮助理解词向量生成过程。内部评价能够返回一个表示词向量好坏的数字,以显示当前词向量在该子任务上的效果。
动机:
考虑这样一个例子,我们要构建一个问答系统,以词向量作为输入。如图所示。
image.png
一种构建该系统的流程如下。

  • 1)以词为单位作为系统输入
  • 2)将词转换为词向量 3)使用词向量作为复杂ML系统的输入
  • 4)将输出词向量映射回词 5)把映射后的词作为答案。

构建一个state-of-the-art的问答系统,我们需要设计最优的词向量,因为这些词向量应用到下游的子系统如DNN中。在实践中,我们需要不断的调整word2vec的超参数(维度、窗口大小)。理想情况下每改变一次word2vec的参数都需要对整个系统重新训练,但从工程角度来说,这种方式并不可行,因为在第三个步骤,通常是一个复杂的拥有几百万参数DNN,需要很长时间进行训练。因此在这种情况,我们需要一种能够直接、快速体现词向量好坏的评价方法,并且词向量和任务最终效果有直接的关系。因此,内部评价需要满足如下条件,

  • 1)在一个特定的、内部任务上进行评价
  • 2)能够快速计算效果
  • 3)可以帮助理解子系统
  • 4)需要和任务最终效果有正相关性

外部评价

外部评价是指词向量在实际任务上的对该任务的影响。这些任务通常复杂度高、计算实际久。鉴于此,前面所说的问答系统,可以认为是一个外部评价。通常来说,如果一个外部任务效果不好,我们并不能知道具体是哪个子任务或环节造成,这一点也说明了需要内部评价来对词向量进行评估。因此外部评价特点如下,

  • 是否在一个真实的任务上进行
  • 计算效率是否很慢
  • 不能明确具体出问题的是子系统或其他方面的问题
  • 如果替换子系统能够提升性能,那这个改变是好的

内部评价举例:词向量类比

典型的词向量内部评价任务是“词向量类比”。在词向量类比任务中,给出一个不完整的类比形式如下,a:b::c:?,意思就是a相对于b就像c相对于谁。之后内部评价系统会找到能够是的如下余弦相似度最小的词向量。
image.png

这个指标是很直观的。我们希望X_b - X_a = X_d - X_c (就像 queen - King=actress - actor),那因此得到X_d = X_b - X_a +X_c,因此可以通过最大化这两个向量归一化之后的点积即余弦相似度。
在用词向量类比进行内部评价时,需要小心处理如用来进行预训练的语料库的各个方面。例子如下:
image.png
在许多情况下,美国各地有多个同名的城市/城镇/村庄。因此,许多州都可以作为正确的答案。例如,美国至少有10个地方叫菲尼克斯,因此,亚利桑那州不一定是唯一正确的回应。那现在考虑下面的形式,
image.png
根据上面的例子,这个形式的结果仅能是在过去的时期内作为capital的城市。因此这里要说明的是我们要时刻关注训练预料是否有效。

上面两个例子通过词向量在词的语义层面进行测试,也可以通过词向量类比进行语法(syntax)层面进行测试。下面的内部评价能够体现词向量捕获形容词词性的能力。
image.png
类似地,下面内部评价测试了单词向量捕捉过去时态的能力
image.png
image.png

内部评价参数调优示例:类比评价

接下来我们将探讨超参数的对内部评价的影响。首先让来看下相同超参数不同词向量方法在词类比任务的情况。在词向量训练时可进行调整的参数有,1) 词向量维度 2)语料库大小 3)语料库来源或类型 4)词窗口大小 5)语境对称性 6)词频率等
image.png
通过观察上面表格,可得到:

  • 最终效果和选用哪种词向量模型有关
    这个很好理解,因为不同的模型利用不同的信息,比如贡献慈善,奇异值向量等
  • 最终效果随语料库的增大而增大
    这个现象也很好理解,语料库越大模型遇见的共现次数越多,
  • 最终效果在维度过高和过低的情况下都不好
    较低的维度不能够捕获语料库中不同的含义,这种情况也可以看做是高偏差high bias的情况,模型复杂度低,表达能力不够。
    例如,让我们考虑“king”、“queen”、“man”、“woman”这几个词。直观地说,我们需要用两个维度,如“性别”和“领导”编码成2维的词向量。较低维度的词向量是无法捕捉到这四个词之间的语义差异,而更多的可能会捕获语料库中的噪音,会造成泛化能力差,也可以看成是高方差的问题high variance。
    image.png
    image.png

内部评价:相关性评价

另一种对词向量的评价方式是,让人对两个词向量间的相似度给出一个0-10的评分,然后利用词向量计算这些词的余弦相似度进行比较。下图是在不同数据集上进行测试的结果。图6是不同词向量技术在不同人类评测集上的结果。
image.png

进阶阅读:处理歧义

当有了词向量之后,我们会好奇是否可以用它来解决一词多义的情况,比如”run”在不同的场景下既可以是noun也可以是verb。在文章Improving
Word Representations Via Global Context And Multiple Word Prototypes (Huang et al, 2012) 叙述了如何来解决这种情况。该方法的本质是:
1)固定共现词context窗口大小,通常前后各5各词 2)每个context用所包括词的词向量的加权平均来表示(udf作为权重) 3)对这些context表示用kmeans进行聚类 4)每个词都会被聚集到相应的簇中,同时,用这些词来训练每个簇的表示
也就是说,不同含义会随context出现在不同的簇里面。

外部评价任务

上一节主要关注内部评价及其对词向量训练的重要,但我们的终极目标是把这些词向量应用于特定的某个具体任务上以提高效果,接下来会讨论外部评价的一些方法。

问题定义

大部分NLP任务都可以看成是分类任务,比如给定一个句子,可以判断该句子是positive,negative,neutral的情感分析。同样,比如NER任务,给定一个context和中心词,希望确定这个中心词属于众多类别中的哪一个,如输入句子“Jim bought 300 shares of Acme Corp. in 2006”,输出可以是“[Jim]Person bought 300 shares of [Acme Corp.]Organization in [2006]Time.”
针对这种类似的任务,我们通常会以构建这样的训练集开始,image.png
其中x(i)是一个d-维的向量,采用词向量技术获得,y(i)是一个C-维的one-hot编码的向量,它表示我们希望预测的结果(情感倾向,其他词,NER,购买/卖出等决策)。
在典型机器学习任务中,我们通常固定输入、输出不变,采用优化方法找到合适的模型权重或参数如gradient descent、L-BFGS、Newton法。但是在NLP应用中,介绍一种当处理外部任务时我们重新训练输入词向量的思想,病讨论为什么及哪种情况下这么做。注:重新训练词向量是针对大语料库的情况,如果时小语料库,重新训练词向量结果不一定好。

重新训练词向量

目前为止,在外部任务中使用的词向量初始化值都是在简单的内部评价基础上优化训练得到。在很多场合下,这些预训练的词向量对于外部任务来说都是一个较好的选择,而且通常也会得到较好的结果。但是,在外部任务上对预训练词向量再训练(重新训练)也是可以的,有时可以得到更好的结果。但是重新训练词向量是有风险的。

如果在外部任务对词向量重新训练,需要保证训练集足够大以涵盖词典中所有的词,word2vec和GloVe是基于具有相同词空间位置得到词的语义。如果在一个涵盖词的小的数据集重新训练词向量,词在词空间位置发生变化,结果会是整个任务效果下降。假设一个预训练的词向量在2维空间中,如图6所示。

image.png

image.png

可以看到词向量在某些任务上可以准确的分为两类。此时,如果我们在有限的数据集上只对其中的2个词向量重新训练,会得到图7的结果,有一个次被错误分类了,因为此时的界线随着词向量的更新而发生了偏移。因此,如果训练集不是足够大,最好不要重新训练词向量,如果训练集足够大,重新训练可以提升最终任务的效果。

Softmax 分类和Regularization

softmax分类的函数形式如下:
image.png
它所表达的意思是输入x属于class j的概率。采用cross-entropy loss,得到这个训练样例的loss,
image.png
在这个例子中,y是采用one-hot编码的向量,也即是说该向量中只有y_j处是1(表示x只属于一个类别),其余位置全是零。那我们假定正确类别对应的下标是k,loss函数可以简化如下:
image.png
现在是一个sample,将它扩充到含有N个样本的数据集上,则总体loss为:
image.png
这个式子和上面式子唯一的区别是k(i)是一个函数用来返回样本x(i)所对应的正确类别的下标。
下面我们来估算一下在同时考虑模型权重W和x的词向量的时候需要多少参数。对于一个简单的线性模型,至少需要一个d-维的输入词向量,输出一个含有C个类别的分布,那更新这些权重,我们需要更新Cd个参数;如果同时更新具有V个词典中的每一个词的词向量,每个词向量是d-维的,因此需要Vd个参数,总的来说对于一个线性模型我们需要Cd+Vd个参数。
image.png
我们知道线性模型是最简单的模型,但它却用这么多的参数,这势必会造成过拟合。为了减少过拟合的风险,我们引入正则化项,根据 Bayesian belief,参数theta在数值应该非常小接近于0.新的loss函数如下:
image.png
通过调整正则化参数,最小化上述损失函数,减少了参数取为了满足训练集而取较大值得可能性,同时也可以提高模型的泛化能力。正则化思想已经成为复杂模型标配,比如后面会涉及到的NN,它有着更多的参数。

窗口分类

截止到目前我们主要探讨了使用词向量进行外部任务上的预测。但事实上,由于自然语言的原因,这很难办到,因为自然语言通常采用相同的词表达不同的含义,我们必须要知道词当前所处的场景才能够区别它的含义。例如,要求你向其他解释“to sanction”的意思,你会立刻意识到你需要它的具体context来区分它是“to permit”还是“to punish”。大部分情况下,我们会把一连串词输入到模型,这个序列是由中心词的词向量和context词向量构成如图8所示。
image.png
context中词的个数通常被称作context Window size,它的大小由具体要解决的任务决定。一般小的窗口大小在语法测试层面会有好的效果,大的窗口在语义层面有好的效果。
为了能在前面讨论的softmax 分类中使用词窗口,我们对x(i)进行修改如下,
image.png
image.png
那么在求loss对某个词的梯度时,会得到每个词向量的梯度如上图,在具体实现上,这些梯度需要传递到相对应的每个词上用来更新词向量。

非线性分类器

下面介绍一下为什么需要非线性分类器比如NN,
image.png
image.png
在图9中,线性分类器将很多点都分错了,此时我们用一个非线性分类器,如图10,它将所有点都分对了。虽然这个例子过于简单,但它充分说明了需要非线性分类器的必要性,在下一节中我们将要学习具有Neutal network,它属于非线性分类模型,但它在很多深度学习应用中都有出色的表现。

评论加载中