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} }