Transformer实战——Hugging Face环境配置与应用详解
Transformer实战——Hugging Face环境配置与应用详解
- 0. 前言
- 1. 安装 transformers
- 1.1 安装 Anaconda
- 1.2 安装 TensorFlow、PyTorch 和 Transformer
- 1.3 使用 hf-mirror 快速下载模型
- 2. 使用语言模型和分词器
- 3. 使用社区提供的模型
- 4. 使用多模态 Transformer
- 小结
- 系列链接
0. 前言
我们已经了解了使用深度学习 (Deep Learning
, DL
) 方法的自然语言处理 (Natural Language Processing, NLP) 技术演进,学习了关于 Transformer
及其架构的一些基本信息。在本节中,我们将深入探讨 Transformer
模型的应用,详细介绍分词器 (tokenizer
) 和模型,例如双向编码器表示 (Bidirectional Encoder Representations from Transformer
, BERT
),并通过实践介绍如何加载分词器/模型,以及如何使用预训练模型。在进行实践之前,我们将首先了解所需环境的安装步骤,介绍如何在 PyTorch
和 TensorFlow
框架中使用模型。
Hugging Face
模型库也是本节的一个重要部分,我们将讨论如何获取不同的模型以及使用不同管道的步骤。例如,双向自回归 Transformer
(Bidirectional and Auto-regressive Transformer
, BART
)、BERT
和 TAPAS
(TAble PArSing
) 等模型,同时介绍 GPT-2
(Generative Pretrained Transformer 2
) 文本生成。需要注意的是,本节主要集中在如何准备环境以及如何使用预训练模型,而不是模型训练。模型训练将在后续学习中详细讨论。
1. 安装 transformers
Anaconda
是一个用于 Python
和 R
编程语言的发行版,旨在简化科学计算中包的分发和部署。在本节中,我们将介绍如何安装 transformers
库。虽然也可以在不使用 Anaconda
的情况下安装此库,但使用 Anaconda
的主要目的是为了更容易地解释安装过程,并且能够更好地管理所使用的库。Anaconda
文档提供了适用于常见操作系统 (macOS
、Windows
和 Linux
) 的官方安装指南,步骤简便易行。
1.1 安装 Anaconda
1.1.1 Linux 操作系统
从 Anaconda 官网下载适用于 Linux
的 Anaconda
安装程序。打开终端并运行以下命令:
bash ./FilePath/For/Anaconda.sh
安装完成后,在终端运行 python
命令,能够在 Python
版本信息后看到 Anaconda
提示符。
可以通过从终端运行 anaconda-navigator
命令来访问 Anaconda Navigator
。
1.1.2 Windows 操作系统
从 Anaconda
官网下载适用于 Windows
操作系统的安装程序。打开安装程序并按照向导点击 “I Agree
” 按钮进行操作。选择安装位置后,单击 Next
。
勾选 “Add anaconda3 to my PATH environment variable
” 复选框后单击 Install
。如果不勾选该框,Anaconda
版本的 Python
将不会添加到 Windows
环境变量中,将无法直接在 Windows
命令行或 Windows Shell
中使用 python
命令运行 Anaconda
。安装完成后,可以从开始菜单启动 Anaconda Navigator
。
1.1.3 macOS 操作系统
从 Anaconda
官网下载适用于 macOS
的安装程序。打开安装程序。根据安装引导,点击 Install
按钮,将 Anaconda
安装到预定义的位置,也可以更改默认安装目录。
安装完成后,能够访问 Anaconda Navigator
。
1.2 安装 TensorFlow、PyTorch 和 Transformer
TensorFlow 和 PyTorch 是深度学习中使用的两个主要库,可以通过 pip
或 conda
进行安装。conda
提供了一个命令行界面,使得安装这些库更加便捷。
为了避免干扰其他环境,最好 为huggingface
库创建一个新的 conda
环境。可以通过运行以下代码来实现:
$ conda create -n Transformer
该命令将创建一个空的环境用于安装其他库。创建完成后,需要激活此环境:
$ conda activate Transformer
安装 Transformer
库非常简单,只需要运行以下命令:
$ conda install -c conda-forge tensorflow
$ conda install -c conda-forge pytorch
$ conda install -c conda-forge transformers
在 conda install
命令中,-c
参数让 Anaconda
使用额外的渠道来查找库。
需要注意的是,安装 TensorFlow
和 PyTorch
是必要的,因为 Transformer
库依赖于这两个库。conda
能够轻松处理 TensorFlow
和 PyTorch
的 CPU
和 GPU
版本,通过 pip
安装 PyTorch
的 GPU
版本时,需要安装相关的库,如 cuda
等,但 conda
会自动处理这一过程,无需手动设置或安装其他内容。
这些库安装也可以在没有 conda
的情况下完成,但使用 Anaconda
的原因在于其简便性。特别是在安装 TensorFlow
或 PyTorch
的 GPU
版本时,能够节省大量时间。
1.3 使用 hf-mirror 快速下载模型
hf-mirror.com 是 Hugging Face 官方网站的镜像,旨在解决访问 Hugging Face
官方站点时遇到的网络瓶颈和下载缓慢问题。
hf-mirror.com 致力于帮助用户快速、稳定的下载模型、数据集。可以直接在 hf-mirror.com
网站中搜索所需模型和数据集,并在模型主页的 Files and Version
中下载文件。
此外,还可以使用 huggingface-cli
,huggingface-cli
是 Hugging Face
官方提供的命令行工具,自带完善的下载功能。使用 huggingface-cli
首先需要安装依赖:
$ pip install -U huggingface_hub
然后,设置环境变量:
# linux 为了使之永久生效,可以将其写入 `~/.bashrc`
$ export HF_ENDPOINT=https://hf-mirror.com
# windows
$env:HF_ENDPOINT = https://hf-mirror.com
设置完成后,可以通过以下命令下载模型和数据集:
$ huggingface-cli download --resume-download gpt2 --local-dir gpt2
$ huggingface-cli download --repo-type dataset --resume-download wikitext --local-dir wikitext
可以添加 --local-dir-use-symlinks False
参数禁用文件软链接。设置完成后,除了直接下载模型和数据集外,也可以通过内置的 from_pretrained()
函数直接从镜像网站上下载模型。
2. 使用语言模型和分词器
在本节中,我们将介绍如何使用 Transformer
库中的语言模型,以及与之相关的分词器。为了使用指定的语言模型,首先需要导入它,我们从 Google
提供的 BERT
模型开始,并使用其预训练版本:
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
以上代码的第一行导入了 BERT
的分词器,第二行下载了 BERT
基础版的预训练分词器。需要注意的是,uncased
版本是以不区分大小写的字母训练的,因此字母的大小写不会影响模型的效果。测试并查看输出:
text = "Using Transformers is easy!"
tokenizer(text)
输出结果如下所示:
{'input_ids': [101, 2478, 19081, 2003, 3733, 999, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1]}
input_ids
显示了每个词元 (token
) 的 ID
。token_type_ids
显示了每个 token
的类型,用于区分第一个和第二个序列,如下图所示:
attention_mask
是由 0
和 1
组成的掩码,用于标示序列的开始和结束,以防止不必要的计算。每个分词器有不同的添加特殊 token
的方式。在 BERT
的分词器中,在序列的开始添加了一个 [CLS]
token
,在序列的结束添加了一个 [SEP]
token
,ID
分别为 101
和 102
。这些数字来源于预训练分词器的 token ID
。
同一分词器可以同时用于基于 PyTorch
和 TensorFlow
的 Transformer
模型。为了分别获得每种模型的输出,需要在 return_tensors
参数中使用 pt
和 tf
关键字。例如,可以通过运行以下命令来使用分词器:
encoded_input = tokenizer(text, return_tensors="pt")
得到的 encoded_input
就是已分词的文本,可以用于 PyTorch
模型。为了运行模型(例如 BERT
模型),可以使用以下代码从 Hugging Face
的模型仓库下载模型:
from transformers import BertModel
model = BertModel.from_pretrained("BERT-base-uncased")
通过以下代码可以将分词器的输出传递给模型:
output = model(**encoded_input)
输出结果为模型的嵌入和交叉注意力。
在加载和导入模型时,可以指定想要使用的模型版本。如果在模型名称前加上 TF
,Transformer
库将加载其 TensorFlow
版本。以下代码展示了如何加载并使用 BERT
基础模型的 TensorFlow
版本:
from transformers import BertTokenizer, TFBertModel
tokenizer = BertTokenizer.from_pretrained('BERT-base-uncased')
model = TFBertModel.from_pretrained("BERT-base-uncased")
text = "Using Transformer is easy!"
encoded_input = tokenizer(text, return_tensors='tf')
output = model(**encoded_input)
对于特定任务,Hugging Face
提供了现成的管道 (pipeline
)。例如,使用语言模型填充掩码的任务可以通过以下代码实现:
from transformers import pipeline
unmasker = pipeline('fill-mask', model='BERT-base-uncased')
unmasker("The man worked as a [MASK].")
生成输出如下所示,输出分数和可能替换 [MASK]
的词汇:
使用 pandas
可以获取更整洁的视图:
pd.DataFrame(unmasker("The man worked as a [MASK]."))
结果如下所示:
3. 使用社区提供的模型
Hugging Face
拥有大量由来自 Google
和 Facebook
等大型人工智能和信息技术公司的合作者提供的社区模型,个人和其它团体也提供了许多有趣的模型,访问和使用这些模型也非常简单。首先,访问官方网站上的 Transformer 模型目录:
在官方网站无法正常访问时,也可以访问镜像网站 hf-mirror.com 获取模型。除了这些模型,NLP
任务还可以使用不同数据集。
要使用这些社区提供的模型,可以通过关键词搜索来探索它们,或者直接指定 NLP
任务和管道。
例如,使用表格问答模型。在查找到感兴趣的模型后,能够看到以下页面:
在右侧,有一个面板可以测试这个模型。表格问答模型可以回答有关提供给模型的表格的问题。进行提问后,模型将通过高亮显示答案来进行回答。下图显示了它如何获取输入并为特定表格提供答案:
每个模型都有一个由模型作者提供的页面,通常被称为模型卡。可以按照模型页面上提供的示例使用该模型。例如,访问 GPT-2
的 Hugging Face
仓库页面,并查看作者提供的示例,如下图所示:
推荐使用管道 (pipelines
),因为所有的复杂工作都由 Transformer
库处理。假设需要一个开箱即用的零样本分类器,以下代码展示了实现和使用预训练模型的便捷性:
from transformers import pipeline
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
sequence_to_classify = "I am going to france."
candidate_labels = ['travel', 'cooking', 'dancing']
classifier(sequence_to_classify, candidate_labels)
输出结果如下所示:
{'labels': ['travel', 'dancing', 'cooking'], 'scores':
[0.9866883158683777, 0.007197578903287649, 0.006114077754318714],
'sequence': 'I am going to france.'}
4. 使用多模态 Transformer
零样本图像分类在只有类别名称或与类别相关的短语可用时非常有用。CLIP
作为一个多模态模型,能够将图像和文本表示在同一个语义空间中。为了得到一个零样本图像分类器,即在没有任何关于类别的先验知识的情况下进行分类,可以设想以下场景:类名已经给定,但没有示例样本的类别信息。此时唯一可用的知识就是这些类名以及一组之前未见过的图像。
(1) 首先准备图片:
from PIL import Image
import requests
url = "http://images.cocodataset.org/test-stuff2017/000000027922.jpg"
image = Image.open(requests.get(url, stream=True).raw)
(2) 加载图像后,查看图像样本:
image
(3) 为所有类别创建提示 (prompt
),然后为文本部分创建输入:
prompt = "a photo of a "
class_names = ["food", "fruit"]
inputs = [prompt + class_name for class_name in class_names]
(4) 文本和图像的输入准备好后,加载模型:
from transformers import CLIPProcessor, CLIPModel
model = CLIPModel.from_pretrained("openai/clip-vit-large-patch14")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-large-patch14")
(5) processor
是一个用于分词的封装器。最后,可以将预处理和分词后的数据交给模型,最终得到输出:
inputs = processor(text=inputs, images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits = outputs.logits_per_image
probs = logits.softmax(dim=1)
# tensor([[0.9923, 0.0077]], grad_fn=<SoftmaxBackward0>)
Logits
是与每个组合(第一个提示和图像,第二个提示和图像)相关的分数,分别为 10.9
和 18.5
。为了获得最终的类别概率,需要对其应用 SoftMax
函数,得到结果概率(例如,food
的概率为 0.99
)。
小结
在本节中,介绍了语言模型、社区提供的模型和分词过程,测试了使用多模态模型和简单提示进行零样本图像分类的基本方法。
系列链接
Transformer实战——词嵌入技术详解
Transformer实战——循环神经网络详解
Transformer实战——从词袋模型到Transformer:NLP技术演进