SetFit:无需提示的少量样本高效学习
SetFit 在样本效率和对噪声的鲁棒性方面均显著优于标准微调。
使用预训练语言模型进行少量样本学习已成为每个数据科学家噩梦的解决方案:处理标签很少甚至没有标签的数据😱。
Hugging Face 与我们在 Intel Labs 和 UKP Lab 的研究合作伙伴一起,很高兴推出 SetFit:一个用于少量样本微调 Sentence Transformers 的高效框架。SetFit 可以在少量标记数据的情况下实现高精度——例如,在客户评论 (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 上,SetFit Roberta(使用 `all-roberta-large-v1` 模型)拥有 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 | 3.55亿 |
9 | PET | 69.6 | 2.35亿 |
11 | SetFit (MP-Net) | 66.9 | 1.1亿 |
12 | GPT-3 | 62.7 | 175B |
RAFT 排行榜上的主要方法(截至 2022 年 9 月)
在其他数据集上,SetFit 在各种任务中都表现出鲁棒性。如下图所示,每个类别仅使用 8 个示例,它的性能通常优于 PERFECT、ADAPET 和微调后的普通 Transformer。SetFit 也取得了与 T-Few 3B 相当的结果,尽管它无需提示且小 27 倍。
SetFit 性能与其他方法在 3 个分类数据集上的比较。
快速训练和推理
T-Few 3B 和 SetFit (MPNet) 的训练成本和平均性能比较,每个类别有 8 个标记示例。
由于 SetFit 采用相对较小的模型即可实现高精度,因此它的训练速度极快,成本也低得多。例如,在 NVIDIA V100 上使用 8 个标记示例训练 SetFit 仅需 30 秒,成本为 0.025 美元。相比之下,训练 T-Few 3B 需要 NVIDIA A100,耗时 11 分钟,相同实验的成本约为 0.7 美元——是 SetFit 的 28 倍。事实上,SetFit 可以在单个 GPU 上运行,例如 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 仓库上提出问题 🤗。
祝您少量样本学习愉快!