关于人工智能:5分钟-NLP-Hugging-Face-主要类和函数介绍-🤗

次要包含Pipeline, Datasets, Metrics, and AutoClasses

HuggingFace是一个十分风行的 NLP 库。本文蕴含其次要类和函数的概述以及一些代码示例。能够作为该库的一个入门教程 。

Hugging Face 是一个开源库,用于构建、训练和部署最先进的 NLP 模型。Hugging Face 提供了两个次要的库,用于模型的transformers 和用于数据集的datasets 。能够间接应用 pip 装置它们。

pip install transformers datasets

Pipeline

应用transformers库中的Pipeline是开始试验的最快和最简略的办法:通过向Pipeline对象提供工作名称,而后从 Hugging Face 模型存储库中主动下载适合的模型,而后就能够应用了!

transformers库中曾经提供了以下的几个工作,例如:

  • 文本分类
  • 问答
  • 翻译
  • 文本摘要
  • 文本生成

除此以外还有计算机视觉和音频工作(次要也是基于transformer的)

上面是一个情绪剖析工作的例子。为了预测句子的情绪,只需将句子传递给模型。

from transformers import pipeline

classifier = pipeline("sentiment-analysis")

results = classifier("I'm so happy today!")
print(f"{results[0]['label']} with score {results[0]['score']}")
# POSITIVE with score 0.9998742341995239

模型的输入是一个字典列表,其中每个字典都有一个标签(对于这个特定示例,值为“POSITIVE”或“NEGATIVE”)和一个分数(即预测标签的分数)。

能够为分类器提供多个句子,并在一个函数调用中取得所有后果。

results = classifier(["I'm so happy today!", "I hope you don't hate him..."])
for result in results:
    print(f"{result['label']} with score {result['score']}")
# POSITIVE with score 0.9998742341995239
# NEGATIVE with score 0.6760789155960083

也能够通过设置模型名称的参数指定要应用的模型,所有的模型和对于模型的信息都在官网文档中提供了,例如上面代码应用的是twitter-roberta-base-sentiment

classifier = pipeline("sentiment-analysis",
                      model="cardiffnlp/twitter-roberta-base-sentiment",
                      tokenizer="cardiffnlp/twitter-roberta-base-sentiment")
# three possible outputs:
# LABEL_0 -> negative
# LABEL_1 -> neutral
# LABEL_2 -> positive

results = classifier(["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."])
for result in results:
    print(f"{result['label']} with score {result['score']}")
# LABEL_2 with score 0.9814898371696472
# LABEL_1 with score 0.5063014030456543

Dataset

Dataset库能够轻松下载 NLP 中应用的一些最常见的基准数据集。

例如须要加载Stanford Sentiment Treebank(SST2,。它的指标是二元(侧面和负面)分类,只有句子级别的标签。能够间接应用 load_dataset 函数加载数据集。

import datasets

dataset = datasets.load_dataset("glue", "sst2")

print(dataset)
DatasetDict({
    train: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 67349
    })
    validation: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 872
    })
    test: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1821
    })
})

数据集曾经被分为训练集、验证集和测试集。能够应用 split 参数调用 load_dataset 函数,间接失去咱们感兴趣的数据集的拆分。

dataset = datasets.load_dataset("glue", "sst2", split='train')

print(dataset)
Dataset({
    features: ['sentence', 'label', 'idx'],
    num_rows: 67349
})

如果想应用 Pandas 解决数据集,能够间接应用数据集的对象创立df。

import pandas as pd

df = pd.DataFrame(dataset)
df.head()

应用GPU

当初曾经加载了一个对于情感剖析的数据集,上面开始创立一个情感分析模型。

首先测试下预测 500 个句子的情绪并测量它须要多少工夫。

classifier = pipeline("sentiment-analysis")
%time results = classifier(dataset.data["sentence"].to_pylist()[:500])
# CPU times: user 21.9 s, sys: 56.9 ms, total: 22 s
# Wall time: 21.8 s

预测 500 个句子须要 21.8 秒,均匀每秒 23 个句子。咱们试试 GPU。

为了让分类器应用 GPU,首先必须保障GPU是可用的,而后用参数device=0 。这样就能够在 反对CUDA 的GPU上运行模型,其中从零开始的每个 id 都映射到一个 CUDA 设施,值 -1 是 CPU。

classifier = pipeline("sentiment-analysis", device=0)
%time results = classifier(dataset.data["sentence"].to_pylist()[:500])
# CPU times: user 4.07 s, sys: 49.6 ms, total: 4.12 s
# Wall time: 4.11 s

预测 500 句只用了 4.1 秒,均匀每秒 122 句,速度进步了大概 6 倍!这就对了😏

指标

如果想在 SST2 数据集上测试分类器的品质怎么办?应该应用哪个指标?

在 Hugging Face 中,metrics 和 datasets 是配对在一起的。所以能够应用与 load_dataset 函数雷同的参数调用 load_metric 函数。

对于 SST2 数据集,指标是准确度。能够应用以下代码间接通过metric取得指标值。

metric = datasets.load_metric("glue", "sst2")

n_samples = 500

X = dataset.data["sentence"].to_pylist()[:n_samples]
y = dataset.data["label"].to_pylist()[:n_samples]

results = classifier(X)
predictions = [0 if res["label"] == "NEGATIVE" else 1 for res in results]

print(metric.compute(predictions=predictions, references=y))
# {'accuracy': 0.988}

AutoClasses

pipeline 在底层是由 AutoModel 和 AutoTokenizer 类来实现的。AutoClass(即像 AutoModel 和 AutoTokenizer 这样的通用类)是加载模型的快捷方式,它能够从其名称或门路中自动检索预训练模型。在应用时只须要为工作抉择适合的 AutoModel 并应用 AutoTokenizer 为其关联的分词器:在这个示例中是对文本进行分类,因而正确的 AutoModel 是 AutoModelForSequenceClassification。

上面咱们看看如何应用 AutoModelForSequenceClassification 和 AutoTokenizer 来实现与下面Pipeline雷同的性能:

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

这里应用 AutoTokenizer 创立一个分词器对象,并应用 AutoModelForSequenceClassification 创立一个模型对象。只须要传递模型的名称,剩下的事件都会主动实现。

接下来让咱们看看如何应用分词器对句子进行分词。tokenizer 输入是一个字典,由 input_ids(即在输出句子中检测到的每个 token 的 id,取自 tokenizer 词汇表)、token_type_ids(用于须要两个文本进行预测的模型中,咱们当初能够疏忽它们)组成的字典, 和 attention_mask(显示在标记化期间产生填充的地位)。

encoding = tokenizer(["Hello!", "How are you?"], padding=True,
                     truncation=True, max_length=512, return_tensors="pt")

print(encoding)
{'input_ids': tensor([[  101, 29155,   106,   102,     0,     0],
        [  101, 12548, 10320, 10855,   136,   102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 0, 0],
        [1, 1, 1, 1, 1, 1]])}

而后将标记完的句子传递给模型,模型负责输入预测。这个特定的模型输入五个分数,其中每个分数是评论得分的概率,因为分数从 1 到 5。

outputs = model(**encoding)

print(outputs)
SequenceClassifierOutput(loss=None, logits=tensor([[-0.2410, -0.9115, -0.3269, -0.0462,  1.2899],
        [-0.3575, -0.6521, -0.4409,  0.0471,  0.9552]],
       grad_fn=<AddmmBackward0>), hidden_states=None, attentions=None)

该模型在 logits 属性中输入最终后果。将 softmax 函数利用于 logits 能够取得每个标签的概率。

from torch import nn

pt_predictions = nn.functional.softmax(outputs.logits, dim=-1)

print(pt_predictions)
tensor([[0.1210, 0.0619, 0.1110, 0.1470, 0.5592],
       [0.1269, 0.0945, 0.1168, 0.1902, 0.4716]], grad_fn=<SoftmaxBackward0>)

在本地保留和加载模型

最初,看看如何在本地保留模型。这能够应用分词器和模型的 save_pretrained 函数来实现。

pt_save_directory = "./model"
tokenizer.save_pretrained(pt_save_directory)
model.save_pretrained(pt_save_directory)

如果要加载之前保留的模型,能够应用AutoModel 类的 from_pretrained 函数加载它。

model = AutoModelForSequenceClassification.from_pretrained("./model")

总结

在本文中介绍了Hugging Face 库的次要类和函数。包含transformers 的datasets库,以及如何应用Pipeline在几行代码中加载模型,并让这些代码在 CPU 或 GPU 上运行,还介绍了如何间接从库中加载基准数据集以及如何计算指标。最初还演示了如何应用最重要的两个类 AutoModel 和 AutoTokenizer和如何在本地保留和加载模型,通过以上的介绍我想曾经能够应用Hugging Face库开始你的NLP之旅了。

https://www.overfit.cn/post/5cd4f89120724b129fc3d17039cb78a0

作者:Fabio Chiusano

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理