RoBERTa:当"复现"变成"打脸"——用训练配方而非架构创新追平所有后续 SOTA
- 关联论文:1907.11692
- 作者:flyP
- 更新:2026-11-04
一句话结论
RoBERTa 证明 BERT 原版被严重训练不足:仅仅调整训练配方(动态掩码、去掉 NSP、更长序列、更大 batch、byte-level BPE、更多数据、更多步数),不改任何架构、不改 MLM 目标,就能匹配或超过 BERT 之后发表的所有模型——这把整个领域的注意力从"新架构/新预训练目标"拉回到了"训练细节和数据规模"。
它解决的真问题
2018 年底到 2019 年中,BERT 之后出现了一波密集的架构改进:XLNet 的 permutation language modeling、ELMo 的改进、Joshi et al. 的 span prediction、Megatron 的更大模型、多任务微调……每篇都在宣称超越 BERT。
但这些比较存在一个几乎无法察觉的方法论漏洞。RoBERTa 摘要里一句话点破:
"Training is computationally expensive, often done on private datasets of different sizes, and, as we will show, hyperparameter choices have significant impact on the final results."
具体来说,一个后来者要宣称"我的方法比 BERT 好",需要至少匹配以下条件才有意义:
- 训练充分——BERT 官方只报了 1M steps,而后来者往往训 500K-2M steps 却不控制数据量
- 数据量对齐——XLNet 用的是 126GB + 额外数据,BERT 用 16GB;差 8 倍数据量的情况下,谁赢谁说不清
- batch size 对齐——BERT 用 256,后来者用 2K/8K/32K
- 序列长度对齐——BERT 用 512,后来者用更短或更长
- masking 模式对齐——BERT 是静态掩码(预处理时 mask 一次并保存),后来者多数是动态掩码
这五个变量中任何一个的差距,都足以单独制造出"我的架构更好"的假象。
RoBERTa 的做法是做 controlled replication:固定架构(BERT_LARGE),逐项拆解变量,测出每个变量的真实贡献。这篇论文的价值因此不在方法创新,而在于它把一批"创新"重新归因成了"工程细节"。
核心方法:四个改动 + 两个被低估的因素
改动一:Dynamic Masking(动态掩码)
先精确复述 BERT 原版的机制——这是很多人没意识到的细节。BERT 的原始实现在数据预处理阶段 mask 一次并保存,导致同一句话在整个训练中永远带着同一个 mask pattern。BERT 的解法很土:把训练数据复制 10 份,每份 mask 得不一样,然后在 40 个 epoch 里——用 RoBERTa 论文的原话——"each training sequence was seen with the same mask four times during training"。
RoBERTa 改为:每次把序列喂给模型时现场生成掩码 pattern。
论文指出这在训得更久或数据更大时才会变得关键("This becomes crucial when pretraining for more steps or with larger datasets")。表 1 的结论是:静态掩码的复现结果与原版 BERT 相当,动态掩码"comparable or slightly better",加上动态掩码还有额外效率收益,于是全文采用动态掩码。
这个细节的解释力极强:如果你在 2024 年用 300GB 数据训 BERT 原版配方,你会同时被静态掩码拖累——因为 10 份复制的技巧在数据量大、epoch 数少的情况下反而失效。这直接解释了大量"复现 BERT 但效果不如预期"的工程事故。
改动二:去掉 NSP,并改变输入格式
RoBERTa 对比了四种输入格式(表 2,全部模型训 1M steps、batch 256,5 个随机种子取中位数):
| 格式 | 说明 | NSP |
|---|---|---|
segment-pair+nsp |
BERT 原版:两段(可含多句)拼接,总长 < 512 | 有 |
sentence-pair+nsp |
只用单个自然句,batch size 相应放大以保持 token 数相当 | 有 |
full-sentences |
从一个或多个文档连续采样整句填满 ≤512 token,可跨文档边界,文档间加额外 separator token | 无 |
doc-sentences |
同上但不跨文档边界,短序列时动态调整 batch size | 无 |
论文的实验发现链条清晰:
sentence-pair+nsp比segment-pair+nsp差 → 论文归因为"模型学不到 long-range dependencies"(输入太短)- 去掉 NSP 匹配或略优于 已发表的 BERT_BASE 结果 → "removing the NSP loss matches or slightly improves downstream task performance, in contrast to Devlin et al. (2019)"——BERT 原论文声称去掉 NSP 会显著掉点(尤其 QNLI/MNLI/SQuAD 1.1),RoBERTa 的复现推翻了这一点
- 论文给了一个很讲究的解释:「It is possible that the original BERT implementation may only have removed the loss term while still retaining the segment-pair input format.」——即 BERT 论文的消融可能并没有同时改变输入格式,两件事纠缠在一起,导致结论被误读
doc-sentences略优于full-sentences,但因为 batch size 会变,作者为了便于与相关工作比较,最终采用full-sentences
⚠️ 明文负面发现:NSP 是 BERT 的两大预训练任务之一,RoBERTa 直接把它删掉,结论是删掉更好。结合 BERT 论文脚注 5「最终模型在 NSP 上达到 97%-98% 准确率」这个数字来看,NSP 提供的信号强度与其被赋予的重要性严重不匹配。
改动三:Large Batch + 调优学习率
关键约束是控制变量:所有设置都让模型对数据做相同遍数(epochs)且相同计算成本。
表 3(BERT_BASE,BookCorpus + Wikipedia,5 个种子中位数):
| bsz | steps | lr | ppl (held-out) | MNLI-m | SST-2 |
|---|---|---|---|---|---|
| 256 | 1M | 1e-4 | 3.99 | 84.7 | 92.7 |
| 2K | 125K | 7e-4 | 3.68 | 85.2 | 92.9 |
| 8K | 31K | 1e-3 | 3.77 | 84.6 | 92.8 |
论文的换算说明很清楚:BERT 原版 1M steps × bsz 256,等价于 125K steps × bsz 2K,或 31K steps × bsz 8K。
读法:perplexity 在 2K 时最好(3.68),但下游任务准确率并不严格跟随 ppl 走——8K 的 ppl 反而回升到 3.77,MNLI 也回落(84.6)。这是很实用的一条经验:MLM perplexity 不是下游任务的可靠代理指标。
另外两条工程经验(Section 3.1): - 「We found training to be very sensitive to the Adam epsilon term」——调 epsilon 常常能带来更好的性能或稳定性 - 「setting β2 = 0.98 to improve stability when training with large batch sizes」
改动四:Byte-level BPE,词表 30K → 50K
- BERT 原版:character-level BPE,30K 词表,且需先用启发式 tokenization rules 预处理输入
- RoBERTa:采用 Radford et al. (2019) 的 byte-level BPE,50K 词表,不做任何额外预处理或 tokenization
Byte-level BPE 的优势是能用有限的词表编码任意输入且不产生任何 unknown token。参数代价:BERT_BASE +15M,BERT_LARGE +20M。
⚠️ 明文负面发现:论文自己承认——"Early experiments revealed only slight differences between these encodings, with the Radford et al. (2019) BPE achieving slightly worse end-task performance on some tasks.",但作者认为 "the advantages of a universal encoding scheme outweighs the minor degredation in performance",仍然采用了它,并说详细对比留待未来工作。这是一个明确的"性能负收益但工程正收益"的取舍,作者选择了工程侧。
被低估因素一:数据规模与多样性
五个英文语料,合计超过 160GB 未压缩文本:
| 语料 | 大小 | 说明 |
|---|---|---|
| BookCorpus + English Wikipedia | 16GB | BERT 原版数据 |
| CC-News | 76GB | 作者自建,从 CommonCrawl News 英文部分抓取 2016-09 至 2019-02 间的 63 million 篇英文新闻,用 news-please 抽取 |
| OpenWebText | 38GB | Gokaslan & Cohen (2019) 的 WebText 开源复现版(Reddit 上至少三票分享的 URL 抓取内容) |
| Stories | 31GB | Trinh & Le (2018) 引入,从 CommonCrawl 过滤出符合 Winograd schema 故事风格的数据 |
CC-News 是本文的一个独立贡献——因为当时大量训练数据是私有的,无法公开,导致学术比较无法控制数据量变量。论文原话:「Unfortunately, not all of the additional datasets can be publicly released. For our study, we focus on gathering as much data as possible for experimentation, allowing us to match the overall quality and quantity of data as appropriate for each comparison.」
⚠️ 论文自陈的方法论缺陷(脚注 9,重要):
"Our experiments conflate increases in data size and diversity. We leave a more careful analysis of these two dimensions to future work."
即:16GB → 160GB 的提升中,规模与多样性的贡献没有被解耦。这是本文一个诚实但实质性的缺陷。
被低估因素二:训练步数
表 4(RoBERTa 累积改进,每行继承上一行):
| Model | data | bsz | steps | SQuAD (v1.1/v2.0) | MNLI-m | SST-2 |
|---|---|---|---|---|---|---|
| RoBERTa | Books+Wiki 16GB | 8K | 100K | 93.6/87.3 | 89.0 | 95.3 |
| + additional data | 160GB | 8K | 100K | 94.0/87.7 | 89.3 | 95.6 |
| + pretrain longer | 160GB | 8K | 300K | 94.4/88.7 | 90.0 | 96.1 |
| + pretrain even longer | 160GB | 8K | 500K | 94.6/89.4 | 90.2 | 96.4 |
| BERT_LARGE(对比) | Books+Wiki 13GB | 256 | 1M | 90.9/81.8 | 86.6 | 93.7 |
| XLNet_LARGE(对比) | Books+Wiki 13GB | 256 | 1M | 94.0/87.8 | 88.4 | 94.4 |
| XLNet_LARGE(对比) | + additional data 126GB | 2K | 500K | 94.5/88.8 | 89.8 | 95.6 |
⚠️ 注意 BERT_LARGE 那行的 13GB vs 上方 16GB 的差异——RoBERTa 脚注 3 解释了:「Yang et al. (2019) use the same dataset but report having only 13GB of text after data cleaning. This is most likely due to subtle differences in cleaning of the Wikipedia data.」这是"同一个语料、不同清洗脚本得到不同数据量"的活例子。
论文还写道:「even our longest-trained model does not appear to overfit our data and would likely benefit from additional training.」
最终配方
RoBERTa = BERT_LARGE 架构(L=24, H=1024, A=16, 355M 参数)
+ dynamic masking
+ full-sentences 且去掉 NSP loss
+ large mini-batches(最终用 8K)
+ byte-level BPE 50K
+ 160GB 数据(五个语料)
+ 500K steps
算力:RoBERTa_LARGE 用 1024 块 V100 训练约一天。
关键实验与数据
GLUE(表 5,全部基于 24 层架构)
开发集(single-task, single model,5 次运行中位数):
| Model | MNLI | QNLI | QQP | RTE | SST | MRPC | CoLA | STS | WNLI | Avg |
|---|---|---|---|---|---|---|---|---|---|---|
| BERT_LARGE | 86.6/- | 92.3 | 91.3 | 70.4 | 93.2 | 88.0 | 60.6 | 90.0 | - | - |
| XLNet_LARGE | 89.8/- | 93.9 | 91.8 | 83.8 | 95.6 | 89.2 | 63.6 | 91.8 | - | - |
| RoBERTa | 90.2/90.2 | 94.7 | 92.2 | 86.6 | 96.4 | 90.9 | 68.0 | 92.4 | 91.3 | - |
测试集(leaderboard,as of July 25, 2019,ensembles):
| Model | MNLI | QNLI | QQP | RTE | SST | MRPC | CoLA | STS | WNLI | Avg |
|---|---|---|---|---|---|---|---|---|---|---|
| ALICE | 88.2/87.9 | 95.7 | 90.7 | 83.5 | 95.2 | 92.6 | 68.6 | 91.1 | 80.8 | 86.3 |
| MT-DNN | 87.9/87.4 | 96.0 | 89.9 | 86.3 | 96.5 | 92.7 | 68.4 | 91.1 | 89.0 | 87.6 |
| XLNet | 90.2/89.8 | 98.6 | 90.3 | 86.3 | 96.8 | 93.0 | 67.8 | 91.6 | 90.4 | 88.4 |
| RoBERTa | 90.8/90.2 | 98.9 | 90.2 | 88.2 | 96.7 | 92.3 | 67.8 | 92.2 | 89.0 | 88.5 |
摘要级 verbatim 数字:RoBERTa 在公开 GLUE leaderboard 上取得 "88.5","matching the 88.4 reported by Yang et al. (2019)"(即 XLNet)。
两个技术细节(很值得学): - RTE / STS / MRPC 三个低资源任务,从 MNLI 单任务模型微调,而非从 baseline 预训练模型微调。这个 trick 今天在低资源场景仍常用。 - RoBERTa 不依赖 multi-task finetuning,而当时大多数头部提交依赖。论文说 "This is especially exciting because RoBERTa does not depend on multi-task finetuning, unlike most of the other top submissions."
SQuAD(表 6)
| Model | SQuAD 1.1 EM | SQuAD 1.1 F1 | SQuAD 2.0 EM | SQuAD 2.0 F1 |
|---|---|---|---|---|
| BERT_LARGE | 84.1 | 90.9 | 79.0 | 81.8 |
| XLNet_LARGE | 89.0 | 94.5 | 86.1 | 88.8 |
| RoBERTa(dev, 单模型, 无数据增强) | 88.9 | 94.6 | 86.5 | 89.4 |
| XLNet_LARGE(test) | 86.3† | 89.1† | ||
| RoBERTa(test) | 86.8 | 89.8 | ||
| XLNet + SG-Net Verifier(test) | 87.0† | 89.9† |
† 标记表示结果依赖额外外部训练数据。RoBERTa 在 dev 和 test 两个设置下都只用了提供的 SQuAD 数据。
RACE(表 7,test set)
| Model | Accuracy | Middle | High |
|---|---|---|---|
| BERT_LARGE | 72.0 | 76.6 | 70.1 |
| XLNet_LARGE | 81.7 | 85.4 | 80.2 |
| RoBERTa | 83.2 | 86.5 | 81.3 |
RACE 的做法:把每个候选答案与对应 question + passage 拼接,编码这 4 个序列,取各自 [CLS] 表示过全连接层预测;question-answer 对超过 128 token 就截断,必要时再截 passage,使总长 ≤ 512。
亮点与局限
真正的亮点
- 方法论上的贡献大于技术贡献。这篇论文示范了"怎么做一个诚实的 controlled replication",这套方法论在今天的复现性危机里仍然稀缺。
- 负面发现的能量:一篇"没提出新架构"的论文,把 BERT 的 NSP 设计、80/10/10 掩码策略、静态掩码实现、30K 词表——四大遗产中的四大——全部重新定性为"未调好的工程细节"。
- 公开了 CC-News,让后续研究第一次能在同量级公开数据上比较。
- 给出了"训练配方 > 架构创新"在当时强度的量化证据。
必须诚实标注的局限
- 【明文负面发现】byte-level BPE 带来轻微性能负收益。论文原话是 "slightly worse end-task performance on some tasks",作者仍选择采用,因为通用编码方案(无 unknown token)的工程价值更高。
- 【明文负面发现】数据规模与多样性混淆。脚注 9 自认 "conflate increases in data size and diversity",未做解耦分析。
- 【明文负面发现】BERT 复现结果与原论文在数据量上不一致(13GB vs 16GB),论文归因于 Wikipedia 清洗细节差异——这实际上是对整个 BERT 时代数据可复现性的一个警示。
- 【明文负面发现】模型架构未做探索。脚注 7 明确:"Studying architectural changes, including larger architectures, is an important area for future work."——全文固定架构。
- 【明文负面发现】WNLI 的损失是结构性的。RoBERTa 用 SuperGLUE reformatted 数据 + margin ranking loss + spaCy 候选短语生成,但论文坦承:"we can only make use of the positive training examples, which excludes over half of the provided training examples."
- QNLI 换了任务定义。测试提交采用了 pairwise ranking formulation(从训练集挖候选答案两两比较),"This formulation significantly simplifies the task, but is not directly comparable to BERT"——与 BERT 的 dev 数字不可直接对比(所以论文在 dev 集用纯分类方案报数)。
- TPU/硬件依赖:全文实验在 DGX-1(8×32GB V100,InfiniBand)上做 mixed precision 训练,1024 块 V100 跑一天——复现门槛极高,这是它当时没被更广泛采纳的直接原因。
- ⚠️ 榜单时效性:所有 leaderboard 数字标注为 "as of July 25, 2019",是 2019 年 7 月的快照,不代表当前状态。
对工程落地的启发
- 做自己的 BERT 复现时,优先改这五项(按性价比排序):动态掩码 → 去掉 NSP → 大 batch + 相应提 lr → 更多数据 → 更长训练。架构一点别动。
- 静态掩码是最容易踩的暗坑。如果你手上的训练脚本是"预处理时 mask 一次",并且在扩数据/延长训练,性能会低于预期。改法极简单:把 mask 逻辑挪到 dataloader 的
__getitem__里。 - mlm perplexity 不能当作下游任务的代理指标(表 3 的 2K vs 8K 对比)。模型选型请直接看下游 dev 分数。
- 大 batch 必须配 lr 缩放和 β2 调整(0.98),并且要调 Adam epsilon。这三条是一套的。
- 长文本任务(RACE 那种)需要特殊处理:截断策略直接决定上限,question-answer 对 128 token 这个阈值是经验值,值得在你的数据上重调。
- 低资源任务(<10K 样本)先在中等规模任务上微调再迁移(RoBERTa 的 RTE/STS/MRPC 做法),这是低成本高回报的工程模式。
- 数据清洗脚本要版本化。13GB vs 16GB 的差异说明:同一份语料,不同清洗逻辑会产生不同的"数据规模",从而污染所有跨论文比较。
- 【工程上最重要的一条】当你要评估一个新方法时,先确认 baseline 吃满了。RoBERTa 的核心教训:很多"新方法"的收益,在 baseline 调优后消失了。
与同方向工作的关系
直接上游
- BERT(1810.04805,本知识库同日另篇):RoBERTa 的复现对象。RoBERTa 把 BERT 的四个组件(静态掩码、NSP、character-level BPE 30K、sentence-pair 格式)逐一重新评估。
- XLNet(Yang et al., 2019):最重要的对照。RoBERTa 用完全相同的 MLM 目标追平了 XLNet,论文结论:"we re-establish that BERT's masked language model training objective is competitive with other recently proposed training objectives such as perturbed autoregressive language modeling"——但脚注 2 诚实补了一句:"It is possible that these other methods could also improve with more tuning."
- ELMo(Peters et al., 2018)、GPT(Radford et al., 2018)、XLM(Lample & Conneau, 2019)、Joshi et al. (2019):正文列为自训练谱系的相关工作,其中 XLM 与 Joshi 是最早质疑 NSP 必要性的两篇。
- fast.ai(Howard & Ruder, 2018):多任务微调范式。
- Baevski et al. (2019):数据规模对下游任务的影响,RoBERTa 据此设计数据量实验。
- You et al. (2019):大规模训练 BERT,batch 最高到 32K;RoBERTa 说 "We leave further exploration of the limits of large batch training to future work"。
- Kocijan et al. (2019):WNLI 的 margin ranking loss。
- Ott et al. (2018, 2019):NMT 大 batch 训练经验(学习率缩放)与 fairseq 框架。
后续影响
- RoBERTa 之后,领域默认的 encoder 底座几乎都采用了它的配方(byte-level BPE、动态掩码、无 NSP、大 batch)。ALBERT、DeBERTa 等后续 encoder 工作都在这个基线上做改进。
- 它的方法论被广泛继承:任何声称 SOTA 的新方法,若 baseline 没有对齐数据量/步数/batch size,审稿人都会要求补 controlled comparison。
- 数据规模维度被后续工作(GPT-3 的 scaling law 路线)推到极端。
适合谁读
- 要复现 BERT 或训练自己 encoder 底座的工程团队:这是逐条可执行的 checklist,价值极高。
- 正在评估"要不要换新架构"的团队:先读这篇。它会帮你判断基线是否已吃满。
- 做模型评测/榜单对比的分析人员:controlled comparison 的方法论范本。
- 做预训练数据工程的团队:CC-News 的构造流程(news-please 抽取、时间窗 2016-09 至 2019-02、63M 文章)可直接借鉴。
- 需要理解"负结果价值"的研究者:这篇论文示范了如何用一篇不改架构的复现论文产生四个有杀伤力的负面发现。
- 算力受限者请谨慎投入:1024×V100 一天的门槛意味着照搬全量配方不现实,应只取可迁移的单项改进(动态掩码、去 NSP、batch/lr 调整)。
证据边界与待核项
- 本篇数字全部取自 arXiv:1907.11692v1 的 abstract 页与 HTML 全文(fetch 时间 2026-11-04)。表 1(static vs dynamic)、表 2(输入格式)、表 3(batch size)、表 4(累积改进)、表 5(GLUE)、表 6(SQuAD)、表 7(RACE)均已回查正文数字。
- GitHub:论文脚注 1 与摘要明确给出 "We release our models and code",地址为
https://github.com/pytorch/fairseq(已由论文正文 verbatim 记录)。本次未执行对该仓库的实际 fetch 验证,其当前维护状态与具体模型权重可用性未经核实——引用前建议自查。 - 待核:表 1(static vs. dynamic masking)的逐格数字在 HTML 渲染中未能完整抽取为纯文本,本文只引用了该表的定性结论("comparable or slightly better"),未抄录具体数值。
- 待核:附录中的完整 GLUE 各任务测试集数字、以及超参搜索空间的细节(正文说 "We explore a slightly wider hyperparameter space, described in the Appendix")未逐条抄录。
- ⚠️ 时效性:所有 leaderboard 数字为 2019-07-25 快照;SQuAD/RACE 的当前 SOTA 早已远高于本文数值,本文所有 "state-of-the-art" 表述均为2019 年 7 月时点的历史陈述,不适用于当前判断。
- 本文未包含:RoBERTa 在 QNLI 与 WNLI 上的任务特定改造的完整实现细节(仅记录了论文中的描述),以及 RACE 上四候选答案拼接编码的完整超参。