【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

  • 前言
  • Abstract
  • 1. Introduction
  • 2. Related Work
    • 2.1 Unsupervised Feature-based Approaches
    • 2.2 Unsupervised Fine-tuning Approaches
    • 2.3 Transfer Learning from Supervised Data
  • 3. BERT
    • 3.1 Pre-training BERT
      • Masked LM
      • Next Sentence Prediction (NSP)
      • Pre-training data
    • 3.2 Fine-tuning BERT
  • 4. Experiments
    • 4.1 GLUE
    • 4.2 SQuAD v1.1
    • 4.3 SQuAD v2.0
    • 4.4 SWAG
  • 5. Ablation Studies
    • 5.1 Effect of Pre-training Tasks
    • 5.2 Effect of Model Size
    • 5.3 Feature-based Approach with BERT
  • 6. Conclusion
  • 阅读总结

前言

BERT在推动NLP发展的道路上有着举足轻重的地位,它简单的设计,通用的部署与实现,以及预训练+微调的成功范式,为很多后序的设计带来启发。本篇文章是NLP经典论文第二篇,希望能够帮助读者进一步理解BERT。


Paper: https://arxiv.org/pdf/1810.04805.pdf&usg=ALkJrhhzxlCL6yTht2BRmH9atgvKFxHsxQ
Code: https://github.com/google-research/bert

Abstract

本文提出BERT模型,基于双边编码表示的Transformer实现。它旨在通过调节所有层中的左右上下文信息来预训练未标记文本的双向表示,只需要一个额外的输出层就能微调到特定的任务场景。BERT概念简单,效果显著,在十一个NLP任务上都取得了SOTA。

1. Introduction

预训练语言模型已被证明可以改善很多NLP任务,包括句子级和词级任务,现有的预训练策略包括两种:

  • 基于特征。如ELMo,使用特定于任务的架构(RNN)。
  • 基于微调,如GPT,通过简单微调预训练参数训练下游任务。

二者都是使用单向的语言模型来学习通用语言表示。但是单向限制了预训练模型的架构选择,导致句子级和词级任务无法学习到最优的信息。
本文的BERT基于Transformer的双向编码器,受到完形填空任务的启发,BERT通过使用MLM预训练目标来缓解单向性问题。MLM通过随机mask输入中的token,并根据上下文预测原始token。与GPT不同,MLM融合了左右上下文信息,能够预训练深度双向Transformer。除外,作者还构造了NSP任务,即预测当前句子和下一个句子的关系。本文的贡献如下:

  • 本文展示了双向预训练对于语言表征的重要性。
  • 预训练表征降低了任务特定架构的复杂性。
  • BERT在十一个任务场景达到了SOTA。

2. Related Work

2.1 Unsupervised Feature-based Approaches

预训练词级表征对于从头开始训练embedding有着显著的提升。为了预训练词级表征,前者的工作使用从左向右的语言建模目标以及区别左右上下文中正确和错误单词的目标等。
ELMo从不同的方向研究传统的词嵌入方法,以从左到右再从右到左的方式提取上下文特征,推进了多个NLP任务的发展,该工作表明完形填空任务可以提高文本生成模型的鲁棒性。

2.2 Unsupervised Fine-tuning Approaches

最近,有一种新的方法从未标记的文本中预训练句子,然后进行微调以适应下游任务。这种方式的好处是不用重新训练参数。代表工作是GPT,在多个句子级任务上达到了SOTA。

2.3 Transfer Learning from Supervised Data

许多工作从具有大规模数据的监督任务中进行有效迁移,例如自然语言推理、机器翻译。

3. BERT

BERT架构有两个步骤:预训练和微调。预训练在无标签数据上进行训练,而微调采用预训练的参数,使用下游任务的监督数据进行微调。
【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第1张图片
BERT的显著特征是跨任务统一架构。BERT的架构本质上是多层双向Transformer编码器,在本文中,L代表Transformer块个数,隐向量长度为H,头的个数为A。本文提供了两种规模的BERT模型。 B E R T b a s e \mathbf{BERT_{base}} BERTbase B E R T l a r g e \mathbf{BERT_{large}} BERTlarge,前者L=12、H=768、A=12、参数量110M,后者L=24、H=1024、A=16、参数量340M。

这里有必要讲解一下H、A随着L变化的规律和参数的计算过程。随着层数的翻倍,希望模型的参数量也能翻倍,但是参数量是随着H的2次方增长,因此为了让参数量翻倍,将H设置为1024更为合适。A也是随着H变化的,因为为了保持多头的维度一致,即H/A要相等(这里是64),所以large中A设置为16。参数的计算见下图,其中30k是词表大小,详细解释见沐神视频。

【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第2张图片
为了让BERT能够处理一系列下游任务,输入的表示能够让一个token序列明确表示单个句子或一对句子,这里的token序列是一个连续的范围,不是实际的句子。
作者采用WordPiece embedding来处理30K大小的词表,每个序列第一个token是[CLS],该token最后一层隐向量状态用于分类任务的聚合序列表示。句子对区分方式有两种,首先二者以一个特殊token[SEP]进行分隔,其次作者为每个token加入了可学习的嵌入,用于学习该token属于第一个句子还是第二个句子。
每个token的embedding是其token embedding、segment embedding和position embedding的求和,其可视化过程如下:
【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第3张图片

3.1 Pre-training BERT

预训练采用了两个无监督学习任务。

Masked LM

直接上双向模型会比单向模型学习到更多信息,为了训练双向表示,作者随机mask一定比例的token,然后将token最后一层的输出经过softmax预测这些token。这个任务称为MLM,或者完形填空任务。实验中,mask的比例为15%。
但是只是单纯的mask会造成训练和微调不匹配(因为[mask]在微调中不出现),因此对于选中的15%的token,80%用于mask,10%替换为随机token,10%不变。

Next Sentence Prediction (NSP)

许多下游任务如问答、自然语言理解都是基于理解两个句子之间的关系,但是语言模型不能直接捕获这种关系。为了学习句子级别的特征,构建了NSP任务。作者构造句子对时,50%是相邻句子,50%不相邻。

Pre-training data

预训练语料库采用800M的BooksCorpus和2500M英文维基百科。

3.2 Fine-tuning BERT

对于每个任务,只需要将任务的输入和输出输入到BERT中,然后进行端到端的微调即可。对于词级任务,将token表征喂入MLP中的得到结果,对于句子级任务,将[CLS]的表征喂入MLP输出结果。
微调的过程比预训练过程更节省时间。

4. Experiments

4.1 GLUE

GLUE基准是各种自然语言理解任务的集合,为了在GLUE上微调,作者将数据输入到BERT中,使用[CLS] token最后一层隐向量 C ∈ R H C \in \mathbb{R}^H CRH作为聚合表示。微调过程引入的唯一参数是分类层的权重 W ∈ R K × H W \in \mathbb{R}^{K×H} WRK×H,其中 K K K是标签数量。作者用 C C C W W W计算标准分类损失,即 l o g ( s o f t m a x ( C W T ) ) \mathrm{log(softmax}(CW^T)) log(softmax(CWT))
【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第4张图片
部分小规模数据集上训练效果不稳定,因此作者选取在这些数据集上最优性能作为结果。实际上性能不好的原因是因为作者实验中选择epoch为3,即只对数据集进行了3次全面扫描,这显然是不够的,只有增大epoch个数,才能得到稳定的结果。
实验结果如上表所示, B E R T b a s e \mathbf{BERT_{base}} BERTbase B E R T l a r g e \mathbf{BERT_{large}} BERTlarge都提升了SOTA,并且优于模型架构相似的GPT。随着模型规模的增大,模型性能更好。

4.2 SQuAD v1.1

斯坦福的问答数据集收集了10万个众包问答对,任务是预测文章中答案文本的范围,本质上是标出文本的起始位置S和结束位置E。结果如下表所示:
【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第5张图片
最好的结果是在TriviaQA数据集上预训练,再在SQuAD上微调。

4.3 SQuAD v2.0

该数据集是在v1.1基础上进行扩展,让回答不存在简短的序列,从而让问题更现实。
【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第6张图片
上表是训练结果,观察到BERT比SOTA高出了5.1。

4.4 SWAG

SWAG数据集包含了113K个句子对,用于评估常识推理。给定一个句子,任务是在四个选项中选出最合理的下一句。微调时,作者对每个样本构建四个输出序列,每个序列包含给定的句子A和可能的下一句B。[CLS]的最后一层输出作为分数。结果如下表所示:
【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第7张图片

效果要比baseline高出27.1%,比GPT高出8.3%。

5. Ablation Studies

5.1 Effect of Pre-training Tasks

本节通过使用相同的预训练数据、微调方案和参数来评估两个预训练任务的重要性。
No NSP: 只使用MLM预训练任务,而不使用NSP。
LTR&No NSP: 将双向模型改为自左向右的单向模型,使用标准的从左到右LM进行训练。相当于GPT,只不过在不同的数据上预训练。
【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第8张图片
上表是不同模型的表现,可以看到,移除NSP会损害模型的性能,并且进一步不使用双向模型让模型的表现更差。作者尝试增加LTR&NO NSP的性能,在这基础上加上BiLSTM,这确实改善了模型性能,但是和BERT相比有差距。

5.2 Effect of Model Size

【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第9张图片
作者尝试了不同规模的模型,表现结果如上表所示。可以看到更大的模型在所有四个数据集上带来了严格的性能提升。作者认为,只要模型经过充分的预训练,不断扩大模型的规模,微调阶段即使在很小的任务上也能带来巨大的改进。

5.3 Feature-based Approach with BERT

BERT作为基于预训练的方法只需要一个简单的分类层就可以实现很好的结果,但是基于特征提取的方法也有一定的优势。第一,并非所有的任务都能通过Transformer编码器实现(生成任务就不行),并且预训练成本高昂。
这里对两种方法进行比较。
【NLP经典论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding_第10张图片
因此这里对BERT不进行微调,而是作为静态特征输入,效果没有微调那么好。

6. Conclusion

最近基于语言模型的迁移学习结果表明丰富的、无监督的预训练是语言理解系统不可或缺的一部分,本文的主要贡献是进一步推广这种工作到一个更深的双向架构上,从而使同一个预训练模型能够泛化到更多的NLP任务上。

阅读总结

相比于GPT和Transformer,BERT在前两年可能知名度更广,虽然它仅仅是截取了Transformer的encoder部分,然后稍微做了一些改进:增加了两项预训练任务,输入增加了segment embedding,就没有额外的工作了。虽然实现很简单,但是这为NLP领域的走势提供了一个很好的范式,那就是预训练+微调,之前一直应用在CV领域,而BERT成功将其应用到NLP领域。此外,该文章还提出模型越大,性能越好的结论,这也为当今的大语言模型之间的百模大战打下了坚实的基础。
文章整体思路清晰,逻辑缜密,对于每个部分的设计都进行了很好的讲解,这样的写作还是非常值得借鉴的,最后强推沐神的讲解视频,会让你对文章有更深刻的理解。

你可能感兴趣的:(NLP经典论文,自然语言处理,bert,人工智能,nlp,transformer)