英文

RoBERTa 大模型

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 模型是在下列五个数据集的合并上进行预训练的:

  • BookCorpus ,一个包含11,038本未出版图书的数据集;
  • 英文维基百科 (不包括列表、表格和标题);
  • CC-News ,一个包含自2016年9月至2019年2月期间爬取的6300万篇英文新闻文章的数据集;
  • OpenWebText ,GPT-2 训练所使用的 WebText 数据集的开源重制版;
  • Stories ,一个包含筛选后与 Winograd schemas 故事样式相匹配的 CommonCrawl 数据子集。

这些数据集的总大小为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

BibTeX 引用和引用信息

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