文章目录

  • BERT论文精读
  • Abstract
  • Introduction
  • BERT
  • Pre-training BERT
  • Task #1: Masked LM
  • Task #2: Next Sentence Prediction (NSP)
  • Fine-tuning BERT


BERT论文精读

Abstract

我们引入了一种新的语言表示模型BERT,它使用了来自Transformer的双向编码器。 与最近的语言表示模型不同,Bert的设计目的是结合左右双向的信息,使用预训练模型来生成文本的深度双向表示。预训练的Bert模型可以通过一个额外的输出层进行优化,从而为广泛的任务(如问题回答和语言推理)创建最先进的模型,而无需对特定于任务的体系结构进行实质性修改。 它在11个自然语言处理任务上获得了最新的结果。

Introduction

目前有两种方法应用于对下游任务的预训练语言表示:基于特征和微调。 基于特征的方法,如Elmo,使用特定于任务的架构,其中包括预先训练的表示作为附加特征。 微调方法,如 GPT,引入了最小的任务特定参数,并通过简单地微调所有预训练参数来对下游任务进行训练。 在预训练过程中,这两种方法共享相同的目标函数,它们使用单向语言模型来学习通用的语言表征。
我们认为,目前的技术限制了预先训练的表征的能力,特别是对于微调方法。 主要的限制是标准语言模型是单向的,这限制了在预训练期间可以使用的体系结构的选择。在这些任务中,从两个方向结合上下文是至关重要的。
在本文中,我们改进了基于微调的方法,提出了BERT。 受完形填空任务的启发,Bert使用了一个“蒙蔽语言模型”(MLM)的预训练目标来缓解单向性限制。 掩码语言模型随机地从输入中掩码一些标记,目标是只根据掩码词的上下文来预测其原始词汇ID。 与Left-Toright语言模型预训练不同,MLM目标使表示能够融合左和右上下文,这允许我们预训练一个深度双向转换器。 除了掩蔽语言模型之外,我们还使用了一个“下一个句子预测”任务,它联合对文本对表示进行预训练。 本文的贡献如下:

1、我们论证了双向预训练对语言表征的重要性。
2、我们表明,预训练减少了对许多经过大量工程设计的特定于任务的体系结构的需求。 Bert是第一个基于微调的表示模型,它在大量句子级和令牌级任务上实现了最先进的性能,优于许多特定于任务的体系结构。
3、Bert提出了11个NLP任务的最新技术。 代码和预先训练的模型可以在https://github.com/google-research/bert上找到。

BERT

我们在本节中介绍BERT及其详细实现。 在我们的框架中有两个步骤:预训练和微调。 在预训练过程中,模型在不同预训练任务的无监督数据上进行训练。 在微调部分,Bert模型首先用预先训练的参数初始化,然后使用来自下游任务的标记数据对所有参数进行微调。 每个下游任务都有单独的微调模型,即使它们是用相同的预先训练的参数初始化的。 图1中的问答示例将作为本节的运行示例。
Bert的一个显著特征是跨不同任务的统一架构。 在预先训练的体系结构和最终的下游体系结构之间有微小的差异。
模型架构Bert的模型架构是基于Vaswani等人原始实现的多层双向transformer编码器。 因为我们的实现与原始的几乎完全相同,所以我们将省略对模型架构的详尽描述。 在这项工作中,我们将层数(即transformer块)表示为L,隐藏单元的大小表示为H,自注意头的数量表示为A。我们生成了两个模型的结果:BertBase(L=12,H=768,A=12,总参数=110m)和BertLarge(L=24,H=1024,A=16,总参数=340m)。

输入/输出表示为了使Bert处理各种下游任务,我们的输入表示能够在一个令牌序列中毫不含糊地表示单个句子和一对句子(例如,可能的问题,答案)。 在这,一个“句子”可以是一个连续的文本的任意跨度,而不是一个实际的语言句子。 一个“序列”指的是对Bert的输入令牌序列,可以是单个句子,也可以是打包在一起的两个句子。 我们使用WordPiece Embeddings生成有30,000个令牌词汇表。 每个序列的第一个令牌总是一个特殊的分类令牌([CLS])。 与此令牌对应的最终隐藏状态被用作分类任务的聚合序列表示。 句子对被打包成一个单独的序列。 我们用两种方法区分这些句子。 首先,我们用一个特殊的令牌([SEP])将它们分开。 其次,我们在每个令牌上添加一个学习嵌入,表示它是属于语句A还是语句B。如图1所示,我们将输入嵌入表示为E,将特殊[CLS]令牌的最终隐藏向量表示为C∈RH,将第i个输入令牌的最终隐藏向量表示为TI∈RH。

对于给定的令牌,它的输入表示是通过对相应的令牌、段和位置嵌入求和来构造的。 这个结构的可视化可以在下图中看到。

bert模型进行抽取式文本摘要 bert 文本摘要_语言模型

Pre-training BERT

我们不使用传统的从左到右或从右到左的语言模型对BERT进行预训练。 相反,我们使用本节中描述的两个无监督任务对Bert进行预训练。 这个步骤在下图的左侧部分中给出。

bert模型进行抽取式文本摘要 bert 文本摘要_bert_02

Task #1: Masked LM

凭直觉,我们有理由相信,深度双向模型严格来说比从左到右模型或从左到右模型的浅层连接更强大。 不幸的是,标准条件语言模型只能从左到右或从右到左训练,因为双向条件允许每个词间接地“看到自己”,模型可以在多层上下文中简单地预测目标词。 为了训练深度双向表示,我们只需随机屏蔽一部分输入令牌,然后预测这些被屏蔽的令牌。 我们把这个过程称为“蒙面LM”(MLM)。 在这种情况下,与掩码令牌相对应的最终隐藏向量被馈送到词汇表上的输出Softmax中,就像在标准LM中一样。 在我们所有的实验中,我们随机屏蔽了每个序列中15%的所有文字标记。 我们只预测被掩盖的单词,而不是重建整个输入。
虽然这允许我们获得双向预训练模型,但缺点是我们在预训练和微调之间产生了不匹配,因为[mask]标记在微调期间不会出现。 为了缓解这种情况,我们并不总是用实际的[mask]标记替换“masked”单词。 训练数据生成器随机选择15%的令牌位置进行预测。 如果选择了第i个令牌,我们将第i个令牌替换为
(1)80%的时间使用[mask]令牌
(2)10%的时间使用随机令牌
(3)10%的时间使用未更改的第i个令牌。
然后,将TI用于具有交叉熵损失的原始令牌预测。

Task #2: Next Sentence Prediction (NSP)

许多重要的下游任务如问答(QA)和自然语言推理(NLI)都是基于理解两个句子之间的关系,而语言建模不能直接捕捉到这种关系。 为了训练一个理解句子关系的模型,我们预先训练了一个二值化的下一个句子预测任务,该任务可以从任何单语语料库中生成。 具体来说,当为每个预训练示例选择句子A和B时,50%的时间B是紧随A之后的实际下一个句子(标记为isnext),而50%的时间是来自语料库的随机句子(标记为notnext)。 正如我们在图1中所示,C被用于下一个句子预测(NSP)。然而,在以前的工作中,只有句子嵌入被转移到下游任务,其中Bert转移所有参数来初始化最终任务模型参数。
预训练数据预训练程序在很大程度上遵循现有的语言模型预训练的文献。 对于预训练语料库,我们使用Bookscorpus(800m单词)和英语Wikipedia。 对于Wikipedia,我们只提取文本段落,忽略列表、表和标题。 为了提取长的连续序列,使用文档级语料库而不是洗牌过的句子级语料库是至关重要的,比如十亿字基准。

Fine-tuning BERT

bert模型进行抽取式文本摘要 bert 文本摘要_语言模型_03


微调非常简单,因为Transformer中的自注意力机制允许Bert通过交换适当的输入和输出来建模许多下游任务–无论它们涉及单个文本还是文本对。 对于涉及文本对的应用,一个常见的模式是在应用双向交叉注意之前对文本对进行独立编码。Bert使用自我注意机制来统一这两个阶段,因为编码具有自我注意的串联文本对有效地包含了两个句子之间的双向交叉注意。 对于每个任务,我们只需将特定于TaskSpecific的输入和输出插入到Bert中,并对所有参数进行端到端的优化。 在输入端,预训练后的句子A和句子B类似于

(1)释义中的句子对,

(2)蕴涵中的假设-前提对,

(3)问答中的问题-段落对,

(4)文本分类或序列标注中的退化文本对。

在输出端,令牌表示被馈送到输出层用于令牌级任务,如序列标记或问题回答,而[CLS]表示被馈送到输出层用于分类,如蕴涵或情感分析。 与预训练相比,微调相对便宜。 从完全相同的预先训练的模型开始,在单个云TPU上最多可在1小时内复制论文中的所有结果,或在GPU上最多可在几小时内复制。