与规范微调相比,SetFit 能更高效地利用训练样本,同时对噪声也更鲁棒。
如何解决少标签或无标签的训练数据是每个数据科学家的梦魇 😱。最近几年来,基于预训练语言模型的少样本 (few-shot) 学习呈现并成为解决这类问题的颇有前途的计划。
因而,咱们非常高兴地向大家介绍 SetFit: 一个基于 Sentence Transformers 的高效的少样本微调 (fine-tune) 框架,该工作由 HuggingFace 和咱们的钻研搭档 Intel Labs 以及 UKP Lab 单干实现。SetFit 仅需应用很少的标注数据就能达到较高的准确率。举个例子,在客户评论情感数据集 (Customer Reviews (CR) sentiment dataset) 上,每类仅应用 8 个标注样本,SetFit 的准确率就和在 3 千个标注样本的训练选集上微调 RoBERTa Large 相当了 🤯!
与其余少样本学习计划相比,SetFit 有很多独有的特点:
- 🗣 无需提醒词或语言器 (verbalisers):目前的少样本微调技术都须要手工设计的提醒或语言器,用于将训练样本转换成适宜目标语言模型的格局。SetFit 通过间接从大量标注训练样本中生成丰盛的嵌入,齐全省去了提醒。
- 🏎 疾速训练 : SetFit 不须要应用像 T0 或 GPT-3 这样的大规模语言模型就能达到高准确率。因而,典型状况下,它的训练和推理会快一个数量级或以上。
- 🌎 反对多语言: SetFit 可与 Hub 上的任一 Sentence Tranformer 一起应用,这意味着如果你想让它反对多语言文本分类,你只有简略地微调一个多语言的 checkpoint 就好了。
如果你想晓得更多细节,能够在下方链接获取咱们的 论文、数据 及 代码。在本文中,咱们次要解释 SetFit 是如何工作的以及如何应用 SetFit 训练一个你本人的模型。让咱们开始吧!
SetFit 如何工作?
在设计 SetFit 时,咱们始终牢记高效、简略两个准则。SetFit 次要蕴含两个阶段:首先在大量标注样例 (典型值是每类 8 个或 16 个样例) 上微调一个 Sentence Transformer 模型。而后,用微调失去的 Sentence Tranformer 的模型生成文本的嵌入 (embedding),并用这些嵌入训练一个分类头 (classification head)。
SetFit 的两阶段训练过程
SetFit 利用 Sentence Transformer 的能力去生成基于句对 (paired sentences) 的浓密嵌入。在第一步微调阶段,它应用比照训练 (contrastive training) 来最大化利用无限的标注数据。首先,通过抉择类内 (in-class) 和类外 (out-class) 句子来结构正句对和负句对,而后在这些句对 (或三元组 (triplets) ) 上训练 Sentence Transformer 模型并生成每个样本的浓密向量。第二步,依据每个样本的嵌入向量和各自的类标签,训练分类头。推理时,未见过的样本通过微调后的 Sentence Transformer 并生成嵌入,生成的嵌入随后被送入分类头并输入类标签的预测。
只须要把根底 Sentence Transformer 模型换成多语言版的,SetFit 就能够无缝地在多语言环境下运行。在咱们的试验中,SetFit 在德语、日语、中文、法语以及西班牙语中,在单语言和跨语言的条件下,都获得了不错的分类性能。
测试 SetFit
只管与现存的少样本模型相比,SetFit 的模型要小得多,但在各种各样的测试基准上,SetFit 还是体现出了与以后最先进的办法相当或更好的性能。在 RAFT 这个少样本分类测试基准上,参数量为 335M 的 SetFit Roberta (应用 all-roberta-large-v1 模型) 性能超过了 PET 和 GPT-3。它的排名仅在人类均匀性能以及 11B 参数的 T-few 之后,而 T-few 模型的参数量是 SetFit Roberta 的 30 倍。SetFit 还在 11 个 RAFT 工作中的 7 个工作上体现好于人类基线。
Rank | Method | Accuracy | Model Size |
---|---|---|---|
2 | T-Few | 75.8 | 11B |
4 | Human Baseline | 73.5 | N/A |
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 月)
在其余的数据集上,SeiFit 在各种各样的工作中也展现出了鲁棒的性能。如下图所示,每类仅需 8 个样本,其典型性能就超过了 PERFECT、ADAPET 以及微调后的原始 transformer 模型。SetFit 还获得了与 T-Few 3B 相当的后果,只管它无需提醒且模型小了 27 倍。
在 3 个分类数据集上比拟 SetFit 与其余办法的性能。
疾速训练与推理
在每类 8 个标注样本的条件下,比拟 T-Few 3B 和 SetFit (MPNet) 的训练老本和均匀性能。
因为 SetFit 能够用绝对较小的模型获得高准确率,所以它训练起来能够十分快,而且老本也低不少。举个例子,在每类 8 个标注样本的数据集上应用 NVIDIA V100 训练 SetFit 只须要 30 秒,共破费 0.025 美金;相比较而言,雷同的试验下,训练 T-Few 3B 须要一张 NVIDIA A100,工夫上要 11 分钟,需破费 0.7 美金,老本高 28 倍以上。事实上,SetFit 不仅能够运行在那种你在 Google Colab 找到的 GPU 单卡上,甚至在 CPU 上你也仅需几分钟即能够训练一个模型。如上图所示,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
当初,咱们开始从 HuggingFace 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 仓库 上提出问题 🤗。
少样本学习高兴!
英文原文: https://hf.co/blog/setfit
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的利用及大规模模型的训练推理。