Transformers - Roberta(huggingface)

目录

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


1 Overview

        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 上取得了最先进的结果。这些结果突出了以前被忽视的设计选择的重要性,并对最近报告的改进来源提出了质疑。我们发布了我们的模型和代码。

  • 这个实现与BertModel相同,只是对嵌入进行了微小的调整,并对Roberta预训练模型进行了设置;
  • RoBERTa 具有与 BERT 相同的架构,但使用字节级 BPE 作为标记器(与 GPT-2 相同),并使用了不同的预训练方案;
  • RoBERTa 没有 token_type_ids,你不需要指明哪个 token 属于哪个段。只需使用分隔标记 tokenizer.sep_token (或 )分隔您的段;
  • CamemBERT 是 RoBERTa 的包装器;

2 RobertaConfig

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

3 RobertaTokenizer

3.1 class transformers.RobertaTokenizer

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,其中包含大部分主要方法。

3.2 build_inputs_with_special_tokens

( 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 序列具有以下格式:

  • single sequence:  X
  • pair of sequences:  A B

3.3 get_special_tokens_mask

( 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方法添加特殊令牌时,该方法被调用。

3.4 create_token_type_ids_from_sequences

( 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,因此返回一个零列表。

3.5 save_vocabulary

( save_directory: str, filename_prefix: typing.Optional[str] = None )

4 RobertaModel

4.1 class transformers.RobertaModel

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

5 RobertaForCausalLM

5.1 class transformers.RobertaForCausalLM

参数

        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

6 RobertaForSequenceClassification

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)

你可能感兴趣的:(编程,自然语言处理,深度学习,python)