BERT及RoBERTa论文笔记

NLP领域最近一年多来,各种语言预训练模型层出不穷,去年Google团队发布的BERT一出场就技惊四座,刷新了GLUE 11项NLP测试的最高纪录,甚至超越了人类的表现,荣获NAACL 2019最佳长论文奖,可谓实至名归。2019年上半年,虽然又涌现出了GPT-2、Transformer-XL、XLNet等新贵,一度将BERT拉下了冠军宝座。但是,最近Facebook团队开源的基于BERT开发的加强版预训练模型RoBERTa又卷土重来,再次站上了GLUE的巅峰,并且在SQuADRACE排行榜上都名列前茅。真是应了那句话——“能打败你的,只有你自己”

BERT (Bidirectional Encoder Representations from Transformers)

论文地址:BERT: Pre-training of Deep Bidirectional Transformers for Langue Understanding

代码地址:https://github.com/google-research/bert

短评:BERTBidirectional Encoder Representations from Transformers的缩写(《芝麻街》里的伯特,从Elmo开始的家庭故事真是丰富多彩,后面可能会专开篇专题谈谈,敬请期待)。从名字就可以看出,BERT师承Transformer,训练Masked LM和Next Sentence Prediction两个任务,在11项NLP测试上超越前人,令人印象深刻。从当前学术界、工业界的应用情况来看,BERT称得上是NLP领域的重要里程碑

简介

论文首先谈到现在应用预训练语言模型的两种策略:feature-basedfine-tuning,并分别谈到对应的两个典型代表ElmoGPT,都是构建自回归语言模型,只能利用到单向信息(虽然Elmo同时进行了前向和后向的RNN,但是两个方向是独立的)。作者认为,这种单向性限制了模型的能力,特别是在一些双向信息很为关键的token-level的任务上,例如命名实体识别(Named Entity Recognition)、问答(Question Answering)等。

主要贡献有以下几点:

  • 揭示了语言表示中双向建模的重要性。通过掩码语言模型(Masked LM)实现。
  • 第一个在很多sentence-level和token-level任务中,同时超越许多任务专属模型的全能型模型。
  • 刷新11项NLP测试任务,代码和预训练模型公开,为社区发展贡献力量。

模型框架

Model Architecture

image-20190803181954529

BERT framework的示意图,包含两个阶段,重点注意左右基本一样,只是输出根据不同任务做了一些修改

有两个版本,BERT_{BASE}(L=12 H=768 A=12,与GPT规模相当)和BERT_{LARGE}(L=24 H=1024 A=16)。

Input/Output Representations

image-20190803203127396

这里为了适应下游任务的多种输入样式,直接设计了句子对的输入。句子由[SEP]和Segment Embeddings进行区分。[CLS]是一个特殊的可用于分类任务的token。输入采用WordPiece(通常是Byte-Pair Encoding的实现方式,具体做法简而言之是,先将单词拆分成更小的字符,然后在词的范围内统计字符对的出现次数,不断合并高频字符对并保存,直到循环介绍)。

Pre-training BERT
  • Masked LM (MLM)

    在历史上,这通常被称为“完形填空”(Cloze task,1953)。实现中,随机mask掉15%输入WordPiece序列的位置。这种做法最大的一个缺点是造成pre-training和fine-tuning的不一致性(mismatch),因为[MASK] token是不会出现在fine-tuning阶段的。为了减缓这种不一致,实际上不会总是将masked的位置全部替换成[MASK],而是(1) 以80%的概率替换为[MASK],(2) 10%的概率替换字典里的随机字,(3) 10%的概率就保持不变(信息泄漏,被允许)。损失函数采用交叉熵损失(cross entropy loss)。

  • Next Sentence Prediction (NSP)

    很多重要的下游任务涉及两个句子关系的判断,例如QA和NLI任务。但是LM没有建模这样的关系,因此这里引入了NSP希望增强这方面的关注。

  • Pre-training data

    训练数据主要采用BooksCorpus和English Wikipedia两个数据集,主要是用文档级别的数据,重点考虑建模长距离连续序列。

Fine-tuning BERT

BERT的fine-tuning相当直接,设计好对应的输入输出,沿用同样的框架,便可根据特定任务调优所有层的参数。

实验分析

在GLUE(General Language Understanding Evaluation)的11项自然语言理解的基准测试任务上进行了实验。实验结果如下图:

image-20190803210735087

Fine-tune阶段的batch size为32,跑3个epochs。在验证集上选择最优的学习率(5e-5, 4e-5, 3e-5, 2e-5),针对BERT_{LARGE}在某些小数据集上的不稳定,采用多次实验(修改shuffle和分类层的初始化)的验证集最优结果。(注,分类任务只需要在[CLS]的最终输出C\in R^H再过一个分类向量W\in R^H转换即可,分类损失为-log(softmax(CW^T))

还有一个比较有趣的任务值得介绍一下,SQuAD:给定一个问题和一个段落,要求在段落中标记处答案的跨度(span,有两个版本,v1.1答案肯定存在,v2.0答案可能并不存在)。输入的话,没有什么特别,就是将问题当作sent_a,将段落当作sent_b输入就好,比较巧妙的是输出的设计。在SQuAD v1.1中,输出层增加两个向量,起始向量S\in R^H和结束向量E\in R^H,训练目标为正确起始位置和结束为止的最大似然,以起始位置为例,其概率分布可以表示为P_i=\frac{e^{S\cdot T_i}}{\sum_je^{S\cdot T_j}}。从所有候选答案片段(candidate answer span)中,选择最大打分s_{\widehat{i,j}}=max_{j\ge i}S\cdot T_i + E\cdot T_j对应的片段作为预测输出。而在SQuAD v2.0中,把起始和结束位置都预测为[CLS]的认为是答案不存在(no-answer span),其打分为s_{null}=S\cdot C+E\cdot C,预测时如果s_{\widehat{i,j}}> s_{null}+\tau,则可判定段落中存在答案span_{i,j},否则答案不存在。其中\tau值根据验证集上的最大F1设定。BERT在这两个数据集上的效果如下图(论文中提到,BERT-single在SQuAD v1.1上也比当前最优+1.3 F1,表中似乎没有看出,🤔):

SQuAD v1.1 SQuAD v2.0
image-20190803221219203 image-20190803221132755

接下来就是模型设计的各种对比分析(Ablation Studies)

实验 结果
Effect of Pre-training Tasks
1. 对比行1和行2,去掉NSP任务在NLI和QA任务上下降
2. 对比行2和行3,采用标准的Left-to-Right语言模型,性能下降严重(和GPT更接近)
3. 为了更确信双向建模的重要性,对比行3和行4,可以看到加入BiLSTM后对于SQuAD提升较大,但是同时注意到对于GLUE任务可能有损伤。
image-20190803222453958
Effect of Model Size
这个还是那句话,“大力出奇迹”。
image-20190803223636619
Feature-based Approach with BERT
之前提到的方法都是fine-tuning,但是其实直接拿来当特征提取器(效率更高,更灵活)效果也是很不错的,如右图实验结果,取最后4层隐层拼接,性能相较fine-tuning整个BERT_{LARGE} 仅下降0.3 F1。
image-20190803224054654

附录

附录给出了要复现结果设计到的模型的一些超参数,例如学习率、优化器设定、batch_size、epoch等。有两个对比图值得关注一下,

image-20190803224953192

image-20190803225411203

(a)和(b)是sequence-level任务,(c)和(d)是token-level任务

RoBERTa (Robustly optimized BERT aprroach)

论文地址:RoBERTa: A Robustly Optimized BERT Pretraining Approach

代码地址:https://github.com/pytorch/fairseq

短评:论文揭示了BERT的巨大潜力,细致研究BERT预训练过程的超参和数据设计,并提出了更鲁棒的优化方法(replication study)。在GLUE,RACE和SQuAD都达到了新的SOTA(刚看了一下,我写这篇博文的时候,XLNet又夺回了SQuAD的榜首,下一篇博文就会谈到这个新贵)。

简介

相比之前提出的BERT模型,主要改动有4点:

  1. 训练更长时间,使用更大的batch_size,更多的数据
  2. 删除next sentence prediction任务
  3. 在更长的序列上进行训练
  4. 动态改变训练数据的masking模式

证明了通过更加精心的设计和更大的数据(新增了一个76GB的英文新闻数据集CC-NEWS),BERT仍有提升空间。

细节

实验 结果
Static vs Dynamic Masking
BERT中是准备训练数据时,每个样例只会进行一次随机mask(因此每个epoch都是重复),这里的static是进行10次(总共40 epochs,所以重复4次),而dynamic是训练过程中进行mask,所以是时刻变化的。应该主要出于efficiency的考虑,后面都采用了dynamic模式。
image-20190803233055441
Model Input Format and NSP
BERT采用的是SEGMENT-PAIR(可包含多句话)的输入格式,从实验结果来看,如果在采用NSP loss的情况下,是优于SENTENCE-PAIR(两句话)的。但是,不采用NSP loss,改用FULL-SENTENCES或DOC-SENTENCES(区别在于是否允许跨文档),效果能持平甚至超越BERT。出于处理方便,后面采用DOC-SENTENCES输入格式。
image-20190803234410862

总结一下,RoBERTa使用dynamic masking,FULL-SENTENCES without NSP loss,larger mini-batches和larger byte-level BPE(这个文本编码方法在之前的GPT-2博文中介绍过,BERT之前用的是character粒度的)进行训练。

image-20190804000044305

Published by

admin

天空没有翅膀的痕迹,但我已飞过

Leave a Reply

Your email address will not be published. Required fields are marked *