此文为转载,原文链接 https://wmathor.com/index.php/archives/1504/
RoBERTa 相较于 BERT 最大的改进有三点:
- 动态 Masking
- 取消 NSP (Next Sentence predict) 任务
- 扩大 Batch Size
静态 Masking vs 动态 Masking
- 静态 Maksing:在数据预处理期间 Mask 矩阵就已生成好,每个样本只会进行一次随机 Mask,每个 Epoch 都是相同的
- 修改版静态 Maksing:在预处理的时候将数据拷贝 10 份,每一份拷贝都采用不同的 Mask,也就说,同样的一句话有 10 种不同的 mask 方式,然后每份数据都训练 N/10 个 Epoch
- 动态 Masking:每次向模型输入一个序列时,都会生成一种新的 Maks 方式。即不在预处理的时候进行 Mask,而是在向模型提供输入时动态生成 Mask
取消NSP任务
其实到 2020 年了,很多论文早已不再使用 NSP 任务,但是 RoBERTa 算是比较早的一批质疑 NSP 任务的模型。RoBERTa 实验了 4 种方法:
- SEGMENT-PAIR + NSP:输入包含两部分,**每个部分是来自同一文档或者不同文档的 segment **(segment 是连续的多个句子),这两个 segment 的 token 总数少于 512 。预训练包含 MLM 任务和 NSP 任务。这是原始 BERT 的做法
- SENTENCE-PAIR + NSP:输入也是包含两部分,每个部分是来自同一个文档或者不同文档的单个句子,这两个句子的 token 总数少于 512 。由于这些输入明显少于 512 个 tokens,因此增加 batch size 的大小,以使 tokens 总数保持与 SEGMENT-PAIR + NSP 相似。预训练包含 MLM 任务和 NSP 任务
- FULL-SENTENCES:输入只有一部分(而不是两部分),来自同一个文档或者不同文档的连续多个句子,token 总数不超过 512 。输入可能跨越文档边界,如果跨文档,则在上一个文档末尾添加标志文档边界的 token 。预训练不包含 NSP 任务
- DOC-SENTENCES:输入只有一部分(而不是两部分),输入的构造类似于 FULL-SENTENCES,只是不需要跨越文档边界,其输入来自同一个文档的连续句子,token 总数不超过 512 。在文档末尾附近采样的输入可以短于 512 个 tokens, 因此在这些情况下动态增加 batch size 大小以达到与 FULL-SENTENCES 相同的 tokens 总数。预训练不包含 NSP 任务
扩大Batch Size/更多的训练数据/更长的训练时间
其实之前我看到过一个说法(源自 Chinese-BERT-wwm):降低 batch size 会显著降低实验效果
RoBERTa 论文作者也做过相关实验,采用大的 Batch Size 有助于提高性能
其中,bsz 是 Batch Size;steps 是训练步数(为了保证 bsz*steps 近似相同,所以大 bsz 必定对应小 steps);lr 是学习率;ppl 是困惑度,越小越好;最后两项是不同任务的准确率