Hugging Face 联合 Intel Labs 与 UKP Lab 发布少样本文本分类框架 SetFit
SetFit: Efficient Few-Shot Learning Without Prompts
Hugging Face 与 Intel Labs、UKP Lab 发布少样本学习框架 SetFit,无需提示词即可微调 Sentence Transformer 做文本分类。
原文给出 SetFit 在少样本文本分类上的具体对比数字和训练成本,读者可以据此评估小样本场景下是否用它替代大模型微调。
SetFit 在样本效率和抗噪性方面显著优于标准微调。
使用预训练语言模型进行的小样本学习已成为解决每位数据科学家噩梦的有前景方案:处理几乎没有标签甚至完全没有标签的数据 😱。
Hugging Face 与我们的研究合作伙伴 Intel Labs 和 UKP Lab 一起,激动地推出 SetFit:一个用于 Sentence Transformers 小样本微调的高效框架。SetFit 仅需少量标注数据即可实现高准确率——例如,在 Customer Reviews (CR) 情感数据集上,每类仅用 8 个标注样本,SetFit 就能与在包含 3k 样本的完整训练集上微调的 RoBERTa Large 相媲美 🤯!
与其他小样本学习方法相比,SetFit 具有几个独特特性:
🗣 无需提示或语言化器:当前的小样本微调技术需要手工设计的提示或语言化器,以将样本转换为适合底层语言模型的格式。SetFit 完全摒弃了提示,直接从少量标注文本样本生成丰富的嵌入。
🏎 训练快速:SetFit 不需要像 T0 或 GPT-3 这样的大规模模型就能实现高准确率。因此,它的训练和推理速度通常要快一个数量级(或更多)。
🌎 多语言支持:SetFit 可与 Hub 上的任何 Sentence Transformer 一起使用,这意味着你只需微调一个多语言检查点,就能对多种语言的文本进行分类。
如需了解更多详情,请查看我们的论文、数据和代码。在这篇博客文章中,我们将解释 SetFit 的工作原理以及如何训练你自己的模型。让我们开始吧!
它是如何工作的?
SetFit 在设计时兼顾了效率和简洁性。SetFit 首先在少量标注样本(通常每类 8 或 16 个)上微调一个 Sentence Transformer 模型。随后,在由微调后的 Sentence Transformer 生成的嵌入上训练一个分类头。
SetFit 的两阶段训练过程
SetFit 利用了 Sentence Transformers 基于成对句子生成稠密嵌入的能力。在初始微调阶段,它通过对比训练来利用有限的标注输入数据,其中正负样本对通过类内和类外选择来构建。然后,Sentence Transformer 模型在这些样本对(或三元组)上进行训练,并为每个样本生成稠密向量。在第二步中,分类头在编码后的嵌入及其对应类别标签上进行训练。在推理时,未见过的样本会通过微调后的 Sentence Transformer,生成一个嵌入,该嵌入输入分类头后输出类别标签预测。
而只需将基础 Sentence Transformer 模型替换为多语言模型,SetFit 就能无缝地在多语言环境中工作。在我们的实验中,SetFit 在德语、日语、普通话、法语和西班牙语的分类任务上,无论是在单语言还是跨语言设置下,都显示出有前景的结果。
SetFit 基准测试
尽管基于比现有少样本方法小得多的模型,SetFit 在各种基准测试上的表现与最先进的少样本方法相当或更好。在 RAFT 这一少样本分类基准上,使用 all-roberta-large-v1 模型的 SetFit Roberta(拥有 3.55 亿参数)超越了 PET 和 GPT-3。它仅略低于人类平均表现和 110 亿参数的 T-few——后者规模是 SetFit Roberta 的 30 倍。SetFit 还在 11 项 RAFT 任务中的 7 项上超越了人类基线。
| 排名 | 方法 | 准确率 | 模型大小 |
|---|---|---|---|
| 2 | T-Few | 75.8 | 11B |
| 4 | 人类基线 | 73.5 | 不适用 |
| 6 | SetFit(Roberta Large) | 71.3 | 355M |
| 9 | PET | 69.6 | 235M |
| 11 | SetFit(MP-Net) | 66.9 | 110M |
| 12 | GPT-3 | 62.7 | 175 B |
RAFT 排行榜上的主要方法(截至 2022 年 9 月)
在其他数据集上,SetFit 在各种任务中展现出稳健性。如下图所示,每类仅用 8 个示例,它通常就能超越 PERFECT、ADAPET 和微调过的普通 transformer。尽管无需提示词且规模小 27 倍,SetFit 也能取得与 T-Few 3B 相当的结果。
在 3 个分类数据集上比较 SetFit 与其他方法的性能。
快速训练和推理
比较 T-Few 3B 和 SetFit(MPNet)的训练成本与平均性能,每类使用 8 个标注示例。
由于 SetFit 能以相对较小的模型实现高准确率,因此训练速度极快且成本低得多。例如,在 NVIDIA V100 上用 8 个标注示例训练 SetFit 仅需 30 秒,成本为 0.025 美元。相比之下,训练 T-Few 3B 需要 NVIDIA A100,耗时 11 分钟,同一实验的成本约为 0.7 美元——高出 28 倍。事实上,SetFit 可以在像 Google Colab 上那样的单块 GPU 上运行,你甚至可以在 CPU 上仅用几分钟就训练好 SetFit!如上图所示,SetFit 的速度提升伴随着相当的模型性能。类似的收益也体现在推理上,而蒸馏 SetFit 模型可以带来 123 倍的速度提升 🤯。
训练你自己的模型
为了让社区能够使用 SetFit,我们创建了一个小型 setfit 库,让你只需几行代码就能训练自己的模型。
首先要做的是通过运行以下命令来安装它:
pip install setfit
接下来,我们导入 SetFitModel 和 SetFitTrainer,这两个核心类简化了 SetFit 的训练过程:
from datasets import load_dataset
from sentence_transformers.losses import CosineSimilarityLoss
from setfit import SetFitModel, SetFitTrainer
现在,让我们从 Hugging Face Hub 下载一个文本分类数据集。我们将使用 SentEval-CR 数据集,这是一个客户评论数据集:
dataset = load_dataset("SetFit/SentEval-CR")
为了模拟只有少量标注示例的真实场景,我们将从训练集中每类抽取 8 个示例:
# Select N examples per class (8 in this case)
train_ds = dataset["train"].shuffle(seed=42).select(range(8 * 2))
test_ds = dataset["test"]
现在我们有了数据集,下一步是从 Hub 加载一个预训练的 Sentence Transformer 模型并实例化一个 SetFitTrainer。这里我们使用 paraphrase-mpnet-base-v2 模型,我们发现它在许多数据集上都能给出很好的结果:
# Load SetFit model from Hub
model = SetFitModel.from_pretrained("sentence-transformers/paraphrase-mpnet-base-v2")
# Create trainer
trainer = SetFitTrainer(
model=model,
train_dataset=train_ds,
eval_dataset=test_ds,
loss_class=CosineSimilarityLoss,
batch_size=16,
num_iterations=20, # Number of text pairs to generate for contrastive learning
num_epochs=1 # Number of epochs to use for contrastive learning
)
最后一步是训练并评估模型:
# Train and evaluate!
trainer.train()
metrics = trainer.evaluate()
就是这样——你现在已经训练好了你的第一个 SetFit 模型!记得把你训练好的模型推送到 Hub :)
# Push model to the Hub
# Make sure you're logged in with huggingface-cli login first
trainer.push_to_hub("my-awesome-setfit-model")
虽然这个例子展示了如何用一种特定类型的基础模型来完成,但任何 Sentence Transformer 模型都可以替换进来,以获得不同的性能和适应不同任务。例如,使用多语言 Sentence Transformer 主体可以将少样本分类扩展到多语言场景。
后续步骤
我们已经展示了 SetFit 是一种有效的少样本分类方法。在接下来的几个月里,我们将探索该方法在自然语言推理和标记分类等任务上的泛化能力。与此同时,我们非常期待看到业界从业者如何将 SetFit 应用到他们的用例中——如果您有任何问题或反馈,请在我们的 GitHub 仓库 上提交 issue 🤗。
祝少样本学习愉快!
来源:Hugging Face:Blog · huggingface.co