LiqFit Library是专为交叉编码器模型设计的改变游戏规则的少样本学习工具。就其核心而言,LiqFit辨别成对陈述(假设和前提)之间的关系——无论它们是必然的、矛盾的还是不相关的,这一过程被称为自然语言推理(NLI)。在Bowman等人发表了自然语言推理数据集之后,这个概念变得流行起来。2015年获得斯坦福大学博士学位。它通过显著提高语言模型的推理能力,推动了语言模型的发展。我们的框架围绕这一技术,使每个人都可以用最少的数据集完成信息提取任务。它通过成倍地减少训练数据需求来增强文本分类、命名实体识别和问题回答。
什么是少样本学习?
少样本学习是指机器学习模型从最小数据集学习或归纳的能力。与传统的ML模型需要大数据集才能有效学习不同,少样本学习模型被设计为使用较少的示例进行准确的预测。
最少示例的效率
LiqFit的突出之处在于,它能够显著提高默认的零击分类器的准确性,每个标签只有8个示例。这种学习效率使其有别于需要大量数据集的传统模型。
应用的多功能性
该框架在自然语言推理方面的熟练程度使其能够适应各种信息抽取任务。这种多功能性使其成为从命名实体识别到问答系统等应用程序的宝贵资产。
类灵活性
LiqFit的独特属性之一是它能够适应训练集中不存在的类。由于LIQFIT对自然语言推理和分类任务的大量语料库进行了预先微调,因此它在各种类别中保持了其通用性。在实践中,为了节省时间和资源,你可以只注入标签的示例,如果模型处理其他标签,则模型在这些标签上执行得很差。
支持多个交叉编码器架构
该框架与各种交叉编码器实现兼容,包括传统的、二进制的和编码器-解码器架构。这种灵活性允许用户选择最适合其特定要求的型号。
不平衡数据的稳定性
LiqFit采用了标准化技术,使其即使在不平衡的数据集上也能有效运行。此功能对于数据不平衡是常见挑战的实际应用程序至关重要。
多标签分类
LiqFit支持多类别和多标签分类,扩展了其在不同分类任务中的适用性。
计算需求
该框架需要运行变压器的前馈通道n次,其中n是标签的数量。
实际执行
可以使用以下命令通过pip安装LiqFit:
pip install LiqFit
对于最新版本,你可以通过执行以下命令从源代码进行构建:
pip install git+https://github.com/Knowledgator/LiqFit
首先,我们需要导入库。此外,对于LiqFit,我们需要使用HuggingFace Hub和DataSets中的模型的转换器来下载必要的数据集。
from transformers import AutoModelForSequenceClassification, AutoTokenizer
from transformers import TrainingArguments, Trainer
from liqfit.datasets import NLIDataset
from liqfit.collators import NLICollator
from datasets import load_dataset
在这种情况下,我们将使用DAIR-AI/Emotion数据集。它由六种基本情绪的英文推特信息组成:愤怒、恐惧、喜悦、爱、悲伤和惊讶。
我们将为训练集的每个标签平均随机选择8个示例,并将使用整个测试集进行测试。
#emotion
emotion_dataset = load_dataset("dair-ai/emotion")
test_dataset = emotion_dataset['test']
classes = test_dataset.features["label"].names
N = 8
train_dataset = emotion_dataset['train'].shuffle(seed=41).select(range(len(classes)*N))
在下载和采样数据集之后,我们需要对其进行预处理以适应自然语言推理(NLI)格式。
自然语言识别是自然语言处理中的一项重要任务,它主要是确定两个给定文本片段之间的逻辑关系:前提和假设。
目标是确定假设是否可以从前提中推断出来,分为三类:蕴涵、矛盾或中性。
在我们的例子中,我们使用类来形成文本和语句对,比如“ This text belongs to business Class ”,包括否定语句。然后,我们训练一个分类器来区分语句是真还是假。
为了转换数据集,我们使用 NLIDataset 的一个名为 load_dataset 的类方法,它采用以下参数:
参数:
nli_train_dataset = NLIDataset.load_dataset(train_dataset, classes = classes)
nli_test_dataset = NLIDataset.load_dataset(test_dataset, classes = classes)
模型初始化
在我们的例子中,我们将使用Knowledgator/Comprehender-It-Base模型。它在多个自然语言推理数据集上进行了训练,并在零拍摄文本分类中表现出优越的性能。
此外,该模型还可用于零拍摄设置下的多个信息提取任务。
model_path = 'knowledgator/comprehend_it-base'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForSequenceClassification.from_pretrained('knowledgator/comprehend_it-base')
如果你想要使用另一个损失或分类压头,我们建议使用LiqFitModel类别。
from liqfit.modeling import LiqFitModel
from liqfit.losses import FocalLoss
backbone_model = AutoModelForSequenceClassification.from_pretrained('microsoft/deberta-v3-xsmall')
loss_func = FocalLoss(multi_target=True)
model = LiqFitModel(backbone_model.config, backbone_model, loss_func=loss_func)
训练
我们将使用Transformers Trainer,并使用Liqfit NLicollator整理数据。你可以将训练参数设置为你认为需要的任何参数。
data_collator = NLICollator(tokenizer, max_length=128, padding=True, truncation=True)
training_args = TrainingArguments(
output_dir='comprehendo',
learning_rate=3e-5,
per_device_train_batch_size=3,
per_device_eval_batch_size=3,
num_train_epochs=9,
weight_decay=0.01,
evaluation_strategy="epoch",
save_steps = 5000,
save_total_limit=3,
remove_unused_columns=False,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=nli_train_dataset,
eval_dataset=nli_test_dataset,
tokenizer=tokenizer,
data_collator=data_collator,
)
trainer.train()
测试
我们将使用Transformer库的零样本分类管道,在少量样本设置中测试微调模型。然后,我们将计算基本的分类指标,例如准确度、精确度、召回率、F1 分数。
from transformers import pipeline
from sklearn.metrics import classification_report
from tqdm import tqdm
import torch
device = torch.device('cuda:0')
classifier = pipeline("zero-shot-classification",
model=model,tokenizer=tokenizer, device=device)
from tqdm import tqdm
label2idx = {label: id for id, label in enumerate(classes)}
preds = []
template = 'This example is {}.'
new_classes = [template.format(c) for c in classes]
label2idx = {label: id for id, label in enumerate(new_classes)}
for example in tqdm(test_dataset):
if not example['text']:
preds.append(idx)
continue
pred = classifier(''+example['text'],new_classes, hypothesis_template = template)['labels'][0]
idx = label2idx[pred]
preds.append(idx)
print(classification_report(test_dataset['label'][:len(preds)], preds, target_names=classes, digits=4))
性能基准测试
LIQFIT的有效性在不同数据集上与SETFIT的基准比较中得到了强调。LiqFit展示了卓越的性能,尤其是每个标签的示例数量最少。