转自 机器之心
自然语言处理的基础涉及到对词的表征。华盛顿大学计算机科学与工程教授 Noah Smith(史諾亞)近日在 arXiv 发布了一篇入门介绍论文,由浅入深通俗易懂地介绍了自然语言处理中对词的处理和表示方法。机器之心重点编译介绍了其中涉及上下文的第 4 和 5 节,略过了第 2 和 3 节的基础介绍。感兴趣的读者可参阅机器之心之前发布的系列文章《词嵌入系列博客:一、二、三》。
论文:https://arxiv.org/abs/1902.06006
摘要:这篇介绍论文的目的是讲述如何让计算机处理语言的故事。这是自然语言处理(NLP)领域的一部分,而 NLP 又是人工智能的一个分支领域。本文的目标是让广泛的受众都能获得对计算机编程的基本理解,但其中避免了详细的数学描述,并且不会给出任何算法。本文的重点也并非 NLP 的任何特定的应用,比如翻译、问答或信息抽取。这里给出的思想经过了许多研究者数十年的发展,所以引用的文献并非详尽无遗,但能为读者指出一些在作者看来影响深远的论文。在读完本文之后,你应当会有对词向量(也被称为词嵌入)的大致理解:它们为何存在、它们解决的是什么问题、它们来自何处、它们如何随时间变化、有关它们还有那些有待解决的问题。建议已经熟悉词向量的读者跳至第 5 节查看有关当前最新进展「上下文词向量」的讨论。
1 前提准备
我们有两种谈论词的方式。
- word token,这是一段文本形式的词。在某些语言中,确认 word token 的边界是一个复杂的过程(而且该语言的说话人可能不认同「正确的」规则),但在英语中,我们往往使用空格和标点符号来分割词;在本文中,我们假设这已被「解决」。
- word type,这是抽象的词。每个 word token 据说都「属于」自己的 type。当我们统计一个词在一段文本(称为语料库)中的出现情况时,我们统计的是属于同一 word type 的 token 的数量。
4 词即分布向量:上下文即含义
语言学中有一个重要思想:能以类似方式使用的词(表达)很可能具有相关的含义。在大型语料库中,我们可以收集有关一种 word type w 的使用方式的信息,比如,通过统计它出现在每个其它词旁边的次数。当我们开始调查 w 所在的语料库中上下文的完整分布时,我们就能从分布的角度看待词义。
基于这一思想设计的一种自动推导特征的一种很成功的方法是聚类;比如 Brown et al. (1992) 的聚类算法能基于词在语料库中的上下文自动将词组织成不同的集群。经常出现在同样的相邻上下文(其它词)中的词会被划入到同一个集群。然后这些集群会融合成更大的集群。所得到的层次结构尽管与 WordNet 中专家设计的数据结构绝不相同,但在可解释性和实用性方面好得惊人。它还有可在任意给定语料库上重建的优势,而且每个被观察的词都会被包含进来。因此,可以为新闻文本或生物医学文章或微博分别构建合适的词聚类。
另一类方法首先是创建词向量,其中每个维度对应于该 word type 出现在某个上下文中的频率(Deerwester et al., 1990)。比如,一个维度可能对应于 the,包含该词紧随 the 之后出现的次数。其中可能包含在左侧或右侧以及不同的距离和长度的上下文模式。结果可能是一个长度超过词库大小许多倍的向量,其中每个维度都包含微量可能有用或没用的信息。使用来自线性代数的方法(被恰当地称为「降维」),这些向量可被压缩成更短的向量,其中各维度间的冗余可被折叠起来。
这些降维后的向量有一些优势。首先,为了满足程序的需要,NLP 程序开发者可以对这些维度进行选择。更紧凑的向量可能计算起来更为高效,而且压缩所造成的信息损失也可能是有益的,因为特定语料的「噪声」可能就会这样消失。但也存在一些权衡;更长、压缩更少的向量能保留分布向量中更多的原始信息。尽管压缩向量的单个维度难以解读,但我们可以使用众所周知的算法寻找一个词在该向量空间中的最近邻,而且已经发现这些词往往在语义上是相关的。
(实际上,这些观察催生了向量空间语义(vector space semantics)这一思想(参见 Turney and Pantel, 2010),即可将代数运算应用于这些词向量以调查其中学习到了何种「含义」。举一个著名的例子:「男人之于女人相当于国王之于女王」这个类比可以得到一个测试方法,即 v(男人) − v(女人) = v(国王) − v(女王)。人们设计了一些遵守这类性质的词向量算法。)
降维后的向量也有一个显著的缺点,即单个维度不再是可解释的特征,不能映射回提供了该词含义的直观的构建模块。该词的含义分布在整个向量上;因此,这些向量有时也被称为「分布式表征」。
随着语料库的增长,可扩展性就成了一大难题,因为可观察上下文的数量也会增长。所有词向量算法都基于这样一个概念:每个 word type 的向量中每个维度中的值都是一个可优化的参数,再加上所有其它参数,可以最好地拟合数据中观察到的词模式。因为我们将这些参数看作是连续值,而且「拟合数据」的概念可以通过一个平滑的连续的目标函数来操作,所以可以使用基于梯度下降的迭代算法来选择这些参数值。使用机器学习领域常用的工具,研究者已经开发出了一些基于随机优化的更快速的方法。word2vec 软件包(Mikolov et al., 2013)即是一个广为人知的算法集。现在常见的模式是有大型语料库和强大计算基础设施的行业研究者会使用已经建立好的(往往成本很高)迭代方法构建词向量,然后发布这些向量以供任何人使用。
在获取分布词向量方面,还有很多人在探索新的方法。这里提一些有趣的想法:
- 当我们希望将神经网络用于 NLP 问题时,一个有用的做法是:首先将每个输入的 word token 映射成它的向量,然后再将这些词向量「馈送」到执行翻译等任务的神经网络模型中。这些向量可以是事先固定的(即使用类似上述的方法在一个语料库上进行过预训练,通常来自其他人),或它们可被视为神经网络模型的参数,之后针对任务进行具体的调整(比如 Collobert et al., 2011)。微调(fine-tuning)是指先通过预训练初始化词向量,然后通过针对具体任务的学习算法来调整。这些词向量也可以初始化为随机值,然后仅通过任务学习来进行评估,我们可以称之为「从头学习」。
- 使用专家构建的数据结构(如 WordNet)作为附加输入来创建词向量。一种被称为 retrofitting 的方法首先是从一个语料库提取词向量,然后想办法调整它们,使得 WordNet 中相关的 word type 在向量空间中更为接近((Faruqui et al., 2015)。
- 使用双语词典将两种语言中的词的向量在单个向量空间中「对齐」,使得对应的词的向量有较小的欧几里德距离,比如英语 word type「cucumber」和法语 word type「concombre」(Faruqui and Dyer, 2014)。通过构建一个能将所有英语向量重新定位到法语空间(或反过来)的函数,研究者希望能对齐所有的英语词和法语词,而不只是双语词典中的那些词。
- 词的向量的计算依据有一部分(或完全)是其字符序列(Ling et al., 2015)。这些方法往往是使用神经网络将任意长度的序列映射成固定长度的向量。这有两个有趣的效果:(1)在具有复杂的构词体系(形态学)的语言中,同一基本词根的不同变体可能具有相似的向量,(2)同一词的不同拼写的变体会具有相似的向量。这类方法在社交媒体文本方面的应用是相当成功的,因为社交媒体文本中存在丰富的拼写变体。比如,would 一词在社交媒体消息中就有多种变体,它们会具有相似的基于字符的词向量,因为它们具有类似的拼写:would、wud、wld、wuld、wouldd、woud、wudd、whould、woudl、w0uld。
5 上下文词向量
我们在一开始就对 word token 和 word type 进行了区分。一直以来,我们都假设在我们的 NLP 程序中,每个 word type 都会由一个固定的数据对象表示(先是整数,之后是向量)。这样很方便,但这样一些对语言的假设并不符合实际。最重要的是,很多词在不同的语境/上下文中会具有不同的含义。专家们在设计 WordNet 时就较粗略地包含了这个现象,比如,get 映射了超过 30 种不同的含义(或领会的意思)。应该为不同的词分配多少种含义,或一个含义与另一个含义的边界如何确定?这些问题很难得到人们广泛认同的一致性意见,何况词义还可能流动转变。实际上,在很多基于神经网络的 NLP 程序中,最先做的事情都是将每个 word token 的 type 向量传递给一个函数,该函数会基于这个 word token 临近上下文的词对其进行变换,给出这个词向量的一个新版本(现在特定于在自身特有上下文中的 token)。在我们之前的示例句子中,be 的两个实例就会有不同的向量,因为一个出现在 will 和 signed 之间,另一个则位于 we’ll 和 able 之间。
现在看来,通过独立于上下文地表征 word type 实际上会让问题难度超过必需的程度。因为词在不同的上下文中会具有不同的含义,我们需要 type 的表征具备所有这些可能性(比如 get 的 30 个含义)。转向 word token 向量能简化这些事情,只需要求 word token 表征仅获取该词在这个上下文中的含义即可。因为同样的原因,一个 word type 所在的上下文集合能提供有关其含义的线索,一个特定的 token 上下文会提供有关其具体含义的线索。举个例子,你可能不知道 blicket 一词的含义,但如果我说「I ate a strawberry blicket for dessert」,你大概就能很好地猜测。
回到相似度的基本概念,我们可以预料:彼此相似的词能够很好地互相替代。比如,能够很好替代 gin 的词有哪些?只考虑 word type 的话,这个问题很难回答。WordNet 告诉我们,gin 可以指一种酒品、捕猎的陷阱、分离种子与棉花纤维的机器、一种卡牌游戏。但如果我们考虑了给定的上下文(比如 I use two parts gin to one part vermouth.),就会很简单。实际上,如果能用 vodka 替代 gin,那么可以预计 vodka 会有一个相似的上下文词向量。
ELMo 表示「embeddings from language models(来自语言模型的嵌入)」(Peters et al., 2018a),它为 word token 向量的形式(即词在上下文中的向量或上下文词向量)带来了强有力的进步,这些向量在大型语料库上进行过预训练。ELMo 背后有两个重要的见解:
- 如果每个 word token 都有自己的向量,那么该向量就依赖于一个任意长度的临近词上下文。为了得到「上下文向量」,我们可以从 word type 向量开始,然后将它们传递通过一个神经网络,该神经网络可以将任意长度的上文词向量和下文词向量转换成单个固定长度的向量。不同于 word type 向量(本质上是查找表),上下文词向量既包括 type 层面的向量,也包括「上下文化(contextualize)」每个词的神经网络参数。ELMo 会为上文训练一个神经网络(一直回到 token 所在的句子的起始位置),还会为下文训练一个神经网络(直到句子结束)。超出句子范围的更长的上下文也是可能的。
- 回想一下,估计词向量需要通过求解一个优化问题来「拟合数据」(这里的数据是语料库)。NLP 领域有一个长期存在的数据拟合问题,即语言建模,这是指根据「历史」词的序列预测下一个词。很多已在使用的词(type)向量算法都基于概念固定大小的上下文,这收集自该 word type 在一个语料库中的所有实例。ELMo 走得更远,使用了任意长度的历史并且整合了那时候已知最有效的语言模型(基于循环神经网络,Sundermeyer et al., 2012)。尽管那时循环网络已在 NLP 领域有广泛的应用,但训练它们作为语言模型,然后使用它们为每个 word token 提供的上下文向量作为预训练的词(token)向量的方法是全新的。
了解词在计算机中的完整处理过程会很有意思。通过观察词所处的上下文,文本数据能为词义提供指导;这个强有力的思想引导我们主要通过 word token 所在的具体上下文来获取该 word token 的含义。这意味着 plant 的每个实例都有一个不同的词向量;那些上下文看起来提到了植物的预计会彼此更为接近,而那些上下文可能提到了生产制造中心的则会聚集在向量空间中的另一处。这个发展能否完全解决词具有不同含义的难题?这一点还有待观察,但研究已经表明 ELMo 在一些 NLP 程序中是非常有益的,包括:
- 问答(在 SQuAD 基准上相对误差下降了 9%)
- 标记动词的语义参数(在 Ontonotes 语义角色标注基准上相对误差下降了 16%)
- 标注文本中指代人或组织等命名实体的表达(在 CoNLL 2003 基准上相对误差下降了 4%)
- 求解哪些指示表达指代同一实体(在 Ontonotes 共指消解基准上相对误差下降了 10%)
Peters et al. (2018a) 和之后的其他研究者还报告了在其它任务上取得的进展。Howard and Ruder (2018) 引入了一种类似的方法 ULMFiT,研究表明有助于文本分类任务。之后的来自 transformer 的双向编码器表征(BERT; Devlin et al., 2018)提出了一些学习方法的创新,并且学习了更多数据,在第一个任务上实现了进一步的 45% 的误差下降(相对于 ELMo),在第二个任务上下降了 7%。在 SWAG 基准上,这些方法最近被用来测试基础常识推理(Zellers et al., 2018),Devlin et al. (2018) 发现 ELMo 相对于非上下文词向量实现了 5% 的相对误差下降,BERT 相对于 ELMo 又额外降低了 66%。
在撰写本文时,在不同方法的相对性能方面还存在很多有待解决的问题。对学习算法(尤其是神经网络架构)之间的差异进行完整的解释超出了本文范围,但可以相当合理地说:学习方法的可能空间尚未得到完全的探索;Peters et al. (2018b) 中有一些探索方向。在 BERT 上的一些发现表明微调可能具有至关重要的作用。尽管 ELMo 源自语言建模,但 BERT 求解的建模问题(即在估计阶段最小化的目标函数)却相当不同。用于学习语言模型的数据集的作用还没有得到完整的评估,除了这一个并不让人惊讶的模式:更大的数据集往往更有益。
6 注意
- 词向量是有偏差的
- 语言远不只是词
- 自然语言处理不是一个单一问题