<论文>如何构建一个更鲁棒的Bert?
一、摘要
今天我们来聊一聊论文《RoBERTa: A Robustly Optimized BERT Pretraining Approach》。这篇论文提出了一种更优的Bert训练方案,并将该方案训练的模型称为——RoBERTa。
译文:
语言模型的预训练已经带来了显著的性能提升,但不同方法之间的仔细比较仍然具有挑战性。训练过程计算量大,通常在不同规模的私有数据集上进行,并且正如我们将展示的那样,超参数选择对最终结果有显著影响。我们进行了一项BERT预训练(Devlin等,2019)的复现研究,仔细测量了许多关键超参数和训练数据规模的影响。我们发现BERT显著地训练不足,并且可以匹配或超过之后发布的每一个模型的性能。我们的最佳模型在GLUE、RACE和SQuAD上达到了最新的最先进结果。这些结果突显了之前被忽视的设计选择的重要性,并对最近报告的改进来源提出了质疑。我们发布了我们的模型和代码。
二、模型核心创新点
RoBERTa模型在架构上仍然与Bert类似,同样都是多层Transformer模型编码器的堆叠。二者主要的区别在于预训练任务的设计,RoBERTa采用的动态掩码的机制来替代MLM中的静态掩码,同时变更预训练输入文本的格式并取消NSP任务,还采用了新的文本编码方式。
1、动态掩码(dynamic masking)
BERT 依赖于随机进行Mask和预测Token,其实现方式是在数据预处理阶段进行一次Mask,从而产生单一的静态Mask,也就是说每条文本Mask的位置是固定的,无论在哪一轮的训练迭代时都不会发生变化。为此,作者提出了动态Mask的概念,即每向模型输入一个序列时,都会生成一次Mask,这样一来,即便是同一条样本在不同的训练阶段所Mask的Token也是不同的。实验效果表明,动态掩码效果的确略优于静态掩码,毕竟一定程度上提升了训练文本的多样性。
2、改进预训练输入格式
经过多种策略的比较,作者最终使用了一种叫Full Sentences的预训练输入策略。具体来说:每个输入都填充有从一个或多个文档中连续采样得到的完整句子,使得总长度最多为 512 个词元。输入可能跨越文档边界,当到达一个文档末尾时,就开始从下一个文档中采样句子,并在文档之间添加一个额外的分隔符词元。同时,作者移除了下一句预测NSP任务的损失。
3、改进文本编码方式
这里需要知道什么是字节对编码。字节对编码(BPE)是字符级和词级表示之间的一种混合形式,它能够处理自然语言语料库中常见的大型词汇表。字节对编码依靠子词单元,而非完整的单词,这些子词单元是通过对训练语料库进行统计分析提取出来的。Radford等人引入了一种巧妙的字节对编码实现方式,它使用字节而非 Unicode 字符作为基础子词单元。使用字节使得学习一个规模适中(5 万个单元)的子词词汇表成为可能,该词汇表仍能对任何输入文本进行编码,且不会引入任何 “未知” 词元。
原始的 BERT 实现方式使用了一个规模为 3 万个单元的字符级BPE词汇表,这个词汇表是在用启发式分词规则对输入进行预处理之后学习得到的。参照Radford等人(2019 年)的做法,RoBERTa的作者转而考虑使用包含 5 万个子词单元的更大的字节级BPE码词汇表来训练 BERT,且不对输入进行任何额外的预处理或分词操作。通过这个操作,RoBERTa的参数量比原始的Bert增加了15M-20M不等。
三、总结
总的来说,RoBERTa还是Bert的衍生模型,只不过作者通过上述的操作并加上更大的Batch Size和更多的数据量等,非常暴力地提升了原始Bert的性能表现。从这里也可以窥见,更大的模型参数量、更多的数据以及更多的训练资源等的确能够提升预训练模型的性能。近几年各大顶流团队的大模型军备竞赛也很好地印证了这一点,谁的数据多、谁的模型大、谁的训练时间长,那他的模型就更牛X。