BERT 论文详解
paperreading
本文字数:1.5k 字 | 阅读时长 ≈ 5 min

BERT 论文详解

paperreading
本文字数:1.5k 字 | 阅读时长 ≈ 5 min

推荐个讲解视频b 站李沐,本文很大部分借鉴了沐神的讲解

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

题目包含了下面几个含义:首先是 Pre-training,就是在大量的数据集上预训练,将预训练的参数拿到自己的任务上来做。deep 即将网络做的很深,bidirectional transformers 表明论文做的工作是双向的 transformer,language understanding 就是语言理解任务

1. Abstract

本文为 BERT(Bidirectional Encoder Representations from Transformers),即 transformer 的双向编码器表示。BERT 可以从 unlabeled 的文本中双向的学习特征表示,仅需额外加一个输出层,预训练好的权重就可以在下游任务上进行 fine-tune,例如 question answering and language inference。

作者在概念上简单,经验上效果更好,并在很多任务上做到了 SOTA,这里作者在介绍性能时用到了自己的绝对精度和相对于别的 paper 的精度,这样写作更好,例如 MultiNLI accuracy to 86.7% (4.6% absolute improvement)

2. Introduction

自然语言可以用 pre-training 来提升下游任务的性能,一般来讲包含两大类任务

目前有两种预训练策略,一种是 feature-based,如 ELMo,另一种是 fine-tuning,GPT 系列,这两种方法都是单向的语言模型(unidirectional),因为语言模型一般是单向的,我们知道前一句话,才能知道后一句话,但是会带来一定的局限性,如果要做句子层面的分析,比如情感分析,我可以看左边的句子,也可以看右边的句子,再比如 QA,我可以看完所有的句子在回答问题,这都是合理的。为此作者使用双向的预训练策略,并设计了两个任务

贡献总结

3. BERT

BERT 包含两部分,pre-training 和 fine-tuning,预训练是在 unlabel 的数据上训练,微调是在 label 的下游任务上训练,下面是整个模型的 pipeline

Model Architecture
BERT 是一个 multi-layer bidirectional Transformer encoder,在原始的 transformer 基础上没有做很大的改动,作者调整了三个参数,L,H,A,其中 L 是 layer 的层数,H 是隐藏层大小,A 是多头的头的数量,一共两个版本

BERT large 的深度 L 计算是线性关系,H 是平方关系,因此 L 变为两倍,H 大约为 1.5 倍;A 为 16 是因为每个 head 维度固定在 64 维

Input/Output Representations
输入可以是一段句子也可以是句子对,sentence 指的是任意连续文本,sequence 指的是一个 sentence 或者是两个 sentence 连在一起(将两个 sentence 连在一起是有一些下游任务要输入两个句子)

切词方法
切词方法采用的是 WordPiece,一般来说使用空格进行切词,但是这样会有一些问题,比如如果某个词出现的频率很低,如果将他算为一个 tokend 的话,字典长度很大,可学习参数都在字典中了,于是就将他切成一个个小片段,每个小片段出现的频率很高,比如 wordpiece 这个单词,切成 word 和 piece 这两个小片段。切完词后,我们在每个 sequence 之前加入([CLS])用来分类,除此之外,在每个 sentence 最后加入([SEP])来区分不同的 sentence,如之前的 Pipeline 所示,整体为「cls, token, token, …, token, seq, token, token, …, token, seq」

位置编码

训练方法

  1. 有两个训练任务,第一个是 Mask Language Model(MLM)
    对于用 WordPiece 生成的 token,有 15%的概率将其 mask 掉([MASK]),并用网络来预测 mask 的 token,而不是预测整个序列,但这样会带来一些问题:网络在微调的时候是没有 mask 的,所以对这些 mask 的词作者采取了以下策略

这个比例是通过 ablation 来选取的,变为其他 token 主要为了加入一些噪声

  1. 第二个是 Next Sentence Prediction(NSP)
    我们的输入 sequence 有两个 sentence A 和 B,有 50%的概率 B 真的在 A 之后,有 50%的概率 B 不在 A 之后,

Input=[CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label = NotNext

注意这里有一个井号#,他本身是一个单词 flightless,但是因为不常见,所以被 wordpiece 分成了 fight 和 less 两个词

数据集
数据集采用了两个,BooksCorpus(800M words)以及 English Wikipedia(2500M words),第二个是比价好下载的

4. Conclusion

目前预训练的方法在 NLP 中效果很好,双向的想法可以在 low-resource 中取得很好的效果