Press "Enter" to skip to content

BERT 详解

目前最强NLP模型,横扫NLP11项任务。利用Transformer去预训练双向语言模型和NSP任务,再finetune达到了各种任务的最优效果。

 

背景

 

简介

 

在NLP中,利用语言模型去做预训练,能显着提升许多任务的效果。

 

句子级别
词级别

 

两种迁移方式

基于特征:ELMo
基于finetune:OpenAI GPT

存在的问题

 

单向语言模型和两个方向语言模型简单拼接,这两个方法的能力都小于双向语言模型。

 

单向语言模型对于:

 

sentence-level
token-level

 

相关研究

 

1. 基于特征的方法

词向量
sentenceparagraph 向量
从语言模型中获得具有上下文语义的向量–ELMo

2. 基于Finetune的方法

 

预训练一个语言模型,在下游任务只需要简单finetune,只需要从新训练很少的参数。

OpenAI GPT

3. 基于监督数据的迁移学习

 

从一些大规模是数据集中进行迁移学习。比如

从自然语言推理中迁移
从机器翻译中迁移学习词向量: Learned in Translation: Contextualized Word Vectors

BERT模型

 

模型架构

 

1. 总体架构

 

利用Transformer的Encoder去训练双向语言模型 BERT ,再在BERT后面接上特定任务的分类器。

 

 

使用方法示例:

 

 

2. 输入与输出

 

 

 

 

3. 两种规模

\(\rm{BERT}_{BASE}\) : \(\rm{L=12, H=768, A=12}\) 。总参数为110M。和GPT一样
\(\rm{BERT}_{LARGE}\) : \(\rm{L=24, H=1024, A=16}\) 。总参数为340M。最优模型

 

 

单个位置的输入

 

每个位置输入三个部分相加而成:

 

wordpiece-token
位置向量
段向量

 

一些符号:

CLS :special classification embedding,用于分类的向量,会聚集所有的分类信息
SEP :输入是QA或2个句子时,需添加 SEP 标记以示区别
\(E_A\) 和 \(E_B\) :输入是QA或2个句子时,标记的sentence向量。如只有一个句子,则是sentence A向量

 

特定任务的BERT

单句子分类:CLS+句子。利用CLS进行分类
多句子分类:CLS+句子A+SEP+句子B。利用CLS分类
SQuAD:CLS+问题+SEP+文章。利用所有文章单词的输出做计算start和end
NER:CLS+句子。利用句子单词做标记

 

预训练语言模型

 

我们都知道单向语言模型的能力很差,单独训练两个方向的语言模型再把结果拼接起来也不好。那幺怎幺才能训练一个真正的双向语言模型呢?如何让一个单词 is conditioned on both left and right context 呢?答案就是 Masked Language Model

 

Masked LM

 

在进行WordPiece之后,随机掩盖一些(15%)词汇,再去预测这些词汇。

 

 

但是有2个缺点

 

缺点1 大量mask标记,造成预训练和finetune时候的差距,因为finetune没有mask

80%:替换为mask
10%:随机替换为其它词汇
10%:保留原来的词汇。这部分正确的保留,保证了语言能力。

由于Transformer不知道要预测哪个词语,所以它会强制学习到所有单词的上下文表达。

 

缺点2 收敛很慢,但是效果好

 

比单向语言模型收敛较慢。

 

预训练NSP任务

 

对于像QA、NLI等需要理解多个句子之间关系的下游任务,只靠语言模型是不够的。还 需要提前学习到句子之间的关系 。

 

Next Sentence Prediction

 

NSP- Next Sentence Prediction ,是一个二分类任务。输入是A和B两个句子,标记是 IsNextNotNext ,用来判断B是否是A后面的句子。这样,就能从大规模预料中学习到一些句间关系。

 

 

模型最终能达到97%-98%的准确率,对QA和NLI都很有效果。

 

预训练细节

 

数据组成

 

语料是下面两个库,合计33亿词汇。采用文档级别的语料,有利于学习长依赖序列。

 

BooksCorpus
英文维基百科

 

从语料库中随机选择2个片段(较长)作为两个AB句子,构成一条输入数据:

0.5概率A-B两个句子连续,0.5概率随机选择B
A使用A embedding,B使用B embedding
A和B总长度最大为512 tokens

WordPiece Tokenization 后再mask掉15%的词汇。

 

训练参数

batch_size :256。每条数据长度:512
100万步,40个epoch。语料合计33亿词汇
Adam : \(\beta_1=0.9, \beta_2=0.999\)
L2权值衰减为0.01。所有层的dropout为0.1
学习率的warmup 的step为10000
GELU 激活函数
训练loss:LM和NSP的loss加起来
BERT base 16个TPU,Large 64个TPU,训练4天

Finetune细节

 

两种不同类型的任务所需要的向量,详情见特定任务的BERT

sentence-level :一般只拿 CLS 位置的向量,过线性层再softmax即可得到分类结果
token-level :SQuAD或NER,取对应位置的向量,过线性层再softmax得到相应的结果

Finetune时超参数基本一致,但有一些是与特定任务相关的。下面是比较好的选择

Batch size :16, 32
学习率 : \(5*10^{-5}\) , \(3*10^{-5}\) , \(2*10^{-5}\)
epoch :3,4

BERT与GPT比较

 

BERT和OpenAI GPT都是使用Transformer进行预训练语言模型, 再进行finetune达到不错的效果。区别如下:

 

项目BERTGPT
训练数据BooksCorpus(8亿)+维基百科(25亿)BooksCorpus(8亿)
任务双向语言模型(MLM)+NSP+Finetune单向语言模型+Finetune
TransformerEncoderDecoder
符号CLS, SEP, sentence A-BStart, SEP, 结束(CLS)
符号使用预训练、finetune过程finetune过程
Batch数据1M步,128000个词汇1M步,32000个词汇
finetune学习率与特定任务相关与预训练一样, \(5*10^{-5}\)

 

实验结果

 

9项GLUE任务

 

General Language Understanding Evaluation 包含了很多自然语言理解的任务。

 

1. MNLI

 

Multi-Genre Natural Language Inference 是一个众包大规模的文本蕴含任务。

 

给2个句子,判断第二个句子与第一个句子之间的关系。蕴含、矛盾、中立的

 

2. QQP

 

Quora Question Pairs

 

给2个问题,判断是否语义相同

 

3. QNLI

 

Question Natural Language Inference 是一个二分类任务,由SQuAD数据变成。

 

给1个(问题,句子)对,判断句子是否包含正确答案

 

4. SST-2

 

Stanford Sentiment Treebank ,二分类任务,从电影评论中提取。

 

给1个评论句子,判断情感

 

5. CoLA

 

The Corpus of Linguistic Acceptablity ,二分类任务,判断一个英语句子是否符合语法的

 

给1个英语句子,判断是否符合语法

 

6. STS-B

 

The Semantic Textual Similarity Benchmark ,多分类任务,判断两个句子的相似性,0-5。由新闻标题和其他组成

 

给2个句子,看相似性

 

7. MRPC

 

Microsoft Research Paraphrase Corpus ,2分类任务,判断两个句子是否语义相等,由网上新闻组成。05年的,3600条训练数据。

 

给1个句子对,判断2个句子语义是否相同

 

8. RTE

 

Recognizing Textual Entailment ,二分类任务,类似于MNLI,但是只是蕴含或者不蕴含。训练数据更少

 

9. WNLI

 

Winograd NLI 一个小数据集的NLI。据说官网评测有问题。所以评测后面的评测没有加入这个

 

GLUE评测结果

 

对于 sentence-level 的分类任务,只用 CLS 位置的输出向量来进行分类。

 

 

SQuAD-v1.1

 

SQuAD属于 token-level 的任务,不是用CLS位置,而是用所有的文章位置的向量去计算开始和结束位置。

 

Finetune了3轮,学习率为 \(5*10^{-5}\) ,batchsize为32。取得了最好的效果

 

 

NER

 

 

SWAG

 

The Situations With Adversarial Generations 是一个常识性推理数据集,是一个四分类问题。给一个背景,选择一个最有可能会发生的情景。

 

Finetune了3轮,学习率为 \(2*10^{-5}\) ,batchsize=16

 

 

效果分析

 

任务影响

 

No NSP:不加NSP任务;LTR 单向语言模型。

NSP:对SQuAD、QNLI、MNLI有影响,下降1个点左右
双向LM:如果是LTR,SQuAD、MRPC都严重下降10个点。因为 token-level的任务,更需要右边上下文的信息

 

模型大小

 

BERT的base和large的参数分别为:110M和340M。

 

一般来说,对于大型任务,扩大模型会提升效果。但是, BERT得到充分预训练以后,扩大模型,也会对小数据集有提升 !这是第一个证明这个结论的任务。

 

 

训练步数

确实需要训练100万步。12800词/batch
MLM收敛到最优慢,但是效果好。在早期就早早超过单向语言模型了

 

BERT使用方法

 

基于finetune

 

 

基于特征

 

Finetune稍微麻烦一些。可以使用BERT预训练好的 contextualized embeddings ,每一层都有。

 

 

其中效果最好的方法,就是 拼接最后四层的向量 。

 

 

 

参考和思考

 

参考

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

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注