• 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

    1. class transformers.RobertaConfig
    2. ( pad_token_id = 1, bos_token_id = 0, eos_token_id = 2, **kwargs )

            这是用于存储 RobertaModel 或 TFRobertaModel 配置的配置类。它用于根据指定的参数实例化 RoBERTa 模型,定义模型体系结构。使用默认值实例化配置将产生与 RoBERTa (roberta-base)架构类似的配置。

            配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。

            RobertaConfig 类直接继承 BertConfig。它重用相同的默认值。请检查父类以获取更多信息(BertConfig

    1. from transformers import RobertaConfig, RobertaModel
    2. # 初始化 RoBERTa 配置
    3. configuration = RobertaConfig()
    4. # 从配置初始化模型
    5. model = RobertaModel(configuration)
    6. # 访问模型配置
    7. configuration = model.config

    3 RobertaTokenizer

    3.1 class transformers.RobertaTokenizer

    1. class transformers.RobertaTokenizer
    2. ( vocab_file, merges_file, errors = 'replace', bos_token = '',
    3. eos_token = '', sep_token = '', cls_token = '', unk_token = '', pad_token = '',
    4. 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 标记器。

            这个标记器已经被训练成把空格当作标记的一部分(有点像句子部分),所以一个词无论是否在句子的开头(没有空格),都会被不同地编码。

    1. from transformers import RobertaTokenizer
    2. tokenizer = RobertaTokenizer.from_pretrained("roberta-base")
    3. tokenizer("Hello world")['input_ids']
    4. [0, 31414, 232, 328, 2]
    5. tokenizer(" Hello world")['input_ids']
    6. [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

    1. ( token_ids_0: typing.List[int],
    2. 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

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

    4 RobertaModel

    4.1 class transformers.RobertaModel

    1. class transformers.RobertaModel
    2. ( 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 实例而不是 这样做,因为前者负责运行前处理和后处理步骤,而后者默默地忽略它们。

    1. from transformers import RobertaTokenizer, RobertaModel
    2. import torch
    3. tokenizer = RobertaTokenizer.from_pretrained("roberta-base")
    4. model = RobertaModel.from_pretrained("roberta-base")
    5. inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
    6. outputs = model(**inputs)
    7. 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 文档以了解与一般使用和行为相关的所有事项。

    1. from transformers import RobertaTokenizer, RobertaForCausalLM, RobertaConfig
    2. import torch
    3. tokenizer = RobertaTokenizer.from_pretrained("roberta-base")
    4. config = RobertaConfig.from_pretrained("roberta-base")
    5. config.is_decoder = True
    6. model = RobertaForCausalLM.from_pretrained("roberta-base", config=config)
    7. inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
    8. outputs = model(**inputs)
    9. prediction_logits = outputs.logits

    6 RobertaForSequenceClassification

    1. class transformers.RobertaForSequenceClassification
    2. ( 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 之后的注意力权重,用于计算自注意力头中的加权平均值。

    1. import torch
    2. from transformers import RobertaTokenizer, RobertaForSequenceClassification
    3. tokenizer = RobertaTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-emotion")
    4. model = RobertaForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-emotion")
    5. inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
    6. with torch.no_grad():
    7. logits = model(**inputs).logits
    8. predicted_class_id = logits.argmax().item()
    9. model.config.id2label[predicted_class_id]
    10. # 要在 `num_labels` 类上训练模型,可以将 `num_labels=num_labels` 传递给`.from_pretrained(...)
    11. num_labels = len(model.config.id2label)
    12. model = RobertaForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-emotion", num_labels=num_labels)
    13. labels = torch.tensor(1)
    14. loss = model(**inputs, labels=labels).loss
    15. round(loss.item(), 2)

  • 相关阅读:
    词云的可视化设计教程
    systemverilog运行的时候调用系统函数运行python等
    Python-----PyInstaller的简单使用
    4.10、matlab生成脉冲序列:pulstran()函数
    中国首幅1米分辨率土地覆盖图
    管道和FIFO
    【hadoop】纠删码技术详解
    NPM 使用入门
    关于安卓唯一标识的汇总及最佳做法
    基于Spring Boot的租房网站设计与实现
  • 原文地址:https://blog.csdn.net/qq_40671063/article/details/126447897