前言

在本节中,我们将更深入地了解如何创建和使用模型。我们将使用 AutoModel 类,这在您想要从检查点实例化任何模型时会非常方便。

AutoModel 类及其所有相关类实际上是对库中可用的各种模型的一种简单封装。它是一个巧妙的封装,因为它可以自动猜测您的检查点所需的适当模型架构,然后实例化具有该架构的模型。

然而,如果您知道您想要使用的模型类型,您可以直接使用定义其架构的类。让我们看看这是如何与 BERT 模型一起工作的。

src link: https://huggingface.co/learn/nlp-course/chapter2/3

Operating System: Ubuntu 22.04.4 LTS

参考文档

  1. NLP Course - Models

创建一个 Transformer 模型

要初始化一个 BERT 模型,我们首先需要做的是加载一个配置对象:

1
2
3
4
5
6
7
from transformers import BertConfig, BertModel

# Building the config
config = BertConfig()

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

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

1
print(config)
1
2
3
4
5
6
7
8
9
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 模型具有的层数。

不同的加载方法

使用默认配置创建模型时,会使用随机值进行初始化:

1
2
3
4
5
6
from transformers import BertConfig, BertModel

config = BertConfig()
model = BertModel(config)

# Model is randomly initialized!

模型在这种状态下可以使用,但它会输出无意义的内容;首先需要进行训练。我们可以在当前任务上从头开始训练模型,但正如您在第一章中看到的,这将需要很长时间和大量数据,并且会对环境产生不可忽视的影响。为了避免不必要的重复工作,能够共享和重用已经训练好的模型至关重要。

加载一个已经训练好的Transformer模型很简单——我们可以使用from_pretrained()方法来实现:

1
2
3
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环境变量来自定义您的缓存文件夹。

用于加载模型的标识符可以是模型库上任何与BERT架构兼容的模型的标识符。可用的BERT检查点完整列表可以在此处找到。

保存方法

保存模型就像加载模型一样简单——我们使用 save_pretrained() 方法,它类似于 from_pretrained() 方法:

1
model.save_pretrained("directory_on_my_computer")

这将在您的磁盘上保存两个文件:

1
2
3
ls directory_on_my_computer

config.json pytorch_model.bin

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

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

使用 Transformer 模型进行推理

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

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

假设我们有几个序列:

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

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

1
2
3
4
5
encoded_sequences = [
[101, 7592, 999, 102],
[101, 4658, 1012, 102],
[101, 3835, 999, 102],
]

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

1
2
3
import torch

model_inputs = torch.tensor(encoded_sequences)

使用张量作为模型的输入

使用张量与模型进行操作非常简单——我们只需使用输入调用模型:

1
output = model(model_inputs)

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

结语

第二百一十篇博文写完,开心!!!!

今天,也是充满希望的一天。