首先我们先来总结下BERT模型,BERT的全名是Bidirectional Encoder Representations from Transformers,是由Devlin等人在2018年提出的,其主要结构是Transformer的encoder层,其包括两个训练阶段,预训练与fine-tuning。BERT论文链接:https://arxiv.org/pdf/1810.04805.pdf。下面我们从模型的输入输出、预训练任务及下游任务来进行介绍。
BERT模型的输入主要包含三部分:分别是token embedding词向量,segment embedding段落向量,position embedding位置向量。这里简单说下BERT输入与Transformer的区别:
Transformer的输入只包含两部分,token embedding词向量和position encoding位置向量,且position encoding用的是函数式(正余弦函数),BERT的position embedding位置向量是参数式(可学习的),且segment embedding段落向量用于区分两个句子(第一个句子为0,第二个句子为1)。
需要注意的就是,【CLS】和【SEP】,【CLS】为句首向量,【SEP】为句中和句尾向量。
BERT模型的输出为每个token对应的向量,在代码中通常包含last_hidden_state和pooler_output。
last_hidden_state:shape是(batch_size, sequence_length, hidden_size),hidden_size=768,它是模型最后一层输出的隐藏状态。
pooler_output:shape是(batch_size, hidden_size),这是序列的第一个token(classification token)的最后一层的隐藏状态,它是由线性层和Tanh激活函数进一步处理的,这个输出不是对输入的语义内容的一个很好的总结,对于整个输入序列的隐藏状态序列的平均化或池化通常更好。(【CLS】—> Linear —>tanh函数 )
通常用output[0]表示上面的last_hidden_state,output[1]表示的是pooler_output。
如果 return_dict = False,就会返回一个元组(tuple);
如果 return_dict = True,就会返回一个字典,包含下面几部分。
BERT模型的预训练任务主要包含两个, 一个是MLM(Masked Language Model),一个是NSP(Next Sentence Prediction),BERT 预训练阶段实际上是将上述两个任务结合起来,同时进行,然后将所有的 Loss 相加。
Masked Language Model 可以理解为完形填空,随机mask每一个句子中15%的词,用其上下文来做预测。而这样会导致预训练阶段与下游任务阶段之间的不一致性(下游任务中没有【MASK】),为了缓解这个问题,会按概率选择以下三种操作:
例如:my dog is hairy → my dog is [MASK]
80%的是采用[mask],my dog is hairy → my dog is [MASK]
10%的是随机取一个词来代替mask的词,my dog is hairy -> my dog is apple
10%的保持不变,my dog is hairy -> my dog is hairy
Next Sentence Prediction可以理解为预测两段文本的蕴含关系(分类任务),选择一些句子对A与B,其中50%的数据B是A的下一条句子(正样本),剩余50%的数据B是语料库中随机选择的(负样本),学习其中的相关性。前面提到序列的头部会填充一个[CLS]标识符,该符号对应的bert输出值通常用来直接表示句向量。
BERT模型在经过大规模数据的预训练后,可以将预训练模型应用在各种各样的下游任务中。使用方式主要有两种:一种是特征提取,一种是模型精调。
特征提取:仅使用BERT提取输入文本特征,生成对应上下文的语义表示,来进行下游任务的训练(BERT本身不参与训练);
模型精调:利用BERT作为下游任务模型基底,生成文本对应的上下文语义表示,并参与到下游任务的训练。
常见的下游任务有四种:单句文本分类、句子对文本分类、阅读理解和序列标注等。
RoBERTa的全名是Robustly OptimizedBERT Pre-training Approach,对BERT模型进行了优化,在BERT的基础上引入了动态掩码技术,同时舍弃了 NSP任务,同时采用了更大规模预训练数据,并以更大的批次和BPE词表训练了更多的步数。ROBERTa模型论文链接:https://arxiv.org/pdf/1907.11692.pdf。
Bert 模型
原始静态mask:
BERT中是准备训练数据时,每个样本只会进行一次随机mask(因此每个epoch都是重复),后续的每个训练步都采用相同的mask,这是原始静态mask,即单个静态mask,这是原始 BERT 的做法。
RoBERTa 模型
修改版静态mask:
在预处理的时候将数据集拷贝 10 次,每次拷贝采用不同的 mask(总共40 epochs,所以每一个mask对应的数据被训练4个epoch)。这等价于原始的数据集采用10种静态 mask 来训练 40个 epoch。
动态mask:
并没有在预处理的时候执行 mask,而是在每次向模型提供输入时动态生成 mask,所以是时刻变化的。
RoBERTa 模型在 Bert 模型基础上的调整:
简单总结如下:
参数\模型 | Bert | RoBerta |
---|---|---|
Batch_size | 256 | 2K、8K |
训练数据 | 13G(Bert Large) | 16G、160G |
训练步数 | 1M | 125K、31K |
是否有NSP | 是 | 否 |
Mask方式 | static mask(静态mask) | dynamic(动态mask) |
text Encoding | 基于 char-level 的 BPE | 基于 bytes-level 的BPE |
词表大小 | 30K | 50K |
ALBERT的全名 A Lite BERT,一个轻量级的BERT模型。ALBERT模型主要是为了解决BERT模型参数量大,占用计算资源大的问题。ALBERT模型降低了内存消耗并提高了BERT的训练速度。主要有两项:词向量参数因式分解和跨层参数共享,同时还引入了SOP的预训练任务,取代了BERT中原有的NSP任务。ALBERT模型论文地址:https://arxiv.org/pdf/1909.11942.pdf。
具体描述如下:
MacBERT模型的全名 MLM as correction(校正),是一种基于文本纠错的掩码语言模型。MacBERT模型是由哈工大讯飞联合实验室提出的,BERT模型存在预训练—微调不一致的问题,具体来说就是在预训练阶段使用了【MASK】进行了掩码,但在微调阶段并没有【MASK】。MacBERT模型通过改变掩码方式解决了该问题。MacBERT模型论文链接:https://arxiv.org/pdf/2004.13922.pdf
MacBERT模型主要进行了以下修改:
使用整词掩码及N-gram掩码两种方式选择待掩码的标记,其中 unigram 至 4-gram的概率分别为为40%,30%,20%,10%。
为了解决【MASK】在预训练和微调不一致的问题,使用类似的单词进行masking。 通过使用基于word2vec相似度计算的同义词工具包获得相似的单词。 如果选择一个N-gram进行masked,分别找到相似的单词。 在极少数情况下,当没有相似的单词时,会降级以使用随机单词替换。
对15%比例的输入单词进行masking,其中80%替换为相似的单词,10%将替换为随机单词,其余10%则保留原始单词。
采用ALBERT引入的句子顺序预测(SOP)任务,替换BERT中的NSP任务,并通过切换两个连续句子的原始顺序来创建负样本。