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 倉庫上提出問題 🤗。
祝您少量樣本學習愉快!