罗凌作者

自然语言处理中的语言模型预训练方法

最近,在自然语言处理(NLP)领域中,使用语言模型预训练方法在多项 NLP 任务上都获得了不错的提升,广泛受到了各界的关注。就此,我将最近看的一些相关论文进行总结,选取了几个代表性模型(包括 ELMo [1],OpenAI GPT [2] 和 BERT [3])和大家一起学习分享。 作者:罗凌;学校:大连理工大学信息检索研究室;研究方向:深度学习,文本分类,实体识别

引言

在介绍论文之前,我将先简单介绍一些相关背景知识。首先是语言模型(Language Model),语言模型简单来说就是一串词序列的概率分布。具体来说,语言模型的作用是为一个长度为 m 的文本确定一个概率分布 P,表示这段文本存在的可能性。

在实践中,如果文本的长度较长,P(wi | w1, w2, . . . , wi−1) 的估算会非常困难。因此,研究者们提出使用一个简化模型:n 元模型(n-gram model)。在 n 元模型中估算条件概率时,只需要对当前词的前 n 个词进行计算。在 n 元模型中,传统的方法一般采用频率计数的比例来估算 n 元条件概率。当 n 较大时,机会存在数据稀疏问题,导致估算结果不准确。因此,一般在百万词级别的语料中,一般也就用到三元模型。

为了缓解 n 元模型估算概率时遇到的数据稀疏问题,研究者们提出了神经网络语言模型代表性工作是 Bengio 等人在 2003 年提出的神经网络语言模型,该语言模型使用了一个三层前馈神经网络来进行建模。其中有趣的发现了第一层参数,用做词表示不仅低维紧密,而且能够蕴涵语义,也就为现在大家都用的词向量(例如 word2vec)打下了基础。

其实,语言模型就是根据上下文去预测下一个词是什么,这不需要人工标注语料,所以语言模型能够从无限制的大规模单语语料中,学习到丰富的语义知识。

接下来再简单介绍一下预训练的思想。我们知道目前神经网络在进行训练的时候基本都是基于后向传播(BP)算法,通过对网络模型参数进行随机初始化,然后通过 BP 算法利用例如 SGD 这样的优化算法去优化模型参数

那么预训练的思想就是,该模型的参数不再是随机初始化,而是先有一个任务进行训练得到一套模型参数,然后用这套参数对模型进行初始化,再进行训练。

其实早期的使用自编码器栈式搭建深度神经网络就是这个思想。还有词向量也可以看成是第一层 word embedding 进行了预训练,此外在基于神经网络迁移学习中也大量用到了这个思想。

接下来,我们就具体看一下这几篇用语言模型进行预训练的工作。

ELMo

引言

Deep Contextualized Word Representations [1] 这篇论文来自华盛顿大学的工作,最后是发表在今年的 NAACL 会议上,并获得了最佳论文。

其实这个工作的前身来自同一团队在 ACL 2017 发表的 Semi-supervised sequence tagging with bidirectional language models [4],只是在这篇论文里,他们把模型更加通用化了。

首先我们来看看他们工作的动机,他们认为一个预训练的词表示应该能够包含丰富的句法和语义信息,并且能够对多义词进行建模。而传统的词向量(例如 word2vec)是上下文无关的。例如下面"apple"的例子,这两个"apple"根据上下文意思是不同的,但是在 word2vec 中,只有 apple 一个词向量,无法对一词多义进行建模。

所以他们利用语言模型来获得一个上下文相关的预训练表示,称为 ELMo,并在 6 个 NLP 任务上获得了提升。

方法

在 EMLo 中,他们使用的是一个双向的 LSTM 语言模型,由一个前向和一个后向语言模型构成,目标函数就是取这两个方向语言模型的最大似然。

在预训练好这个语言模型之后,ELMo 就是根据下面的公式来用作词表示,其实就是把这个双向语言模型的每一中间层进行一个求和。最简单的也可以使用最高层的表示来作为 ELMo。

然后在进行有监督的 NLP 任务时,可以将 ELMo 直接当做特征拼接到具体任务模型的词向量输入或者是模型的最高层表示上。

总结一下,不像传统的词向量,每一个词只对应一个词向量,ELMo 利用预训练好的双向语言模型,然后根据具体输入从该语言模型中可以得到上下文依赖的当前词表示(对于不同上下文的同一个词的表示是不一样的),再当成特征加入到具体的 NLP 有监督模型里。 

实验 

这里我们简单看一下主要的实验,具体实验还需阅读论文。首先是整个模型效果的实验。他们在 6 个 NLP 任务上进行了实验,首先根据目前每个任务搭建了不同的模型作为 baseline,然后加入 ELMo,可以看到加入 ELMo 后 6 个任务都有所提升,平均大约能够提升 2 个多百分点,并且最后的结果都超过了之前的先进结果(SOTA)。

在下面的分析实验中,我们可以看到使用所有层的效果要比只使用最后一层作为 ELMo 的效果要好。在输入还是输出上面加 EMLo 效果好的问题上,并没有定论,不同的任务可能效果不一样。

OpenAI GPT

引言 

我们来看看第二篇论文 Improving Language Understanding by Generative Pre-Training[2],这是 OpenAI 团队前一段时间放出来的预印版论文。他们的目标是学习一个通用的表示,能够在大量任务上进行应用。

这篇论文的亮点主要在于,他们利用了Transformer网络代替了LSTM作为语言模型来更好的捕获长距离语言结构。然后在进行具体任务有监督微调时使用了语言模型作为附属任务训练目标。最后在 12 个 NLP 任务上进行了实验,9 个任务获得了 SOTA。

方法 

首先我们来看一下他们无监督预训练时的语言模型。他们仍然使用的是标准的语言模型目标函数,即通过前 k 个词预测当前词,但是在语言模型网络上,他们使用了 Google 团队在Attention is all your need 论文中提出的 Transformer 解码器作为语言模型

Transformer 模型主要是利用自注意力(self-attention)机制的模型,这里我就不多进行介绍,大家可以看论文或者参考我之前的文章自然语言处理中的自注意力机制(Self-Attention Mechanism)

然后在具体 NLP 任务有监督微调时,与 ELMo 当成特征的做法不同,OpenAI GPT 不需要再重新对任务构建新的模型结构,而是直接在 Transformer 这个语言模型上的最后一层接上 softmax 作为任务输出层,然后再对这整个模型进行微调。他们还发现,如果使用语言模型作为辅助任务,能够提升有监督模型的泛化能力,并且能够加速收敛。

由于不同 NLP 任务的输入有所不同,在 Transformer 模型的输入上针对不同 NLP 任务也有所不同。

具体如下图,对于分类任务直接讲文本输入即可;对于文本蕴涵任务,需要将前提和假设用一个 Delim 分割向量拼接后进行输入;对于文本相似度任务,在两个方向上都使用 Delim 拼接后,进行输入;对于像问答多选择的任务,就是将每个答案和上下文进行拼接进行输入。

实验

下面我简单的列举了一下不同 NLP 任务上的实验结果。

语言推理任务:

问答和常识推理任务:

语义相似度和分类任务:

可以看到在多项任务上,OpenAI GPT 的效果要比 ELMo 的效果更好。从下面的消除实验来看,在去掉预训练部分后,所有任务都大幅下降,平均下降了 14.8%,说明预训练很有效;在大数据集上使用语言模型作为附加任务的效果更好,小数据集不然;利用 LSTM 代替 Transformer 后,结果平均下降了 5.6%,也体现了 Transformer 的性能。

BERT

引言 

上周 Google 放出了他们的语言模型预训练方法,瞬时受到了各界广泛关注,不少媒体公众号也进行了相应报道,那我们来看看这篇论文 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding [3]。

这篇论文把预训练语言表示方法分为了基于特征的方法(代表 ELMo)和基于微调的方法(代表 OpenAI GPT)。而目前这两种方法在预训练时都是使用单向的语言模型来学习语言表示。

这篇论文中,作者们证明了使用双向的预训练效果更好。其实这篇论文方法的整体框架和 GPT 类似,是进一步的发展。具体的,BERT 是使用 Transformer 的编码器来作为语言模型,在语言模型预训练的时候,提出了两个新的目标任务(即遮挡语言模型 MLM 和预测下一个句子的任务),最后在 11 个 NLP 任务上取得了 SOTA。

方法

语言模型上,BERT 使用的是 Transformer 编码器,并且设计了一个小一点的 base 结构和一个更大的网络结构。

对比一下三种语言模型结构,BERT 使用的是 Transformer 编码器,由于 self-attention 机制,所以模型上下层直接全部互相连接的。而 OpenAI GPT 使用的是 Transformer 编码器,它是一个需要从左到右的受限制的 Transformer,而 ELMo 使用的是双向 LSTM,虽然是双向的,但是也只是在两个单向的 LSTM 的最高层进行简单的拼接。所以只有 BERT 是真正在模型所有层中是双向的。

而在模型的输入方面,BERT 做了更多的细节,如下图。他们使用了 WordPiece embedding 作为词向量,并加入了位置向量和句子切分向量。此外,作者还在每一个文本输入前加入了一个 CLS 向量,后面会有这个向量作为具体的分类向量。

语言模型预训练上,他们不再使用标准的从左到右预测下一个词作为目标任务,而是提出了两个新的任务。第一个任务他们称为 MLM,即在输入的词序列中,随机的挡上 15% 的词,然后任务就是去预测挡上的这些词,可以看到相比传统的语言模型预测目标函数,MLM 可以从任何方向去预测这些挡上的词,而不仅仅是单向的。

但是这样做会带来两个缺点:

1. 预训练用 [MASK] 提出挡住的词后,在微调阶段是没有 [MASK] 这个词的,所以会出现不匹配;

2. 预测 15% 的词而不是预测整个句子,使得预训练的收敛更慢。但是对于第二点,作者们觉得虽然是慢了,但是效果提升比较明显可以弥补。

对于第一点他们采用了下面的技巧来缓解,即不是总是用 [MASK] 去替换挡住的词,在 10% 的时间用一个随机词取替换,10% 的时间就用这个词本身。

而对于传统语言模型,并没有对句子之间的关系进行考虑。为了让模型能够学习到句子之间的关系,作者们提出了第二个目标任务就是预测下一个句子。其实就是一个二元分类问题,50% 的时间,输入一个句子和下一个句子的拼接,分类标签是正例,而另 50% 是输入一个句子和非下一个随机句子的拼接,标签为负例。最后整个预训练的目标函数就是这两个任务的取和求似然。

在微调阶段,不同任务的模型如下图,只是在输入层和输出层有所区别,然后整个模型所有参数进行微调。

实验

下面我们列出一下不同 NLP 上 BERT 的效果。

GLUE结果:

QA结果:

实体识别结果:

SWAG结果:

可以看到在这些所有 NLP 任务上,BERT 都取得了 SOTA,而且相比 EMLo 和 GPT 的效果提升还是比较大的。

在预训练实验分析上,可以看到本文提出的两个目标任务的作用还是很有效的,特别是在 MLM 这个目标任务上。

作者也做了模型规模的实验,大规模的模型效果更好,即使在小数据集上。

此外,作者也做了像 ELMo 当成特征加入的实验,从下图可以看到,当成特征加入最好效果能达到 96.1% 和微调的 96.4% 差不多,说明 BERT 对于基于特征和基于微调这两种方法都是有效的。

总结

最后进行简单的总结,和传统的词向量相比,使用语言模型预训练其实可以看成是一个句子级别的上下文的词表示,它可以充分利用大规模的单语语料,并且可以对一词多义进行建模。

而且从后面两篇论文可以看到,通过大规模语料预训练后,使用统一的模型或者是当成特征直接加到一些简单模型上,对各种 NLP 任务都能取得不错的效果,说明很大程度上缓解了具体任务对模型结构的依赖。在目前很多评测上也都取得了 SOTA,ELMo 也提供了官网供大家使用。

但是这些方法在空间和时间复杂度上都比较高,特别是 BERT,在论文中他们训练 base 版本需要在 16 个 TGPU 上,large 版本需要在 64 个 TPU 上训练 4 天。对于一般条件,一个 GPU 训练的话,得用上 1年。还有就是可以看出这些方法里面都存在很多工程细节,一些细节做得不好的话,效果也会大大折扣。

参考文献

[1] Peters, M. E. et al. Deep contextualized word representations. naacl (2018). 

[2] Radford, A. & Salimans, T. Improving Language Understanding by Generative Pre-Training. (2018). 

[3] Devlin, J., Chang, M.-W., Lee, K. & Toutanova, K. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. (2018). 

[4] Peters, M. E., Ammar, W., Bhagavatula, C. & Power, R. Semi-supervised sequence tagging with bidirectional language models. Acl (2017).



PaperWeekly
PaperWeekly

推荐、解读、讨论和报道人工智能前沿论文成果的学术平台。

理论BERT预训练模型语言模型自然语言处理
151
相关数据
基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

时间复杂度技术

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。例如,如果一个算法对于任何大小为 n (必须比 n0 大)的输入,它至多需要 5n3 + 3n 的时间运行完毕,那么它的渐近时间复杂度是 O(n3)。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

注意力机制技术

我们可以粗略地把神经注意机制类比成一个可以专注于输入内容的某一子集(或特征)的神经网络. 注意力机制最早是由 DeepMind 为图像分类提出的,这让「神经网络在执行预测任务时可以更多关注输入中的相关部分,更少关注不相关的部分」。当解码器生成一个用于构成目标句子的词时,源句子中仅有少部分是相关的;因此,可以应用一个基于内容的注意力机制来根据源句子动态地生成一个(加权的)语境向量(context vector), 然后网络会根据这个语境向量而不是某个固定长度的向量来预测词。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

大数据技术技术

大数据,又称为巨量资料,指的是传统数据处理应用软件不足以处理它们的大或复杂的数据集的术语。

目标函数技术

目标函数f(x)就是用设计变量来表示的所追求的目标形式,所以目标函数就是设计变量的函数,是一个标量。从工程意义讲,目标函数是系统的性能标准,比如,一个结构的最轻重量、最低造价、最合理形式;一件产品的最短生产时间、最小能量消耗;一个实验的最佳配方等等,建立目标函数的过程就是寻找设计变量与目标的关系的过程,目标函数和设计变量的关系可用曲线、曲面或超曲面表示。

分类问题技术

分类问题是数据挖掘处理的一个重要组成部分,在机器学习领域,分类问题通常被认为属于监督式学习(supervised learning),也就是说,分类问题的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。根据类别的数量还可以进一步将分类问题划分为二元分类(binary classification)和多元分类(multiclass classification)。

迁移学习技术

迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务,虽然大多数机器学习算法都是为了解决单个任务而设计的,但是促进迁移学习的算法的开发是机器学习社区持续关注的话题。 迁移学习对人类来说很常见,例如,我们可能会发现学习识别苹果可能有助于识别梨,或者学习弹奏电子琴可能有助于学习钢琴。

前馈神经网络技术

前馈神经网络(FNN)是人工智能领域中最早发明的简单人工神经网络类型。在它内部,参数从输入层经过隐含层向输出层单向传播。与递归神经网络不同,在它内部不会构成有向环。FNN由一个输入层、一个(浅层网络)或多个(深层网络,因此叫作深度学习)隐藏层,和一个输出层构成。每个层(除输出层以外)与下一层连接。这种连接是 FNN 架构的关键,具有两个主要特征:加权平均值和激活函数。

word2vec技术

Word2vec,为一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。 训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络之隐藏层。 Word2vec依赖skip-grams或连续词袋(CBOW)来建立神经词嵌入。Word2vec为托马斯·米科洛夫(Tomas Mikolov)在Google带领的研究团队创造。该算法渐渐被其他人所分析和解释。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

长短期记忆网络技术

长短期记忆(Long Short-Term Memory) 是具有长期记忆能力的一种时间递归神经网络(Recurrent Neural Network)。 其网络结构含有一个或多个具有可遗忘和记忆功能的单元组成。它在1997年被提出用于解决传统RNN(Recurrent Neural Network) 的随时间反向传播中权重消失的问题(vanishing gradient problem over backpropagation-through-time),重要组成部分包括Forget Gate, Input Gate, 和 Output Gate, 分别负责决定当前输入是否被采纳,是否被长期记忆以及决定在记忆中的输入是否在当前被输出。Gated Recurrent Unit 是 LSTM 众多版本中典型的一个。因为它具有记忆性的功能,LSTM经常被用在具有时间序列特性的数据和场景中。

深度神经网络技术

深度神经网络(DNN)是深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。

语言模型技术

语言模型经常使用在许多自然语言处理方面的应用,如语音识别,机器翻译,词性标注,句法分析和资讯检索。由于字词与句子都是任意组合的长度,因此在训练过的语言模型中会出现未曾出现的字串(资料稀疏的问题),也使得在语料库中估算字串的机率变得很困难,这也是要使用近似的平滑n元语法(N-gram)模型之原因。

推荐文章
在 n 元模型中估算条件概率时,只需要对当前词的前 n 个词进行计算【ngram,当前词的出现只与前面N-1个词相关,不是当前词的前N个词】