few-shot learning是什么

个人博客:勤奋的懒猫

小样本学习

背景

深度学习背景下,每个类至少需要上千张训练样本才能使CNN在已知类别上性能饱和。此外,神经网络 generalization ability 薄弱,当 novel class 来临时, 模型很难通过少量的标记样本就学会识别 novel concepts。然而这一切对于人类来说却不成问题,我们人类是具有快速从少量(单)样本中快速学习能力的。即使对于一个五六岁的孩子来说,他从没有见过 “熊猫”,父亲给他看了一次熊猫的图片后,孩子到了动物园也会认识到那个黑眼圈,胖胖的动物叫“熊猫”啊。

有的朋友可能会想,为什么我们人类总是能快速的学习到未知的事物?简单的说,是因为人类生活中各种知识的积累以及人类天生的思考能力(如:类比能力)。知识的积累意味着我们是存在各种知识的先验的,天生的思考能力意味着我们拥有强大的类比能力、强大的大脑算力。

以“人类从未见到过澳大利亚的鸭嘴兽,给我们一张鸭嘴兽的照片后,人类就认识了!”这句话为例。鸭嘴兽就代表未知的事物(new class),而我们生活中已经见到过的鸭子、狸猫、鱼等动物就代表知识的先验,我们把这种知识的先验称为 元知识 (meta Knowledge),我们大脑的能快速的把从未见过的鸭嘴兽与这些元知识快速的类比(可能还存在一些其他脑力活动,如视觉提取物体的特征),得出结论:这个长得像鸭子嘴,还能像鱼一样游泳、身形扁扁的新动物就是鸭嘴兽。

上一段举的这个例子,倒是把我们人类的大脑小看了,这里我只是想说明,novel concepts 和已知知识是存在千丝万缕的联系的。当然,如果对于一件事物,我们完全完全未知,我们人类学习也是需要时间的。

看文字看累了,我们接着用图的方式来看看的 few shot 吧~

经过我上边的图,再加上下面的过程的文字介绍,我们应该可以理解小样本学习的过程了。

到了这里,还有唯一的疑问就是:小样本学习如何训练,就是这个 \mathcal{D}_{base} 怎么用呢?有两种训练方式:

1. 就是像 《Matching Nets》《RelationNet》《Prototypical Nets》《Meta-SGD》等等那样,训练测试保持统一,训练过程模拟测试过程。即训练时候,以 MatchNets,5way-1shot为例,每次也是随机采5个类,每类中1张图像做support sample,剩余的 99 张图像中可采15张做query samples ,query 与 support 通过 cosine distance 分类并计算 loss。这属于一种元学习的训练策略,往往用于 5-way 的设置

2. 普通分类训练方式,\mathcal{D}_{base} 直接用普通分类方式来训练一个鲁棒的特征提取器,\mathcal{D}_{novel}  可以直接通过 SVM,Euclid ,权重迁移的方式分出 query set。

------------------------------------------------------------------------------------------------------------------------------

分割线

2019年6月13日更新

18年写这篇文章时候,基本上网上还没有 few-shot 的东西,没想到访问量突破 w 了。现在few-shot也逐步被大家水的饱和了,开始转向 zero-shot。

### 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 特别适用于那些难以获取大量高质量标注数据领域,例如医疗影像分析、个性化推荐系统以及自然语言处理等领域中的罕见事件检测等应用场合。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的懒猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值