譯者 | 陳峻
審校 | 重樓
在本文中,我將向您介紹“少樣本(Few-shot)學(xué)習(xí)”的相關(guān)概念,并重點(diǎn)討論被廣泛應(yīng)用于文本分類的SetFit方法。
傳統(tǒng)的機(jī)器學(xué)習(xí)(ML)
在監(jiān)督(Supervised)機(jī)器學(xué)習(xí)中,大量數(shù)據(jù)集被用于模型訓(xùn)練,以便磨練模型能夠做出精確預(yù)測(cè)的能力。在完成訓(xùn)練過(guò)程之后,我們便可以利用測(cè)試數(shù)據(jù),來(lái)獲得模型的預(yù)測(cè)結(jié)果。然而,這種傳統(tǒng)的監(jiān)督學(xué)習(xí)方法存在著一個(gè)顯著缺點(diǎn):它需要大量無(wú)差錯(cuò)的訓(xùn)練數(shù)據(jù)集。但是并非所有領(lǐng)域都能夠提供此類無(wú)差錯(cuò)數(shù)據(jù)集。因此,“少樣本學(xué)習(xí)”的概念應(yīng)運(yùn)而生。
在深入研究Sentence Transformer fine-tuning(SetFit)之前,我們有必要簡(jiǎn)要地回顧一下自然語(yǔ)言處理(Natural Language Processing,NLP)的一個(gè)重要方面,也就是:“少樣本學(xué)習(xí)”。
少樣本學(xué)習(xí)
少樣本學(xué)習(xí)是指:使用有限的訓(xùn)練數(shù)據(jù)集,來(lái)訓(xùn)練模型。模型可以從這些被稱為支持集的小集合中獲取知識(shí)。此類學(xué)習(xí)旨在教會(huì)少樣本模型,辨別出訓(xùn)練數(shù)據(jù)中的相同與相異之處。例如,我們并非要指示模型將所給圖像分類為貓或狗,而是指示它掌握各種動(dòng)物之間的共性和區(qū)別。可見(jiàn),這種方法側(cè)重于理解輸入數(shù)據(jù)中的相似點(diǎn)和不同點(diǎn)。因此,它通常也被稱為元學(xué)習(xí)(meta-learning)、或是從學(xué)習(xí)到學(xué)習(xí)(learning-to-learn)。
值得一提的是,少樣本學(xué)習(xí)的支持集,也被稱為k向(k-way)n樣本(n-shot)學(xué)習(xí)。其中“k”代表支持集里的類別數(shù)。例如,在二分類(binary classification)中,k 等于 2。而“n”表示支持集中每個(gè)類別的可用樣本數(shù)。例如,如果正分類有10個(gè)數(shù)據(jù)點(diǎn),而負(fù)分類也有10個(gè)數(shù)據(jù)點(diǎn),那么 n就等于10??傊?,這個(gè)支持集可以被描述為雙向10樣本學(xué)習(xí)。
既然我們已經(jīng)對(duì)少樣本學(xué)習(xí)有了基本的了解,下面讓我們通過(guò)使用SetFit進(jìn)行快速學(xué)習(xí),并在實(shí)際應(yīng)用中對(duì)電商數(shù)據(jù)集進(jìn)行文本分類。
SetFit架構(gòu)
由Hugging Face和英特爾實(shí)驗(yàn)室的團(tuán)隊(duì)聯(lián)合開(kāi)發(fā)的SetFit,是一款用于少樣本照片分類的開(kāi)源工具。你可以在項(xiàng)目庫(kù)鏈接--https://github.com/huggingface/setfit?ref=hackernoon.com中,找到關(guān)于SetFit的全面信息。
就輸出而言,SetFit僅用到了客戶評(píng)論(Customer Reviews,CR)情感分析數(shù)據(jù)集里、每個(gè)類別的八個(gè)標(biāo)注示例。其結(jié)果就能夠與由三千個(gè)示例組成的完整訓(xùn)練集上,經(jīng)調(diào)優(yōu)的RoBERTa Large的結(jié)果相同。值得強(qiáng)調(diào)的是,就體積而言,經(jīng)微優(yōu)的RoBERTa模型比SetFit模型大三倍。下圖展示的是SetFit架構(gòu):
圖片來(lái)源:https://www.sbert.net/docs/training/overview.html?ref=hackernoon.com
用SetFit實(shí)現(xiàn)快速學(xué)習(xí)
SetFit的訓(xùn)練速度非???,效率也極高。與GPT-3和T-FEW等大模型相比,其性能極具競(jìng)爭(zhēng)力。請(qǐng)參見(jiàn)下圖:
SetFit與T-Few 3B模型的比較
如下圖所示,SetFit在少樣本學(xué)習(xí)方面的表現(xiàn)優(yōu)于RoBERTa。
SetFit與RoBERT的比較,圖片來(lái)源:https://huggingface.co/blog/setfit?ref=hackernoon.com
數(shù)據(jù)集
下面,我們將用到由四個(gè)不同類別組成的獨(dú)特電商數(shù)據(jù)集,它們分別是:書(shū)籍、服裝與配件、電子產(chǎn)品、以及家居用品。該數(shù)據(jù)集的主要目的是將來(lái)自電商網(wǎng)站的產(chǎn)品描述歸類到指定的標(biāo)簽下。
為了便于采用少樣本的訓(xùn)練方法,我們將從四個(gè)類別中各選擇八個(gè)樣本,從而得到總共32個(gè)訓(xùn)練樣本。而其余樣本則將留作測(cè)試之用。簡(jiǎn)言之,我們?cè)诖耸褂玫闹С旨?/span>4向8樣本學(xué)習(xí)。下圖展示的是自定義電商數(shù)據(jù)集的示例:
自定義電商數(shù)據(jù)集樣本
我們采用名為“all-mpnet-base-v2”的Sentence Transformers預(yù)訓(xùn)練模型,將文本數(shù)據(jù)轉(zhuǎn)換為各種向量嵌入。該模型可以為輸入文本,生成維度為768的向量嵌入。
如下命令所示,我們將通過(guò)在conda環(huán)境(是一個(gè)開(kāi)源的軟件包管理系統(tǒng)和環(huán)境管理系統(tǒng))中安裝所需的軟件包,來(lái)開(kāi)始SetFit的實(shí)施。
!pip3 install SetFit
!pip3 install sklearn
!pip3 install transformers
!pip3 install sentence-transformers
安裝完軟件包后,我們便可以通過(guò)如下代碼加載數(shù)據(jù)集了。
from datasets import load_dataset
dataset = load_dataset('csv', data_files={
"train": 'E_Commerce_Dataset_Train.csv',
"test": 'E_Commerce_Dataset_Test.csv'
})
我們來(lái)參照下圖,看看訓(xùn)練樣本和測(cè)試樣本數(shù)。
訓(xùn)練和測(cè)試數(shù)據(jù)
我們使用sklearn軟件包中的LabelEncoder,將文本標(biāo)簽轉(zhuǎn)換為編碼標(biāo)簽。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
通過(guò)LabelEncoder,我們將對(duì)訓(xùn)練和測(cè)試數(shù)據(jù)集進(jìn)行編碼,并將編碼后的標(biāo)簽添加到數(shù)據(jù)集的“標(biāo)簽”列中。請(qǐng)參見(jiàn)如下代碼:
Encoded_Product = le.fit_transform(dataset["train"]['Label'])
dataset["train"] = dataset["train"].remove_columns("Label").add_column("Label", Encoded_Product).cast(dataset["train"].features)
Encoded_Product = le.fit_transform(dataset["test"]['Label'])
dataset["test"] = dataset["test"].remove_columns("Label").add_column("Label", Encoded_Product).cast(dataset["test"].features)
下面,我們將初始化SetFit模型和句子轉(zhuǎn)換器(sentence-transformers)模型。
from setfit import SetFitModel, SetFitTrainer
from sentence_transformers.losses import CosineSimilarityLoss
model_id = "sentence-transformers/all-mpnet-base-v2"
model = SetFitModel.from_pretrained(model_id)
trainer = SetFitTrainer(
model=model,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
loss_class=CosineSimilarityLoss,
metric="accuracy",
batch_size=64,
num_iteratinotallow=20,
num_epochs=2,
column_mapping={"Text": "text", "Label": "label"}
)
初始化完成兩個(gè)模型后,我們現(xiàn)在便可以調(diào)用訓(xùn)練程序了。
trainer.train()
在完成了2個(gè)訓(xùn)練輪數(shù)(epoch)后,我們將在eval_dataset上,對(duì)訓(xùn)練好的模型進(jìn)行評(píng)估。
trainer.evaluate()
經(jīng)測(cè)試,我們的訓(xùn)練模型的最高準(zhǔn)確率為87.5%。雖然87.5%的準(zhǔn)確率并不算高,但是畢竟我們的模型只用了32個(gè)樣本進(jìn)行訓(xùn)練。也就是說(shuō),考慮到數(shù)據(jù)集規(guī)模的有限性,在測(cè)試數(shù)據(jù)集上取得87.5%的準(zhǔn)確率,實(shí)際上是相當(dāng)可觀的。
此外,SetFit還能夠?qū)⒂?xùn)練好的模型,保存到本地存儲(chǔ)器中,以便后續(xù)從磁盤(pán)加載,用于將來(lái)的預(yù)測(cè)。
trainer.model._save_pretrained(save_directory="SetFit_ECommerce_Output/")
model=SetFitModel.from_pretrained("SetFit_ECommerce_Output/", local_files_notallow=True)
如下代碼展示了根據(jù)新的數(shù)據(jù)進(jìn)行的預(yù)測(cè)結(jié)果:
input = ["Campus Sutra Men's Sports Jersey T-Shirt Cool-Gear: Our Proprietary Moisture Management technology. Helps to absorb and evaporate sweat quickly. Keeps you Cool & Dry. Ultra-Fresh: Fabrics treated with Ultra-Fresh Antimicrobial Technology. Ultra-Fresh is a trademark of (TRA) Inc, Ontario, Canada. Keeps you odour free."]
output = model(input)
可見(jiàn),其預(yù)測(cè)輸出為1,而標(biāo)簽的LabelEncoded值為“服裝與配件”。由于傳統(tǒng)的AI模型需要大量的訓(xùn)練資源(包括時(shí)間和數(shù)據(jù)),才能有穩(wěn)定水準(zhǔn)的輸出。而我們的模型與之相比,既準(zhǔn)確又高效。
至此,相信您已經(jīng)基本掌握了“少樣本學(xué)習(xí)”的概念,以及如何使用SetFit來(lái)進(jìn)行文本分類等應(yīng)用。當(dāng)然,為了獲得更深刻的理解,我強(qiáng)烈建議您選擇一個(gè)實(shí)際場(chǎng)景,創(chuàng)建一個(gè)數(shù)據(jù)集,編寫(xiě)對(duì)應(yīng)的代碼,并將該過(guò)程延展到零樣本學(xué)習(xí)、以及單樣本學(xué)習(xí)上。
譯者介紹
陳峻(Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對(duì)內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專注傳播網(wǎng)絡(luò)與信息安全知識(shí)與經(jīng)驗(yàn)。
原文標(biāo)題:Mastering Few-Shot Learning with SetFit for Text Classification,作者:Shyam Ganesh S)