LLM 课程文档

模型

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

模型

Ask a Question Open In Colab Open In Studio Lab

在本节中,我们将更仔细地研究如何创建和使用模型。我们将使用 AutoModel 类,当您想要从检查点实例化任何模型时,此类非常方便。

AutoModel 类及其所有相关类实际上只是库中各种可用模型的简单包装器。它是一个聪明的包装器,因为它可以自动猜测您的检查点适用的模型架构,然后使用此架构实例化模型。

但是,如果您知道要使用的模型类型,则可以直接使用定义其架构的类。让我们看一下如何使用 BERT 模型来实现这一点。

创建 Transformer

初始化 BERT 模型需要做的第一件事是加载配置对象

from transformers import BertConfig, BertModel

# Building the config
config = BertConfig()

# Building the model from the config
model = BertModel(config)

配置包含许多用于构建模型的属性

print(config)
BertConfig {
  [...]
  "hidden_size": 768,
  "intermediate_size": 3072,
  "max_position_embeddings": 512,
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  [...]
}

虽然您尚未了解所有这些属性的作用,但您应该能够识别出其中一些:hidden_size 属性定义了 hidden_states 向量的大小,而 num_hidden_layers 定义了 Transformer 模型拥有的层数。

不同的加载方法

从默认配置创建模型会使用随机值初始化模型

from transformers import BertConfig, BertModel

config = BertConfig()
model = BertModel(config)

# Model is randomly initialized!

模型可以在此状态下使用,但它会输出乱码;它需要先进行训练。我们可以从头开始在手头的任务上训练模型,但正如您在第 1 章中看到的那样,这将需要很长时间和大量数据,并且会对环境产生不可忽略的影响。为了避免不必要的重复劳动,必须能够共享和重用已经训练过的模型。

加载已训练的 Transformer 模型很简单 — 我们可以使用 from_pretrained() 方法来完成此操作

from transformers import BertModel

model = BertModel.from_pretrained("bert-base-cased")

正如您之前看到的,我们可以用等效的 AutoModel 类替换 BertModel。从现在开始我们将这样做,因为这会生成与检查点无关的代码;如果您的代码适用于一个检查点,则它应该可以与另一个检查点无缝协作。即使架构不同,这也适用,只要检查点是为类似的任务(例如,情感分析任务)训练的。

在上面的代码示例中,我们没有使用 BertConfig,而是通过 bert-base-cased 标识符加载了预训练模型。这是一个由 BERT 作者自己训练的模型检查点;您可以在其模型卡中找到有关它的更多详细信息。

现在,此模型已使用检查点的所有权重进行初始化。它可以直接用于对其训练的任务进行推理,也可以在新任务上进行微调。通过使用预训练权重而不是从头开始训练,我们可以快速获得良好的结果。

权重已下载并缓存在缓存文件夹中(因此,将来调用 from_pretrained() 方法不会重新下载它们),该文件夹默认为 ~/.cache/huggingface/transformers。您可以通过设置 HF_HOME 环境变量来自定义缓存文件夹。

用于加载模型的标识符可以是 Model Hub 上任何模型的标识符,只要它与 BERT 架构兼容即可。可以在此处找到所有可用的 BERT 检查点的列表。

保存方法

保存模型与加载模型一样容易 — 我们使用 save_pretrained() 方法,该方法类似于 from_pretrained() 方法

model.save_pretrained("directory_on_my_computer")

这会将两个文件保存到您的磁盘

ls directory_on_my_computer

config.json pytorch_model.bin

如果您查看 config.json 文件,您会识别出构建模型架构所需的属性。此文件还包含一些元数据,例如检查点的来源以及您上次保存检查点时使用的 🤗 Transformers 版本。

pytorch_model.bin 文件被称为状态字典;它包含模型的所有权重。这两个文件是相辅相成的;配置是了解模型架构所必需的,而模型权重是模型的参数。

使用 Transformer 模型进行推理

现在您已经知道如何加载和保存模型,让我们尝试使用它来进行一些预测。Transformer 模型只能处理数字 — 分词器生成的数字。但在我们讨论分词器之前,让我们先探讨模型接受哪些输入。

分词器可以负责将输入转换为适当框架的张量,但为了帮助您理解正在发生的事情,我们将快速了解在将输入发送到模型之前必须完成的操作。

假设我们有几个序列

sequences = ["Hello!", "Cool.", "Nice!"]

分词器将这些转换为词汇表索引,这些索引通常称为输入 ID。现在,每个序列都是数字列表!结果输出是

encoded_sequences = [
    [101, 7592, 999, 102],
    [101, 4658, 1012, 102],
    [101, 3835, 999, 102],
]

这是一个编码序列列表:列表的列表。张量只接受矩形形状(想想矩阵)。这个“数组”已经是矩形形状,因此将其转换为张量很容易

import torch

model_inputs = torch.tensor(encoded_sequences)

使用张量作为模型的输入

将张量与模型一起使用非常简单 — 我们只需使用输入调用模型即可

output = model(model_inputs)

虽然模型接受许多不同的参数,但只有输入 ID 是必需的。我们稍后将解释其他参数的作用以及何时需要它们,但首先我们需要仔细研究构建 Transformer 模型可以理解的输入的分词器。

< > 在 GitHub 上更新