Bert
0 摘要
- BERT(来自Transformer的双向编码器表示)是一种新的语言表示模型,旨在通过在所有层中同时联合 conditioning 左侧和右侧上下文,从无标注文本中预训练深度双向表示。
- 与ELMo和OpenAI GPT等先前模型不同,BERT通过“掩码语言模型”(MLM)目标实现了深度双向性。预训练后的BERT模型只需添加一个额外的输出层进行微调,即可在广泛的下游自然语言处理任务上取得最先进性能,且无需大量任务特定的架构修改。
- BERT在11项NLP任务上刷新了榜单,包括GLUE(80.5%,绝对提升7.7%)、MultiNLI(86.7%,绝对提升4.6%)、SQuAD v1.1(F1 93.2,绝对提升1.5)和SQuAD v2.0(F1 83.1,绝对提升5.1)。
1 引言
语言模型预训练已被证明能有效提升诸多NLP任务,包括句子级任务(如自然语言推理、释义识别)和词元级任务(如命名实体识别、问答)。应用预训练表示主要有两种策略:
- 基于特征的方法(如ELMo)
- 基于微调的方法(如OpenAI GPT)
这两种方法在预训练阶段通常都使用单向语言模型(只能基于单方向的上下文来预测当前词)。
作者认为,单向语言模型限制了预训练表示的能力,特别是在微调方法中。例如,OpenAI GPT使用从左到右的架构,每个词元只能关注其左侧的上下文,这对于句子级任务不是最优的,而对于需要双向上下文的词元级任务(如问答)则可能非常有害。
BERT通过引入掩码语言模型(MLM)预训练目标来解决这一限制。MLM受Cloze任务启发,随机掩码部分输入词元,并基于其双向上下文预测被掩码的原始词元。此外,BERT还引入下一句预测(NSP)任务,用于联合预训练文本对表示。本文的主要贡献包括:
- 证明了双向预训练对语言表示的重要性;
- 减少了对大量精心设计的任务特定架构的需求;
- 在11项NLP任务上取得最先进成果。
2 相关工作
2.1 无监督基于特征的方法
词嵌入(如word2vec、GloVe)长期以来被用作预训练特征,并已被推广至句子嵌入和段落嵌入。ELMo通过从左到右和从右到左的LSTM提取上下文敏感特征并进行拼接,但其并非深度双向,而是独立训练的浅层拼接。
ELMo
ELMo:使用双向LSTM(长短期记忆网络),但不是真正的深度双向。具体做法:
- 分别训练一个从左到右的LSTM语言模型和一个从右到左的LSTM语言模型。
- 对于每个词,将两个方向LSTM的隐藏状态进行拼接,得到该词的上下文相关表示。
- 预训练任务为预测下一个词(左到右和右到左分别训练)。预训练完成后,ELMo的权重被固定。
- 在下游任务中,将ELMo生成的上下文词向量作为额外特征,输入到任务特定的模型架构中(如BiLSTM-CRF用于命名实体识别)。
- 下游任务模型可以灵活使用ELMo的不同层:通常将底层(捕捉句法信息)和高层(捕捉语义信息)加权组合。
2.2 无监督基于微调的方法
早期工作预训练词嵌入后进行微调。近期方法(如OpenAI GPT、ULMFiT)预训练完整编码器并在下游任务上微调。OpenAI GPT使用从左到右的Transformer,在GLUE任务上取得了当时的先进结果。
GPT
GPT:基于微调,先用大量无标注数据预训练一个强大的语言模型,然后在下游任务上微调所有参数
- 使用Transformer解码器(12层,从左到右的单向架构)。
- 采用掩码自注意力(masked self-attention):每个词元只能关注其左侧的上下文,不能看到右侧信息。
2.3 有监督数据的迁移学习
从有监督任务(如NLI、机器翻译)进行迁移学习也已被证明有效,类似于计算机视觉中基于ImageNet的预训练。
3 BERT
BERT包含两个阶段:预训练和微调。预训练阶段,模型在无标注数据上通过两个无监督任务进行训练;微调阶段,使用下游任务的有标注数据对预训练参数进行微调,任务特定的输入和输出格式通过统一架构适配。
模型架构:BERT是一个多层双向Transformer编码器,基于Vaswani等人(2017)的原始实现。本文提出两种模型规模:
- BERTBASE:L=12,H=768,A=12,参数量1.1亿
- BERTLARGE:L=24,H=1024,A=16,参数量3.4亿
BERT使用双向自注意力,而OpenAI GPT使用受限的仅左侧上下文自注意力。
输入/输出表示:BERT能够在一个词元序列中同时表示单个句子和句子对。使用WordPiece分词(词汇量3万)。特殊标记包括:
[CLS]:分类标记,其对应的最终隐藏状态用作分类任务的聚合序列表示。[SEP]:句子分隔符。- 段嵌入:指示词元属于句子A还是B。
- 位置嵌入:学习得到的位置编码。
每个词元的输入表示由对应的词元嵌入、段嵌入和位置嵌入求和得到。
3.1 预训练BERT
BERT使用两个无监督任务进行预训练:
任务1:掩码语言模型(MLM)
为实现深度双向预训练,每个序列中随机选择15%的词元进行预测。然而,为缓解预训练(出现[MASK])和微调(无[MASK])之间的不匹配,被选中的词元并非总是替换为[MASK]:
- 80%的概率替换为
[MASK] - 10%的概率替换为随机词元
- 10%的概率保持原词元不变
模型通过交叉熵损失预测原始词元。这迫使模型保持每个输入词元的分布式上下文表示。
任务2:下一句预测(NSP)
为捕捉句子间的关系,BERT在二值化的下一句预测任务上进行预训练:
- 50%的概率:B是A的下一句(标签为
IsNext) - 50%的概率:B是语料中的随机句子(标签为
NotNext)
该任务对问答和自然语言推理等任务非常有益。
预训练数据:BooksCorpus(8亿词)+ 英文维基百科(25亿词)。使用文档级语料库以提取长连续序列,而非打乱的句子级语料。
3.2 微调BERT
BERT的微调过程简单直接。Transformer中的自注意力机制允许BERT通过替换适当的输入和输出,统一处理单文本和文本对任务。对于涉及文本对的应用,BERT将两个句子打包成一个序列,利用自注意力实现双向交叉注意力,无需像以往方法那样独立编码后再进行双向注意力。
针对不同任务,只需在BERT基础上添加任务特定的输入输出层,并端到端微调所有参数:
- 句子对任务(如释义识别、蕴含识别、问答、文本分类):输入为句子A和句子B(类似预训练时的结构),输出使用
[CLS]对应的隐藏状态进行分类。 - 词元级任务(如序列标注、问答):输出使用每个词元对应的隐藏状态
T_i进行预测。
微调相比预训练计算成本较低,在单块Cloud TPU或GPU上数小时内即可完成。
4 实验
BERT在11项NLP任务上进行评估,涵盖句子级和词元级任务。
4.1 GLUE基准
GLUE(通用语言理解评估)包含多种自然语言理解任务。微调时,使用[CLS]对应的隐藏向量C作为序列表示,新增分类层权重W,计算标准分类损失。
- 超参数:batch size=32,微调3个epoch,学习率在{5e-5, 4e-5, 3e-5, 2e-5}中选择最佳值。对于BERT_LARGE,在小数据集上微调不稳定,采用多次随机重启(不同数据打乱顺序和分类层初始化)并选择开发集上最佳模型。
结果:BERT_BASE和BERT_LARGE在所有任务上大幅超越此前最先进系统,平均准确率分别提升4.5%和7.0%。BERT_LARGE在GLUE官方榜单上取得80.5分,OpenAI GPT为72.8分。MNLI任务上BERT获得4.6%的绝对准确率提升。
4.2 SQuAD v1.1
SQuAD v1.1是斯坦福问答数据集,任务是根据问题和维基百科段落预测答案文本片段。
- 方法:将问题与段落打包成一个序列,问题用A段嵌入,段落用B段嵌入。微调时引入起始向量
S和结束向量E,通过点积计算每个词元作为答案起点/终点的概率,取最大得分区间作为预测。 - 超参数:学习率5e-5,batch size=32,微调3个epoch。可选地在TriviaQA上先微调再进行SQuAD微调(数据增强)。
结果: - 单模型BERT_LARGE:EM 84.1,F1 90.9(超越所有现有单模型)。 - 集成模型(7个不同预训练检查点+微调种子):EM 86.2,F1 92.2,超越榜单顶级集成系统。 - 未使用TriviaQA时,性能仅下降0.1–0.4 F1,仍大幅领先。
4.3 SQuAD v2.0
SQuAD v2.0扩展了v1.1,允许段落中不存在答案,更贴近实际。
- 方法:将无答案问题视为答案区间在
[CLS]位置。预测时,比较“无答案区间”得分s_null与最佳非空区间得分^s_{i,j},若^s > s_null + τ则预测非空答案,阈值τ在开发集上调优。 - 超参数:学习率5e-5,batch size=48,微调2个epoch,未使用TriviaQA。
结果:BERT_LARGE单模型在测试集上取得EM 80.0、F1 83.1,相较此前最佳系统提升5.1 F1。
4.4 SWAG
SWAG(对抗生成情境)数据集包含11.3万个句子对补全示例,评估基于常识的推理。给定一个句子,从四个选项中选择最合理的后续。
- 方法:构造四个输入序列,每个序列为给定句子(A)与一个候选后续(B)的拼接。使用
[CLS]对应的向量C与任务特定权重向量点积得到每个选项得分,经softmax归一化。 - 超参数:学习率2e-5,batch size=16,微调3个epoch。
结果:BERT_LARGE准确率86.3%,远超ESIM+ELMo(59.1%)和OpenAI GPT(78.0%),甚至超越人类专家基线(85.0%)。
5 消融实验
5.1 预训练任务的影响
为验证深度双向性的重要性,使用与BERT_BASE完全相同的预训练数据、微调方案和超参数,比较不同预训练目标:
- No NSP:使用MLM但不使用NSP任务。
- LTR & No NSP:使用标准从左到右(LTR)语言模型,无MLM也无NSP,类似OpenAI GPT但使用更大的训练集和BERT的输入表示。
结果:
- 移除NSP导致QNLI、MNLI和SQuAD v1.1性能显著下降。
- LTR模型在所有任务上均差于MLM模型,尤其在MRPC和SQuAD上差距巨大。即使为LTR模型添加随机初始化的BiLSTM,SQuAD性能虽有提升但仍远低于双向模型,且GLUE任务性能下降。
结论:深度双向预训练是BERT成功的关键。
5.2 模型规模的影响
训练多个不同层数、隐藏单元数和注意力头数的BERT模型,控制其他超参数不变。
结果:
- 更大模型在所有数据集上带来严格性能提升,包括仅有3600个训练样本的MRPC。
- BERT_LARGE(340M参数)显著优于BERT_BASE(110M参数)。
- 对比以往研究(如仅增加BiLM层数或隐藏维度到一定程度后无提升),本文表明在充分预训练的前提下,极大规模模型即使在小数据集上也能带来显著收益。
结论:模型规模扩大持续提升下游任务性能,尤其是在微调范式下。
5.3 基于特征的BERT方法
除微调外,BERT也可作为特征提取器使用(固定参数,提取特征供下游模型使用),具有以下优势:
- 某些任务不易用Transformer编码器架构表示,需添加任务特定模型。
- 可预先计算训练数据的表示,大幅降低实验成本。
实验:在CoNLL-2003命名实体识别(NER)任务上对比微调与基于特征的方法。
- 微调方法:BERT_LARGE F1 92.8,BERT_BASE F1 92.4。
- 特征方法(BERT_BASE):提取不同层的激活值作为输入,训练两层BiLSTM分类器。最佳策略是拼接最后四层隐藏表示,F1达96.1(开发集)和92.4(测试集),仅比微调低0.3。
结论:BERT在微调和特征提取两种范式下均表现优异。
6 结论
近期迁移学习的经验性进展表明,丰富的无监督预训练是许多语言理解系统不可或缺的组成部分,尤其使得低资源任务也能从深度单向架构中受益。BERT的核心贡献是将这些发现推广到深度双向架构,使得同一预训练模型能够成功应对广泛的NLP任务。
BERT通过掩码语言模型和下一句预测两个预训练任务,实现了真正的双向上下文表示,显著超越单向模型和浅层双向模型。在11项NLP任务上取得最先进成果,证明了双向预训练的强大能力。代码与预训练模型已开源。