1. 从“零”到“有”:理解少样本学习的核心范式
最近在跟进一些前沿的论文和项目,发现“zero-shot”、“one-shot”、“few-shot”这几个词出现的频率越来越高,尤其是在大语言模型和计算机视觉的一些新工作中。很多朋友,包括一些刚入行的同学,常常会问我:这几个概念听起来很酷,但到底是什么意思?它们之间有什么区别?为什么现在这么重要?今天,我就结合自己读论文和做实验的体会,来聊聊这几个“shot”背后的门道。简单来说,它们描述的是模型在学习新任务或识别新类别时,需要多少“例子”。这直接关系到模型的泛化能力、适应性和数据效率,是当前AI从“实验室玩具”走向“实用工具”的关键门槛。
我们可以把模型想象成一个刚入职的新员工。“zero-shot”就是老板直接扔给他一份全新的、从没接触过的工作说明书(比如用梵文写一份市场分析),要求他立刻完成。这听起来很离谱,但如果这个员工知识面极广、逻辑推理能力超强,他或许能根据对“市场分析”和“梵文字符”的已有知识,勉强拼凑出点东西。“one-shot”则是老板给了他一个完美的范例(比如一份英文的市场分析报告),然后说:“照这个格式和逻辑,用梵文写一份新的”。“few-shot”就更友好了,老板给了他三五个不同风格的范例,让他从中总结规律,再完成新任务。显然,给的例子越多,任务完成得可能越好,但对员工自身“举一反三”能力的要求也越低。在AI领域,我们追求的就是那个“知识面极广、逻辑超强”的员工,让它在例子极少甚至为零的情况下,也能出色工作。
2. Zero-Shot Learning:无例可循的“开卷考试”
Zero-Shot Learning的核心思想是:让模型能够识别或处理它在训练阶段从未见过的类别或任务。这听起来像是“无中生有”,但实际上,它依赖于一个关键的桥梁:语义空间或知识库。
2.1 核心原理:从特征到语义的映射
模型在训练时,并没有见过“斑马”的图片,但它见过“马”和“老虎”。同时,我们有一个先验的语义描述,比如通过词向量(Word Embedding)或知识图谱,知道“斑马”的语义是“一种有黑白条纹的、像马的动物”。训练过程不仅仅是学习区分“马”和“老虎”的视觉特征,更重要的是学习视觉特征空间到语义属性空间的映射关系。
举个例子,模型学会了“有条纹”这个视觉特征对应着语义属性中的has_stripes=True,“体型像马”对应着shape=equine。当测试时出现一张斑马图片,模型提取出“黑白条纹”和“马形体型”的特征,然后将其映射到语义空间。在语义空间中,它发现这个组合最接近“斑马”的语义描述(has_stripes=True,shape=equine,color=black&white),从而推断出这是“斑马”。
注意:这里的“语义”不一定非得是人类语言。它可以是任何形式的、能够描述类别特性的辅助信息,比如属性向量、类别的文本描述、甚至其他模态的数据(如音频)。关键在于,这些语义信息在训练和测试阶段是共享的,为模型提供了跨类别的推理基础。
2.2 典型应用场景与挑战
场景一:开放词汇目标检测在自动驾驶或机器人视觉中,世界上的物体种类无穷无尽,不可能在训练集中穷举。ZSL使得模型能够检测出训练时未标注的物体,只要我们能提供这些物体的文本描述(例如,“一个正在玩滑板的人”)。模型将图像区域的特征与文本描述的特征进行匹配,从而定位并识别出新物体。
场景二:基于文本描述的图像生成如DALL-E或Stable Diffusion等模型,用户输入“一只穿着宇航服、正在弹吉他的柯基犬”,模型就能生成对应的图像。模型从未在训练集中见过如此组合的图片,但它理解“柯基犬”、“宇航服”、“弹吉他”这些概念的视觉特征,并能将它们组合起来。这本质上是一种条件生成式的Zero-Shot任务。
主要挑战:
- 语义鸿沟:模型学习到的视觉-语义映射可能是不精确或不完整的。语义空间中的相似性(如“马”和“斑马”的词向量很接近)不一定对应视觉上的相似性,反之亦然。
- 领域偏移:训练时见过的类别(如家养动物)和测试时未见的类别(如野生动物)可能分布在不同的数据域中,导致映射函数失效。
- 偏见问题:模型倾向于将未知类别的样本预测为已知类别中语义最相似的,这被称为“枢纽点问题”。
在实际操作中,要成功应用ZSL,精心设计语义表示(如使用大规模预训练语言模型获取高质量文本特征)和采用鲁棒的映射学习算法(如使用生成对抗网络为未见类别合成视觉特征)至关重要。
3. One-Shot Learning:见微知著的“范例学习”
如果说ZSL是“开卷考”,那One-Shot Learning就是给了你一道极其相似的“例题”。它的目标是:通过单个示例,让模型学会一个新的类别或任务。这比ZSL多了一点信息,但依然是对模型泛化能力的巨大考验。
3.1 核心原理:度量学习与相似性比较
One-Shot Learning通常不依赖显式的语义描述,而是依赖于一个学习好的度量空间。在这个空间里,相同类别的样本彼此靠近,不同类别的样本彼此远离。模型的核心能力不再是分类,而是计算相似度。
经典的Siamese Network(孪生网络)就是为此而生。它由两个共享权重的相同子网络组成。训练时,输入一对样本(可能同类,可能不同类),网络提取特征后计算二者的距离(如欧氏距离、余弦相似度)。损失函数鼓励同类样本距离小,异类样本距离大。经过大量“样本对”的训练后,网络学会了如何抽取能够有效区分不同类别的特征。
当遇到一个新类别只有一个支持样本(Support Sample)时,我们将待查询样本(Query Sample)与这个支持样本输入训练好的Siamese Network,计算特征相似度。如果相似度超过某个阈值,就判定为同一类。
3.2 从One-Shot到Few-Shot:原型网络的力量
One-Shot是Few-Shot的特例。更通用的Few-Shot Learning(如N-way K-shot)通常采用“原型网络”或“匹配网络”的范式。以“5-way 1-shot”为例,任务是从5个新类别中识别样本,每个类别只提供1个示例。
原型网络的工作流程非常直观:
- 支持集:提供5个类别的5个样本(每个类别1个)。
- 原型计算:将每个类别的那个唯一样本通过特征提取网络,得到的特征向量就直接作为该类的“原型”。在K>1的情况下,原型就是该类所有支持样本特征向量的均值。
- 查询与分类:对于一个待分类的查询样本,同样提取其特征向量,然后计算它与5个原型在特征空间中的距离(如欧氏距离)。
- Softmax归一化:将这些距离取负后输入Softmax函数,得到查询样本属于每个类别的概率。距离原型越近,概率越高。
这个过程就像一个“最近邻分类器”,但核心在于,特征提取网络是经过精心设计的,使得它提取的特征在空间中的分布具有上述“同类相近、异类相远”的性质。这个网络的训练是在一个包含大量类别和样本的“元训练集”上完成的,通过大量随机构建的Few-Shot任务来模拟测试时的场景,从而学习到通用的、可迁移的特征表示能力。
3.3 实操心得与数据构造陷阱
在实际搭建原型网络进行Few-Shot图像分类实验时,有几个坑很容易踩:
数据集的划分是重中之重。必须严格区分“元训练集”、“元验证集”和“元测试集”的类别。例如,使用MiniImageNet数据集(100个类别,每类600张图)。常见的做法是:
- 元训练集:64个类别。
- 元验证集:16个类别(用于调参,如学习率、网络深度)。
- 元测试集:20个类别(用于最终评估)。
绝对不能让测试集的类别出现在训练集中,哪怕是一张图片。否则就变成了传统的监督学习,失去了Few-Shot的意义。在代码中,这通常通过一个EpisodeSampler来实现,它每次随机从类别池中抽取N个类别,再从每个类别中随机抽K个样本作为支持集,外加一批查询样本,构成一个训练/测试任务。
特征提取网络的选择:通常使用在ImageNet等大型数据集上预训练好的卷积神经网络(如ResNet-12, ResNet-18)作为特征提取器。直接使用其预训练权重进行初始化,然后在元训练阶段进行微调,比从头训练收敛快得多,效果也好得多。我的经验是,冻结前面的卷积层,只微调最后两个全连接层(或原型网络中的映射层)是一个不错的起点。
4. Few-Shot Learning:小样本下的快速适应
Few-Shot Learning是One-Shot的扩展,提供了少量(通常为1-5个,最多不超过20个)示例。它已经成为评估模型泛化能力和数据效率的标准范式,尤其是在大模型时代。
4.1 与大语言模型的结合:In-Context Learning
2020年,Brown等人的论文《Language Models are Few-Shot Learners》真正让Few-Shot Learning出圈。他们发现,超大规模的语言模型(如GPT-3)具有惊人的“上下文学习”能力。你不需要微调模型,只需要在输入提示(Prompt)中给出几个任务描述和示例,模型就能照葫芦画瓢地完成新任务。
例如,你想让模型将英文翻译成法文:
Translate English to French: sea otter => loutre de mer peppermint => menthe poivrée plush girafe => girafe peluche cheese =>模型很可能会输出fromage。这里,我们提供了3个示例(3-shot),模型就学会了翻译任务。这本质上是一种基于序列生成的、隐式的Few-Shot Learning。模型利用其从海量文本中学习到的模式匹配和推理能力,在给定的上下文(Context)中快速适应。
这种能力的强弱,与模型规模、提示工程的质量密切相关。在实践中,示例的选择、顺序、格式都显著影响效果。这就是为什么“提示词工程师”成了一个热门岗位。
4.2 基于优化的元学习:MAML算法
除了基于度量的方法(如原型网络)和基于上下文的方法,另一个重要的Few-Shot流派是基于优化的元学习,其代表作是模型无关元学习算法。
MAML的核心思想是“学习如何快速学习”。它旨在为模型找到一组优秀的初始化参数。这组参数的特点是:当面对一个新任务时,只需要在这个参数基础上进行少量(一步或几步)的梯度更新,就能在该任务上取得很好的性能。
它的训练过程同样是在大量元任务上进行的:
- 采样一个任务Ti(例如,一个5-way 1-shot的分类任务)。
- 用当前模型参数θ,在任务Ti的支持集上计算损失,并进行一步或多步梯度更新,得到任务特定的参数θ’i。
- 用更新后的参数θ’i,在任务Ti的查询集上计算损失。
- 关键一步:这个查询集上的损失,反向传播回最初的参数θ。也就是说,我们优化的目标是“让模型在经过少量更新后,在新任务上的表现更好”。
- 重复这个过程,最终得到的初始参数θ,就具备了快速适应新任务的能力。
MAML的数学推导有点绕,但直观理解就是:它不是在学一个固定的分类器,而是在学一个“适应性超强”的起点。这个起点可能不是一个在任何单一任务上最优的点,但它位于一个“平坦”的区域,朝任何一个新任务的方向稍微走几步,就能到达一个不错的局部最优点。
4.3 在现实项目中的权衡:该用哪种“Shot”?
在实际项目中,选择ZSL、One-Shot还是Few-Shot,取决于你的数据状况、任务需求和计算资源。
| 方法 | 所需新类别示例数 | 核心依赖 | 适用场景 | 挑战 |
|---|---|---|---|---|
| Zero-Shot | 0 | 高质量的语义/属性描述或强大的跨模态对齐模型 | 开放世界识别、创意生成、冷启动推荐 | 语义鸿沟、领域偏移、结果不可控 |
| One/Few-Shot (度量学习) | 1~20 | 学习一个良好的通用特征度量空间 | 工业缺陷检测(新缺陷种类少)、生物识别、个性化设置 | 对基础特征提取网络要求高,同类差异大时效果差 |
| Few-Shot (上下文学习) | 1~20 | 超大规模预训练模型 | 基于大模型的快速应用开发、无需训练的分类/生成任务 | 依赖大模型API,提示工程敏感,计算成本高 |
| Few-Shot (元学习如MAML) | 1~20 | 大量相关元任务用于训练 | 机器人快速学习新技能、游戏AI适应新关卡 | 训练过程复杂且不稳定,容易过拟合到元训练任务 |
我的经验是,永远优先考虑数据。如果你能为新类别收集到哪怕几个样本,Few-Shot方法通常比Zero-Shot更稳定、效果更好。如果连一个样本都没有,但你能清晰定义该类别的属性(文本、关系等),那么可以尝试Zero-Shot。现在,拥有强大In-Context Learning能力的大模型(如GPT-4、Claude)已经成为处理Few-Shot任务的“瑞士军刀”,在很多非视觉任务上,直接设计精妙的Prompt可能比训练一个专门的元学习模型更快、更有效。
5. 前沿动态与实战中的深层思考
从最新的研究趋势和网络热词中,我们可以看到Few-Shot Learning正在向更复杂、更实用的场景深化。
多模态与少样本的结合是一个明确的方向。例如,Target-aware Dual Adversarial Learning and a Multi-scenario Multi-modality Benchmark这类工作,关注如何在多模态(如图像+文本)且多场景的少样本设置下进行学习。这要求模型不仅能处理每种模态内的小样本问题,还要能有效融合跨模态的信息,实现1+1>2的效果。在实战中,这可能意味着我们需要为图像和文本分别设计特征提取器,然后在一个共享的语义空间中对齐它们,最后在这个对齐的空间中做Few-Shot度量或生成。
从静态到动态环境的少样本学习是另一个挑战。像DRL-VO: Learning to Navigate Through Crowded Dynamic Scenes Using Velocity Obstacles这样的研究,将深度强化学习与少样本概念结合,让智能体在只有少量示例(如几种动态障碍物的运动模式)的情况下,学会在复杂动态环境中导航。这启示我们,Few-Shot Learning不仅关乎感知(识别),也关乎决策和控制。在机器人项目中,我们可能先用Few-Shot方法快速教会机器人识别几种新物体,再结合强化学习让机器人学会与这些物体互动。
对模型内部机制的探索也在加强。Confused or Not: Decoding Brain Activity and Recognizing Confusion in Reasoning Learning Using EEG虽然研究的是脑电,但其思路——通过解码信号来识别学习过程中的“困惑”状态——同样适用于AI模型。我们能否设计一种方法,监测模型在进行Few-Shot推理时,是否对某个支持样本“感到困惑”或“不确定”?这可以帮助我们筛选高质量的支持样本,或者动态调整推理策略,提升Few-Shot学习的鲁棒性。
在工程实践上,我最大的体会是:Few-Shot Learning的成功,一半靠算法,一半靠数据工程。即使你采用了最先进的元学习算法,如果你的“元训练集”与你的目标领域差异太大,效果也会大打折扣。例如,用自然图像训练的模型,直接用于医学图像的Few-Shot分类,效果通常不好。一个实用的技巧是进行领域适配预训练:先在大规模的自然图像数据集上预训练,然后在目标领域(如医学影像)的一个较大但类别不相关的数据集上进行二次预训练,最后再用Few-Shot学习算法在小样本新类别上微调。这能显著拉近元训练和元测试之间的分布差距。
另一个常被忽视的细节是损失函数的选择。对于基于度量的Few-Shot学习,对比损失(Contrastive Loss)、三元组损失(Triplet Loss)和原型网络使用的交叉熵损失各有优劣。三元组损失对难例挖掘非常敏感,实现不好容易导致训练不稳定。我的建议是,先从简单的交叉熵损失(配合原型网络)开始,它通常能提供一个稳定的基线。如果想进一步提升,可以尝试加入注意力机制,让模型在计算查询样本与原型距离时,能关注到特征图中更重要的区域,而不是所有区域平等对待。