00210 NLP Course - Models ubuntu
前言
在本节中,我们将更深入地了解如何创建和使用模型。我们将使用 AutoModel 类,这在您想要从检查点实例化任何模型时会非常方便。
AutoModel 类及其所有相关类实际上是对库中可用的各种模型的一种简单封装。它是一个巧妙的封装,因为它可以自动猜测您的检查点所需的适当模型架构,然后实例化具有该架构的模型。
然而,如果您知道您想要使用的模型类型,您可以直接使用定义其架构的类。让我们看看这是如何与 BERT 模型一起工作的。
src link: https://huggingface.co/learn/nlp-course/chapter2/3
Operating System: Ubuntu 22.04.4 LTS
参考文档
创建一个 Transformer 模型
要初始化一个 BERT 模型,我们首先需要做的是加载一个配置对象:
1 | from transformers import BertConfig, BertModel |
配置对象包含许多用于构建模型的属性:
1 | print(config) |
1 | BertConfig { |
虽然您还没有看到所有这些属性的作用,但您应该能认出其中的一些:hidden_size 属性定义了 hidden_states 向量的尺寸,而 num_hidden_layers 定义了 Transformer 模型具有的层数。
不同的加载方法
使用默认配置创建模型时,会使用随机值进行初始化:
1 | from transformers import BertConfig, BertModel |
模型在这种状态下可以使用,但它会输出无意义的内容;首先需要进行训练。我们可以在当前任务上从头开始训练模型,但正如您在第一章中看到的,这将需要很长时间和大量数据,并且会对环境产生不可忽视的影响。为了避免不必要的重复工作,能够共享和重用已经训练好的模型至关重要。
加载一个已经训练好的Transformer模型很简单——我们可以使用from_pretrained()方法来实现:
1 | from transformers import BertModel |
正如您之前看到的,我们可以用等效的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 | ls directory_on_my_computer |
如果您查看 config.json 文件,您会认出构建模型架构所需的属性。这个文件还包含一些元数据,比如检查点的来源以及您上次保存检查点时使用的 🤗 Transformers 版本。
pytorch_model.bin 文件被称为状态字典;它包含您模型的所有权重。这两个文件相辅相成;配置文件用于了解您的模型架构,而模型权重则是您的模型参数。
使用 Transformer 模型进行推理
现在您已经知道如何加载和保存模型,让我们尝试使用它来做出一些预测。Transformer 模型只能处理数字——由分词器生成的数字。但在讨论分词器之前,让我们先探索模型接受的输入是什么。
分词器可以负责将输入转换为相应框架的张量,但为了帮助您理解发生的情况,我们将快速查看在将输入发送到模型之前必须完成的工作。
假设我们有几个序列:
1 | sequences = ["Hello!", "Cool.", "Nice!"] |
分词器将这些转换为通常称为输入ID的词汇索引。现在每个序列都是一个数字列表!得到的输出是:
1 | encoded_sequences = [ |
这是一个编码序列的列表:一个列表的列表。张量只接受矩形形状(想象成矩阵)。这个“数组”已经是矩形形状,所以将其转换成张量很容易:
1 | import torch |
使用张量作为模型的输入
使用张量与模型进行操作非常简单——我们只需使用输入调用模型:
1 | output = model(model_inputs) |
虽然模型接受许多不同的参数,但只有输入ID是必需的。我们稍后会解释其他参数的作用以及何时需要它们,但首先我们需要更仔细地了解构建 Transformer 模型可以理解的输入的分词器。
结语
第二百一十篇博文写完,开心!!!!
今天,也是充满希望的一天。