·阅读摘要:
本文在BERT
模型的基础上进行了一些改进,提出了RoBERTa
模型,并证明了RoBERTa
比BERT
的效果更好一些。
·参考文献:
[1] RoBERTa: A Robustly Optimized BERT Pretraining Approach
[2]BERT
模型讲解,参考博客:【文本分类】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
目前预训练语言模型按时间排:ELMo
- GPT
- BERT
- XML
- XLNet
- RoBERTa
- ALBERT
。基本上越往后的模型效果越好。
BERT用了16GB的训练数据,XLNet用了126GB数据,RoBERTa用了160GB数据。从个人理解上,XLNet像是为了超越BERT而提出各种花里胡哨trick的模型,而RoBERTa完全是对标XLNet的BERT加强版,从RoBERTa论文的各种设置就能看出来它是想干掉XLNet哈哈。
本文对BERT
进行复制研究,其中包括对超参数调整和训练集大小的影响的仔细评估,并提出了一种改进的训练BERT模型的方法,主要有4点:
1、动态掩码机制(Dynamic Masking)
2、取消下一个句子预测机制(Next Sentence Prediction, NSP)
,更改模型输入形式
3、训练模型的时间更长,批次更大,数据更多,更大的字节对编码(Byte-Pair Encoding, BPE)
词典
4、全长序列训练
[1] 动态掩码机制
首先介绍BERT
模型中的掩码语言模型(Masked Language Model, MLM)
:
对于一条样本,随机选择序列中的词,然后用特殊词[MASK]
替换。MLM
的目标是预测掩码时的交叉熵损失。BERT
统一选择15%的输入词用于可能的替换。在选定的词中,80%的时间被替换为[MASK]
,10%的时间保持不变,剩下10%的时间被随机替换成词典中的任意词。
原始的BERT
实现在数据预处理期间执行一次masking
,然后直接用于训练,但是这样会在每个时期对每个训练实例使用相同的掩码。
为了避免这个情况,BERT
会把训练数据被复制10次,以便在40个训练时期内以10种不同的方式对每个序列进行掩码。
【注一】其实它这样还是在数据预处理时只执行一次
masking
。而且训练数据被复制10次,可能不如扩大到10倍的数据集。
介绍RoBERTa
模型中的动态掩码(Dynamic Masking)
:
在动态掩蔽中,每次向模型喂输入序列时,都会动态生成掩码。
【注二】说起来比较简单。
[2] 取消下一个句子预测,更改模型输入形式
首先介绍BERT
模型中的下一个句子预测(Next Sentence Prediction, NSP)
:
NSP
是一种二进制分类损失,用于预测两个片段在原始文本中是否相互连续。通过从文本语料库中提取连续的句子来创建正例,反例是通过对不同文档的片段进行配对来创建的。正反两个例子的抽样概率相等。NSP目标旨在提高下游任务的性能,如自然语言推理,这需要对句子对之间的关系进行推理。
RoBERTa
模型为什么要取消NSP
?
原因一: 近年来,有人质疑NSP的必要性。
原因二: 作者做实验验证了NSP是没有必要的。作者比较了几种不同的模型输入形式:
· SEGMENT-PAIR+NSP
:这是BERT
中使用的原始输入格式,使用NSP Loss。每个输入都有一对段,每个段可以包含多个自然语句,但总的组合长度必须小于512个标记。
· SENTENCE-PAIR+NSP
:每个输入都包含一对自然语句,可以从一个文档的连续部分中采样,也可以从单独的文档中采样。由于这些输入明显短于512个令牌,增加了批大小,以便令牌总数保持与SEGMENT-PAIR+NSP
相似,保留NSP Loss。
· FULL-SENTENCES
:每个输入都包含从一个或多个文档连续采样的完整句子,因此总长度最多为512个标记。输入可能跨文档。当采样到一个文档的末尾时,对下一个文档中的句子进行采样,并在文档之间添加一个额外的分隔符标记。不使用NSP Loss。
· DOC-SENTENCES
:输入的构造类似于FULL-SENTENCES
,只是它们不能跨文档。在文档末尾附近采样的输入可能短于512个令牌,因此在这些情况下动态地增加批大小,以实现与FULLSENTENCES
相同数量的总令牌。我不使用NSP Loss。
【注三】相当严谨。
以下是实验结果:
[3] 训练模型的时间更长,批次更大,数据更多,更大的字节对编码词典
【注四】关于“训练模型的时间更长,批次更大,数据更多”文章说了很多,总结起来就是:大力出奇迹。主要说一下字节对编码。
字节对编码(Byte-Pair Encoding, BPE)
是字符和单词级表示之间的混合,允许处理自然语言语料库中常见的大型词汇。BPE
不依赖于完整的单词,而是依赖于通过对训练语料库进行统计分析而提取的子单词单元。BPE
词汇表的大小通常在10K-100K子字单位之间。然而,在对大型和多样的语料库建模时,unicode
字符可以占到词汇表的相当大的一部分。Radford等人(2019)介绍了一种巧妙的BPE
实现,它使用字节而不是unicode
字符作为基本子字单位。使用字节可以学习中等大小(50K单位)的子单词词汇表,仍然可以对任何输入文本进行编码,而不会引入任何[UNK]
标记。
原始BERT
实现使用大小为30K的字符级BPE
词汇表,该词汇表是在使用启发式标记化规则预处理输入后学习的。作者使用包含50K个子字单元的更大字节级BPE
词汇来训练BERT
,而不对输入进行任何额外的预处理或标记化。
[4] 全长序列训练
RoBERTa
模型用最多T=512个标记的序列进行预训练。与BERT
模型不同,RoBERTa
模型不随机注入短序列,也不在前90%的更新中使用减少的序列长度进行训练。RoBERTa
模型只训练全长序列。
[5] 实验效果总结
改进的预训练程序RoBERTa
模型在GLUE
、RACE
和SQuAD
上实现了最先进的结果,无需对GLUE
进行多任务微调或对SQuAD
进行额外数据。