RoBERTa
RoBERTa 是 Facebook AI 提出的 BERT 改进版本,全名是 Robustly Optimized BERT Pretraining Approach。它并没有改变 BERT 的模型结构,而是通过对预训练流程的全方位优化,显著提升了模型性能。
原因是,研究人员发现,BERT的训练远未收敛,所以他们提出了几种对BERT模型预训练的方法。RoBERTa = 优化训练方法版 BERT
RoBERTa的改进
去掉下句预测(NSP)任务
RoBERTa 彻底移除了 NSP 任务,只保留 掩码语言模型(MLM) 。
BERT 原始论文中使用了两个预训练任务:
- 掩码语言模型(Masked Language Model, MLM)下句预测(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 |
文档句 | ❌ 否 | 与“完整句”类似,但只从同一个文档中采样,如果输入到达一个文件的末尾,就不会从下一个文件中采样,不跨文件边界 |
研究人员在以下四个任务上评估了模型表现:
- SQuAD(问答任务,F1 分数)MNLI-m(自然语言推理)SST-2(情感分类)RACE(多项选择阅读理解)
论文中这个表格的结果表明,不使用 NSP 的“完整句”和“文档句”训练方式,在多个任务上性能优于使用 NSP 的训练方式。“文档句”在效果上略优于“完整句”,但由于其采样更复杂、批大小不稳定,RoBERTa 最终选择使用“完整句”作为默认策略。
然后他们进行了深入分析,认为NSP有几个问题:
- NSP 任务太简单,没太多学习价值:句子之间是否相邻,模型可以凭借一些浅层线索(如主题相似、词语重合)来判断,不需要深层语义理解。NSP 混淆了“连贯性”和“相关性”:正例中的句子是自然连续的,但负例往往是随机配对,差距太大,模型容易抓住“话题不同”这种表层特征来猜,而不是去学真正的语义连贯性。实验发现:移除 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 在此基础上,进一步扩充了训练语料库,引入了三个全新的开放域数据集:
- CC-News:从 Common Crawl 中抽取的新闻数据,约 76GB;OpenWebText:模仿 OpenAI GPT 训练语料,从 Reddit 高质量链接页面抓取的网页文本,约 38GB;Stories:Common Crawl 的子集,包含大量连贯叙事文本,约 31GB。
📊 五个数据集总量合计达 160GB,是 BERT 原始语料的 10 倍。
这种语料扩展使 RoBERTa 能够学习更多样、更多领域的语言模式,从而提升其泛化能力。
批量
在训练配置上,RoBERTa 同样进行了重要优化:BERT的预训练批量大小为256。而RoBERTa批量大小为8000。
采用字节级 BPE分词
BERT 使用的 WordPiece 分词器:
- 从字符开始构建词表;根据 语言统计特征(如互信息、似然增益)合并频繁子词;尽可能保留语义单元,减少 OOV(未登录词)。
例如:
Token: unbelievableWordPiece: 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 架构,但凭借优化数据规模、任务设计和训练方式,就能让模型在几乎所有任务上显著提升。