Tips: 摘要的写法:
1. 摘要的第一段写出这篇工作与哪些工作相关。 2. 本篇工作的优点。 3. 讲自己工作时,需要讲到绝对精度以及和其他工作的有点。
Abstract
摘要部分主要介绍了BERT是基于ELMo和GPT这两个工作的改进。BERT使用了一种双向的表征方式,来使得模型可以学到当前词与左边和右边的关系。
Introduction
语言模型的预训练在自然语言处理任务上是很有效的。自然语言处理有两大任务:
- Sentence-level tasks: natural language inference and paraphrasing.
- Token-level tasks: named entity recognition and question answering.
语言模型预处理有两种主要的策略:
- Feature-based (ELMo): 使用预训练的模型对当前任务生成额外的特征。
- Fine-tuning (GPT): 将预训练模型直接作为上游模型结构,因此对于特定的任务,只需要fine-tune少量的参数即可。
在BERT出现之前的预训练模型存在一个问题。模型是单向的,因此每一个token只能与之前的token进行attention计算。这种限制对于sentence-level tasks来说是次优的,而对于token-level tasks,可能会非常有害,比如问题回答等任务,因为在这些任务中,从两个方向纳入上下文是至关重要的。
BERT是基于Transformer的双向编码表征,它采用了掩码语言模型 (MLM: masked language model)作为预训练目标。
MLM: Masked language model 的目的是基于上下文来预测当前位置的原始词的id。
MLM模型可以让特征能够融合当前词左边以及右边的内容。同时,BERT还使用了 next sentence prediction
作为另一个预训练任务。
NSP: Next sentence prediction 的目的是用来判断两个句子是否是承接关系。
本文的主要贡献:
- 提出了基于Transformer的双向预训练语言模型。
- 证明了预训练表征可以减少不同任务对不同模型设计的需求。
- BERT在11种NLP任务中达到了SOTA。
BERT
本文的主要工作分为两步: 1. pre-training. 2. fine-tuning.
pre-training: 在这个过程中,模型将使用unlabled data来对BERT两个预训练任务 (Masked LM and NSP) 进行训练。
fine-tuning: BERT模型将用预训练模型初始化所有参数,这些参数将针对于下游任务,如,问答任务等,使用labeled data进行训练。不同的下游任务可以训练出不同的模型,但是它们都是用同一个预训练模型进行初始化的。
下图表示了本文的两个主要工作,pre-training and fine-tuning. BERT的主要特征是,对于不同的任务都有一个统一的模型结构。
Source:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
Model Architecture
BERT的结构是一种多层的双向Transformer编码器 (Transformer的讲解)。文中主要介绍了两种BERT,使用了WordPiece embeddings (30,000 token size)。
- BERT_BASE: L = 12, H = 768, A = 12, Total Parameters = 110M.
- BERT_LARGE: L = 24, H = 1024, A = 16, Total Parameters = 340M.
L: Numbers of layers; H: Hidden size; A: numbers of heads
BERT参数计算:
*** 对于transformer中Q,K,V的维度。 ***
经过实验测试,Q,K,V的维度保持在64时效果最佳。
如果Hidden size = 768, 要保持多头Q,K,V的维度为64,那么head size 需要等于12.
*** BERT BASE 参数估计 ***
vocab --> Hidden state: 30K * 768
Hidden state --> Q, K, V 的投影映射 768 * 768 * 3
self attention之后的一次映射: 768 * 768
MLP: 2层MLP,输入输出的维度为: H --> 4H --> H, 参数量为H * 4H + 4H * H = H^2 * 8
Sum: 30K * H + layer num * H ^ 2 * (3 + 1 + 8)
Input/Output Representations
BERT预训练的输入统一成为 input sequence。为了能够让BERT解决更多的下游任务,input sequence由单个句子或者句子对组成 (<Question, Answer>)。如下图表示一个input sequence 例子。
Source:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
几种特殊的token:
[CLS]
: [CLS]的最后一个hidden state用来表述句子的整体特征,可以应用于下游分类任务。
[SEP]
: 用来区分两个不同的句子。
Embedding: 一共有3种:
- Token embeddings: 用来表征不同的词,以及特殊的tokens.
- Segment embeddings: 用来表征这个词是属于哪一个句子。
- Position embeddings: BERT的position embedding不同于Transformer,BERT的position embedding是可学习的。
Pre-training BERT
Task 1: Masked LM
随机掩盖掉一个句子中15%的token。有3中掩盖的方法:
- 80%的情况使用
[MASK]
来掩盖。 - 10%的情况使用随机的token来掩盖。
- 10%的概率不改变token。
此任务是通过BERT来预测掩盖掉的词token。Mask token相关的最后一层hidden state将通过softmax来进行预测。
Task 2: Next Sentence Prediction (NSP)
常见的下游任务比如Question Answering (QA),这些任务是要判断两个句子的关系。BERT预训练NSP任务是训练一个二分类的下一个句子预测任务 (Binarized next sentence prediction task)。此任务的数据集的生成方式为:
- 50%的句子B是真是的A后面的句子,标注为 IsNext.
- 50%的句子B是从语料中随机选取的句子,标注为 NotNext.
[CLS]
token通过BERT生成最后一个hidden state [C]
,用来做NSP任务。
到此为止,BERT的预训练任务,如何生成训练数据,以及优势都已经介绍完了。接下来会做BERT相关的代码阅读,以及fine-tune下游任务的尝试。
待补充内容:
- Transformer的介绍 (网上已有很多详尽的介绍,如果大家评论有需求我可以写一篇补充介绍)。
上游工作:
- ELMo (feature-based pre-trained model)
- GPT (fine-tuning pre-trained model)
分词工作:
- WordPiece