抱抱脸(hugging face)教程-中文翻译-创建一个自定义架构

创建一个自定义架构

AutoClass 自动推导模型架构,并下载预先训练的配置和权重。通常,我们建议使用 AutoClass 生成与检查点无关的代码。但是,想要更多地控制特定模型参数的用户可以从几个基类创建自定义的 Transformers 模型。对于那些对研究、训练或试验变形金刚模型感兴趣的人来说,这本书特别有用本指南深入探讨如何在没有 AutoClass 的情况下创建自定义模型如何:

  • 加载并自定义模型配置。
  • 创建一个模型架构
  • 为文本创建一个缓慢和快速的标记器。
  • 为音频或图像任务创建一个特征提取器。
  • 为多通道任务创建处理器。

配置

配置引用模型的特定属性。每个模型配置都有不同的属性,例如,所有的 NLP 模型都有共同的 hidden_size、 num_attention_heads、 num_hidden_layers 和 vocab_size 属性。这些属性指定用于构建模型的注意力头或隐藏层的数量。

通过访问 distillbertconfig 来检查它的属性,可以进一步了解 distillbert:

from transformers import DistilBertConfig

config = DistilBertConfig()
print(config)
DistilBertConfig {
  "activation": "gelu",
  "attention_dropout": 0.1,
  "dim": 768,
  "dropout": 0.1,
  "hidden_dim": 3072,
  "initializer_range": 0.02,
  "max_position_embeddings": 512,
  "model_type": "distilbert",
  "n_heads": 12,
  "n_layers": 6,
  "pad_token_id": 0,
  "qa_dropout": 0.1,
  "seq_classif_dropout": 0.2,
  "sinusoidal_pos_embds": false,
  "transformers_version": "4.16.2",
  "vocab_size": 30522
}

Distbertconfig 显示用于构建基本 distbertmodel 的所有默认属性。所有属性都是可定制的,为实验创建空间。例如,您可以将默认模型定制为:

  • 尝试一个不同的带有激活参数的激活函数。
  • 对注意力丢失参数的注意概率使用较高的丢失率。
my_config = DistilBertConfig(activation="relu", attention_dropout=0.4)
print(my_config)
DistilBertConfig {
  "activation": "relu",
  "attention_dropout": 0.4,
  "dim": 768,
  "dropout": 0.1,
  "hidden_dim": 3072,
  "initializer_range": 0.02,
  "max_position_embeddings": 512,
  "model_type": "distilbert",
  "n_heads": 12,
  "n_layers": 6,
  "pad_token_id": 0,
  "qa_dropout": 0.1,
  "seq_classif_dropout": 0.2,
  "sinusoidal_pos_embds": false,
  "transformers_version": "4.16.2",
  "vocab_size": 30522
}

预训练的模型属性可以在 from_Pretrained ()函数中修改:

my_config = DistilBertConfig.from_pretrained("distilbert-base-uncased", activation="relu", attention_dropout=0.4)

一旦您满意您的模型配置,您可以使用 save_pretrained ()来保存它。配置文件以 JSON 文件的形式存储在指定的保存目录中:

my_config.save_pretrained(save_directory="./your_model_save_path")

要重用配置文件,可以从_pretrained ()加载它:

my_config = DistilBertConfig.from_pretrained("./your_model_save_path/my_config.json")

您还可以将配置文件保存为字典,甚至只保存自定义配置属性和默认配置属性之间的差异!有关详细信息,请参阅配置文档。

模型

下一步是创建一个模型。这个模型——也不严格地称为体系结构——定义了每个层正在做什么以及正在进行什么操作。配置中的 num_hidden_layers 等属性用于定义体系结构。每个模型都共享基类 PreTrainedModel 和一些常用的方法,如调整输入嵌入大小和剪枝自我关注头。此外,所有模型也都是一个 torch.nn。模块,tfkeras。模型或亚麻。模块子类。这意味着模型与它们各自框架的用法是兼容的。

Pytorch

将您的自定义配置属性加载到模型中:

from transformers import DistilBertModel

my_config = DistilBertConfig.from_pretrained("./your_model_save_path/my_config.json")
model = DistilBertModel(my_config)

这将创建一个具有随机值的模型,而不是预先训练的权重。在你训练它之前,你还不能用它做任何有用的事情。培训是一个昂贵而耗时的过程。一般来说,使用预先训练的模型更好,更快地获得更好的结果,而只使用培训所需资源的一小部分。

使用_pretrained ()创建一个预训练的模型:

model = DistilBertModel.from_pretrained("distilbert-base-uncased")

当您加载预先训练的权重时,如果模型是由变压器提供的,则默认模型配置将自动加载。另外,如果您愿意,您仍然可以用自己的属性替换部分或全部的默认模型配置属性:

model = DistilBertModel.from_pretrained("distilbert-base-uncased", config=my_config)

TensorFlow

将您的自定义配置属性加载到模型中:

from transformers import TFDistilBertModel

my_config = DistilBertConfig.from_pretrained("./your_model_save_path/my_config.json")
tf_model = TFDistilBertModel(my_config)

这将创建一个具有随机值的模型,而不是预先训练的权重。在你训练它之前,你还不能用它做任何有用的事情。培训是一个昂贵而耗时的过程。一般来说,使用预先训练的模型更好,更快地获得更好的结果,而只使用培训所需资源的一小部分。

使用_pretrained ()创建一个预训练的模型:

tf_model = TFDistilBertModel.from_pretrained("distilbert-base-uncased")

当您加载预先训练的权重时,如果模型是由变压器提供的,则默认模型配置将自动加载。另外,如果您愿意,您仍然可以用自己的属性替换部分或全部的默认模型配置属性:

tf_model = TFDistilBertModel.from_pretrained("distilbert-base-uncased", config=my_config)

模特头

此时,您已经有了一个输出隐藏状态的基础 DistilBERT 模型。隐藏状态作为输入传递给模型头以产生最终的输出。只要模型支持任务,Transformers 就为每个任务提供不同的模型头(例如,您不能将 DistilBERT 用于序列到序列的任务,如转换)。

Pytorch

例如,蒸馏分类是一个带有序列分类头的基本蒸馏伯特模型。序列分类头是在混合输出顶部的线性层。

from transformers import DistilBertForSequenceClassification

model = DistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")

通过切换到不同的模型头,可以轻松地将这个检查点重用于另一个任务。对于问答任务,您可以使用 distillbertforquestionanswering 模型头部。问题回答头与序列分类头相似,只是在隐状态输出的顶部有一个线性层。

from transformers import DistilBertForQuestionAnswering

model = DistilBertForQuestionAnswering.from_pretrained("distilbert-base-uncased")

TensorFlow

例如,tfdistillbertforsequenclassification 是一个带有序列分类头的基本 distillbert 模型。序列分类头是在混合输出顶部的线性层。

from transformers import TFDistilBertForSequenceClassification

tf_model = TFDistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")

通过切换到不同的模型头,可以轻松地将这个检查点重用于另一个任务。对于问答任务,您可以使用 tfdistillbertforquestionanswering 模型头部。问题回答头与序列分类头相似,只是在隐状态输出的顶部有一个线性层。

from transformers import TFDistilBertForQuestionAnswering

tf_model = TFDistilBertForQuestionAnswering.from_pretrained("distilbert-base-uncased")

Tokenizer

在使用文本数据模型之前需要的最后一个基类是将原始文本转换为张量的标记器。你可以在变形金刚中使用两种类型的标记器:

  • PreTrainedTokenizer: tokenizer 的 Python 实现。
  • PreTrainedTokenizerFast: 来自我们Rust-based Tokenizer 库的 Tokenizer。他的标记器类型是显着更快-特别是在批量标记-由于它的锈实施。他的快速标记器还提供了其他方法,比如将标记映射到原始单词或字符的偏移映射。

这两个标记器都支持常用的方法,例如编码和解码、添加新标记以及管理特殊标记。

并不是每个模型都支持快速标记器。看看这个表格,检查一个模型是否支持快速标记器。

如果你训练自己的 tokenizer,你可以从你的词汇表文件中创建一个:

from transformers import DistilBertTokenizer

my_tokenizer = DistilBertTokenizer(vocab_file="my_vocab_file.txt", do_lower_case=False, padding_side="left")

记住来自定制标记器的词汇表非常重要,它将不同于经过训练的模型的标记器生成的词汇表。如果您使用的是预先培训过的模型,那么您需要使用预先培训过的模型词汇,否则输入将没有意义。使用 distillberttokenizer 类创建一个带有经过训练的模型词汇表的 tokenizer:

from transformers import DistilBertTokenizer

slow_tokenizer = DistilBertTokenizer.from_pretrained("distilbert-base-uncased")

使用 distillberttokenizerfast 类创建一个快速的 tokenizer:

from transformers import DistilBertTokenizerFast

fast_tokenizer = DistilBertTokenizerFast.from_pretrained("distilbert-base-uncased")

默认情况下,AutoTokenizer 会尝试加载一个快速的 tokenizer,您可以通过从_pretrained 设置 use_fast = False 来禁用此行为。

特性提取器

特征提取器处理音频或图像输入。它继承自基本 FeatureExtractionMixin 类,也可以继承自 ImageFeatureExtractionMixin 类用于处理图像特性或处理音频输入的 sequencefeatureextraction 类。

根据您正在处理的是音频任务还是视觉任务,创建一个与您正在使用的模型相关联的特性提取器。例如,如果你使用 ViT 进行图像分类,创建一个默认的 ViTFeatureExtractor:

from transformers import ViTFeatureExtractor

vit_extractor = ViTFeatureExtractor()
print(vit_extractor)
ViTFeatureExtractor {
  "do_normalize": true,
  "do_resize": true,
  "feature_extractor_type": "ViTFeatureExtractor",
  "image_mean": [
    0.5,
    0.5,
    0.5
  ],
  "image_std": [
    0.5,
    0.5,
    0.5
  ],
  "resample": 2,
  "size": 224
}

如果您不需要任何定制,只需使用 from_pretrained 方法来加载模型的默认特性提取器参数。

修改 ViTFeatureExtractor 参数来创建自定义特性提取器:

from transformers import ViTFeatureExtractor

my_vit_extractor = ViTFeatureExtractor(resample="PIL.Image.BOX", do_normalize=False, image_mean=[0.3, 0.3, 0.3])
print(my_vit_extractor)
ViTFeatureExtractor {
  "do_normalize": false,
  "do_resize": true,
  "feature_extractor_type": "ViTFeatureExtractor",
  "image_mean": [
    0.3,
    0.3,
    0.3
  ],
  "image_std": [
    0.5,
    0.5,
    0.5
  ],
  "resample": "PIL.Image.BOX",
  "size": 224
}

对于音频输入,你可以创建一个 Wav2Vec2FeatureExtractor 并以类似的方式自定义参数:

from transformers import Wav2Vec2FeatureExtractor

w2v2_extractor = Wav2Vec2FeatureExtractor()
print(w2v2_extractor)
Wav2Vec2FeatureExtractor {
  "do_normalize": true,
  "feature_extractor_type": "Wav2Vec2FeatureExtractor",
  "feature_size": 1,
  "padding_side": "right",
  "padding_value": 0.0,
  "return_attention_mask": false,
  "sampling_rate": 16000
}

处理器

对于支持多模式任务的模型,Transformers 提供了一个处理器类,可以方便地将特性提取器和标记器包装到单个对象中。例如,让我们使用 Wav2Vec2Processor 执行自动语音识别任务(ASR)。SR 转录音频到文本,所以你需要一个功能提取器和一个标记器。

创建一个功能提取器来处理音频输入:

from transformers import Wav2Vec2FeatureExtractor

feature_extractor = Wav2Vec2FeatureExtractor(padding_value=1.0, do_normalize=True)

创建一个 tokenizer 来处理文本输入:

from transformers import Wav2Vec2CTCTokenizer

tokenizer = Wav2Vec2CTCTokenizer(vocab_file="my_vocab_file.txt")

在 wav2vec2处理器中结合特征提取器和标记器:

from transformers import Wav2Vec2Processor

processor = Wav2Vec2Processor(feature_extractor=feature_extractor, tokenizer=tokenizer)

通过两个基本类——配置和模型——以及一个额外的预处理类(tokenizer、特性提取器或处理器) ,您可以创建 Transformers 支持的任何模型。这些基类中的每个都是可配置的,允许您使用所需的特定属性。你可以很容易地建立一个模型训练或修改现有的预训练模型微调。

本文是抱抱脸(Hugging Face)教程中文翻译,仅学习使用

原文链接

你可能感兴趣的:(翻译,leetcode,算法,nlp)