RoBERTa 是一个在英语语言上使用遮蔽语言模型 (MLM) 目标进行预训练的模型。它是在 这篇论文 中提出的,并首次在 这个代码库 中发布。该模型是区分大小写的:它将英文和 English 视为不同。
免责声明:发布 RoBERTa 的团队未为该模型撰写模型卡片,因此此模型卡片由 Hugging Face 团队撰写。
RoBERTa 是一个在大型英文语料库上进行自监督训练的 Transformer 模型。这意味着它仅使用原始文本进行预训练,没有以任何方式人为标注这些文本(这就是为什么它可以使用大量公开可用的数据),并通过自动过程从这些文本中生成输入和标签。
更具体地说,它使用遮蔽语言建模(MLM)目标进行预训练。对于一个句子,该模型会随机遮蔽输入中 15% 的单词,然后通过整个遮蔽后的句子运行模型,并且需要预测被遮蔽的单词。这与传统的递归神经网络(RNN)通常逐个单词地处理单词不同,也与像 GPT 这样的自回归模型在内部遮蔽未来标记的方式不同。它使得模型可以学习句子的双向表示。
通过这种方式,模型学习了英语语言的内部表示,可以用于提取对下游任务有用的特征:例如,如果你有一个带有标签的句子数据集,可以使用 BERT 模型产生的特征作为输入来训练标准分类器。
你可以使用原始模型进行遮蔽语言建模,但它主要用于在下游任务上进行微调。请参考 模型中心 上与你感兴趣的任务相对应的微调版本。
请注意,该模型主要用于在使用整个句子(可能是遮蔽的)进行决策的任务上进行微调,例如序列分类、标记分类或问答。对于文本生成等任务,你应该查看像 GPT2 这样的模型。
你可以使用该模型直接进行遮蔽语言建模的管道操作:
>>> from transformers import pipeline
>>> unmasker = pipeline('fill-mask', model='roberta-large')
>>> unmasker("Hello I'm a <mask> model.")
[{'sequence': "<s>Hello I'm a male model.</s>",
'score': 0.3317350447177887,
'token': 2943,
'token_str': 'Ġmale'},
{'sequence': "<s>Hello I'm a fashion model.</s>",
'score': 0.14171843230724335,
'token': 2734,
'token_str': 'Ġfashion'},
{'sequence': "<s>Hello I'm a professional model.</s>",
'score': 0.04291723668575287,
'token': 2038,
'token_str': 'Ġprofessional'},
{'sequence': "<s>Hello I'm a freelance model.</s>",
'score': 0.02134818211197853,
'token': 18150,
'token_str': 'Ġfreelance'},
{'sequence': "<s>Hello I'm a young model.</s>",
'score': 0.021098261699080467,
'token': 664,
'token_str': 'Ġyoung'}]
以下是如何在 PyTorch 中使用该模型获取给定文本的特征:
from transformers import RobertaTokenizer, RobertaModel
tokenizer = RobertaTokenizer.from_pretrained('roberta-large')
model = RobertaModel.from_pretrained('roberta-large')
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='pt')
output = model(**encoded_input)
以及在 TensorFlow 中:
from transformers import RobertaTokenizer, TFRobertaModel
tokenizer = RobertaTokenizer.from_pretrained('roberta-large')
model = TFRobertaModel.from_pretrained('roberta-large')
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='tf')
output = model(encoded_input)
该模型的训练数据包含大量来自互联网的未经过滤的内容,远非中立。因此,模型可能存在偏见的预测结果:
>>> from transformers import pipeline
>>> unmasker = pipeline('fill-mask', model='roberta-large')
>>> unmasker("The man worked as a <mask>.")
[{'sequence': '<s>The man worked as a mechanic.</s>',
'score': 0.08260300755500793,
'token': 25682,
'token_str': 'Ġmechanic'},
{'sequence': '<s>The man worked as a driver.</s>',
'score': 0.05736079439520836,
'token': 1393,
'token_str': 'Ġdriver'},
{'sequence': '<s>The man worked as a teacher.</s>',
'score': 0.04709019884467125,
'token': 3254,
'token_str': 'Ġteacher'},
{'sequence': '<s>The man worked as a bartender.</s>',
'score': 0.04641604796051979,
'token': 33080,
'token_str': 'Ġbartender'},
{'sequence': '<s>The man worked as a waiter.</s>',
'score': 0.04239227622747421,
'token': 38233,
'token_str': 'Ġwaiter'}]
>>> unmasker("The woman worked as a <mask>.")
[{'sequence': '<s>The woman worked as a nurse.</s>',
'score': 0.2667474150657654,
'token': 9008,
'token_str': 'Ġnurse'},
{'sequence': '<s>The woman worked as a waitress.</s>',
'score': 0.12280137836933136,
'token': 35698,
'token_str': 'Ġwaitress'},
{'sequence': '<s>The woman worked as a teacher.</s>',
'score': 0.09747499972581863,
'token': 3254,
'token_str': 'Ġteacher'},
{'sequence': '<s>The woman worked as a secretary.</s>',
'score': 0.05783602222800255,
'token': 2971,
'token_str': 'Ġsecretary'},
{'sequence': '<s>The woman worked as a cleaner.</s>',
'score': 0.05576248839497566,
'token': 16126,
'token_str': 'Ġcleaner'}]
这种偏见也会影响该模型的所有微调版本。
RoBERTa 模型是在下列五个数据集的合并上进行预训练的:
这些数据集的总大小为160GB。
使用字节版本的 Byte-Pair Encoding (BPE) 对文本进行分词处理,词汇表大小为50,000。模型的输入采用由512个连续令牌组成的片段,这些片段可能跨越多个文档。新文档的开头由 <s> 标记,并由 </s> 标记表示文档的结尾。
对于每个句子的遮蔽过程的详细信息如下:
15% 的令牌被遮蔽。
在80%的情况下,遮蔽的令牌被 <mask> 替换。
在10%的情况下,遮蔽的令牌被与其替换的令牌(不同于原始令牌)替换。
在剩下的10%中,遮蔽的令牌保持不变。
与 BERT 不同,遮蔽是在预训练过程中动态进行的(例如,每个时期都会变化,而不是固定的)。
该模型在1024个 V100 GPU 上进行了500K步的训练,批量大小为8K,序列长度为512。使用的优化器是 Adam,学习率为4e-4,β 1 = 0.9,β 2 = 0.98,ϵ = 1e-6,权重衰减为0.01,学习率预热为30,000步,学习率线性衰减。
在下游任务上进行微调时,该模型实现了以下结果:
GLUE 测试结果:
Task | MNLI | QQP | QNLI | SST-2 | CoLA | STS-B | MRPC | RTE |
---|---|---|---|---|---|---|---|---|
90.2 | 92.2 | 94.7 | 96.4 | 68.0 | 96.4 | 90.9 | 86.6 |
@article{DBLP:journals/corr/abs-1907-11692,
author = {Yinhan Liu and
Myle Ott and
Naman Goyal and
Jingfei Du and
Mandar Joshi and
Danqi Chen and
Omer Levy and
Mike Lewis and
Luke Zettlemoyer and
Veselin Stoyanov},
title = {RoBERTa: {A} Robustly Optimized {BERT} Pretraining Approach},
journal = {CoRR},
volume = {abs/1907.11692},
year = {2019},
url = {http://arxiv.org/abs/1907.11692},
archivePrefix = {arXiv},
eprint = {1907.11692},
timestamp = {Thu, 01 Aug 2019 08:59:33 +0200},
biburl = {https://dblp.org/rec/journals/corr/abs-1907-11692.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}