跳到正文
原文
Hugging Face Blog·· 2022-09-26精选AI 评分62

Hugging Face 联合 Intel Labs 与 UKP Lab 发布 SetFit 小样本微调框架

SetFit: Efficient Few-Shot Learning Without Prompts

AI 导读

Hugging Face 与 Intel Labs、UKP Lab 合作推出 SetFit,一个用于 Sentence Transformers 小样本微调的框架,无需提示词或 verbaliser。

推荐理由

SetFit 用 Sentence Transformers 的对比训练替代提示词,在 RAFT 上以小模型接近大模型表现,读者可据此了解小样本分类的低成本路径。

正文 · AI 翻译

SetFit 在样本效率和抗噪声能力上显著优于标准的微调方法。

利用预训练语言模型进行少样本学习已成为解决每位数据科学家噩梦的一项有前景的方案:处理几乎没有标签或完全没有标签的数据 😱。

我们与 Intel Labs 和 UKP Lab 的研究伙伴合作,HF Mirror 非常高兴地推出 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 还在 RAFT 的 11 个任务中的 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 175B

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

现在,让我们从 HF Mirror 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 · hf-mirror.com