Press "Enter" to skip to content

广告行业中那些趣事系列18:RoBERTa-wwm-ext模型为啥能带来线上效果提升?

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

摘要:本篇主要分享能带来线上文本分类效果有效提升的RoBERTa-wwm-ext模型。首先介绍背景,RoBERTa-wwm-ext模型不管在公共数据集上还是在我们线上真实分布数据集上都能带来不错的效果提升,需要重点分析下效果提升的原因。RoBERTa-wwm-ext模型相比于BERT主要有两大方面的优化,第一是RoBERTa预训练模型,第二是基于全词掩码的中文训练方式;然后重点分析RoBERTa预训练模型的六大优化项,包括动态Mask、取消NSP任务、设置更大的batchsize训练、使用更多的数据同时训练更久、调整优化器Adam参数和使用Byte level构建词表等优化策略;最后分析了基于全词掩码的中文预训练方式。希望对文本分类优化感兴趣的小伙伴有所帮助,也欢迎大家分享一些项目实践中的优化策略。

 

下面主要按照如下思维导图进行学习分享:

 

 

01 业务背景介绍

 

之前的一篇文章 《广告行业中那些趣事系列16:NLPer一定要知道的BERT文本分类优化策略及原理》 讲过,我们在实际业务中发现RoBERTa-wwm-ext,Chinese预训练模型能极大提升线上文本分类系统的识别效果。这篇文章咱们详细分析下原因。只有真正明白带来线上效果提升的原因,我们才能更放心的使用RoBERTa-wwm-ext模型,也能为我们后续的优化提供思考和方向。

 

1.1 公共数据集上效果提升

 

 

图1 RoBERTa-wwm-ext模型在公共数据集上的提升

 

通过上图可以发现在情感分析任务(实质是文本分类任务)、LCQMC(实质是句对分类任务)、简体中文阅读理解和司法阅读理解等数据集中RoBERTa-wwm-ext模型的指标都有较大提升,可以看出在行业内公认的数据集上的确能提升NLP任务的效果。

 

1.2 实际线上业务效果提升

 

仅仅在公共数据集上有效果提升还不够,我们需要通过实验的方式证明RoBERTa-wwm-ext模型对于我们实际业务也能带来不错的提升。在实际的线上业务中,我们也证明了lab5(RoBERTa-wwm-ext模型)在测试集和真实分布数据集上能带来较大的效果提升,详细的实验分析、实验过程和实验结论小伙伴可以查看我之前分享的文章。

 

 

图2 RoBERTa-wwm-ext模型在实际业务中的提升

 

所以我们得到结论:不论在公共数据集上还是我们的真实线上业务中都发现RoBERTa-wwm-ext模型能较大的提升文本分类效果。

 

1.3 RoBERTa-wwm-ext模型牛在哪里

 

知道了RoBERTa-wwm-ext模型非常牛,下面我们需要弄清楚它为什幺这幺牛?RoBERTa-wwm-ext模型对比与原生BERT模型来说主要有两大块的优化,第一块是RoBERTa模型,第二块是基于全词掩码Whole Word Mask(WWM)。下面咱们详细分析下这两个原因。

 

02 RoBERTa 预训练模型

 

2.1 RoBERTa是啥

 

RoBERTa是由FacebookAI和华盛顿大学的研究团队共同完成,英文全称是“Robustly optimized BERT approach”,中文翻译过来就是强力优化的BERT方法,通俗易懂。因为RoBERTa的作者认为原生BERT训练不足,所以进行了一项复杂研究,包括仔细评估了超参数和训练集大小等等对BERT预训练模型的影响。

 

2.2 BERT的知识点

 

因为RoBERTa实质是对BERT模型的优化,很多优化策略会涉及BERT模型内部细节,所以这里需要大概讲一下BERT的相关知识点,这样方便小伙伴们理解RoBERTa的优化思路。想更加详细的了解BERT模型,小伙伴们可以去看一下我之前写过的一篇文章 《广告行业中那些趣事系列3:NLP中的巨星BERT》

 

这里重点讲一下BERT模型的输入,同时会讲一下预训练的两个任务:

 

BERT模型在预训练时输入是两段话segment1和segment2,模型将这两段话进行拼接,具体操作是添加一个初始标志[CLS],两段拼接处添加一个分隔标志[SEP],最后再添加一个结束标志[EOS]。这样就把两段话拼接成了这样的格式:[CLS]segment1[SEP] segment2[EOS]。BERT模型通过这种方式从海量的文本数据中进行无监督学习。

 

讲完了BERT模型的输入,下面讲一下BERT预训练模型的两个任务:一个是基于掩码的语言任务Masked Language Model(MLM),另一个是下一句预测任务Next SentencePrediction(NSP),所以BERT预训练任务其实是多任务训练。

 

MLM任务是从输入的文本中随机挑选Token替换成[Mask],然后让模型去预测这些替换成[Mask]的Token从而学习语言学知识。具体操作是随机挑选15%的Token进行替换,这15%的Token中80%替换成[Mask],10%保持原来的Token,剩下的10%从词表中随机进行替换。

 

NSP任务主要用来判断两段话是不是连续的,正样本是从同一篇文章中选择连续的两段话,负样本则是分别从不同的文章中各选一段话。

 

2.3 RoBERTa六大优化项

 

上面讲了BERT模型的相关知识点,下面通过和原生BERT模型对比的方式来看看RoBERTa模型主要进行了哪些优化。

 

2.3.1 动态Mask操作

 

原生BERT模型使用静态的Mask操作,而RoBERTa模型使用动态的Mask操作。静态的Mask操作其实就是在数据处理时将语句进行Mask操作,然后将这些Mask操作完成的语句直接提供给模型进行训练。而动态Mask操作则是在模型训练的时候动态的对语句进行Mask。可能比较绕,咱们通过一个详细的例子进行说明。

 

现在假如我们有一条样本“[CLS] BERT模型不仅效果好,而且应用范围广。[SEP] NLP目前最流行的模型是啥?[EOS]”。如果是静态的Mask,那幺样本会处理成“[CLS] BERT模型不仅效果好,而且应用范[Mask]广。[SEP] NLP目前最流行的模型是啥?[EOS]”。因为在模型训练前数据已经处理好,所以不管训练多少轮,后面的训练中这句话的Mask操作是固定的。

 

如果是动态的Mask操作,那幺会在模型训练时不断更改Mask位置,比如第一轮训练可能是“ [CLS] BERT模型不仅效果好,而且应用范[Mask]广。[SEP] NLP目前最流行的模型是啥?[EOS]”,那幺第二轮训练时可能变成了“ [CLS] BERT模型不仅效果好,而且应用范围广。[SEP] NLP目前最流行的模[Mask]是啥?[EOS]”,第三轮、第四轮Mask位置可能又会发生变化,也就是说每一轮训练样本的Mask位置可能都不同。这就是动态Mask操作。

 

通过上面的例子小伙伴应该能理解动态Mask和静态Mask的区别了。 通过动态Mask操作可以使得一条样本在每轮训练中Mask位置不同,提高了模型输入数据的随机性,最终提升了模型的学习能力。 这里需要说明的是RoBERTa模型并没有真正实现动态Mask操作,而是将训练数据重复10次,然后一条样本可能被Mask的位置会不同,这样相当于达到了动态Mask的目的。下图是论文中对比动态Mask和静态Mask,可以发现动态Mask相比静态Mask在模型效果上有轻微的提升。

 

图2 动态Mask和静态Mask操作对模型的影响

 

2.3.2 取消NSP任务

 

上面BERT知识点讲解中也说了BERT会将两段话进行拼接提供给模型进行训练,正样本是选择同一篇文章中的连续的两段话,负样本是分别从两篇文章中分别选择一段话。为了证明NSP任务对BERT模型的作用,RoBERTa模型进行了如下实验:

 

SEGMENT-PAIR+NSP:这个其实是原生BERT使用的策略。使用NSP任务,正样本使用的是同一篇文章中连续的两段话,负样本使用的是从两篇文章中分别选择一段话。这里一定要明白一段话和一句话的区别。一段话可能包含多个自然语句,也就是多个完整的句号结尾的语句,而一句话就是一个句号结尾的语句。当然,这两段话拼接的语句长度是小于512的;

 

SENTENCE-PAIR+NSP:使用NSP任务,正样本使用的是同一篇文章中连续的两句话,负样本则使用的是两篇文章中各选一句话。这里因为使用的是一条自然语句,所以相比于上面的一段话一般会比较短。针对这个问题,论文中通过增加batch size从而使得SENTENCE-PAIR+NSP的字符总数和SEGMENT-PAIR+NSP的字符总数相似。当然,这两句话拼接的语句长度也是小于512的;

 

FULL-SENTENCES:取消NSP任务,相比于原生BERT使用两段话进行拼接,这里使用长度接近512个token的一段话,唯一需要注意的是这一段话可能来自一篇或者多篇文档。如果从文章A中获取的一段话长度接近512个token时就只从一篇文档中获取,否则会继续从文章B中选取一段话直到接近512个token,但是如果是多篇文档会添加一个特殊标志;

 

DOC-SENTENCES:和FULL-SENTENCES相似,也是取消NSP任务,也是使用一段话,但是区别在于仅从一篇文档中选取,所以可能获取的token长度是小于512的。针对这个问题也是动态的增加batch size使得DOC-SENTENCES的字符总数和FULL-SENTENCES相似。

 

 

图3 实验对比NSP任务对BERT的影响

 

从上图中我们可以得到以下几个比较有趣的结论:首先, 取消NSP任务反而能给BERT模型带来较好的提升 ,用实验证明了NSP任务基本没啥卵用;然后, 同样使用NSP任务的情况下,样本中包含更多字符有更好的效果 ,SEGMENT-PAIR+NSP的效果比SENTENCE-PAIR+NSP好;最后, 取消NSP任务的情况下,从一篇文章中获取数据要比从多篇文章中获取数据效果更好 ,DOC-SENTENCES的效果比FULL-SENTENCES好。

 

2.3.3 设置更大的batch size训练

 

RoBERTa模型论文中还发现在模型训练时使用更大的batch size有利于提升模型的效果。原生BERT模型训练时使用的batch size是256,训练了1M的steps,而RoBERTa模型使用了更大的batch size进行对比。这里关于batch size和steps咱们用一个通俗的例子来进行说明。假如我们现在有一项工程要完成,工程量是固定的,如果你每天安排的工作量比较小(batch size),那幺你可能需要工作更多的天数(steps);同理,如果你决定每天多安排一点工作量,那幺你可能需要工作的天数就变少了。就是这幺简单。

 

图4 实验对比batch size对BERT的影响

 

从上图中发现,随着batch size增加,ppl(Perplexity on held-outtraining data)不断降低,同时下游任务的准确率不断提升。虽然实验结果中2k的batch size效果最优,但是RoBERTa模型的作者认为更大的batch size有利于模型并行化训练,所以在更大的实验中使用8K的batch size来训练模型。

 

2.3.4 使用更多的数据集同时训练的更久

 

RoBERTa模型论文同样强调了使用更多的训练数据可以有效提升下游任务的性能。原生BERT仅使用了16G的训练文本,但是RoBERTa模型使用了160G的训练文本,其中包括原始BERT的训练集BOOKCORPUS 和英文维基百科(16G)、6300万篇英文新闻数据集CC-NEWS(76G)、Reddit上的网页内容(38G)和CommonCrawl数据集的一个子集STORIES(31G)。关于数据对预训练模型的作用毋庸置疑,不管是现在风头更劲的GPT系列模型还是XLNet都很好的证明了数据的重要性。不仅使用更多的数据集可以提升模型,同时训练的时间更长也可以有效提升模型的性能。下图说明了RoBERTa模型使用更多的数据和训练更长的时间带来的效果提升:

 

 

图5 更多的训练数据和训练更长时间带来的效果提升

 

这里还需要说明的是这些通用的数据集训练得到的模型具有较好的通用性, 如果想在特定的应用场景下获取更好的模型下游效果,那幺需要在BERT的基础上使用自己特定场景下的业务数据使用较小的学习率进行进一步的学习 。很多大厂会使用自己业务领域的数据来训练得到更适合自身场景的预训练模型,比如美团的MT-BERT等等。关于BERT在美团搜索业务下的使用小伙伴可以参考我之前写过的一篇文章 《广告行业中那些趣事系列15:超实用的基于BERT美团搜索实践》

 

2.3.5 调整优化器Adam参数

 

RoBERTa模型论文中还对优化器Adam中的两项参数进行了调整:

 

图6 调整Adam公式的参数

 

第一个调整是对Adam中的二阶矩估计β_2。β_2参数一般用于解决梯度稀疏的问题,通常情况下在NLP或者CV任务中建议设置接近为1,所以一般情况下都是设置为0.999。但是在论文中将β_2参数设置为0.98;第二个调整则是Adam中的ε 参数。ε 参数参数最初的用途是防止除0的情况,在这里调节该参数可以提高模型训练的稳定性,有时候还能有一定提升。关于优化器参数的调整论文中其实也是一笔带过,没有细讲。这里咱们也点到为止,不再深究。

 

2.3.6 使用Bytelevel构建词表

 

论文中使用更大的Byte level的BPE词表,主要目的是为了减少NLP任务中未知词的问题。原生BERT模型在英文分词的时候使用的是基于BPE(Byte Pair Encoding)的wordpiece方法,该方法的核心就是将单词打散为字符,然后根据片段的组合频率对单词进行word piece分段处理。相比于原来的分词,wordpiece能有效降低OOV(out of vocab)的情况。这里咱们还是举个例子来说明,假如现在有个英文单词cosplayer,这个单词在常规的数据集中出现的频率比较少,那幺如果使用分词的话因为出现频率比较低所以这个词就可能被划分到未知词UNK里去了。但是如果我们使用wordpiece的方法,那幺BPE就可以把这个词切分成cos/play/er三部分,这样模型可以根据词根以及前缀等信息学习到这个词的大致信息。通过这个例子我们可以了解到wordpiece方法如何有效降低OOV的情况。

 

BPE算法的词表大小一般为10K-100K,采用unicode编码。RoBERTa模型的作者在BPE算法的基础上使用byte编码来替代原来的unicode编码,从而将词表中的最小单元进一步提炼。比如刚才的例子BPE中的词表可能有-er,现在使用byte编码可能直接到字符级别,变成了-e和-r。

 

图7 对比Byte level和Byte PairEncoding(BPE)

 

虽然基于Byte level并没有带来实际的效果提升,但是RoBERTa模型的作者认为该方法产生的词表更加广泛,所以能进一步解决OOV的问题。

 

2.4 RoBERTa模型论文的重要贡献

 

上面讲了RoBERTa模型六个优化项带来的模型提升,下面讲下论文的三个重要贡献:

 

论文提出了一套重要的BERT设计选择和训练策略,并且引入了能提高下游任务性能的备选策略。这对于那些想使用特定领域的数据来训练自己的BERT模型的小伙伴决定是重大利好;

 

论文证明了使用更多的数据集来训练模型可以有效提升下游任务的性能。当你挖耳挠腮实在想不到可以优化的策略时,那就简单的增加训练数据的规模吧;

 

论文同时证明了MLM方法的有效性,丝毫比不其他的方法差。最实用的是同时公布了pytorch版本实现的模型、预训练和微调的代码,让我们可以更好的应用到实际业务中。

 

03 全词掩码

 

上面详细分析了RoBERTa-wwm-ext模型牛的一个原因是RoBERTa模型,下面继续分析另外一个原因基于全词掩码。关于全词掩码在之前的文章里面大概讲了下,这里直接照搬过来。因为谷歌发布的BERT-Base, Chinese模型里中文是以字为粒度进行切分,在BERT预训练过程中基于掩码的Masked Language Model(MLM)任务中也以字粒度进行Mask操作。BERT-wwm针对这个问题进行一系列中文式的改造,充分考虑传统NLP中的中文分词操作,以词为粒度进行Mask操作,也就是Whole Word Masking(wwm)操作。下面直接通过一个样本示例进行说明:

 

 

图8 全词Mask操作样本说明

 

假如原始Mask将文本中的“西”和“步”进行了Mask操作,全词Mask则考虑分词结果将“西瓜”和“跑步”都进行Mask操作。这种操作其实和百度的Ernie模型有异曲同工之妙,主要是 结合中文的实际应用场景,应用知识图谱加入更多中文语义的信息 。

 

总结

 

本篇主要分享能带来线上文本分类效果有效提升的RoBERTa-wwm-ext模型。首先介绍背景,RoBERTa-wwm-ext模型不管在公共数据集上还是在我们线上真实分布数据集上都能带来不错的效果提升,需要重点分析下效果提升的原因。RoBERTa-wwm-ext模型相比于BERT主要有两大方面的优化,第一是RoBERTa预训练模型,第二是基于全词掩码的中文训练方式;然后重点分析RoBERTa预训练模型的六大优化项,包括动态Mask、取消NSP任务、设置更大的batchsize训练、使用更多的数据同时训练更久、调整优化器Adam参数和使用Byte level构建词表等优化策略;最后分析了基于全词掩码的中文预训练方式。希望对文本分类优化感兴趣的小伙伴有所帮助,也欢迎大家分享一些项目实践中的优化策略。

 

参考资料

 

[1]RoBERTa:A Robustly Optimized BERT Pretraining Approach

 

[2]Pre-Trainingwith Whole Word Masking for Chinese BERT

 

[2]https://github.com/brightmart/roberta_zh

 

[3]https://github.com/ymcui/Chinese-BERT-wwm

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注