当前位置:   article > 正文

BERT 详解

bert

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

自然语言处理任务主要包括两种:

  • sentence-level tasks(句子级别): 学习多个句子之间的关系,例如natural language inference(自然语言推理)。
  • token-level tasks(词级别):模型要生成fine-gained(细粒度的)的输出 。fine-grained指的是类内细分,与之相对应的是coarse-grained(粗粒度)。例如在分类任务中,coarse-grained只需要分辨出是猫还是狗,而fine-grained则要在每个类别中分辨出具体的品种,比如要能分辨出是哈巴狗还是二哈。

1. Language Model Embedding

语言模型来辅助NLP任务已经得到了学术界较为广泛的探讨,通常有两种方式:

  • feature-based(基于特征):ELMo
  • fine-tuning:OpenAI GPT

1.1 Feature-based方法

Feature-based指利用预训练的语言模型的结果也就是LM embedding, 将其作为额外的特征,引入到原任务的模型(task-specific model)中。
例如在TagLM[1]中,采用了两个单向RNN构成的语言模型(pre-trained bi-LM),将语言模型的结果:
h i L M = [ h i L M → ; h i L M ← ]

\textcolorwhitehiLM=[hiLM;hiLM]
hiLM=[hiLM ;hiLM ]引入到序列标注模型中,如下图1所示,其中左边部分为序列标注模型,也就是task-specific model。右边是前向LM(Left-to-right)和后向LM(Right-To-Left), 两个LM的结果进行了合并。并在序列标注模型中将LM embedding与词向量、第一层RNN输出、第二层RNN输出进行了concat操作。图1 TagLM模型示意图 图 1 T a g L M 模 型 示 意 图 图1 TagLM模型示意图 1TagLM通常feature-based方法包括两步:

  1. 首先在大的语料A上无监督地训练语言模型,训练完毕得到语言模型
  2. 然后构造task-specific model例如序列标注模型,采用有标记的语料B有监督地训练task-sepcific model。将语言模型的参数固定,语料B的训练数据经过语言模型得到LM embedding,作为task-specific model的输入(额外特征)。

1.2 Fine-tuning方法

Fine-tuning方式是指在已经训练好的语言模型的基础上,加入少量的task-specific parameters。 例如对于分类问题在语言模型基础上加一层softmax网络,然后在新的语料上重新训练来进行fine-tune。
例如OpenAI GPT 中采用了这样的方法,模型如下所示
在这里插入图片描述
图 2   T r a n s f o r m e r   L M + f i n e − t u n i n g 模 型 示 意 图 图2 \space Transformer \space LM + fine-tuning模型示意图 2 Transformer LM+finetuning
首先语言模型采用了Transformer Decoder的方法来进行训练,采用文本预测作为语言模型训练任务,训练完毕之后,加一层Linear Project来完成分类/相似度计算等NLP任务。
因此总结来说,LM + Fine-Tuning的方法工作包括两步:

  1. 构造语言模型,采用大的语料A无监督地来训练语言模型
  2. 在语言模型基础上增加少量神经网络层来完成specific task例如序列标注、分类等,然后采用有标记的语料B来有监督地训练模型,这个过程中语言模型的参数并不固定,依然是trainable variables.

BERT论文采用了LM + fine-tuning的方法,同时也讨论了BERT + task-specific model的方法。

2.BERT模型介绍

BERT采用了Transformer Encoder的模型来作为语言模型,完全抛弃了RNN/CNN等结构,而完全采用Attention机制来进行input-output之间关系的计算,如下图中左半边部分所示,其中模型包括两个sublayer:

  1. Multi-Head Attention 来做模型对输入的Self-Attention
  2. Feed Forward 部分来对attention计算后的输入进行变换

在这里插入图片描述
BERT模型如下图中左边第一个所示,它与OpenAI GPT的区别就在于采用了Transformer Encoder,也就是每个时刻的Attention计算都能够得到全部时刻的输入。而OpenAI GPT采用了Transformer Decoder,每个时刻的Attention计算只能依赖于该时刻前的所有时刻的输入,因为OpenAI GPT是采用了单向语言模型。
在这里插入图片描述

3. 预训练

下面我们介绍BERT的Pre-training tasks, 这里为了能够有利于token-level tasks例如序列标注,同时有利于sentence-level tasks例如问答,采用了两个预训练任务分别是

  1. Masked Language Model(MLM)
  2. Next Sentence Prediction(NSP)

3.1 Masked Language Model

传统的的语言模型的问题在于,关于传统的语言模型训练, 都是采用left-to-right, 或者left-to-right + right-to-left结合的方式, 但这种单向方式或者拼接的方式提取特征的能力有限,没有同时利用到Bidirectional信息. 为此BERT提出一个深度双向表达模型(deep bidirectional representation). 即采用MASK任务来训练模型。

例如:现有的语言模型例如ELMo号称是双向LM(BiLM),但是实际上是两个单向RNN构成的语言模型的拼接,如下图所示
在这里插入图片描述 图 3   E L M o 模 型 示 意 图 图3\space ELMo模型示意图 3 ELMo
语言模型本身的定义是计算句子的概率:
在这里插入图片描述前向RNN构成的语言模型计算的是:
在这里插入图片描述也就是当前词的概率只依赖前面出现词的概率。

而后向RNN构成的语言模型计算的是:
在这里插入图片描述
也就是当前词的概率只依赖后面出现的词的概率。

那么如何才能同时利用好前面词和后面词的概率呢?BERT提出了Masked Language Model,也就是随机去掉句子中的部分token,然后模型来预测被去掉的token是什么。这样实际上已经不是传统的神经网络语言模型(类似于生成模型)了,而是单纯作为分类问题,根据这个时刻的hidden state来预测这个时刻的token应该是什么,而不是预测下一个时刻的词的概率分布了

这里的操作是随机mask语料中15%的token,然后预测masked token,那么masked token 位置输出的final hidden vectors喂给softmax网络即可得到masked token的预测结果。这样操作存在一个问题,fine-tuning的时候没有[MASK] token,因此存在pre-training和fine-tuning之间的mismatch,为了解决这个问题,采用了下面的策略:

  • 80%的时间中:将选中的词用[MASK]token来代替,例如

my dog is hairy → my dog is [MASK]

  • 10%的时间中:将选中的词用任意的词来进行代替,例如

my dog is hairy → my dog is apple

  • 10%的时间中:选中的词不发生变化,例如

my dog is hairy → my dog is hairy

这样存在另一个问题在于在训练过程中只有15%的token被预测,正常的语言模型实际上是预测每个token的,因此Masked LM相比正常LM会收敛地慢一些,后面的实验也的确证实了这一点。

3.2 Next Sentence Prediction

在NLP中有一类重要的问题比如QA(Quention-Answer), NLI(Natural Language Inference), 需要模型能够很好的理解两个句子之间的关系, 从而需要在模型的训练中引入对应的任务. 在BERT中引入的就是Next Sentence Prediction任务. 采用的方式是输入句子对(A, B), 模型来预测句子B是不是句子A的真实的下一句话。具体的操作方法如下:

所有参与任务训练的语句都被选中作为句子A.

  1. 其中50%的B是原始文本中真实跟随A的下一句话. (标记为IsNext, 代表正样本)
  2. 其中50%的B是原始文本中随机抽取的一句话. (标记为NotNext, 代表负样本)

在这里插入图片描述
N e x t   S e n t e n c e   P r e d i c t i o n 样 例 Next \space Sentence\space Prediction样例 Next Sentence Prediction
而最终该任务得到了97%-98%的准确度。

3.3 模型输入

介绍了两个pre-training tasks之后,我们介绍该模型如何构造输入。如下图所示,输入包括三个embedding的求和,分别是:
在这里插入图片描述
一些符号:

  • CLS:special classification embedding用于分类的向量,会聚集所有的分类信息。例如分类问题中是类别,如果不是分类问题那么就忽略。

  • SEP:输入是QA或2个句子时,需添加SEP标记以示区别为了能够同时表示单句子和句子对。

  • E A , E B E_{A}, E_{B} EA,EB:输入是QA或2个句子时,标记的sentence向量。如只有一个句子,则是sentence A向量 。

3.4 模型训练

3.4.1 数据组成

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

  • BooksCorpus:8亿个词。(800M)
  • 英文维基百科:25亿个词。(2,500M)

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

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

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

3.4.2 训练参数

  • batch_size:256。每条数据长度:512
  • 100万步,40个epoch。语料合计33亿词汇
  • Adam: β 1 = 0.9 \beta_{1}=0.9 β1=0.9, β 2 = 0.999 \beta_{2}=0.999 β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天

3.4.3 两种模型选择

本文提出了两个大小的模型,分别是

  1. BERT-Base: L = 12, H = 768, A = 12, Total parameters = 110M
  2. BERT-Large: L = 24, H = 1024, A = 16, Total parameters = 340M

其中L表示Transformer层数,H表示Transformer内部维度,A表示Heads的数量

训练过程也是很花费计算资源和时间的,总之表示膜拜,普通人即便有idea没有算力也只能跪着。

5. Fine-tuning

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

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

总之不同类型的任务需要对模型做不同的修改,但是修改都是非常简单的,最多加一层神经网络即可。如下图所示
在这里插入图片描述

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

Batch size:16, 32
学习率: 5 ∗ 1 0 − 5 , 3 ∗ 1 0 − 5 , 2 ∗ 1 0 − 5 5*10^{-5}, 3*10^{-5}, 2*10^{-5} 5105,3105,2105
epoch :3, 4

6. BERT与GPT

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

在这里插入图片描述

7. 实验结果

7.1 9项GLUE任务

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

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

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

  1. QQP: Quora Question Pairs

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

  1. 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个句子,看相似性

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

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

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

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

GLUE评测结果:
对于sentence-level的分类任务,只用CLS位置的输出向量来进行分类。
在这里插入图片描述

7.2 SQuAD-v1.1

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

Finetune了3轮,学习率为 5 ∗ 1 0 − 5 5*10^{-5} 5105,batchsize为32。取得了最好的效果。
在这里插入图片描述

7.3 NER

在这里插入图片描述

7.4 SWAG

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

Finetune了3轮,学习率为 2 ∗ 1 0 − 5 2*10^{-5} 2105,batchsize=16
在这里插入图片描述

8. 效果分析

8.1 任务影响

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

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

在这里插入图片描述

8.2 模型大小

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

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

8.3 训练步数

  • 确实需要训练100万步。12800词/batch
  • MLM收敛到最优慢,但是效果好。在早期就早早超过单向语言模型了
    在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/356072
推荐阅读
相关标签
  

闽ICP备14008679号