N-way K-shot Few shot learning

首先需要明确的是少样本领域的数据划分和大规模监督学习方法的数据划分不一样。在大规模监督学习方法中,训练集和测试集是混合后按比例随机切分,训练集和测试集的数据分布一致。以分类问题为例,切分后训练集中的类别和测试集中的类别相同,区别是样本数量不同。但是,在少样本领域,训练集和测试集是不交叉的,也就是说测试集中的类别在训练集中没有出现。

N-way K-shot是指测试集中有N个类别,每个类别有K个样本。对训练集中的类别和样本数量没有限制,但是在训练过程中每次迭代需要遵守N-way K-shot设置。上文提到训练集需划分为support set和query set,但是实际上,我们是在每个batch中,从训练集中采样N个类别,每个类别采样K+Q个样本。然后将这个batch的数据分为support set和query set,其中support set包含N个类别,每个类别K个样本,query set包含N个类别,每个类别Q个样本。

训练集中的类别和样本数量没有限制。这好像和少样本场景不符,但是测试集是N-way K-shot,并且类别和训练集不交叉。少样本模型的目的就是learn to learn,不管在训练集上如何训练,使用多少数据,最终还是要在测试集上测试。在测试集上测试是不会反向传播更新参数的,测试过程和训练过程一样,只是不需要计算损失和更新参数。在训练时保持N-way K-shot设置就是为了模拟测试集环境,而不是说训练集只有N*K个样本。顺便提一下,在测试时,测试集也需要划分support set和query set,其中support set需要符合N-way K-shot定义,这也是N-way K-shot的真正含义!对query set的样本数量没有限制,只需要类别和support set保持一致即可。

下面是一个few-shot learning 的示意图:

总结一下就是,训练和测试时的类别是不一样的,训练的目的是使得模型具有一定的先验知识,这种先验知识可以通过预训练的方式获取。然后在正式训练的时候通过support set 和 query set对比误差的方式 更新模型参数,从而在测试的时候通过对比图片的相似度来达到学会学习的目的,这也是少样本学习的最终目的。

 

### Few-Shot Learning 概念 Few-shot learning 是一种机器学习范式,在这种情况下,对于新的类别的识别只需要很少量的样本来进行训练。具体来说,该方法旨在利用少量标记的数据实例来快速适应新任务或类别[^1]。 ### n-way k-shot 定义 在 few-shot 学习框架下,“n-way k-shot”定义了一个特定的任务设置。“N-way”表示有 N 个不同的类别参与测试;而“K-shot”意味着每个类别仅有 K 个样本用于支持集(support set),即用来帮助模型理解和区分这些类别[^4]。 ### 实现方法 为了有效实施 few-shot learning,研究者们探索了多种技术路径: #### 原型网络 (Prototypical Networks) 通过计算各个类别的原型向量,并测量未知样本到各原型之间的距离来进行分类决策。这种方式假设同一类内的特征分布较为紧凑[^3]。 ```python import torch.nn.functional as F def euclidean_dist(x, y): """Compute Euclidean distance between two tensors.""" m, n = x.size(0), y.size(0) xx = torch.pow(x, 2).sum(dim=1, keepdim=True).expand(m, n) yy = torch.pow(y, 2).sum(dim=1, keepdim=True).expand(n, m).t() dist = xx + yy - 2 * torch.matmul(x, y.t()) return dist ``` #### 关系网络 (Relation Network) 引入额外的关系模块,评估查询样本与支持集中每一样本间的相似度得分,从而决定其归属哪一类。 ```python class RelationNetwork(nn.Module): def __init__(self, input_size, hidden_size): super(RelationNetwork, self).__init__() self.fc1 = nn.Linear(input_size*2, hidden_size) self.fc2 = nn.Linear(hidden_size, 1) def forward(self, x): out = F.relu(self.fc1(x)) out = F.sigmoid(self.fc2(out)) return out ``` ### 应用场景 Few-shot learning 特别适用于那些难以获取大量高质量标注数据领域,例如医疗影像分析、个性化推荐系统以及自然语言处理等领域中的罕见事件检测等应用场合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值