roberta算法详解
一、背景
bert系列的算法论文越来越多,比较出名和有效果的有,Roberta、ALbert。这都是
另一个系列的是XLnet。
论文:https://arxiv.org/pdf/1907.11692.pdf
翻译:https://yiyibooks.cn/nlp/roberta/index.html
全名:RoBERTa:A Robustly Optimized BERT Pretraining Approach
官方源码:https://github.com/pytorch/fairseq
中文预训练模型1:https://github.com/brightmart/roberta_zh
此模型为某个公司训练
中文预训练模型2:https://github.com/ymcui/Chinese-BERT-wwm
此模型为哈工大讯飞实验室预训练
二、在预训练的改动
1.动态mask机制
- 原始静态mask:
BERT中是准备训练数据时,每个样本只会进行一次随机mask(因此每个epoch都是重复),后续的每个训练步都采用相同的mask,这是原始静态mask,即单个静态mask,这是原始 BERT 的做法。 - 修改版静态mask:
在预处理的时候将数据集拷贝 10 次,每次拷贝采用不同的 mask(总共40 epochs,所以每一个mask对应的数据被训练4个epoch)。这等价于原始的数据集采用10种静态 mask 来训练 40个 epoch。 - 动态mask:
并没有在预处理的时候执行 mask,而是在每次向模型提供输入时动态生成 mask,所以是时刻变化的。
不同模式的实验效果如下表所示。其中 reference 为BERT 用到的原始静态 mask,static 为修改版的静态mask。
2.NSP去掉
3.数据+算力+时长
- 1.更多的数据
Bert使用了16G,XLNet使用了126G,RoBerta使用了160G 2.更多的显卡
Bert使用64个TPU,XLNET 128 个 Cloud TPU v3 , RoBerta1024 V100 GPUs
- 3.更大的batch
Bert使用了256,XLNet使用了2K,RoBerta使用了8K
4.Text Encoding
字节对编码(BPE)(Sennrich et al.,2016)是字符级和单词级表示的混合,该编码方案可以处理自然语言语料库中常见的大量词汇。BPE不依赖于完整的单词,而是依赖于子词(sub-word)单元,这些子词单元是通过对训练语料库进行统计分析而提取的,其词表大小通常在 1万到 10万之间。当对海量多样语料建模时,unicode characters占据了该词表的大部分。Radford et al.(2019)的工作中介绍了一个简单但高效的BPE, 该BPE使用字节对而非unicode characters作为子词单元。
总结下两种BPE实现方式:
- 基于 char-level :原始 BERT 的方式,它通过对输入文本进行启发式的词干化之后处理得到。
- 基于 bytes-level:与 char-level 的区别在于bytes-level 使用 bytes 而不是 unicode 字符作为 sub-word 的基本单位,因此可以编码任何输入文本而不会引入 UNKOWN 标记。
当采用 bytes-level 的 BPE 之后,词表大小从3万(原始 BERT 的 char-level )增加到5万。这分别为 BERT-base和 BERT-large增加了1500万和2000万额外的参数。