1. 小样本学习:当数据稀缺时,模型如何“学会学习”?
想象一下,你是一个刚入职的质检员,今天要检查一批你从未见过的精密零件。老师傅没有时间给你看几千张合格与不合格的样本图,他只从口袋里掏出几个零件——喏,这个光滑的是好的,那个有毛刺的是坏的。然后,他指着流水线上源源不断的新零件对你说:“去吧,把它们分好类。” 你心里可能会打鼓,但人类恰恰擅长这种“举一反三”的学习能力。而小样本学习(Few-Shot Learning),就是让AI模型也获得这种能力。
在传统的深度学习中,比如训练一个猫狗分类器,我们通常需要成千上万张标注好的猫和狗图片,模型才能学得靠谱。但在现实世界的很多场景里,这种“数据盛宴”根本不存在。比如医疗影像中罕见的病症、工业上新的缺陷类型、或者为某个特定用户定制化的商品识别,我们可能每个类别只有几张、甚至一张样本图片。小样本学习要解决的,就是如何让模型只凭这“寥寥数语”(少量样本),就能理解一个新类别的核心特征,并做出准确的判断。
它的核心思想,是让模型“学会如何学习”。这听起来有点绕,其实训练过程很巧妙。我们不会用一个固定的数据集(比如全是猫狗)去训练模型,而是准备许多个“小任务”来锻炼它。每个小任务都模拟我们最终要面临的场景:给你一个支持集(Support Set),里面包含几个新类别的少量样本(比如,1张“自行车”图,1张“汽车”图,这叫1-shot 2-way);然后给你一个查询集(Query Set),里面是一些未标注的同类别图片,让你去分类。模型在成千上万个这样五花八门的小任务中摸爬滚打(从动物到水果到交通工具),它最终学会的不是“猫长什么样”,而是一种通用的“比较和归纳”能力。当遇到一个全新的类别(比如“无人机”)时,它就能快速利用支持集中的几个样本,提炼出关键信息,从而对查询图片做出判断。
这种训练方式被称为“元学习”或“学会学习”范式。它与传统训练最根本的区别在于:传统模型学完猫狗后,只能分猫狗;而小样本学习模型在训练中见过无数个“小任务”后,获得的是强大的泛化与适应能力,能够处理它在训练阶段从未见过的全新类别。这就像我们通过大量阅读掌握了“阅读理解”的方法,之后即使遇到一篇全新的文章,也能快速理解其主旨。
接下来,我们就深入实战,剖析小样本学习领域三个里程碑式的模型:孪生网络、匹配网络和原型网络。我会结合代码和实际案例,带你看看它们各自是怎么工作的,在什么情况下用哪个更合适,以及我在实际项目中踩过的一些坑。
2. 孪生网络:从“找不同”到“认亲”的度量大师
孪生网络(Siamese Networks)的思想非常直观,它模仿的是我们人类对比认知的过程。给你两张照片,让你判断是不是同一个人,你会怎么做?你会仔细对比五官、脸型、神态等特征。孪生网络干的就是这个事:它不直接对单张图片进行分类,而是学习一个度量空间,在这个空间里,同类样本的距离很近,异类样本的距离很远。
2.1 核心结构与工作原理
孪生网络的结构就像一对双胞胎,共享同一套“大脑”(参数完全相同的编码器网络)。它的输入总是一对样本(比如两张图片),输出是一个相似度分数。训练时,我们准备三种样本对:
- 正样本对:两张属于同一类别的图片(如两只不同的猫)。
- 负样本对:两张属于不同类别的图片(如一只猫和一只狗)。
模型的目标是,让正样本对经过编码器后得到的两个特征向量尽可能相似(距离小),让负样本对的特征向量尽可能不同(距离大)。常用的损失函数是对比损失或三元组损失。我更喜欢用三元组损失,因为它更符合我们的直觉:它需要一个锚点样本、一个正样本(与锚点同类)和一个负样本(与锚点不同类),然后拉近锚点与正样本的距离,同时推远锚点与负样本的距离,并且要推远到一个设定的“边际”以上。
import torch
import torch.nn as nn
import torch.nn.functional as F
class SiameseNetwork(nn.Module):
def __init__(self, backbone):
super(SiameseNetwork, self).__init__()
self.backbone = backbone # 共享的编码器,例如一个CNN
def forward(self, x1, x2):

878

被折叠的 条评论
为什么被折叠?



