Author Unit: Google AI Language
Authors: Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova
Code: https://github.com/ google-research/bert
Conference: arXiv:1810.04805v2 [cs.CL] 24 May 2019
Email: {jacobdevlin,mingweichang,kentonl,kristout}@google.com
Paper address: https://arxiv.org/abs/1810.04805
bilibili_limu: https://www.bilibili.com/video/BV1PL411M7eQ
Notion 版本的笔记
以下引用的句子都来自李沐讲的视频。
Bert的出现,使得我们终于可以在一个大的数据集上训练好一个比较深的神经网络,然后应用在很多NLP的任务上面,既简化了这些NLP任务的训练,又提升了它的性能。
Bidirectional Encoder Representations from Transformers. 与最近的语言表示模型(Peters et al.,2018a;Radford et al.,2018 这里指的是ELMo和GPT模型)不同,BERT 旨在通过对所有层的左右上下文进行联合调节,从未标记的文本中预训练深度双向表示( GPT是单向的,所以其更适合做生成 )。 因此,预训练的 BERT 模型可以仅通过一个额外的输出层进行微调,从而为各种任务(例如问答和语言推理)创建最先进的模型,而无需对特定于任务的架构进行大量修改( ELMo是基于RNN的,所以如果应用其他任务,需要做较多的结构修改 )。
BERT概念简单,经验强大。它在11个自然语言处理任务上获得了新的最先进的结果,包括将GLUE分数提高到80.5%(**7.7%**的绝对改进点),多项准确率提高到86.7%(4.6%的绝对改进点),SQuAD v1.1答题测试F1达到93.2(1.5分绝对提高),SQuAD v2.0测试F1达到83.1(5.1分绝对提高)。
写论文的时候要把两点写出来,一个是绝对精度,一个是相对提升的精度。
Bert是先写了自己是基于哪些工作做了改进,然后写了自己的结果比别人好在什么地方。
语言模型预训练已被证明对提高许多自然语言处理任务是有效的 (Dai and Le,2015;Peters et al., 2018a;Radford et al.,2018;Howard and Ruder, 2018).
目前有两种将预训练的语言表示应用于下游任务的策略:基于特征的策略和微调策略)(feature-based and fine-tuning)。基于特征的方法,如ELMo (Peters et al.,2018a),使用特定任务的架构,它的输入会包括预训练好的表示作为额外特征。Fine-tuning方法,如OpenAI GPT (Radford et al.,2018),引入了最小的(minimal)特定任务参数,并通过简单微调所有预训练的参数对下游任务进行训练( 意思应该是对于下游任务不用引入更多参数了 )。这两种方法在预训练阶段具有相同的目标函数,即使用单向语言模型学习一般语言表示。
单向的语言表征模型具有局限性,从两个方向来理解句子层面的知识是很重要的!例如问答,需要理解了整个句子之后才能很好的去选择答案。
BERT受Cloze task (Taylor,1953)的启发,采用了“masked language model”(MLM)的预训练目标,缓解了前面提到的单向性约束。掩码语言模型从输入中随机屏蔽一些token,目标是仅根据其上下文来预测屏蔽词的原始词汇 id。 与从左到右的语言模型预训练不同,MLM 目标使学习到的表征能够融合左右上下文,这使我们能够预训练深度双向 Transformer。 除了掩码语言模型,我们还使用了“next sentence prediction”任务来联合预训练text-pair表征。
“next sentence prediction” 意指给定两个句子,判断这两个句子在原文里是否相邻。这样可以让模型学习到句子层面的一些信息。
本文的贡献如下:
ELMo及类似的工作。
GPT及类似的工作
Bert和一系列后面的工作证明,在NLP中,采用大量无标签的数据集来训练模型要比在小的有标签数据集上的效果更好;同样的想法,在计算机视觉上也有人开始采用。
本节将介绍BERT及其详细实现。在我们的框架中有两个步骤:预训练和微调。在预训练过程中,模型通过不同的预训练任务对未标记数据进行训练。对于微调,首先用预先训练好的参数初始化BERT模型,然后使用来自下游任务的标记数据对所有参数进行微调。每个下游任务都有单独的微调模型,即使它们是用相同的预训练参数初始化的。图1中的问答示例将作为本节的运行示例。
写论文的时候,如果用到了一些技术,就算你以为很多人都已经知道了,也要简单的概括一下,就如Bert这段写得微调一样,清晰明了。这是一个很好的习惯,不会造成大家的阅读困难。
BERT 的一个显着特点是其跨不同任务的统一架构。 预训练架构和最终下游架构之间的差异很小。
Model Architecture BERT 的模型架构是一个多层双向 Transformer 编码器,它基于 Vaswani et al.(2017)中描述的原始实现,并在 tensor2tensor 库中发布。 因为 Transformers 的使用已经很普遍,而且我们的实现几乎与原来的完全相同,所以我们将省略模型架构的详尽背景描述,并让读者参考 Vaswani et al.(2017)以及优秀的指引,例如 “The Annotated Transformer.”
在这项工作中,我们将层数(即 Transformer blocks)表示为 L,将 hidden size (即表征向量的宽度)表示为 H,将自注意力头的数量表示为 A。我们主要展示了两种模型大小的结果: B E R T B A S E BERT_{BASE} BERTBASE(L=12 , H=768, A=12, 总参数=110M) 和 B E R T L A R G E BERT_{LARGE} BERTLARGE(L=24, H=1024, A=16, 总参数=340M)。
Bert模型的复杂度,跟层数是线性的关系,跟宽度是平方的关系。所以当 L 增加了两倍,那么 H 就增加了 2平方根 的倍数。这里具体模型参数量的计算可以看李沐B站视频的23:10 —> 25:35,视频链接在文章顶部。
B E R T B A S E BERT_{BASE} BERTBASE 被选为具有与 OpenAI GPT 相同的模型大小以进行比较。 然而,至关重要的是,BERT Transformer 使用双向自注意力,而 GPT Transformer 使用受约束的自注意力,其中每个 token 只能注意其左侧的上下文。
Input/Output Representations 为了让 BERT 处理各种下游任务,我们的输入表示能够在一个标记序列中明确表示单个句子和一对句子(例如,
我们使用 WordPiece embedding(Wu et al., 2016)和 30,000 个标记词汇。 每个序列的第一个标记总是一个特殊的分类标记([CLS])。 与此标记对应的最终隐藏状态用作分类任务的聚合序列表示。 句子对被打包成单个序列。 我们以两种方式区分不同的句子。 首先,我们用一个特殊的标记 ([SEP]) 将它们分开。 其次,我们向每个标记添加一个学习的嵌入,指示它属于句子 A 还是句子 B。 如图 1 所示,我们将输入嵌入表示为 E,将特殊 [CLS] 标记的最终隐藏向量表示为 C ∈ R H C∈\R^H C∈RH,并且 第 i 个输入标记的最终隐藏向量为 T i ∈ R H T_i∈\R^H Ti∈RH。
对于给定的token,其输入表示是通过将相应的token、segment和position embeddings相加来构造的。在图2中可以看到这种构造的可视化。
Bert中的位置embedding和属于哪个句子的embedding都是学习得来的。
与 Peters et al.(2018a) and Radford et al. (2018)不同,我们不使用传统的从左到右或从右到左的语言模型来预训练 BERT。 相反,我们使用本节中描述的两个无监督任务来预训练 BERT。 此步骤显示在图 1 的左侧部分。
Task #1: Masked LM 直观地说,我们有理由相信,深度双向模型严格地比从左到右的模型或从左到右和从右到左的浅连接模型更强大。不幸的是,标准条件语言模型只能从左到右、从右到左进行训练,因为双向条件作用会让每个单词间接地 “看到自己” ,然后该模型就可以在多层语境中轻松地预测目标单词。
为了训练一个深度的双向表示,我们只需按照百分比随机屏蔽一些输入标记,然后预测这些被屏蔽的标记。我们将此过程称为“masked LM”(MLM),尽管在文献中它通常被称为 Cloze task (Taylor,1953)。在这种情况下,与掩码标记对应的最终隐藏向量被送入词汇表上的输出softmax,就像在标准LM中一样。在我们所有的实验中,我们在每个序列中随机屏蔽15%的WordPiece token。与去噪自动编码器(Vincent et al.,2008)相比,我们只预测masked单词,而不是重建整个输入。
虽然这允许我们获得双向预训练模型,但缺点是我们在预训练和微调之间造成了不匹配,因为 [MASK] token在微调期间不会出现。 为了缓解这种情况,我们并不总是用实际的 [MASK] 标记替换 “masked” 词。 训练数据生成器随机选择 15% 的标记位置进行预测。 如果选择第 i 个令牌,我们将第 i 个令牌替换为 (1) 80% 的 [MASK] token (2) 10% 的随机token (3) 10 % 的未更改的第 i 个token。 然后, T i T_i Ti 将用于预测具有交叉熵损失的原始token。 我们在附录 C.2 中比较了此程序的变体。
这里不是将所有的masked token替换为[MASK] token,示例可以看以下论文中给的例子。10%概率是替换成随机的token,10%概率是保留原来的token,这样提高了模型的鲁棒性。
Task #2: Next Sentence Prediction (NSP) 许多重要的下游任务,例如问答 (QA) 和自然语言推理 (NLI),都是基于理解两个句子之间的关系,而语言建模并没有直接捕捉到这种关系。 为了训练一个理解句子关系的模型,我们预训练了一个二值化的next sentence prediction任务,该任务可以从任何单语言的语料库中轻松生成。 具体来说,当为每个预训练示例选择句子 A 和 B 时,50% 的情况下为 B 是 A 之后的实际下一个句子(标记为 IsNext),50% 的情况下为它是来自语料库的随机句子(标记为 作为 NotNext)。 如图 1 所示,C 用于下一句预测 (NSP)。尽管它很简单,但我们在第 5.1 节中证明了针对此任务的预训练对 QA 和 NLI 都非常有益。
Pre-training data 预训练的程序在很大程度上遵循了现有的语言模型预训练的文献。对于预训练语料库,我们使用BooksCorpus(8亿单词)(Zhu et al., 2015)和English Wikipedia(2500万单词)。对于维基百科,我们只提取文本段落,忽略列表、表格和标题。为了提取长连续序列,使用document-level语料库而不是打乱的sentence-level语料库(如Billion Word Benchmark (Chelba et al.,2013))是至关重要的。
document-level 一片片的文章,而不是随机打乱的几个句子
微调非常简单,因为Transformer中的自我注意机制允许BERT通过交换适当的输入和输出来为许多下游任务建模——无论它们涉及单个文本还是文本对。对于涉及文本对的应用,一个常见的模式是在应用双向交叉注意之前独立编码文本对,如parikh等人(2016);Seo等人(2017)。BERT利用自我注意机制将这两个阶段统一起来,因为用自我注意编码连接的文本pair有效地包含了两个句子之间的双向交叉注意。
对于每个任务,我们只需将特定任务的输入和输出插入到 BERT 中,并端到端地微调所有参数。 在输入端,预训练中的句子 A 和句子 B 类似于 (1) 语义的句子对,(2) 假设-前提对(hypothesis-premise pairs in entailment),(3) 问答中的问题-段落对(question-passage pairs in question answering),以及 (4) 在文本分类或序列标记中的退化 text-∅ 对(即单个句子的任务)。 在输出端,token 表征被投入到输出层来用于 token-level 任务,例如序列标记或问答,而 [CLS] 表示被投入到输出层进行分类,例如entailment或情感分析。
与预训练相比,微调相对便宜。本文中的所有结果可以在一个云TPU上最多1小时内复现,或者在GPU上最多几个小时,从完全相同的预训练模型开始。我们在第四部分的相应小节中描述特定于任务的细节。更多细节见附录a .5。
基于迁移学习的语言模型工作表明,丰富的、无监督的预训练是许多语言理解系统的重要组成部分。这些结果使得即使是低资源任务也能从深度单向架构中受益。我们的主要贡献是将这些发现进一步推广到深度双向架构中,允许相同的预训练模型成功地解决一系列广泛的NLP任务。
Bert就是将ELMo和GPT模型结合了起来,然后写了这篇文章,如果你也是进行了一个A+B的工作,得出一个简单又好用的模型,不妨像Bert一样朴实的将其写出来! —李沐
个人总结: 作者通过 MLM 的方法做到了双向的 Transformer,又增加了 NSP 训练任务来增加模型的鲁棒性,简单高效。