BERT是一种基于Transformer架构的预训练语言模型它使用大量未标记的文本进行预训练,然后使用标记的数 据进行微调。全称Bidirectional Encoder Representations Transformer。
pre-training and fine-tuning
NLP 中的 Feature-based 和 Fine-tune 两种学习方法
A Feature-based 方法:不使用模型本身,而是使用模型训练得到的参数作为词语的 embedding;feature-base 方法最典型的例子就是ELMO和word2vec。
B Fine-tune 方法会根据下游特定的任务,在原来的模型上面进行一些修改,使得最后输出是当前任务需要的。这些修改一般是在模型的最后一层,或者在现有的网络后添加一个网络结构用于匹配下游的各种任务;GPT1 GPT2 就采用了Fine-tune 方法,GPT3得益于海量的与训练样本和庞大的网络参数,不在需要 fine-tune过程;BERT论文采用了MLM + fine-tuning的方法,同时也讨论了BERT + task-specific model的方法。
在迁移学习中也有类似 Fine-tune(微调)操作,例如固定卷积层(使用训练好的固定卷积结构和固定网络参数提取图像特征),然后训练后边的全连接层。
Model Architecture
基本就是a multi-layer bidirectional Transformer encoder !!Transformer encoder:双向的Transformer,其每一个token会attend到所有的token。
we denote the number of layers(i.e., Transformer blocks) as L, the hidden size as H, and the number of self-attention heads as A.3 We primarily report results on two model sizes:
BERTBASE (L=12, H=768, A=12, Total Parameters=110M) -- 12个TF Encoder的堆叠
and BERTLARGE (L=24, H=1024,A=16, Total Parameters=340M). -- 24个TF Encoder的堆叠
输入
思路:需要既可以输入单个句子,也可以输入pair of sentences(e.g., h Question, Answer i)。
方法:见下图
首个token: The first token of every sequence is always a special classification token ([CLS]),求最后输出为C。
Embedding:见下图,包括3类embedding。分词用Tok编码,句子中间新增SEP,新增embedding指示属于句子A还是B。
输出
每个输入对应一个输出。C为分类token([CLS])对应最后一个Transformer的输出, 则代表其他token对应最后一个Transformer的输出。对于一些token级别的任务(如,序列标注和问答任务),就把 输入到额外的输出层中进行预测。对于一些句子级别的任务(如,自然语言推断和情感分类任务),就把C输入到额外的输出层中,这里也就解释了为什么要在每一个token序列前都要插入特定的分类token。
1、Pre-training model 利用大规模文本数据的自监督性质来构建预训练任务
1) masked language model (MLM) pre-training objective
In all of our experiments, we mask 15% of all WordPiece tokens in each sequence at random.实际操作中,由于可能并不涉及具体的token,处理流程如下:
1、位置随机:
The training data generator chooses 15% of the token positions at random for prediction.
2、替换策略: If the i-th token is chosen, we replace the i-th token with
(1) the [MASK] token 80% of the time
(2) a random token 10% of the time
(3) the unchanged i-th token 10% of the time.
Then, we will be used to predict the original token with cross entropy loss. We compare variations of this procedure in Appendix C.2.
MLM是BERT能够不受单向语言模型所限制的原因。简单来说就是以15%的概率用mask token ([MASK])随机地对每一个训练序列中的token进行替换,然后预测出[MASK]位置原有的单词。然而,由于[MASK]并不会出现在下游任务的微调(fine-tuning)阶段,因此预训练阶段和微调阶段之间产生了不匹配(这里很好解释,就是预训练的目标会令产生的语言表征对[MASK]敏感,但是却对其他token不敏感)。因此BERT采用了以下策略来解决这个问题:
首先在每一个训练序列中以15%的概率随机地选中某个token位置用于预测,假如是第i个token被选中,则会被替换成以下三个token之一
1)80%的时候是[MASK]。如,my dog is hairy——>my dog is [MASK]
2)10%的时候是随机的其他token。如,my dog is hairy——>my dog is apple
3)10%的时候是原来的token(保持不变,个人认为是作为2)所对应的负类)。如,my dog is hairy——>my dog is hairy
再用该位置对应的 去预测出原来的token(输入到全连接,然后用softmax输出每个token的概率,最后用交叉熵计算loss)。
该策略令到BERT不再只对[MASK]敏感,而是对所有的token都敏感,以致能抽取出任何token的表征信息。这里给出论文中关于该策略的实验数据
(以上中文说明来自 什么是BERT? - 知乎)
例如:"CLS,你,好,SEP,我,是,jack,SEP",先从中随机寻找15%的单词进行标记Mask(不包括CLS,SEP)。若随机找到"好","我","是",这三个字,再从随机到的字中,把80%的字直接用Mask标记,"好"->"mask";10%替换成其他字,"是"->"有";剩下10%不做任何处理"我"->"我"。如上图,最后输入就变成"CLS,你,mask,SEP,我,有,jack,SEP"最为最终的输入。最后预测被mask的三个字"mask","我","有",其真实标签是"好","我","是"。这个任务能帮助Bert去推测语句意思。
然后把每一个训练数据处理成相同长度,不足用"pad"占位,太长直接去掉,最后把句子中没每个token用字典索引表示,也就是用一个数字表示。
(【BERT:一切过往, 皆为序章】BERT预训练模型 | 10分钟理解Bert | Pytorch代码讲解 | 代码可运行 - 知乎)
2) next sentence prediction task
每一个训练样例,我们在语料库中挑选出句子A和句子B来组成,50%的时候句子B就是句子A的下一句(标注为IsNext),剩下50%的时候句子B是语料库中的随机句子(标注为NotNext)。接下来把训练样例输入到BERT模型中,用[CLS]对应的C信息去进行二分类的预测。
Input1=[CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
Label1=IsNext
Input2=[CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label2=NotNext
(以上中文说明来自 什么是BERT? - 知乎)
3)预训练任务总结
把每一个训练样例输入到BERT中可以相应获得两个任务对应的loss,再把这两个loss加在一起就是整体的预训练loss。(也就是两个任务同时进行训练)
2、Fine-tuned model
没有看论文的具体例子,但是参考知乎文档:
这里fine-tuning之前对模型的修改非常简单,例如针对sequence-level classification problem(例如情感分析),取第一个token的输出表示,喂给一个softmax层得到分类结果输出;对于token-level classification(例如NER),取所有token的最后层transformer输出,喂给softmax层做分类。
总之不同类型的任务需要对模型做不同的修改,但是修改都是非常简单的,最多加一层神经网络即可。如下图所示
实验分析: 论文解读:BERT模型及fine-tuning - 知乎
对于Masked LM、NSP的选择是否会影响模型性能,这里做了测试,分别采用了四种模型设置进行比较,性能如下所示,显然BERTBase的效果最好的
这里主要讨论Masked LM和普通LM的训练时间问题,可以看到:
training steps的影响
BERT的确需要训练很长steps
MLM的确收敛比LTR慢,但是很早就效果好于LTR了
BERT+feature-based
由于并非所有的NLP任务都可以很容易地用Transformer encoder结构来表示,因此还是需要一个task-specific model结构。同时如果需要fine-tuning的话,transformer encoder模型很大,需要重新训练的话,需要的计算资源比feature-based方法更多,因此如果可以直接用BERT的Transformer的结果的话,就很方面使用了。因此本文做了一个BERT + task-specific model的实验。表明这种方式也是可以有很好的效果的。
总结
- BERT采用Masked LM + Next Sentence Prediction作为pre-training tasks, 完成了真正的Bidirectional LM
- BERT模型能够很容易地Fine-tune,并且效果很好,并且BERT as additional feature效果也很好
- 模型足够泛化,覆盖了足够多的NLP tasks