一、BERT 整体模型架构
BERT的encoder部分,主要分成了三个内容:输入部分、多头注意力机制、前馈神经网络。
1. 为什么说是基础架构呢?
因为BERT使用的是多个encode堆叠在一起,其中BERT-base使用的是12层encoder,BERT-large使用的是24层的encoder。
注意:有一点十分容易混淆,是12层encoder,而不是12层transformer。transformer在文章中应该是6个encoder堆叠在一起形成编码端,6个decoder堆叠在一起形成解码端。
2. 输入部分
CLS的作用:将CLS的输出向量接一个二分类器去做一个二分类任务
CLS的误解
CLS向量不能代表语义信息。
CLS用来做一个二分类任务,但与编码整个句子的语义信息这个任务相去甚远,所以,用CLS去无监督的做文本相似度任务时,效果会非常的差
BERT预训练模型直接拿来作sentence embedding效果甚至不如word embedding,CLS的embedding效果最差。
二、如何做BERT预训练:MLM+NSP
BERT使用的是大量的无标注语料
MLM-掩码语言模型——AR
也就是autoregressive,我们称之为自回归模型;只能考虑单侧的信息,典型的就是GPT
无监督目标函数——AE
也就是autoencoding,我们称之为自编码模型;从损坏的输入数据中预测重建原始数据。可以使用上下文的信息
【我爱吃饭】
AR:
P(我爱吃饭) = P(我)P(爱|我)P(吃|我爱)P(饭|我爱吃);
AE:
mask之后:【我爱mask饭】
P(我爱吃饭|我爱mask饭)=P(mask=吃|我爱饭)
mask的本质是在打破文本的信息,让其重建文本
mask的缺点
mask之后变成【我爱 mask mask】
优化目标:P(我爱吃饭 | 我爱 mask mask)=P( 吃|我爱)P(饭|我爱)
文章中mask概率问题
随机mask 15%单词,80%替换为mask,10%替换成其他,10%保持不变。
mask代码实践
NSP任务
样本如下:
- 从训练语料库中取出两个连续的段落作为正样本
- 从不同的文档中随机创建一对段落作为负样本
缺点:主题预测和连贯性预测合并为一个单项任务。 因为存在了主题预测,结果变得简单了起来。
如何微调BERT
三、如何提升BERT下游任务的表现
一般做法:1. 获取谷歌中文BERT;2.基于任务数据进行微调。
四步骤:
- 在大量通用语料上训练一个LM(Pretrain);–中文谷歌BERT
- 在相同领域 上继续训练LM(Domain transfer);–在大量微博文本上继续训练这个BERT
- 在任务相关的小数据上继续训练LM(Task transfer);—在微博情感文本上(有的文本不属于情感分析的范畴)
- 在任务相关数据上做具体任务(Fine-tune)。-
先Domain transfer,再进行Task transfer,最后Fine-tune,性能是最好的。
如何在相同领域数据中进行further pre-training
- 动态mask:BERT在训练的时候用的是静态的mask,而动态mask就是每次epoch去训练的时候mask,而不是一直使用同一个;
- n-gram mask:其实比如ERNIE和SpanBert都是类似于做了实体词的mask
参数
- Batch size:16,32 影响不大
- Learning rate(Adam):5e-5,3e-5,2e-5,尽可能小一点,避免灾难性遗忘
- Number of epochs:3,4
- Weighted decay修改后的adam,使用warmup,搭配线性衰减
预训练:数据增强、自蒸馏、外部知识的融入。