RoBERTa:优化训练流程,让 BERT 更强

385 阅读7分钟

RoBERTa

RoBERTa 是 Facebook AI 提出的 BERT 改进版本,全名是 Robustly Optimized BERT Pretraining Approach。它并没有改变 BERT 的模型结构,而是通过对预训练流程的全方位优化,显著提升了模型性能。

原因是,研究人员发现,BERT的训练远未收敛,所以他们提出了几种对BERT模型预训练的方法。RoBERTa = 优化训练方法版 BERT

RoBERTa的改进

去掉下句预测(NSP)任务

RoBERTa 彻底移除了 NSP 任务,只保留 掩码语言模型(MLM)

BERT 原始论文中使用了两个预训练任务:

  1. 掩码语言模型(Masked Language Model, MLM)
  2. 下句预测(Next Sentence Prediction, NSP)

其中,NSP 的任务目标是:判断给定的两个句子,是否是原文中相邻的句子。

🌰 举个例子(BERT 的 NSP 任务):

  • 正例:
    句子A:"优弧给我1000w矿石"
    句子B:"我用矿石换了switch."
    ➜ 标记为 isNext
  • 负例:
    句子A:"优弧给我1000w矿石"
    句子B:"我是王帅帅他爹"
    ➜ 标记为 notNext

BERT 希望模型能学会捕捉句子之间的逻辑连贯性和上下文关系

之前ALBERT那个我们写了,大家觉得NSP任务没啥用,为了深入评估 NSP 的作用,研究者设计了以下四种训练设置,并使用相同的 BERT 模型架构在多个下游任务上进行评估:

训练设置是否使用NSP输入格式说明
片段对 + NSP✅ 是输入为两个片段(非严格意义的句子对),最多512个token,采用标准 BERT 的 NSP 任务
句子对 + NSP✅ 是输入为两个句子组成的句子对,可以来自同一文档或不同文档,长度限制为512个token
完整句❌ 否输入为一个完整文本片段(不使用 NSP),从一个或多个文件中连续采样,如果输入到达一个文件的末尾,那么就从下一个文件开始采样,最大长度512 token
文档句❌ 否与“完整句”类似,但只从同一个文档中采样,如果输入到达一个文件的末尾,就不会从下一个文件中采样,不跨文件边界

image.png

研究人员在以下四个任务上评估了模型表现:

  • SQuAD(问答任务,F1 分数)
  • MNLI-m(自然语言推理)
  • SST-2(情感分类)
  • RACE(多项选择阅读理解)

论文中这个表格的结果表明,不使用 NSP 的“完整句”和“文档句”训练方式,在多个任务上性能优于使用 NSP 的训练方式。“文档句”在效果上略优于“完整句”,但由于其采样更复杂、批大小不稳定,RoBERTa 最终选择使用“完整句”作为默认策略。

然后他们进行了深入分析,认为NSP有几个问题:

  1. NSP 任务太简单,没太多学习价值:句子之间是否相邻,模型可以凭借一些浅层线索(如主题相似、词语重合)来判断,不需要深层语义理解。
  2. NSP 混淆了“连贯性”和“相关性”:正例中的句子是自然连续的,但负例往往是随机配对,差距太大,模型容易抓住“话题不同”这种表层特征来猜,而不是去学真正的语义连贯性。
  3. 实验发现:移除 NSP 后,模型性能反而更好:RoBERTa 团队在 GLUE、SQuAD、RACE 等任务上进行了对比实验,只使用 MLM 而不使用 NSP 的模型,表现更强,尤其在句子级任务中明显受益。

所以最后RoBERTa 彻底移除了 NSP 任务,只保留 掩码语言模型(MLM)

动态掩码策略(Dynamic Masking)

我们都知道 BERT 使用的是“掩码语言模型”任务(MLM),简单说就是把句子里的某些词遮住(mask 掉),然后让模型猜出来原词是什么。

但在 BERT 里,这些被遮住的词在预处理阶段就已经一次性选定,也就是说,无论训练多少轮,模型看到的“填空题”都是那些固定位置。

RoBERTa 对此做了一个关键优化:动态掩码,每次训练时,随机重新选择要遮住的词,也就是说,每次看到的是不同的填空版本

比如:

优弧昨天突然给我发了1000w矿石,非让我换Switch。

"Youhu suddenly sent me 10 million ores yesterday and insisted that I trade them for a Switch."

如果是 BERT,它可能始终只遮住:

"Youhu suddenly sent me 10 million [MASK] yesterday and insisted that I trade them for a Switch."

但在 RoBERTa 中,对模型进行全数据训练,每次训练中看到的被遮盖的词都是不同的:

"Youhu suddenly sent me [MASK] million ores yesterday..."

"Youhu suddenly sent me 10 million ores yesterday and insisted that I [MASK] them..."

"Youhu [MASK] sent me 10 million ores yesterday..."

这样,模型不仅学会填“ores”这种固定位置的某个词语,还能更全面地学习整个句子的上下文关系、语法结构、词义分布。

更大数据集、更大批次

数据集

BERT 的预训练数据主要来自两个英文大规模文本语料:

  • BooksCorpus(多伦多图书语料库) :小说、故事类书籍,共约 800M 单词;
  • English Wikipedia(英文维基百科) :共约 2,500 万篇文章,去除表格、列表后的正文。

📦 这两个数据集合计大小约为 16GB,用于训练原始的 BERT 模型。

RoBERTa 在此基础上,进一步扩充了训练语料库,引入了三个全新的开放域数据集:

  1. CC-News:从 Common Crawl 中抽取的新闻数据,约 76GB;
  2. OpenWebText:模仿 OpenAI GPT 训练语料,从 Reddit 高质量链接页面抓取的网页文本,约 38GB;
  3. Stories:Common Crawl 的子集,包含大量连贯叙事文本,约 31GB。

📊 五个数据集总量合计达 160GB,是 BERT 原始语料的 10 倍

这种语料扩展使 RoBERTa 能够学习更多样、更多领域的语言模式,从而提升其泛化能力。

批量

在训练配置上,RoBERTa 同样进行了重要优化:BERT的预训练批量大小为256。而RoBERTa批量大小为8000。

采用字节级 BPE分词

BERT 使用的 WordPiece 分词器

  • 从字符开始构建词表;
  • 根据 语言统计特征(如互信息、似然增益)合并频繁子词;
  • 尽可能保留语义单元,减少 OOV(未登录词)。

例如:

Token:  unbelievable
WordPiece:  un ##believ ##able

RoBERTa 使用 Byte-Level Byte Pair Encoding (Byte-Level BPE) ,这是一种更底层、更通用的子词分词算法:

  • 操作单元为字节序列:分词操作在 0~255 范围的字节上进行,对所有输入都保持一致性,无需关心字符集或语言编码问题。

  • 可以处理任意输入:包括表情符号(emoji)、Unicode 特殊字符、甚至拼写错误的词汇,没有“未登录词”(OOV)的问题。

  • 一致性更强:不依赖语言规则,对英语、法语、代码等各种文本类型都能统一处理,非常适合跨领域任务。

  • 空格编码机制特殊:空格作为字符被编码,例如 " hello" 会被分词为 "Ġhello"(前缀 Ġ 表示空格),有助于模型区分词与词之间的边界。

例如:

Token:  "Hello😊"
Byte-Level BPE:  ['H', 'ello', '�', '�']

RoBERTa 的词表大小扩展至 50,000 个标记。

RoBERTa 通过采用字节级 BPE,不仅提升了对边缘文本的处理能力,还减少了 OOV 问题,为模型在多任务与跨领域中的稳定表现打下基础。

总结

RoBERTa 告诉我们,训练策略比结构更重要
它没有改变 BERT 的 Transformer 架构,但凭借优化数据规模、任务设计和训练方式,就能让模型在几乎所有任务上显著提升。