自然语言处理中的预训练模型(上)

2020-08-14 15:03:07 浏览数 (1)

本文是最近比较火的一篇关于预训练模型的综述 「Pre-trained Models for Natural Language Processing: A Survey」 的阅读笔记。由于篇幅较长,所以分成两篇发送。

1 引言

随着深度学习的发展,各种各样的神经网络被用来解决「自然语言处理」(NLP)问题,例如卷积神经网络、循环神经网络、图神经网络、注意力机制等等。与传统方法相比,神经模型的一个优点是可以「缓解特征工程问题」。传统方法通常严重依赖于人工提取的特征,而神经方法通常使用低维且低密度的向量(即分布式表示)来含蓄地表达语言的句法及语法特征,这些表示会在具体的 NLP 任务中学习得到。因此,神经方法让人们能够更轻松地开发各种 NLP 系统。

虽然神经模型在 NLP 任务中已经取得了成功,但是其性能提升相对计算机视觉领域来说还是不够明显。一个主要原因在于目前的数据集对于大部分有监督 NLP 任务来说都很小(除了机器翻译),深度神经网络通常有大量的参数,而较小的训练数据集会导致过拟合的出现。因此,早期的面向 NLP 任务的神经模型都相对较浅,往往只包含 1-3 层。

近年来,大量的研究表明基于大型语料库的「预训练模型」(PTM)可以学习通用的语言表示,有利于下游 NLP 任务,同时能够避免从零开始训练模型。随着计算能力的发展,深度模型的出现(即 Transformer)和训练技巧的增强使得 PTM 不断发展,由浅变深。总的来看,PTM 的发展可以分为两个时代。第一代的 PTM 旨在学习「单一的词嵌入」,例如 Skip-Gram 和 GloVe。这些模型并不会用于下游任务,通常为了计算效率而保持较浅。虽然这些预训练的词嵌入可以捕获词语的语义,但是它们与上下文无关,无法捕捉到上下文中更高层次的概念。第二代的 PTM 聚焦于学习「上下文相关的词嵌入」,例如 CoVe、ELMo、OpenAI GPT 和 BERT。这些学习到的编码器在下游任务中也会用于表示词语。此外,各种各样的预训练任务也被提出以基于不同的目的学习 PTM。

2 背景

2.1 语言表示学习

一般来说,一个好的表示应该表达通用的先验知识,这种知识虽然不面向于特定场景,但是能够帮助计算机解决特定的 AI 任务。对于语言来说,一个好的表示应该捕捉潜在的语言规则和文本中隐藏的常识知识,例如词语含义、句法结构、语义角色甚至语用。

分布式表示的核心思想是通过「低维实值向量」来描述文本片段(一般指词语)的含义。向量的每一个维度都没有具体的含义,但是整体却表示一个具体的概念,我们将这种向量称之为「词嵌入」。下图给出了 NLP 中通用的神经体系架构:

词嵌入可以分为两类,「非上下文嵌入」「上下文嵌入」。两者的区别在于一个词语的嵌入是否随着上下文的不同而动态地变化。

2.1.1 非上下文嵌入

表示语言的第一步就是将分离的语言符号映射到分布式嵌入空间中。形式上看,对于每个位于词典

mathcal{V}

中的词语

x

,我们将其映射到一个向量

mathbf{e}_{x} in mathbb{R}^{D_{e}}

,构成一个查询表

mathbf{E} in mathbb{R}^{D_{e} times|mathcal{V}|}

。其中

D_e

是表示词嵌入维度的超参数。

这种嵌入存在两个主要局限性:第一个是嵌入是静态的,与上下文无关,无法处理多义词;第二个是难以处理不在词汇表中的词。针对第二个问题,很多 NLP 任务提出了字符级或词根级的词语表示,例如 CharCNN、FastText 和 Byte-Pair Encoding (BPE)。

2.1.2 上下文嵌入

为了解决多义性和词语上下文依赖特性的问题,我们需要区分不同上下文中词语的语义。给定一个文本

x_{1}, x_{2}, cdots, x_{T}

,其中每一个 token

x_{t} in mathcal{V}

表示一个词语或词根,

x_t

的上下文表示依赖于整个文本:

left[mathbf{h}_{1}, mathbf{h}_{2}, cdots, mathbf{h}_{T}right]=f_{mathrm{enc}}left(x_{1}, x_{2}, cdots, x_{T}right) tag{1}

其中

f_{mathrm{enc}}(cdot)

是一个神经编码器,将在下一节中介绍。

mathbf{h}_{t}

被称为 token

x_t

的上下文嵌入或动态嵌入。

2.2 神经上下文编码器

大部分的神经上下文编码器都可以归为三类:卷积模型、序列模型和基于图的模型。下图展示了这些模型的结构:

「卷积模型」:卷积模型通过卷积操作将词语的嵌入和其相邻的局部信息集成,通常比较容易训练,可以捕捉到局部的上下文信息。

「序列模型」:序列模型通常以序列的顺序捕捉词语的上下文表示,使用经典的 RNN 例如 LSTM 和 GRU。在实践中,通常使用双向 RNN 来收集词语两边的信息,但是其表现往往会受到长期依赖问题的影响(注意序列模型中 seq2seq 涉及的编解码器和神经上下文编码器的含义有所不同,后者包含前者的所有部分)。

「基于图的模型」:不同于上述两个模型,基于图的模型将词语视作节点,基于一个预先定义的语言结构(如句法结构或语义联系)来学习上下文表示。虽然语义感知的图结构可以提供有用的归纳偏差,但是构建一个好的图结构严重依赖于专家知识或外部 NLP 工具,例如依存分析器。

在实践中,一种更加直接的方式是使用一个全连接图来对每两个词语之间的关系建模,让模型自己去学习结构,连接参数一般通过自我注意力机制计算。这种想法的一个成功实现就是 「Transformer」,其采用全连接自我注意力结构,并结合了其他一些有用的设计,如位置嵌入、层归一化和残差连接。

「分析」:卷积模型和序列模型学习到的上下文表示都存在局部偏差,难以捕捉较长范围的词语联系。而 Transformer 可以直接对序列中任意两个词语的关系建模,因此更加适合于对语言建模。然而,由于其较复杂的结构和随之产生的较少的模型偏差,Transformer 通常需要非常大的训练语料,很容易在中小型数据集上过拟合。

2.3 为什么要预训练?

随着深度学习的发展,模型参数的数量飞速增长。为了训练这些参数,需要更大的数据集来避免过拟合。然而,对于大部分 NLP 任务来说,构建大规模的标注数据集非常困难(成本过高),特别是对于句法和语义相关的任务。

相比之下,大规模的未标注语料库的构建则相对容易,为了利用这些数据,我们可以先从其中学习到一个好的表示,再将这些表示应用到其他任务中。最近的研究表明,基于大规模未标注语料库的「预训练模型」( PTM)在很多 NLP 任务上取得了很好的表现。

预训练的优点可以总结为以下三点:

  1. 在大规模语料库上的预训练可以学习到通用语言表示,对下游任务很有帮助
  2. 预训练提供了更好的模型初始化,使得在目标任务上有更好的泛化性能和更快的收敛速度
  3. 预训练可以看做一种避免在小数据集上过拟合的正则化方法

2.4 NLP 中的 PTM 发展简史

关于 NLP 中 PTM 的发展历史,原文通过文字的形式进行了回顾,这里通过一张大图将一些代表性的研究串联在了一起,感兴趣的读者可以自行搜索相关论文。

3 PTM 概述

不同 PTM 间的区别主要体现在「上下文编码器」的使用以及「预训练的任务和目标」上。我们已经在 2.2 节中简单介绍了上下文编码器的不同结构,本章我们将专注于预训练任务,并给出一种 PTM 的分类方法。

3.1 预训练任务

预训练任务对于学习语言的通用表示至关重要。通常,这些预训练任务应该具有一定的挑战性,并且有足够的训练数据支撑。原文将预训练任务分为了三类:「监督学习」「无监督学习」「自监督学习」

  • 监督学习(SL)基于包含输入输出对的训练数据学习一个将输入映射到输出的函数
  • 无监督学习(UL)旨在从无标签数据中找到内在的知识,例如聚类、密度、潜在表示等。
  • 自监督学习(SSL)是监督学习和无监督学习的结合,其学习方式和监督学习一样,但是训练数据的标签是自动生成的。SSL 的核心思想在于以某种形式预测输入的任意部分,基于该部分之外的其他部分。例如,掩码语言模型(MLM)是一种自监督任务,其尝试去遮住句子中的一个词语,基于剩余的词语来预测它。

在 CV 领域,PTM 大部分是基于巨大的监督训练集(例如 ImageNet)训练而成,然而在 NLP 领域,大部分的监督数据集的大小都不足以训练出好的 PTM。唯一的例外是「机器翻译」领域(MT),其中较著名的数据集是 WMT 2017。基于 MT 数据集训练的 PTM 可以用于各种各样的下游预训练任务。本节我们将介绍除此之外的一些常用预训练任务,它们都属于自监督学习,下表总结了这些任务及其损失函数。

3.1.1 语言模型(LM)

概率语言模型是 NLP 中最常见的无监督任务,其实一个经典的概率密度估计问题。虽然 LM 是一个广义的概念,但是在实践中一般指「自回归」 LM 或「单向」 LM(两者是一个意思)。给定一个文本序列:

mathbf{x}_{1: T}=left[x_{1}, x_{2}, cdots, x_{T}right]

其联合概率

p(x_1:T)

可以被分解为:

pleft(mathbf{x}_{1: T}right)=prod_{t=1}^{T} pleft(x_{t} | mathbf{x}_{0: t-1}right) tag{2}

其中

x_0

指序列最开头的词语。上下文

mathbf{x}_{0: t-1}

可以通过神经编码器

f_{mathrm{enc}}(cdot)

建模,条件概率

p(x_t|mathbf{x}_{0: t-1})

可以理解为在给定上下文的情况下整个词典的概率分布,通过下式计算:

pleft(x_{t} | mathbf{x}_{0: t-1}right)=g_{mathrm{LM}}left(f_{mathrm{enc}}left(mathbf{x}_{0: t-1}right)right) tag{3}

其中

g_{mathrm{LM}}(cdot)

是一个预测层。基于上述概率,给定一个巨大的语料库,我们可以通过「最大似然估计」(MLE)训练整个网络。

单向 LM 的一个缺点是只能编码一个词左侧的上下文和其自身,而更好的上下文应该编码左右两侧的文本。针对这一缺点,一个解决方案是使用「双向」 LM(BiLM),其由两个单向 LM 组成:从左向右的正向 LM 和从右向左的反向 LM。

3.1.2 掩码语言模型(MLM)

掩码语言模型的前身是 Taylor 在 1953 年提出的 Cloze task。Devlin 等人在 BERT 的原始论文中正式提出了这一概念,并将其作为一种创新的预训练任务来克服单向 LM 的缺点。简单来说,MLM 首先在输入句子中遮挡住部分的词语(token),然后训练模型来基于剩下的词语预测被遮住的词语。但是,该训练方法会引起预训练阶段和微调阶段的不匹配,因为 mask 标记并不会出现在微调阶段。为了解决这一问题,Devlin 等人对于被选中遮住的词语(总词语数的 15%),80% 的可能使用 mask 将其遮起来,10% 的可能使用随机词语替换,10% 的可能保留原词语。

基于上述标准的 MLM,还衍生出了几种变式 MLM。第一种是「序列到序列 MLM」(Seq2Seq MLM)。原始的 MLM 一般用于解决分类问题,我们将被遮罩的序列输入到一个神经编码器中,其输出又被输入到一个 softmax 分类器中来预测被遮罩的输出。相应地,我们可以在 MLM 中使用序列到序列的结构,其中的编码器输入一个遮罩序列,而解码器则以自回归的形式输出被遮罩的词语。这种 MLM 在 「MASS」「T5」 中得到应用,被证明能够提升诸如问答、总结和机器翻译等 Seq2Seq 类型的下游任务的表现。

第二种是「增强 MLM」(E-MLM)。多个研究在 BERT 的基础上提出了不同增强版本的 MLM 来提升表现。「RoBERTa」 提出了动态 masking;「UniLM」 将对 mask 的预测任务扩展到了三种类型的语言模型任务:单向、双向和序列到序列预测;「XLM」 在一连串平行的双语句子对上执行 MLM,称为「翻译语言模型」(TLM);「SpanBERT」 使用 Random Contiguous Words MaskingSpan Boundary Objective 来集成结构化信息,其要求系统基于 span 的边界来预测被遮罩的 span;「StructBERT」 则引入 Span Order Recovery 任务来进一步包含句子的结构。

此外,另一种丰富 MLM 的方法是包含外部知识,将在 4.1 节中详细介绍。

3.1.3 排列语言模型(PLM)

针对 MLM 任务在预训练过程中引入的 mask 等特殊标记可能会导致与下游任务不匹配的问题,「XLNet」 提出排列了「排列语言模型」(PLM)。简单来说,PLM 是一个基于输入序列的随机排列的语言模型,一个排列来自于所有可能排列的随机采样,排列并不会影响输入序列的原始位置。我们将排列序列的某些词语作为目标,训练模型来基于其他的词语和目标词语的原始位置预测这些目标。为了保证收敛速度,原文中只选用了排列序列最后的一些词语作为预测目标。此外,原文还提出了一种特殊的 two-stream 自我注意力机制以帮助表示目标。

3.1.4 去噪声自编码器(DAE)

去噪声自编码器的基本思想是:基于添加噪声的输入去重构原始的不含噪声的输入。一般使用特定语言的序列到序列模型(如标准的 Transformer)来进行重构。而向输入中添加噪声一般有如下几种方式:

「Token Masking」。从输入中随机选取词语并将其遮住(使用 [MASK] )。

「Token Deletion」。从输入中随机删除一些词语,与 masking 的区别在于模型需要去决定缺失输入的位置。

「Text Infilling」。采样一系列文本片段并将其替换为单个的 [MASK] 标记,每个文本段落的长度采样自泊松分布(

lambda=3

)。模型需要去预测缺失片段的词语数量。(这里以 「SpanBERT」 为例)

「Sentence Permutation」。将文档拆分为句子并进行随机打乱。

「Document Rotation」。随机选择一个词语,并将文档旋转以从词语开始。模型需要去识别文档真正的起始位置。

基于上述方式我们可以看出,MLM 实际上可以理解为 DAE 的一种。

3.1.5 对比学习(CTL)

对比学习基于 “learning by comparison” 的思想,假定某些观测到的文本对要比随机采样文本在语义上更相似,通过学习文本对

(x,y)

的评分函数

s(x, y)

来最小化如下目标函数:

mathcal{L}_{mathrm{CTL}}=mathbb{E}_{x,y^{ },y^{-}}left[-log frac{exp left(sleft(x, y^{ }right)right)}{exp left(sleft(x, y^{ }right)right) exp left(sleft(x, y^{-}right)right)}right] tag{4}

其中

(x,y^{ })

为相似文本对而

y^{-}

则相对与

x

不相似。一般将

y^{ }

y^{-}

称为正样本和负样本。评分函数

s(x,y)

通常通过可学习的神经编码器以如下两种方式计算:

s(x, y)=f_{mathrm{enc}(x)}^{mathrm{T}} f_{mathrm{enc}(y)}

s(x, y)=f_{mathrm{enc}}(x oplus y)

和 LM 相比,CTL 通常具有更低的计算复杂度,因此在某些场景下值得作为 PTM 的任务选择。Collobert 等人提出了 pairwise ranking task 来区分真假词组,模型需要对真正的词组给出比随机生成的词组更高的分数。Mnih 等人提出了「噪声对比估计」(NCE),训练了一个二元分类器来区分真假样本,这一思想也被用在了著名的 word2vec 中(负采样)。注意这里给出的两个研究训练的都是静态词嵌入,而非上下文词嵌入。

下面将介绍几个最近提出的 CTL 任务。

「Deep InfoMax」。DIM 最早用于 CV 领域,通过最大化图像表示与其局部特征的互信息来提升整体表示的质量。Kong 等人将 DIM 引入语言表示学习,将序列

x

的全局表示定义为第一个词语的隐藏状态,通过神经编码器

f_{mathrm{enc}}(mathbf{x})

得到。DIM 的目标是为

f_{mathrm{enc}}left(mathbf{x}_{i:j}right)^{mathrm{T}} f_{mathrm{enc}}left(hat{mathbf{x}}_{i:j}right)

分配比

f_{mathrm{enc}}left(tilde{mathbf{x}}_{i:j}right)^{mathrm{T}} f_{mathrm{enc}}left(hat{mathbf{x}}_{i:j}right)

更高的分数,其中

mathbf{x}_{i:j}

表示一个

mathbf{x}

中从 i 到 j 的 n-gram 片段,

hat{mathbf{x}}_{i:j}

表示从 i 到 j 进行遮罩的片段,而

tilde{mathbf{x}}_{i:j}

则表示从语料库随机采样的负样本。

「Replaced Token Detection」。RTD 和 NCE 的思想相同,区别在于预测的是根据上下文一个词语是否被替换。word2vec 中 CBOW 结合负采样的方法就是 RTD 的一种简单版本。「ELECTRA」 提出了一种生成器-判别器框架,通过生成器来替换序列中的部分词语,以提升 RTD 的效果。具体来说,对于一个生成器

G

和一个判别器

D

,首先利用 MLM 任务训练生成器,再用训练后生成器的权重初始化判别器,最后通过判别任务训练判别器(这里的判别任务即判断哪些输入词语被生成器替换了)。预训练完成后,只保留判别器用于下游任务的微调。类似地,「WKLM」 提出了实体层面的词语替换(之前的都是 token 层面),其将部分实体替换为与其相同类型的其他实体,训练模型来区分该实体是否被替换。RTD 可以一定程度上解决 MLM 中的不匹配问题。

「Next Sentence Prediction」。NSP 利用文本数据中句子的划分来进行预训练。「BERT」 中首次提出了该任务,作者训练模型区分两个输入句子是否在语料库中连续出现。在选择训练句对时,有 50% 的可能第二句是第一句实际的连续片段。NSP 能够教会模型理解两个输入句子的联系,有利于对这种信息敏感的下游任务(如 QA 和 NLI)。

然而近年来,后续的研究对 NSP 的必要性提出了不少质疑。XLNet 的作者发现 NSP 任务的影响并不可靠;SpanBERT 的作者发现不用 NSP 的单句训练要优于使用 NSP 的句对训练;RoBERTa 的作者对 NSP 进行了进一步分析,发现基于来自单个文本的文本块训练时,去除 NSP 会一定程度上提升下游任务的性能。

「Sentence Order Prediction」。为了更好地对句子间的连贯性建模,「ALBERT」 将 NSP loss 替换为了 SOP loss。与 NSP 的不同在于,SOP 将来自同一个文档的两个连续片段作为正样本,而将这两个片段交换顺序后作为负样本。原作者认为,NSP 实际上是在单个任务中融合了主题预测和连贯性预测(因为其负样本是随机采样的),由于主题预测更容易,所以模型将更依赖于主题预测,而降低对连贯性的预测效果。采用了 SOP 的 ALBERT 在多项下游任务中都要优于 BERT。此外,「StructBERT」「BERTje」 也将 SOP 作为其自监督学习任务。

3.2 PTM 分类

为了更好地梳理 NLP 中现有 PTM 之间的关系,本文从不同的角度对 PTM 进行了分类:

  1. 「表示类型」。用于下游任务的表示,分为非上下文模型和上下文模型。
  2. 「结构」。PTM 中使用的网络骨架,主要包括 LSTM、Transformer encoder、Transformer decoder 和 Transformer 全架构。encoder 和 decoder 的区别在于一个是双侧上下文而一个是单侧上下文(通过 masked self-attention 实现)
  3. 「预训练任务类型」。PTM 使用的预训练任务的类型,包括监督学习、无监督学习 / 自监督学习。
  4. 「扩展」。针对各种场景特别设计的 PTM,包括知识增强 PTM、多语言和特定语言的 PTM、领域特定 PTM 和压缩 PTM(下一节介绍)

下图列出了不同分类学下的代表性研究:

下表对一些代表性 PTM 进行了更深层次的对比:

3.3 模型分析

由于 PTM 取得的巨大成功,研究者们希望去理解其究竟捕获了怎样的知识,以及如何从中提取这些知识。大量的文献分析了存储在预训练嵌入(非上下文和上下文)中的「语言知识」「世界知识」

3.3.1 非上下文嵌入

从静态词向量中,研究人员提取出了各种语言知识。Mikolov 等人发现神经网络语言模型学习的词表示可以捕获语言规律性,词语之间的关系可以通过一个特定的关系向来来表征。进一步的类比实验表明,skim-gram 模型给出的词向量可以同时捕获句法层面和语义层面的词语关系,如 vec(“China”) − vec(“Beijing”) ≈ vec(“Japan”) - vec(“Tokyo”)。此外,他们还发现了词向量的合成性质,如 vec(“Germany”) vec(“capital”)vec(“Berlin”) 接近。受上述工作启发,Rubinstein 等人发现分布式词语表示(即词嵌入)擅长预测分类(狗是一种动物)而不擅长学习属性(天鹅是白色的)。类似地,Gupta 等人发现 word2vec 嵌入可以较好地编码实体的相关属性,其验证了结合简单监督模型的分布式词向量可以学习预测实体的数值和二元属性。

3.3.2 上下文嵌入

大量研究调查并提取了上下文嵌入中的各种知识。总的来看,这些知识可以分为两类:语言知识和世界知识。

「语言知识」。这里作者主要围绕对 BERT 的探索展开,介绍了很多相关研究。BERT 被发现可以在很多简单的句法任务上表现良好,例如词性识别和成分标记,但是在语义和细致的句法任务上表现一般。此外,有人分析了 BERT 的每一层在不同任务中的角色,发现 BERT 解决任务的顺序与 NLP pipeline 类似。此外,BERT 中还存在主语-动词一致性和语义角色的知识。此外,有人从 BERT 中提取了依赖树和成分树,表明其能够编码句法结构。还有人探索了 BERT 中内部表示的几何结构,并发现:1)语言特征似乎被表示在单独的语义和句法子空间; 2)attention 矩阵包含了语法表示; 3)BERT 可以很精细地区分词义。

「世界知识」。除了语言知识,PTM 也可能存储了训练数据中包含的世界知识。这里列举的研究仍然围绕 BERT 展开。一种比较直接的调查世界知识的方法是使用「完形填空」(cloze statements)对 BERT 进行查询,如 “Dante was born in [MASK]。Petroni 等人构建了 「LAMA」 任务(语言模型分析),基于多个知识源手工创建了单个词语的完形填空数据集。他们的实验表明 BERT 包含的世界知识能够与传统的信息抽取方法抗衡。由于 LAMA 的简单性,其可靠程度也得到了一些质疑。Jiang 等人认为 LAMA 只测量了语言模型的下限,并提出了更多改进方法来生成更多有效的查询。还有一些研究从用于BERT 中抽取了可以用于下游任务的关系知识和常识知识。

未完待续

0 人点赞