目录
1 Overview
2 RobertaConfig
3 RobertaTokenizer
3.1 class transformers.RobertaTokenizer
3.2 build_inputs_with_special_tokens
3.3 get_special_tokens_mask
3.4 create_token_type_ids_from_sequences
3.5 save_vocabulary
4 RobertaModel
4.1 class transformers.RobertaModel
5 RobertaForCausalLM
5.1 class transformers.RobertaForCausalLM
6 RobertaForSequenceClassification
RoBERTa 模型是由Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov 在 RoBERTa: A Robustly Optimized BERT Pretraining Approach [pdf] 中提出的。它基于谷歌 2018 年发布的 BERT 模型。
它建立在 BERT 之上并修改了关键超参数,删除了下一句预训练目标,并使用更大的mini-batch和学习率进行训练。
论文摘要如下:
语言模型预训练带来了显著的性能提升,但不同方法之间的仔细比较是具有挑战性的。训练的计算成本很高,通常在不同大小的私有数据集上完成,而且,正如我们将展示的,超参数选择对最终结果有重大影响。
我们提出了一项 BERT 预训练的复制研究(Devlin 等人,2019 年),该研究仔细测量了许多关键超参数和训练数据大小的影响。我们发现 BERT 训练不足,并且可以匹配或超过其后发布的每个模型的性能。我们最好的模型在 GLUE、RACE 和 SQuAD 上取得了最先进的结果。这些结果突出了以前被忽视的设计选择的重要性,并对最近报告的改进来源提出了质疑。我们发布了我们的模型和代码。
class transformers.RobertaConfig
( pad_token_id = 1, bos_token_id = 0, eos_token_id = 2, **kwargs )
这是用于存储 RobertaModel 或 TFRobertaModel 配置的配置类。它用于根据指定的参数实例化 RoBERTa 模型,定义模型体系结构。使用默认值实例化配置将产生与 RoBERTa (roberta-base)架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
RobertaConfig 类直接继承 BertConfig。它重用相同的默认值。请检查父类以获取更多信息(BertConfig)
from transformers import RobertaConfig, RobertaModel
# 初始化 RoBERTa 配置
configuration = RobertaConfig()
# 从配置初始化模型
model = RobertaModel(configuration)
# 访问模型配置
configuration = model.config
class transformers.RobertaTokenizer
( vocab_file, merges_file, errors = 'replace', bos_token = '',
eos_token = '', sep_token = '', cls_token = '', unk_token = '', pad_token = '',
mask_token = '', add_prefix_space = False, **kwargs )
Parameters
vocab_file (str) — 词汇文件的路径;
merges_file (str) — 合并文件的路径;
errors(str,可选,默认为“replace”)- 将字节解码为 UTF-8 时遵循的范式;
bos_token (str, optional, 默认为 "") — 预训练期间使用的序列标记的开头。(使用特殊标记构建序列时,这不是用于序列开始的标记。使用的token是 cls_token。)
eos_token (str, optional, 默认为 "") — 序列标记的结尾;(使用特殊标记构建序列时,这不是用于序列结束的标记。使用的令牌是 sep_token。)
sep_token (str, optional, 默认为 "") — 分隔符标记,用于从多个序列构建序列时使用,例如两个序列用于序列分类或一个文本和一个用于问答的问题。它还用作使用特殊标记构建的序列的最后一个标记;
cls_token (str, optional, 默认为 "") — 进行序列分类时使用的分类器标记(整个序列的分类而不是每个标记的分类)。当使用特殊标记构建时,它是序列的第一个标记;
unk_token(str,可选,默认为“”) - 未知令牌。不在词汇表中的标记无法转换为 ID,而是设置为此标记;
pad_token (str, optional, 默认为 "
mask_token (str, optional, 默认为 "
add_prefix_space (bool, optional, 默认为 False) — 是否向输入添加初始空间。这允许像对待任何其他词一样对待前导词。 (RoBERTa 分词器通过前面的空格检测单词的开头)
使用字节级 Byte-Pair-Encoding 构造从 GPT-2 标记器派生的 RoBERTa 标记器。
这个标记器已经被训练成把空格当作标记的一部分(有点像句子部分),所以一个词无论是否在句子的开头(没有空格),都会被不同地编码。
from transformers import RobertaTokenizer
tokenizer = RobertaTokenizer.from_pretrained("roberta-base")
tokenizer("Hello world")['input_ids']
[0, 31414, 232, 328, 2]
tokenizer(" Hello world")['input_ids']
[0, 20920, 232, 2]
您可以通过在实例化此标记器或在某些文本上调用它时传递 add_prefix_space=True 来绕过该行为,但由于模型没有以这种方式进行预训练,因此可能会导致性能下降。
当与 is_split_into_words=True 一起使用时,此标记器将在每个单词(甚至是第一个单词)之前添加一个空格。
此标记器继承自 PreTrainedTokenizer,其中包含大部分主要方法。
( token_ids_0: typing.List[int]token_ids_1: typing.Optional[typing.List[int]] = None ) → List[int]
Parameters
token_ids_0 (List[int]) — 将添加特殊令牌的 ID 列表;
token_ids_1 (List[int], optional) — 序列对的可选第二个 ID 列表。
Returns List[int]
具有适当特殊标记的输入 ID 列表。
通过连接和添加特殊标记,为序列分类任务从一个序列或一对序列构建模型输入。 RoBERTa 序列具有以下格式:
X
A B
( token_ids_0: typing.List[int],
token_ids_1: typing.Optional[typing.List[int]] = None, already_has_special_tokens: bool = False ) → List[int]
Parameters
token_ids_0 (List[int]) — ID 列表;
token_ids_1 (List[int], optional) — 序列对的可选第二个 ID 列表;
already_has_special_tokens (bool, optional, 默认为 False) — 标记列表是否已经用模型的特殊标记格式化;
Returns List[int]
[0, 1] 范围内的整数列表:1 表示特殊标记,0 表示序列标记;
从一个没有添加特殊标记的标记列表中检索序列ID。当使用tokenizer prepare_for_model方法添加特殊令牌时,该方法被调用。
( token_ids_0: typing.List[int], token_ids_1: typing.Optional[typing.List[int]] = None ) → List[int]
token_ids_0 (List[int]) — ID 列表;
token_ids_1 (List[int], optional) — 序列对的可选第二个 ID 列表。
Returns List[int]
零列表。
从传递的两个序列中创建一个掩码,以用于序列对分类任务。 RoBERTa 不使用令牌类型 ID,因此返回一个零列表。
( save_directory: str, filename_prefix: typing.Optional[str] = None )
class transformers.RobertaModel
( config, add_pooling_layer = True )
Parameters
config (RobertaConfig) — 具有模型所有参数的模型配置类。使用配置文件进行初始化不会加载与模型关联的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重
RoBERTa 模型转换器输出原始隐藏状态,顶部没有任何特定的头部。
该模型继承自 PreTrainedModel。检查该库为其所有模型实现的通用方法的超类文档(例如下载或保存、调整输入嵌入的大小、修剪头等)
该模型也是 PyTorch 的 torch.nn.Module 子类。
该模型可以充当编码器(只有自注意力)和解码器,在这种情况下,在自注意力层之间添加一个交叉注意力层,遵循 Attention is all you need_ by Ashish 中描述的架构Vaswani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、Aidan N. Gomez、Lukasz Kaiser 和 Illia Polosukhin。
要充当解码器,需要使用配置的 is_decoder 参数初始化模型,并将其设置为 True。要在 Seq2Seq 模型中使用,模型需要初始化,同时将 is_decoder 参数和 add_cross_attention 设置为 True;然后,encoder_hidden_states 被期望作为前向传递的输入。
Parameters
input_ids (torch.LongTensor of shape (batch_size, sequence_length)) — 词汇表中输入序列标记的索引;
attention_mask (torch.FloatTensor of shape (batch_size, sequence_length), optional) — 避免对填充标记索引执行注意的掩码。在 [0, 1] 中选择的掩码值:
1表示未掩盖的令牌,
0表示被掩盖的标记。
token_type_ids (torch.LongTensor of shape (batch_size, sequence_length), optional) — 分段标记索引以指示输入的第一和第二部分。在 [0, 1] 中选择索引:
0对应一个句子A的token,
1 对应一个句子 B 的token
position_ids (torch.LongTensor of shape (batch_size, sequence_length), optional) — 每个输入序列标记在位置嵌入中的位置索引。在 [0, config.max_position_embeddings - 1] 范围内选择。
head_mask (torch.FloatTensor of shape (num_heads,) or (num_layers, num_heads), optional) — 使自注意力模块的选定头部无效的掩码。在 [0, 1] 中选择的掩码值:
1 表示头部没有被屏蔽,
0 表示头部被屏蔽。
inputs_embeds (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size), optional) — 可选地,您可以选择直接传递嵌入式表示,而不是传递 input_ids。如果您希望比模型的内部嵌入查找矩阵更好地控制如何将 input _ ids 索引转换为相关向量,那么这非常有用。
output_attentions (bool, optional) — 是否返回所有注意力层的注意力张量。
output_hidden_states (bool, optional) — 是否返回所有层的隐藏状态。
return_dict (bool, optional) — 是否返回 ModelOutput 而不是普通元组。
encoder_hidden_states (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size), optional) — 编码器最后一层输出的隐藏状态序列。如果模型配置为解码器,则用于交叉注意。
encoder_attention_mask (torch.FloatTensor of shape (batch_size, sequence_length), optional) — 避免对编码器输入的填充标记索引执行注意的掩码。如果模型配置为解码器,则此掩码用于交叉注意。在 [0, 1] 中选择的掩码值:
1 表示未屏蔽的令牌;
0 表示被屏蔽的令牌。
Past_key_values (tuple(tuple(torch.FloatTensor)) 长度为 config.n_layers,每个元组有 4 个形状张量 (batch_size, num_heads, sequence_length - 1, embed_size_per_head)) — 包含注意块的预先计算的键和值隐藏状态。可用于加速解码。
如果使用了 past_key_values,用户可以选择只输入形状为 (batch_size, 1) 的最后一个 decoder_input_ids(那些没有将其过去的键值状态赋予该模型的那些),而不是所有形状为 (batch_size, sequence_length) 的decoder_input_ids。
use_cache (bool, optional) — 如果设置为 True,则返回 past_key_values 键值状态并可用于加速解码(请参阅 past_key_values)。
Returns
transformers.modeling_outputs.BaseModelOutputWithPoolingAndCrossAttentions 或元组(torch.FloatTensor)
一个transformers.modeling_outputs.BaseModelOutputWithPoolingAndCrossAttentions 或一个torch.FloatTensor 的元组(如果传递了return_dict=False 或当config.return_dict=False 时),包括取决于配置(RobertaConfig)和输入的各种元素;
last_hidden_state (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size)) — 模型最后一层输出的隐藏状态序列。
pooler_output (torch.FloatTensor of shape (batch_size, hidden_size)) — 在通过用于辅助预训练任务的层进行进一步处理后,序列的第一个标记(分类标记)的最后一层隐藏状态。例如。对于 BERT 系列模型,这会在通过线性层和 tanh 激活函数处理后返回分类标记。线性层权重在预训练期间从下一个句子预测(分类)目标进行训练。
hidden_states (tuple(torch.FloatTensor),可选,当 output_hidden_states=True 被传递或当 config.output_hidden_states=True 时返回) — torch.FloatTensor 的元组(一个用于嵌入的输出,如果模型有嵌入层,+一个用于每一层的输出)形状(batch_size,sequence_length,hidden_size)。
每层输出的模型隐藏状态加上可选的初始嵌入输出。
attentions (tuple(torch.FloatTensor),可选,当 output_attentions=True 被传递或当 config.output_attentions=True 时返回) — 形状为 (batch_size, num_heads, sequence_length, sequence_length) 的 torch.FloatTensor 元组(每层一个)。
注意力 softmax 之后的注意力权重,用于计算自注意力头中的加权平均值。
cross_attentions (tuple(torch.FloatTensor),可选,当 output_attentions=True 和 config.add_cross_attention=True 被传递或当 config.output_attentions=True 时返回) — 形状为 (batch_size, num_heads) 的 torch.FloatTensor 元组(每层一个) ,序列长度,序列长度)。
解码器的交叉注意力层的注意力权重,在注意力 softmax 之后,用于计算交叉注意力头中的加权平均值。
past_key_values (tuple(tuple(torch.FloatTensor)),可选,在传递 use_cache=True 或 config.use_cache=True 时返回) — 长度为 config.n_layers 的 tuple(torch.FloatTensor) 的元组,每个元组有 2 个张量形状(batch_size,num_heads,sequence_length,embed_size_per_head))和可选,如果 config.is_encoder_decoder=True 2 个额外的形状张量(batch_size,num_heads,encoder_sequence_length,embed_size_per_head)。
包含预先计算的隐藏状态(自注意力块中的键和值,以及交叉注意力块中的可选 config.is_encoder_decoder=True),可用于加速顺序解码(参见 past_key_values 输入)。
RobertaModel forward 方法覆盖了 __call__ 特殊方法。
尽管需要在此函数中定义前向传递的方法,但应该在之后调用 Module 实例而不是 这样做,因为前者负责运行前处理和后处理步骤,而后者默默地忽略它们。
from transformers import RobertaTokenizer, RobertaModel
import torch
tokenizer = RobertaTokenizer.from_pretrained("roberta-base")
model = RobertaModel.from_pretrained("roberta-base")
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state
参数
config (RobertaConfig) — 具有模型所有参数的模型配置类。使用配置文件进行初始化不会加载与模型关联的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
RoBERTa 模型,顶部带有语言建模头,用于 CLM 微调。
该模型继承自 PreTrainedModel。检查该库为其所有模型实现的通用方法的超类文档(例如下载或保存、调整输入嵌入的大小、修剪头等)
该模型也是 PyTorch 的 torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参阅 PyTorch 文档以了解与一般使用和行为相关的所有事项。
from transformers import RobertaTokenizer, RobertaForCausalLM, RobertaConfig
import torch
tokenizer = RobertaTokenizer.from_pretrained("roberta-base")
config = RobertaConfig.from_pretrained("roberta-base")
config.is_decoder = True
model = RobertaForCausalLM.from_pretrained("roberta-base", config=config)
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
outputs = model(**inputs)
prediction_logits = outputs.logits
class transformers.RobertaForSequenceClassification
( config )
Parameters
config (RobertaConfig) — 具有模型所有参数的模型配置类。使用配置文件进行初始化不会加载与模型关联的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
带有序列分类/回归头的 RoBERTa 模型转换器(在合并输出的顶部有一个线性层) ,例如,用于 GLUE 任务。
该模型继承自 PreTrainedModel。
该模型也是 PyTorch 的 torch.nn.Module 子类。将其用作常规 PyTorch 模块。
Parameters(forward)
input_ids (torch.LongTensor of shape (batch_size, sequence_length)) — 词汇表中输入序列标记的索引;
可以使用 RobertaTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call();
attention_mask (torch.FloatTensor of shape (batch_size, sequence_length), optional) — 避免对填充标记索引执行注意的掩码。在 [0, 1] 中选择的掩码值:
1表示未屏蔽的令牌;
0表示被屏蔽的令牌;
token_type_ids (torch.LongTensor of shape (batch_size, sequence_length), optional) — 分段标记索引以指示输入的第一和第二部分。在 [0, 1] 中选择索引:
0对应一个句子A的token;
1 对应一个句子 B 的记号;
position_ids (torch.LongTensor of shape (batch_size, sequence_length), optional) — 每个输入序列标记在位置嵌入中的位置索引。在 [0, config.max_position_embeddings - 1] 范围内选择。
head_mask (torch.FloatTensor of shape (num_heads,) or (num_layers, num_heads), optional) — 使自注意力模块的选定头部无效的掩码。在 [0, 1] 中选择的掩码值:
1 表示头部没有被屏蔽,
0 表示头部被屏蔽;
inputs_embeds (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size), optional) — 可选地,您可以选择直接传递嵌入式表示,而不是传递 input_ids。如果您希望更好地控制如何将 input_ids 索引转换为关联向量,而不是模型的内部嵌入查找矩阵,这将非常有用。
output_attentions (bool, optional) — 是否返回所有注意力层的注意力张量。
output_hidden_states (bool, optional) — 是否返回所有层的隐藏状态。
return_dict (bool, optional) — 是否返回 ModelOutput 而不是普通元组。
label (torch.LongTensor of shape (batch_size,), optional) — 用于计算序列分类/回归损失的标签。索引应该在 [0, ..., config.num_labels - 1] 中。如果 config.num_labels == 1 计算回归损失(均方损失),如果 config.num_labels > 1 计算分类损失(交叉熵)。
返回
transformers.modeling_outputs.SequenceClassifierOutput或元组(torch.FloatTensor)
一个transformers.modeling_outputs.SequenceClassifierOutput 或一个torch.FloatTensor 的元组(如果return_dict=False 被传递或当config.return_dict=False 时)包含各种元素,具体取决于配置(RobertaConfig)和输入。
损失(torch.FloatTensor 形状: (1,),可选,在提供标签时返回)- 分类(或回归,如果 config.num_labels==1)损失。
logits (torch.FloatTensor of shape (batch_size, config.num_labels)) — 分类(或回归,如果 config.num_labels==1)得分(在 SoftMax 之前)。
hidden_states (tuple(torch.FloatTensor), 可选,当 output_hidden_states=True 被传递或当 config.output_hidden_states=True 时返回) — torch.FloatTensor 的元组(一个用于嵌入的输出,如果模型有嵌入层,+一个用于每一层的输出)形状(batch_size,sequence_length,hidden_size)。
每层输出的模型隐藏状态加上可选的初始嵌入输出。
attentions (tuple(torch.FloatTensor),可选,当 output_attentions=True 被传递或当 config.output_attentions=True 时返回) — 形状为 (batch_size, num_heads, sequence_length, sequence_length) 的 torch.FloatTensor 元组(每层一个)。
注意力 softmax 之后的注意力权重,用于计算自注意力头中的加权平均值。
import torch
from transformers import RobertaTokenizer, RobertaForSequenceClassification
tokenizer = RobertaTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-emotion")
model = RobertaForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-emotion")
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
with torch.no_grad():
logits = model(**inputs).logits
predicted_class_id = logits.argmax().item()
model.config.id2label[predicted_class_id]
# 要在 `num_labels` 类上训练模型,可以将 `num_labels=num_labels` 传递给`.from_pretrained(...)
num_labels = len(model.config.id2label)
model = RobertaForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-emotion", num_labels=num_labels)
labels = torch.tensor(1)
loss = model(**inputs, labels=labels).loss
round(loss.item(), 2)