训练一个文本标签
本教程系列将涵盖txtai的主要用例,这是一个 AI 驱动的语义搜索平台。该系列的每章都有相关代码,可也可以在colab 中使用。
colab 地址
在Hugging Face Model Hub 具有广泛的,可以处理很多任务的机型。虽然这些模型表现良好,但在使用特定于任务的数据对模型进行微调时,通常会发现最佳性能。
Hugging Face 提供了许多功能齐全的示例,可用于帮助训练特定于任务的模型。从命令行构建模型时,这些脚本是一种很好的入门方式。
txtai 提供了一个训练管道,可用于使用 Transformers Trainer 框架以编程方式训练新模型。训练管道支持以下内容:
- 无需输出目录即可构建瞬态模型
- 从 Hugging Face 数据集、pandas DataFrames 和 dicts 列表加载训练数据
- 文本序列分类任务(单/多标签分类和回归)包括所有 GLUE 任务
- 所有训练参数
本文展示了如何使用 txtai 训练/微调新模型的示例。
安装依赖
安装txtai
和所有依赖项。
pip install txtai
Train a model
让我们开始吧!以下示例使用 sst2 数据集微调一个小型 Bert 模型。
训练器管道基本上是一个单线,可以微调任何可用的文本分类/回归模型(本地和/或来自 HF Hub)。
from datasets import load_dataset
from txtai.pipeline import HFTrainer
trainer = HFTrainer()
# Hugging Face dataset
ds = load_dataset("glue", "sst2")
model, tokenizer = trainer("google/bert_uncased_L-2_H-128_A-2", ds["train"], columns=("sentence", "label"))
默认训练器管道功能不会将任何日志、检查点或模型存储到磁盘。培训师可以采用任何标准 TrainingArguments 来启用持久模型。
下一部分使用新构建的模型创建标签管道,并针对 sst2 验证集运行模型。
from txtai.pipeline import Labels
labels = Labels((model, tokenizer), dynamic=False)
# Determine accuracy on validation set
results = [row["label"] == labels(row["sentence"])[0][0] for row in ds["validation"]]
sum(results) / len(ds["validation"])
--------------------------------------------------------输出--------------------------------------------------------
0.8188073394495413
81.88% 的准确率——对于一个很小的 Bert 模型来说还不错。
Train a model with Lists
如前所述,训练器管道支持 Hugging Face 数据集、pandas DataFrames 和 dicts 列表。下面的示例使用列表训练模型。
data = [{"text": "This is a test sentence", "label": 0}, {"text": "This is not a test", "label": 1}]
model, tokenizer = trainer("google/bert_uncased_L-2_H-128_A-2", data)
使用 DataFrames 训练模型
下一部分使用存储在 Pandas DataFrame 中的数据构建一个新模型。
import pandas as pd
df = pd.DataFrame(data)
model, tokenizer = trainer("google/bert_uncased_L-2_H-128_A-2", data)
回归训练模型
之前的模型是分类任务。下面的模型训练一个句子相似性模型,每个句子对的回归输出在 0(不同)和 1(相似)之间。
ds = load_dataset("glue", "stsb")
model, tokenizer = trainer("google/bert_uncased_L-2_H-128_A-2", ds["train"], columns=("sentence1", "sentence2", "label"))
labels = Labels((model, tokenizer), dynamic=False)
labels([("Sailing to the arctic", "Dogs and cats don't get along"),
("Walking down the road", "Walking down the street")])
[[(0, 0.551963746547699)], [(0, 0.9760823845863342)]]
参考
https://dev.to/neuml/tutorial-series-on-txtai-ibg