零样本学习(Zero-Shot Learning, ZSL)和少样本学习(Few-Shot Learning, FSL)都是让AI系统在缺乏充足训练样本的情况下进行有效识别的技术路线。这就像人类看到一种从未见过的动物时,能够根据已有的生物分类知识推测它的特性;或者仅观察几个病例样本就能诊断类似症状的新患者。
ZSL的核心在于属性迁移。假设我们已经训练了一个能识别"斑马"、"熊猫"等动物的模型,现在需要它识别一种训练时从未见过的"犀牛"。传统深度学习会完全失效,但ZSL通过以下流程实现:
关键突破点是使用了辅助信息(attribute/text description)作为桥梁。例如CLIP模型通过对比学习对齐图像和文本嵌入空间,使得输入"一只长鼻子的灰色大型动物"时,即使没有犀牛的训练图片,也能通过文本描述匹配到正确类别。
FSL通常采用N-way K-shot设定(如5类每类3个样本),其技术路线主要有:
以医疗影像诊断为例,当只有5个肺炎阳性病例时,医生可以通过对比健康肺部的结构差异做出判断——这正是FSL模仿的人类认知过程。
python复制# 伪代码示例:基于属性迁移的ZSL流程
class Attributes:
zebra = {"stripes":1, "horns":0, "habitat":"savanna"}
panda = {"stripes":0, "horns":0, "habitat":"forest"}
def train_zsl_model():
# 训练阶段:学习视觉特征到属性空间的映射
model = train(image_features, Attributes)
def predict(image):
# 预测阶段:比较未知类属性描述
projected_attr = model(image)
return argmin(distance(projected_attr, Attributes.unknown_class))
关键组件:
python复制# 伪代码示例:基于原型网络的FSL
class PrototypicalNetwork:
def __init__(self, backbone):
self.encoder = backbone # 如ResNet特征提取器
def compute_prototypes(self, support_set):
# 计算每个类的原型中心
return [mean(self.encoder(x)) for x in support_set]
def predict(self, query, prototypes):
# 基于距离的分类
distances = [euclidean(self.encoder(query), p) for p in prototypes]
return argmin(distances)
典型变体包括:
关键区别:ZSL完全依赖辅助信息建立跨模态关联,而FSL仍需要少量样本进行特征校准或模型适配。
ZSL可形式化为条件概率估计:
$$p(y|x,a) = \frac{p(x|a_y)p(a_y)}{p(x)}$$
其中$a_y$是类别$y$的属性描述。模型需要学习:
挑战在于避免"领域偏移"(Domain Shift)——训练类和测试类的属性分布不一致。例如训练数据都是四足动物,测试时出现鸟类会导致属性组合超出模型经验。
FSL的样本复杂度可用理论泛化界分析。对于$m$个$d$维样本的$k$-shot任务,期望误差满足:
$$\epsilon \leq \mathcal{O}\left(\sqrt{\frac{d}{k}}\right) + \mathcal{O}\left(\sqrt{\frac{d}{m}}\right)$$
这意味着:
ZSL应用:
python复制# 使用CLIP实现零样本分类
import clip
model, preprocess = clip.load("ViT-B/32")
image = preprocess(Image.open("rhino.jpg")).unsqueeze(0)
text = clip.tokenize(["zebra", "panda", "rhino"])
logits_per_image, _ = model(image, text)
probs = logits_per_image.softmax(dim=1)
FSL应用:
python复制# 使用Torchmeta实现5-way 1-shot
from torchmeta.datasets import Omniglot
dataset = Omniglot("data", ways=5, shots=1, download=True)
ZSL突破:
FSL典型方案:
python复制# Pattern-Exploiting Training (PET)
prompt = "这句话谈论的是{}。选项:体育、科技、政治"
verbalizer = {"体育": "运动", "科技": "技术", "政治": "政府"}
实验发现:在MiniImageNet 5-way 1-shot任务中,当前SOTA方法(如Meta-Baseline)准确率约65%,而人类同等条件下可达85%——说明仍有提升空间。
bash复制# 推荐库
pip install transformers # HuggingFace CLIP
pip install gensim # 词向量工具
python复制# 元学习框架选择
import torchmeta # 灵活但需自己实现逻辑
import learn2learn # 内置多种算法
import higher # 支持动态计算图
调试技巧:
决策树:
code复制是否需要识别全新类别?
├─ 是 → 检查是否有语义描述/属性
│ ├─ 有 → 选择ZSL(需构建属性体系)
│ └─ 无 → 需人工标注少量样本转FSL
└─ 否 → 评估可用样本量
├─ <5样本/类 → FSL度量学习方案
└─ >20样本/类 → 传统监督学习更优
在商品推荐系统中,处理长尾商品适合ZSL(用商品描述作为桥梁);而用户冷启动问题更适合FSL(用少量行为数据快速建模)。