BERT论文精读

Abstract

BERT是通过对所有层中的左右上下文进行联合调节,从未标记的文本中预训练深度双向表示。大家可以只需要一个额外的输出层来进行微调这个模型,就可以在很多不同的任务上达到很好的效果,如问答和语言推理等。
解释了两个点:

  • BERT和GPT的训练架构相比,除了一个是encoder-only,一个是decoder-only外,BERT使用的是双边的表示。
  • BERT和ElMo相比,ELmo是RNN架构,用到下游的任务的时候需要做一点调整,但是BERT是transformer架构,仅需要一个输出层即可。

结果跟别的模型比,写一下绝对值和相对值,也就是提升。

这个常用的论文写法:第一段,跟别的模型比,有哪些不一样的地方;第二段,在结果上有了哪些提升,包括绝对值和相对值。

1 Introduction

语言模型预训练任务已经被证明在很多自然语言处理任务上是有效的。任务包括两类,一类是句子级的任务,一类是token级的任务。

将预训练的语言表示应用于下游任务有两种现有策略:feature-based 和 fine-tuning。feature-based如ELMo,将预训练的表示作为附加特征;fine-tuning的代表如GPT,通过简单的微调所有预训练好的参数,就可以应用到下游。这两种方法在预训练期间共享相同的目标函数,它们使用单向语言模型来学习通用语言表示。

我们认为,当前的技术限制了预训练表示的力量,特别是对于微调方法。主要限制是标准语言模型是单向的,这限制了预训练期间可以使用的架构的选择。例如,在 OpenAI GPT 中,作者使用了从左到右的架构。

在本文中,我们通过提出 BERT:来自 Transformers 的双向编码器表示来改进基于微调的方法。BERT 通过使用受完形填空任务启发的“掩码语言模型”(MLM) 预训练目标来缓解前面提到的单向约束。MLM 目标使表示能够融合左右上下文,这使我们能够预训练深度双向 Transformer。除了掩码语言模型之外,我们还使用了“下一句预测”(NSP)任务,该任务共同预训练文本对表示。本文贡献:

  • 本文展示了双向信息的重要性。
  • 预训练的表示减少了对许多经过大量设计的特定任务架构的需求。
  • BERT达到了SOTA,并且提供了全部代码。

7 Conclusion

由于语言模型的迁移学习,最近经验上的改进表明,丰富的、无监督的预训练是许多语言理解系统不可或缺的一部分。特别是,这些结果使即使是低资源任务也能从深度单向架构中受益。我们的主要贡献是将这些发现进一步推广到深度双向架构中,使相同的预训练模型能够成功处理广泛的 NLP 任务。

2 Related Work

  • 基于非监督特征的方法:代表工作ELMo。
  • 非监督的基于微调的方法:代表工作是GPT,在这之前和之后也有很多工作。
  • 在有标号的数据上做迁移学习,如自然语言推理、机器翻译等。

3 BERT

BERT里面有两个步骤:pre-training 和 fine-tuning。

  • pre-training:在预训练期间,模型在不同的预训练任务上对未标号的数据进行训练。
  • fine-tuning:对于微调,首先使用预训练阶段训练好的模型的参数初始化 BERT 模型,然后使用来自下游任务的标号数据所有参数进行微调。
    BERT训练和微调

每个下游任务都有单独的微调模型,即使它们使用相同的预训练参数进行初始化。这也是BERT的显著特点,跨不同任务,但是架构是统一的。

Model Architecture
BERT是一个多层的双向Transformer encoder。BERT主要调了三个Transformer的参数。

  • L: Transformer块的个数或者说堆叠的层数
  • H: Hidden size的大小
  • A: 多头注意力中头的个数

BERT-BASE:L=12, H=786, A = 12, total parameters=110M
BERT-LARGE:L=24, H=1024,A = 16, total parameters=340M
BERT模型的复杂度跟层数是线性的关系,跟宽度是平方的关系

输入/输出表示
为了使 BERT 处理各种下游任务,我们的输入表示能够在一个token sequence中明确地表示单个句子一个句子对(如QA对)。在这项工作中,“句子”可以是连续文本的任意跨度,而不是实际的语言句子。“序列”是指 BERT 的输入标记序列,它可以是单个句子或两个句子打包在一起。

我们使用WordPiece embedding这个方式,生成的词表有30000个token。
每个序列的第一个token都是[CLS],能够代表整个序列的信息;
加入[SEP]来进行句子的区分,例如sentense A [SEP] sentence B. 并且对每个token,添加了一个学习的嵌入来表示它属于第一个句子还是第二个句子.

对于给定的token,它的输入表示是由corresponding token, segment 和position embedding 加和得到的。也就是本身的embedding + 属于哪个句子的embedding(前面说的属于第一个还是第二个句子) + 位置的embedding


BERT输入表示由三部分加和而成

在Transformer里面,Position Embedding 是手动构造出来的;
但是在BERT里面是学习出来的embedding,包括Position Embedding 和Segment Embeddings 都是。

3.1 Pre-training BERT

最关键的两个点在于目标函数和训练数据。

Task #1: Masked LM

随机屏蔽了每个序列中所有 WordPiece token的 15%。对于[CLS] 和[SEP]这种special token 不进行替换。
这样会导致一个我们在预训练和微调之间造成不匹配,因为 [MASK] token在fine-tuning期间不会出现。
为了缓解这种问题,BERT并不总是全部替换被选择的token为[mask],而是采取以下的策略:

  • 80%的概率将该token替换为[mask]
  • 10%的概率将该token替换为随机的token
  • 10%的概率不进行替换,维持原token

最后,新的token将用于预测具有交叉熵损失的原始token。

Task #2: Next Sentence Prediction (NSP)

很多重要的下游任务如QA和NLI是基于理解两个句子之间关系的,这是语言模型无法直接捕获的。为了获取这种句子间的信息,BERT做了一个NSP的分类任务,预测句子B是否在A的后面。
在为每个预训练示例选择句子 A 和 B,50% 概率B 是 A 之后的实际下一个句子(标记为 IsNext),50% 概率是语料库中的随机句子(标记为 NotNext)。

Pre-training data

  • BooksCorpus (800M words)
  • English Wikipedia (2,500M words):只提取文本内容,并且为了提取长连续序列,使用文档级语料库而不是打乱的句子级语料库

3.2 Fine-tuning BERT

对于每项任务,我们只需将特定于任务的输入和输出插入 BERT 并端到端微调所有参数。
根据下游的任务,可以拿到第一个输出的token[CLS]的表示做分类,或者拿到对应的token做输出,无论如何都是在最后再加一个输出层,然后进行softmax。

4 Experiments

4.1 GLUE

通用语言理解评估(GLUE)基准是各种自然语言理解任务的集合。为了微调GLUE,使用最后层的隐藏向量C对应的[CLS]向量作为聚合信息表示。微调过程中引入的唯一新参数是分类层权重W ∈ R^{K×H},很显然H是hidden size,K是需要分类的标签数,就是对[CLS]做了一个线性变化,接着进行softmax得到最后输出。
原文使用的是batch size of 32 and fine-tune for 3
epochs, 但是fine-tuning的时候3个epoch不够,需要更多,例如10个

4.2 SQuAD v1.1

斯坦福问答数据集 (SQuAD v1.1) 是 100k 众包问答对的集合。给出一个问题还有一段包含答案的维基百科,任务是预测段落中的答案文本跨度。
本文将问题和passage表示为一个输入序列,问题使用A embedding,passage使用B embedding。在微调过程中,仅引入开始向量S ∈ R^H和结束向量E ∈ R^H
单词i作为答案片段开头的概率计算为Ti和S的点积,然后跟段落中所有单词进行softmax:P_i = \frac{e^{S·T_i}}{\sum_j{e^{S·T_j}}}
候选跨度从位置 i 到位置 j 的分数定义为 S·Ti + E·Tj ,以及 j ≥ i 的最大评分跨度用作预测。训练目标是正确开始和结束位置的对数似然之和。我们以 5e-5 的学习率和 32 的批量大小对 3 个 epoch 进行了微调。

4.3 SQuAD v2.0

SQuAD 2.0 任务扩展了 SQuAD 1.1 问题定义,允许提供的段落中不存在简答,从而使问题更加现实。

4.4 SWAG

Situations With Adversarial Generations (SWAG) 数据集包含 113k 个句子对完成示例,用于评估基础常识推理。给定一个句子,任务是在四个选项中选择最合理的延续。
在对 SWAG 数据集进行微调时,我们构造了四个输入序列,每个输入序列包含给定句子(句子 A)和可能的延续(句子 B)的串联。
引入的唯一特定于任务的参数是一个向量,其点积与 [CLS] 标记表示 C 表示每个选择的分数,该分数使用 softmax 层进行归一化。

5 Ablation Studies

5.1 Effect of Pre-training Tasks

消融实验

5.2 Effect of Model Size

模型大小的影响,模型越来越大,效果会越来会好。

5.3 Feature-based Approach with BERT

不用BERT做微调,而是直接作为静态特征输入的效果相对没有那么好。
本文建议在使用BERT的时候需要进行fine-tuning。

PS

BERT微调有一些误区:

  1. fine-tuning的时候3个epoch不够,需要更多,例如10个
  2. 优化器使用非完全版的Adam需要修正为完全版Adam
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容