Transformers库是什么
Transformers 库是一个在自然语言处理(NLP)领域广泛使用的强大库,提供了一套全面的工具和预训练模型,用于执行各种 NLP 任务。以下是 transformers 库提供的主要功能:
1.预训练模型: 该库包含多种预训练模型,如 BERT、GPT(生成式预训练变换器)、RoBERTa、T5 等。这些模型在大型数据集上进行了预训练,可以进行特定下游任务的微调。
2.分词(Tokenization): 该库提供了高效的分词工具,允许将原始文本转换为适用于预训练模型输入的数字表示。分词是为 NLP 任务准备文本数据的关键步骤。
3.模型架构: 您可以轻松加载预训练模型并使用其架构进行各种任务。该库支持编码器和解码器架构,适用于分类、翻译、摘要等任务。
4.模型训练和微调: 虽然库提供了许多任务的预训练模型,但也允许用户在自己的数据集上对这些模型进行微调。这在需要特定任务或领域的情况下非常有用。
5.优化器和学习率调度器: 该库包含常见的优化器(如AdamW)以及学习率调度器,有助于训练和微调过程。
6.Pipeline API: transformers 库提供了一个便捷的 pipeline API,允许您使用几行代码执行各种 NLP 任务。任务包括文本生成、命名实体识别、情感分析、翻译、摘要等。
7.模型仓库: 该库维护了一个模型仓库,您可以在其中找到不同任务和语言的各种预训练模型。这使得轻松访问和使用适合特定需求的模型变得简单。
8.与Hugging Face Datasets的集成: 该库与 Hugging Face Datasets 库集成,提供各种不同 NLP 任务的数据集。这使得加载和预处理用于训练和评估的数据集变得容易。
Tranformers API
在编码过程中,使用比较多的是调用Transformers API,下面列举了transformers库提供的常用API
最常用的API:
pipeline: 一个用于执行各种NLP任务的简单API,例如文本生成、命名实体识别、情感分析等。
AutoModel 和 AutoTokenizer: 自动加载适合任务和模型的预训练模型和分词器。
BertModel 和 BertTokenizer: 加载和使用BERT模型和分词器。
其他API:
Trainer 和 TrainingArguments: 用于训练和微调模型的API。
pipeline 中特定任务的参数,如generator、ner、text-classification等。
AutoConfig: 自动加载适合模型的配置。
AutoFeatureExtractor: 自动加载适合模型的特征提取器。
AutoModelForSequenceClassification 和 AutoModelForTokenClassification: 自动加载适合任务的预训练模型。
下面是调用pipeline接口完成一个简单的情感分类任务,pipeline中输入任务名称“sentiment-analysis”,因为没有指定具体的模型名称,这里会下载默认的模型。
from transformers import pipeline
sentiment_analysis = pipeline("sentiment-analysis")
sentiment_result = sentiment_analysis("I love using transformers library!")
print("\nSentiment Analysis Result:")
print(sentiment_result[0]['label'])
下图是执行py脚本文件的过程,可以看到,下载了一个配置文件config.json,下载了模型,默认模型是"distilbert-base-uncased-finetuned-sst-2-english",还下载了tokenizer_config.json,以及一个分词器tokenizer使用的映射表vocab.txt.
下载完后,执行任务,分析的结果是“输入的句子是一个POSITIVE的情感结果”。在上面代码中,如果要指定特定的模型来完成sentiment-analysis任务,增加model_name参数即可,即pipeline("sentiment-analysis",model_name="xxx")即可。在NLP任务中,为什么需要Tokenizer呢?什么是Tokenizer呢?
Tokenizer
在处理自然语言时,tokenizer 的作用是将文本分割成单词、子词或其他基本单元,这有助于将文本转换为计算机能够理解的形式。主要的原因包括:
文本表示: 计算机无法直接理解自然语言,因此需要将文本转换为数字表示。Tokenizer 将文本分割成离散的单元,例如单词或子词,然后为每个单元分配一个唯一的标识符或向量。这样,整个文本就可以被表示为一个数字序列,便于计算机处理。
模型输入: 许多自然语言处理(NLP)模型,尤其是深度学习模型,通常接受固定长度的输入。Tokenizer 可以确保输入文本被切分成适当的长度,使其适应模型的输入要求。
处理不规则性: 自然语言中存在许多不规则性,如大小写、标点符号、缩写词等。Tokenizer 可以处理这些不规则性,将文本标准化为模型能够处理的形式。
词汇表管理: Tokenizer 通常与一个词汇表(vocabulary)一起使用,该词汇表包含了在训练数据中出现的所有单词或子词。这有助于限制模型的输入空间,并提高模型的泛化能力。
降低计算复杂度: Tokenizer 可以降低计算复杂度,尤其是当处理大量文本数据时。通过将文本标记化为较小的单元,模型可以更高效地处理数据。
特定任务处理: 在某些 NLP 任务中,特定的 Tokenization 策略可能是为了更好地捕捉任务相关的信息,例如在情感分析中可能会保留表情符号。
Tokenizer 通常与一个词汇表(vocabulary)一起使用,以确保在文本处理过程中,每个单词或子词都能被映射到一个唯一的标识符或向量。上面下载的vocab.txt就是词汇表。
除了Tokenizer的信息外,还下载了config.json文件,config的内容如下图所示,可以看到都是一些神经网络相关参数。
部分参数作用说明如下所示:
activation (激活函数): "gelu" 表示使用 GELU(Gaussian Error Linear Unit)作为激活函数。GELU 是一种用于神经网络的非线性激活函数。
architectures (模型架构): 包含模型所使用的架构列表。在这个例子中,使用了 DistilBERT 的序列分类版本,即 "DistilBertForSequenceClassification"。
attention_dropout (注意力机制的 dropout): 0.1 表示注意力机制的 dropout 概率为 0.1。这是为了在训练时随机关闭一部分注意力头,以防止过拟合。
dim (模型的隐藏层维度): 768 表示模型的隐藏层维度为 768。
dropout (全连接层的 dropout): 0.1 表示全连接层的 dropout 概率为 0.1。这是为了在训练时随机关闭一些神经元,以防止过拟合。
除了Pipeline API,在加载和使用预训练大模型的常用接口还有AutoModel 和 AutoTokenizer 。
AutoModel && AutoTokenizer
from transformers import AutoModel, AutoTokenizer
# 指定模型名称
model_name = "bert-base-uncased"
# 使用 AutoTokenizer 加载适用于任务的分词器
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 使用 AutoModel 加载适用于任务的预训练模型
model = AutoModel.from_pretrained(model_name)
# 输入文本
input_text = "I love using transformers library!"
# 使用分词器对文本进行分词,并为模型准备输入
input_ids = tokenizer(input_text, return_tensors="pt")["input_ids"]
# 使用模型进行推理
outputs = model(input_ids)
# 打印模型输出
print("Model Output:")
print(outputs.last_hidden_state)
上面的代码中,调用的是bert模型,执行上面的代码,结果如下图所示,可以看到,仍然是下载了模型相关的配置文件和模型本身的权重信息,这些文件在huggingface上都能查看到。执行的结果是输出了一段文本的张量信息。
除了加载bert这种小的模型外,也可以使用相同的方法加载预训练大模型。下面是Chatglm模型官网给出的下载启动大模型的代码,可以看到,也是通过transformers库的AutoTokenizer和AutoModel即可快速完成模型的部署和使用。
当然,除了上面介绍的常用的两类API,transformers库还提供训练数据下载,微调等能力,更多信息可查看官网。