Skip to content

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也可作为特征提取器使用(固定参数,提取特征供下游模型使用),具有以下优势:

  1. 某些任务不易用Transformer编码器架构表示,需添加任务特定模型。
  2. 可预先计算训练数据的表示,大幅降低实验成本。

实验:在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任务上取得最先进成果,证明了双向预训练的强大能力。代码与预训练模型已开源。

Comments