论文阅读-RoBERTa
今天分享一个Bert的改进工作RoBERTa。RoBERTa是训练充分的Bert。
论文:RoBERTa: A Robustly Optimized BERT Pretraining Approach
代码:https://github.com/brightmart/roberta_zh
1. 方法改进
与Bert相比较,RoBERTa主要改进了一下几点:
- 去掉下一句预测(NSP)任务
- 动态掩码。BERT 依赖随机掩码和预测 token。原版的 BERT 实现在数据预处理期间执行一次掩码,得到一个静态掩码。 而 RoBERTa 使用了动态掩码:每次向模型输入一个序列时都会生成新的掩码模式。这样,在大量数据不断输入的过程中,模型会逐渐适应不同的掩码策略,学习不同的语言表征。
- 文本编码。Byte-Pair Encoding(BPE)是字符级和词级别表征的混合,支持处理自然语言语料库中的众多常见词汇。原版的 BERT 实现使用字符级别的 BPE 词汇,大小为 30K,是在利用启发式分词规则对输入进行预处理之后学得的。Facebook 研究者没有采用这种方式,而是考虑用更大的 byte 级别 BPE 词汇表来训练 BERT,这一词汇表包含 50K 的 subword 单元,且没有对输入作任何额外的预处理或分词。
2. Masking
动态掩码 or 静态掩码
-
原来Bert对每一个序列随机选择15%的Tokens替换成[MASK],为了消除与下游任务的不匹配,还对这15%的Tokens进行
(1)80%的时间替换成[MASK];(2)10%的时间不变;(3)10%的时间替换成其他词。
但整个训练过程,这15%的Tokens一旦被选择就不再改变,也就是说从一开始随机选择了这15%的Tokens,之后的N个epoch里都不再改变了。这就叫做静态Masking。 -
而RoBERTa一开始把预训练的数据复制10份,每一份都随机选择15%的Tokens进行Masking,也就是说,同样的一句话有10种不同的mask方式。比如我仍然是训练40个epoches,复制了十份样本,相当于每4个epoches使用的是同一个mask的样本。这种方式称为:动态掩码
全词Masking(Whole Word Masking)
Whole Word Masking (wwm),暂翻译为全词Mask或整词Mask,原有基于WordPiece的分词方式会把一个完整的词切分成若干个子词,在生成训练样本时,这些被分开的子词会随机被mask。
在全词Mask中,如果一个完整的词的部分WordPiece子词被mask,则同属该词的其他部分也会被mask,即全词Mask。
3. NSP和数据输入格式
SEGMENT-PAIR+NSP:就是Bert的输入形式
SENTENCE-PAIR+NSP:输入的是一对句子,即前后是单个句子
FULL-SENTENCES:输入为全量的句子,填满512的长度,采集样本的时候可以跨越文章的界限,去除了NSP loss
DOC-SENTENCES:输入和FULL-SENTENCE类似,但是一个样本不能跨越两个document
- RoBERTa删除了NSP任务,同时改变了输入格式,并不是使用上下两句的输入格式,而是类似文档中的句子全部填满这512个字符的格式进行输入。
- 简单说就是,去掉了NSP任务的同时,去掉了构造数据中NSP数据格式。
4. 总结
RoBERTa包括如下改进
- 数据生成方式和任务改进:取消下一个句子预测,并且数据连续从一个文档中获得。
- 更大更多样性的数据:使用 30G 中文训练,包含 3 亿个句子,100 亿个字 (即 token)。由于新闻、社区讨论、多个百科,保罗万象,覆盖数十万个主题,共160+G数据。
- Byte-Pair Encoding(BPE)是字符级和词级别表征的混合。
- 训练更久:超过500k steps
- 更大批次:使用了超大(8k)的批次 batch size。
- 调整优化器的参数。
- 使用全词 mask(whole word mask)和动态的mask。