云IDE产品介绍 云IDE使用教程 免费使用地址:点击【云IDE】,即可开始创建工作空间啦~
Bert语言模型详细解读
一、前言
要理解Bert语言模型,必须要先掌握Transformer,可以参考本人的博客Transformer原理详解,Bert是2019年谷歌团队提出的语言模型,一经提出就在NLP领域火热起来。因为Bert它作为预训练模型,在训练好之后可以帮助一大批的NLP任务去提升它们的性能,在针对个人不同的子任务时去进行微调即可。那么想要针对Bert模型有更加细致的了解,推荐去看这篇论文 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》 ,那么下面本人将会针对Bert模型的每一个部分做详细介绍,感谢支持😄😄
二、Bert模型的整体架构
如果了解Transformer,那么下面这张图一定不会陌生,它是Transformer架构的Encoder部分,其中包括:输入部分;多头注意力机制;前馈神经网络。 那么Bert模型的基础架构就是由多个 Transformer架构的Encoder部分堆叠而成的。其中在 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》 这一论文中(下面简称Bert论文)作者提出两种形式的Bert,Bert_base是由12层的Encoder堆叠而成;Bert_large是由24层的Encoder堆叠而成。 这里需要区别于Transformer结构,Transformer是由6个Encoder堆叠形成编码端,6个Decoder堆叠形成解码端。
三、Bert模型的输入部分
那么对于Bert的输入有哪些组成呢? Input = token embeddings + segment embeddings + position embeddings (一)首先对于第一行input: 需要关注的有正常词汇:my dog is cute he likes playing; 被分割的词:由于Bert关注词汇的词性,在wordpiece分词时将原型和后缀分开,在后缀前需要添加字符“##”; 特殊词汇:[CLS] 、[SEP],在句子首部添加[CLS],在每一句子结尾添加[SEP]。 为什么要添加两种特殊词汇? 这是由于在Bert预训练中,有一个任务叫做NSP(Next Sentence Prediction)任务。判断两个句子之间的关系,因此需要用到[SEP]告诉模型,在[SEP]之前是一个句子,在[SEP]之后是另一个句子。 而又由于NSP任务是一个二分类任务,也就是说判断两个句子之间是什么关系的二分类任务,在句子前加上[CLS],在训练时,用[CLS]的输入向量连接二分类器,从而去做二分类任务。 (二)token embeddings 对于输入的所有词汇(包括正常词汇,被分割的词以及特殊词汇)做Embedding词嵌入。 (三)segment embeddings 由于处理的是两个句子,因此需要对两个句子进行区分。对于第一个句子的所有词可以用EA表示,第二个句子的所有词可以用EB表示。 (四)position embeddings 这里的position embeddings和Transformer的位置编码有很大的区别。在Transformer中,我们采用正余弦函数来计算位置编码。而对于Bert,采用的是随机初始化,让模型自己学习,通过定义index:0-511,让模型自己去学习每一个embeddings是什么样子的。
四、Bert模型的预训练
(一)MLM(Masked Language Model)掩码语言模型 Bert在预训练时使用的是大量的无标注的语料,因此在预训练任务设计时采用无监督来做。对于无监督的目标函数有两种: 1.AR(autoregressive) 自回归模型:只考虑单侧的信息,典型的是GPT 2.AE(autoencoding)自编码模型:从损坏的输入数据中预测重建原始数据,可以使用上下文信息,在Bert中使用。 例如:有这样一段文本:我爱吃饭 AR:P(我爱吃饭) = P(我)P(爱|我)P(吃|我爱)P(饭|我爱吃) 可以发现AR采用的单侧信息。 AE:mask之后:【我爱mask饭】用mask去遮盖某些或者某几个字 P(我爱吃饭|我爱mask饭) =P(mask=吃|我爱饭) mask机制是打破原有的文本信息,在做预训练时,让模型去做文本重建,模型从上下文中去获取各种信息,使得预测出mask的词汇无限接近或者就是原本的词汇。 mask模型的缺点: mask之后:【我爱mask mask】 优化目标:P(我爱吃饭|我爱mask mask) =P(吃|我爱) P(饭|我爱) ,很明显能够发现优化目标中,吃和饭是相互独立的,也就是mask与mask之间相互独立。
在Bert论文中,作者是这样做的: 随机mask15%的字,在这15%的字中,有80%替换成真正的mask标签,10%原封不动,最后10%替换成词典中的其他字。至于这个概率为啥是这些,作者在论文中也没有详细的解释,只是介绍了按照这个百分比效果确实好。
(二)NSP(Next Sentence Prediction)任务 NSP样本如下: 1.从训练语料中取出两个连续的段落作为正样本; 2.从不同的文档中随机创建一对段落作为负样本。 缺点:将主题预测和连贯性预测合并为一个单项任务。主题预测就是判断两个文本是不是来自同一个文档(1);连贯性预测就是判断两个段落是不是顺序关系(2)。
五、如何在下游任务中微调(fine turning)Bert
a.句子对分类;b.单个句子分类;c.问答任务;d.序列标注任务
六、如何提升Bert在下游任务中的效果
四个步骤: 例如:微博文本情感分析
- 在大量通用语料上训练一个LM (Pretrain): 一中文谷歌BERT
- 在相同领域上继续训练LM(Domain transfer) :一在大量微博文本上继续训练这个BERT
- 在任务相关的小数据上继续训练LM(Task transfer):一在微博情感文本上(有的文本不属于情感分析的范畴)
- 在任务相关数据上做具体任务:—微调fine turning
一般情况下都是先Domain transfer再进行Task transfer最后fine turning性能是最好的。
如何在相同领域数据中进行further pre-training
- 动态mask︰就是每次epoch去训练的时候mask,而不是一直使用同一个。
在Bert模型当中,每次使用的mask都是固定的,就是说Bert将文本mask后存在本地,在训练时每次使用的同样的mask标志。 - n-gram mask:其实比如ERNIE和SpanBert都是类似于做了实体词的mask
|