文献笔记|【文本表征】BERT

文献笔记|【文本表征】BERT

论文信息:

论文题目:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
论文发表时间:2018年10月11日
机构:Google AI

简介

文献解决的问题:提出一个语言表征的模型,叫BERT(Bidirectional Encoder Representations from Transformers)
特点:与传统的语言表征模型不同,BERT使用的是深度双向表征,即在每一层中同时基于左边和右边的context来做预测。
优势:预训练的BERT模型只需要在上面增加额外的一层,就能广泛地于多种NLP任务中进行fine-tune.
结果:在11项NLP任务上都取得了state of art的成绩。

模型主体

1 模型结构

BERT是基于Vaswani et al(2017)的论文"Attention is all you need"中提出的transformer模型构建的多层双向transformoer encoder.
(关于"Attention is all you need"该篇文献的介绍可参见https://blog.****.net/sinat_33761963/article/details/83539949)

其中参数的设置如下:
|参数|表示|standard BERT|larger BERT|
|-|
|the number of layer|L|12|24|
|hidden size|H|768|1024|
|the number of self-attention heads|A|12|16|
|feed-forward size|4H|3072|4096|
|总参数数目||110M|340M|

2 输入的表征

对单独的句子进行表征,也可以对句子对进行表征。下面是示意图:

文献笔记|【文本表征】BERT

模型输入的embedding是3类表征的求和:word representation, positional represention, segment represention。

1.word representation:
文中使用WordPiece embedding,词典有30000个词,拆开的单词用##分割(比如playing==>play##ing

2.positional represention:
使用已学习好的positinal embedding,序列的长度最长为512.

3.segment represention:
对于句子对的数据,在前一个句子的每个词上都加上句子A的Embedding,在后一个句子的每个词上都加上句子B的Embedding。

对于单独一个句子的数据,只在句子上的每个词上都加上句子A的Embedding

4.句子的开头用[CLS]表示,结尾用[SEP]表示,句子对中两个句子之间也用[SEP]表示。

3.预训练的2个任务

使用2种新的非监督预测任务来训练BERT。

3.1 Task #1: Masked LM

背景:
脚指头想想也知道双向的模型肯定比单向的好,但是目前传统的条件语言模型却只能在单向模型上做,因为如果是双向,每个词都会间接地看到自己。

做法:
文本硬要使用双向,因此想了一个办法:随机地遮盖一定比例(本文选择15%)的输入token,然后让模型去预测这些遮盖的token。称这个方法为“masked LM” (MLM)。被隐层的token在最后一个隐藏层得到的向量,被放入softmax中,去计算是字典中每个词的概率。

缺点:
(1)在pre-training和fine-tune之间创建了一个不匹配,因为在微调期间从未看到[MASK]token.解决方案是被选中的masked掉的词不直接全部用[mask]代替,而是:

  • 80%的情况下,将该词用[MASK]代替;
  • 10%的情况下,用随其选取的其他词来代替;
  • 10%的情况下,不改变原词。

transformer encoder是不知道哪个词需要被预测或者哪个词已经被随机替代掉了,因此它必须keep a distributional contextual representation of every input token。
且被改掉的词也就只占所有词的1.5%(如果遮盖15%的词的话),因此不会对模型理解语言的学习上有伤害。

(2)在MLM中,在每个batch中只有15%的tokens被预测,因此在pre-train中就需要更多steps去让模型收敛。实验证明,MLM确实收敛比传统模型慢,但是没关系啊,以之换取的是模型效果更好啊。

3.2 Task #2: Next Sentence Prediction

背景:
NLP中许多任务都是两个句子之间的理解,比如Question Answering (QA) 和 Natural Language Inference (NLI),语言模型无法直接去学习句子之间的关系。为了训练一个能理解句子关系的模型,我们预先训练了一个可以从任何单语语料库中生成的binarized next sentence prediction task

做法:
先准备训练集:(句子A, 句子B),且50%的情况下B是A的后一句,50%的情况下B是在余力啊中随机取出的其他句子。label是两个句子的关系(是下一句/不是下一句):
文献笔记|【文本表征】BERT

结果:
pre-train的model达到97%-98%的准确率,对有利于QA和NLI任务。

4 预训练的过程

训练语料:concatena- tion of BooksCorpus (800M words) and English Wikipedia (2,500M words).

训练样本:
MLM:对每个句子进行分词之后,随机遮盖15%的词
NSP:准备句子对。

模型超参数:
batch size:256 sequences (256 sequences * 512 tokens = 128,000 tokens/batch)
steps:1,000,000
epochs:40
corpus:3.3 billion word
optimizer:Adam(β1 = 0.9, β2 = 0.999)
learning rate:1e-4
learning rate warmup:first 10,000 steps
dropout probability:0.1 on all layer
aitive function:gelu activation (Hendrycks and Gimpel, 2016)
training loss: sum of the mean masked LM likelihood and mean next sentence prediction likelihood(注意!是将上面两个任务的损失函数求和,也就是联合训练2个任务的)

训练时间:
base BERT:4块 clound TPU, 4天
larger BERT:16块 clound TPU, 4天

5 Fine-tuning的过程

对于序列级别的分类问题,在原来的BERT模型上再加一层,W(K*H),K是要分类的类别数, H是transformer的因层数输出维度,再经过一个softmax层,预测类别的概率P(K维)=softmax(CW^T).

所有的参数,包括BERT原来预训练的参数,和新的W的参数,都会联合再训练,目标是使得模型预测的概率和真实的概率距离越小。

在fine-tuning阶段,大部分的参数和pre-training时的差不多,除了batch,size, learning rate, number of training steps.当然超参数的选择不同的任务可能也不同,但是以下这个范围可能会表现更有:
batch size:16,32
learning rate: 5e-5, 3e-5, 2e-5
Number of epochs: 3, 4

越大的数据集对超参数的设置就越不敏感

分别在11项NLP任务上进行了实验,11项任务可分成4类,如下结构:

文献笔记|【文本表征】BERT