fewshot意图识别

本文探讨Few-Shot Text Classification,介绍Induction Network的应用,通过编码器、动态学习和关系抽取处理少量样本的分类任务。在训练集上,模型学习通用表示,而在测试集上,面对新类别时,模型直接利用已学习的表示进行匹配。复现过程中遇到数据集划分、Capsule网络理解和训练策略等问题,需进一步优化以提高损失函数收敛速度和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Few-Shot Text Classification with Induction Network
代码地址:

meta learning:
每一个training episode,在training set中选择C个classes,
在每个class下选择training data(样本环境)和testing data(即为query),
这C个classes的所有training data构成 support set,这C个classes的所有testing data构成query set。
meta testing:
这里面的样本,每个class的样本数很少,而且所有的class在之前的learning中没有见过,
我们用同样的方法选择出support set和query set,验证判断情况。

取自FEW-SHOT TEXT CLASSIFICATION WITH Distributional signatures19,
那么每次的query set 一共有C*len(testing data)个,逐一与classes进行比较。

总结:
1.
在training set上,
encoder学会句子(query和classes里面所有句子的共同表示),
dynamic 学会classes表示
relation学会抽取class-query的匹配信息,
2.
testing set,就是class很少而且class样本很少,不用纠结testing 的定义问题,只是问了判断training的性能。不用继续训练,直接看loss,
当新的classes来的时候,dynamic可以直接提取class表示,
3.
当实际应用时,我们已经提取出所有classes的表示,每来一个query,与所有的class表示进行relation计算,得到分数最高的,


复现问题:

1.learning 和test的数据集的划分问题:

5C5K,5C10K,10C10K,
2.
在test阶段,还是有support set和query set,就是说每个query_text都是有候选集的.而我在test之后需要进行准备好所有的classes_vectors。
文章主要解决的问题是,来了样本条数少的新种类,怎么办。
3.重读文章的理论内容,(已做笔记)
4.对于capsule部分,
论文里仅有的参数是 e i j = W s

### Few Shot Learning 示例 #### 图像分类中的Few Shot Learning 在图像分类场景下,假设有一个新类别的猫科动物——云豹。训练集中仅有几张不同姿态的云豹图片作为支持集(support set),而查询集(query set)中有若干张未见过的云豹照片待分类。 为了完成这个任务,可以采用基于度量学习的方法来构建模型。具体来说,先在一个大型基础数据集上预训练卷积神经网络(CNN)[^1],之后利用少量样本微调(finetune)该CNN的最后一层全连接层权重参数,使得它能够区分出新的类别。另一种策略是直接计算测试样本与支撑集中各个类代表向量之间的距离(如欧氏距离),从而决定其所属类别[^3]。 ```python import torch.nn.functional as F from torchvision import models, transforms from PIL import Image def load_image(image_path): transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), ]) image = Image.open(image_path).convert('RGB') return transform(image) class SimpleConvNet(torch.nn.Module): def __init__(self): super().__init__() self.feature_extractor = models.resnet50(pretrained=True) def forward(self, x): features = self.feature_extractor(x) return F.normalize(features) model = SimpleConvNet().eval() support_images = [load_image(path) for path in support_paths] query_image = load_image(query_path) with torch.no_grad(): support_features = model(torch.stack(support_images)) query_feature = model(query_image.unsqueeze(0)) distances = ((support_features - query_feature)**2).sum(dim=1) predicted_class_index = distances.argmin().item() ``` 此代码片段展示了如何加载一张图片并提取特征表示;接着对于给定的支持集和支持集对应的标签以及单个查询实例,通过比较它们之间嵌入空间内的欧式距离来进行分类决策。 #### 自然语言处理中的Few Shot Learning 考虑一个意图识别的任务,在这里只有几个样例用于定义一个新的命令词:“打开车库门”。尽管可用的数据非常有限,但是借助迁移学习的思想,可以从已经充分训练过的通用对话理解系统中继承大部分的知识结构,并仅针对特定的新指令做适当调整即可适应新情况。 例如,使用BERT这样的预训练语言模型,只需在其之上附加一层简单的线性分类器,并用极少数的人工标注语料对其进行微调就能实现较好的效果。这不仅减少了人工成本还提高了开发效率[^2]。 ```python from transformers import BertTokenizerFast, BertForSequenceClassification import torch tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased') model = BertForSequenceClassification.from_pretrained( 'bert-base-uncased', num_labels=2).train() training_texts = ["Open the garage door please.", ... ] # 小规模的手动标注文本列表 labels = [1]*len(training_texts) # 新增命令对应的目标标签 inputs = tokenizer(training_texts, padding=True, truncation=True, return_tensors="pt") outputs = model(**inputs, labels=torch.tensor(labels)) loss = outputs.loss # 微调过程中的损失值 loss.backward() # 反向传播更新参数 optimizer.step() # 使用优化算法执行一步梯度下降 ``` 上述Python脚本说明了怎样准备输入序列并对预先存在的Bert模型实施一次前馈操作以获得输出logits,进而依据提供的ground truth计算交叉熵损失函数值,最后反传误差至各层节点完成一轮迭代更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值