一位做了十几年川菜的老厨师,被挖角到一家法餐厅当主厨。后厨里的一切都让他陌生:没有豆瓣酱和花椒,取而代之的是黄油和干酪;没有猛火快炒,讲究的是精确到秒的低温慢煮。最棘手的是,餐厅只留给他三道经典法餐样品菜——洋葱汤、油封鸭腿、焦糖布丁——而菜单上还有四十多道他从没做过的菜。 这位老厨师的困境,正是今天 AI 工程师在现实世界中天天遭遇的难题:数据丰富但“口味”截然不同的源域(川菜厨房),加上只有零星标注样本的目标域(法餐厅),要在信息严重不对称的条件下快速学会并做好新任务。这种既要跨过“域差异”又要克服“样本稀缺”的技术,就叫跨域小样本学习。 本文会带你一步步拆解老厨师逆袭的秘密:他如何找到川菜与法餐的“通感”(域适应),如何从三道样品菜举一反三(小样本学习),如何凭借多菜系经验快速上手(元学习),最终在数据壁垒面前交出一桌好菜。

岗位关联

掌握跨域小样本学习,你就掌握了在数据稀缺且分布偏移的真实场景中交付有效模型的能力——从医院影像到工厂产线,这是 AI 工程师突破“数据孤岛”的核心竞争力。

目录
  1. 可视化演示
  2. 问题定义:新厨房的困境
  3. 域适应基础:寻找通感
  4. 小样本学习:三道样品菜里找出规律
  5. 元学习策略:学过多门菜系的老手
  6. 跨域小样本方法:正式挑战新菜系
  7. 挑战与评估:开业后的考验
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示跨域迁移、元学习适应与特征对齐三种突破数据壁垒的核心机制

本节配有交互动效(进入视口后自动加载,约 3KB)。

深度迁移学习跨域适应 预训练模型从源域迁移知识到目标域 微调顶层参数适配新域的分布特征 theta_tgt = theta_src + delta 迁移学习让小样本目标域任务获得源域知识加持

问题定义:新厨房的困境

老厨师推开法餐厅后厨门那一刻,就意识到自己“什么都不懂”了。没有配方齐整的郫县豆瓣酱和汉源花椒,取而代之的是淡黄油、白葡萄酒和香草束;以猛火快炒见长的他,面对的是精确到秒的低温慢煮机。餐厅很客气地留给他三道刚出锅的样品菜:洋葱汤、油封鸭腿、焦糖布丁。可菜单上还有四十多道菜在等着客人点。这几道样品菜,就是他了解法餐的全部“教材”。

这个场景对应的正是跨域小样本学习的标准设定。他熟悉的川菜厨房叫源域(Source Domain),数据丰富、经验充足;他要征服的法餐厅叫目标域(Target Domain),只有极少量的带标签样本。所谓“域”就是数据分布所处的环境——川菜和法餐的调味体系、烹饪逻辑完全不同,就像自然场景图像与医学影像的特征差异。而“跨域小样本”要同时啃下两块硬骨头:域之间的分布差异,以及目标域上标注样本的极度稀缺。

形式化地看,我们拥有一个标注充分但分布不同的源域,以及一个标注稀少的目标域子集。两者之间既有数量落差,又有分布偏移,这正是数据壁垒的本质。

老厨师如果只背下三道样品菜的做法,遇到新菜还是会傻眼;但如果他完全不看法餐样品、只凭川菜经验瞎做,客人更会掀桌。跨域小样本学习的核心矛盾,正是在“借鉴经验”与“尊重差异”之间找到平衡。

Ds={(xis,yis)}i=1ns,DtL={(xjt,yjt)}j=1nt\displaystyle \mathcal{D}_s = \{ (x_i^s, y_i^s) \}_{i=1}^{n_s}, \quad \mathcal{D}_t^L = \{ (x_j^t, y_j^t) \}_{j=1}^{n_t}
  1. 源域数据集$\mathcal{D}_s$ 是数据丰富的源域,包含 $n_s$ 个带标签样本,$x_i^s$ 是第 $i$ 个样本的特征,$y_i^s$ 是其类别标签,相当于老厨师几十年的川菜经验档案。
    Ds={(xis,yis)}i=1ns\mathcal{D}_s = \{ (x_i^s, y_i^s) \}_{i=1}^{n_s}
  2. 目标域标注子集$\mathcal{D}_t^L$ 是目标域上仅有的一小簇带标签样本,$n_t$ 通常只有几到几十,就像留给老厨师参考的三道法餐样品。
    DtL={(xjt,yjt)}j=1nt\mathcal{D}_t^L = \{ (x_j^t, y_j^t) \}_{j=1}^{n_t}
  3. 数量失衡前提源域样本数远大于目标域标注数,且两域数据分布不同——数据壁垒由此而生。
    ns≫nt,Ps(x)≠Pt(x)n_s \gg n_t, \quad P_s(x) \neq P_t(x)

域适应基础:寻找通感

老厨师苦恼了三天,突然发现一个秘密:川菜里“大火爆炒锁住肉汁”,法餐里“黄油煎封锁住肉汁”——手法不同,但都在追求同一件事:锁住水分与鲜味。川菜讲究“咸香下饭”,法餐讲究“酱汁平衡”,本质上都是在用调味衬托食材本味。这些共通的底层规律,就是两个域之间的“通感”。

机器学习的域适应做的正是这件事:找到源域和目标域共通的底层规律。具体做法是学习一个特征提取器 $f$,把所有样本映射到一个共享特征空间,然后让两个域在这个空间里的分布尽可能重合。最大均值差异(MMD)是衡量分布重合程度的经典指标,它的思路很朴素:把两个分布各自映射到高维空间,算一算它们的“重心”,如果重心几乎重合,就说明分布对齐得很好。

除了 MMD,域适应还有一类“对抗”思路:训练一个域判别器分辨特征来自哪个域,特征提取器则努力骗过它。两个网络互相博弈,最终得到连判别器都分不清来源的域不变特征。这就像老厨师请一位法餐评论家试菜——评论家尝一口就要猜“这是川菜还是法餐”,猜不出来,说明两种菜系的精髓已经打通了。

MMD^2=∥1ns∑i=1nsϕ(xis)−1nt∑j=1ntϕ(xjt)∥H2\displaystyle \widehat{\text{MMD}}^2 = \left\| \frac{1}{n_s}\sum_{i=1}^{n_s}\phi(x_i^s) - \frac{1}{n_t}\sum_{j=1}^{n_t}\phi(x_j^t) \right\|_{\mathcal{H}}^2
  1. 特征映射$\phi(\cdot)$ 把原始特征映射到更高维的再生核希尔伯特空间,让分布之间的细微差异更容易被观察到,就像把调味的咸度、酸度、鲜度量化成可比较的坐标轴。
    ϕ:X→H\phi: \mathcal{X} \to \mathcal{H}
  2. 域重心两个求和分别是源域和目标域映射后特征的平均值,也就是各自分布在共享空间中的“重心”,对应川菜和法餐各自的“平均味觉特征”。
    μ^s=1ns∑i=1nsϕ(xis),μ^t=1nt∑j=1ntϕ(xjt)\hat{\mu}_s = \frac{1}{n_s}\sum_{i=1}^{n_s}\phi(x_i^s), \quad \hat{\mu}_t = \frac{1}{n_t}\sum_{j=1}^{n_t}\phi(x_j^t)
  3. 重心距离对两个重心取差,再计算其在希尔伯特空间中的范数平方,得到分布之间的 MMD 距离,距离越小说明两域越“投缘”。
    ∥μ^s−μ^t∥H2\left\| \hat{\mu}_s - \hat{\mu}_t \right\|_{\mathcal{H}}^2
  4. 优化目标训练时不断降低 MMD,让两域样本在共享空间的“重心”逐渐重合,最终源域经验可以放心迁移到目标域。
    min⁡f  MMD^2(f(Ds),f(Dt))\min_{f} \; \widehat{\text{MMD}}^2\big(f(\mathcal{D}_s), f(\mathcal{D}_t)\big)

小样本学习:三道样品菜里找出规律

通感有了,接下来是具体问题:只有三道样品菜,怎么推出整本法餐菜谱?小样本学习(Few-Shot Learning)回答的正是这个问题。它不追求在目标域上从头训练一个大模型,而是利用“少量样本也能勾勒出类别典型轮廓”这一事实。

设目标域有 $N$ 个类别(即 N-way),每类给了 $K$ 个样本(即 K-shot),这组标注样本叫支持集(Support Set);剩下的测试样本叫查询集(Query Set)。模型要在支持集上快速建立分类边界,再在查询集上接受检验。原型网络(Prototypical Network)是其中最优雅的方法之一:把每个类别的 $K$ 个支持样本用特征提取器编码后取平均,得到这个类别的“原型”——它相当于这个类别的“平均长相”。对任意查询样本,只需计算它与每个类原型的欧氏距离,离谁近就归为哪类。

原型网络之所以适合小样本,是因为它不需要为每个新类别重新训练参数,只需要在特征空间里“画几个点”就够了。老厨师看着三道样品菜,心里迅速画出三个“味觉锚点”:洋葱汤代表“清甜打底”,油封鸭腿代表“咸香浓郁”,焦糖布丁代表“甜香收尾”。下次遇到没见过的菜,先尝一口,看它离哪个锚点最近。

pk=1∣Sk∣∑(x,y)∈Skfθ(x)\displaystyle p_k = \frac{1}{|S_k|} \sum_{(x, y) \in S_k} f_\theta(x)
y^=arg⁡min⁡k  d(fθ(x),pk)\displaystyle \hat{y} = \mathop{\arg\min}_{k} \; d\big(f_\theta(x), p_k\big)
  1. 支持集划分$S_k$ 是第 $k$ 类所有带标签支持样本的集合,每类只有 $K$ 个,对应老厨师手头的三道样品法餐。
    Sk={(x,y)∣y=k}S_k = \{ (x, y) \mid y = k \}
  2. 特征编码$f_\theta$ 把原始输入变成特征向量,相当于厨师用舌头把一道菜拆解成“咸度、酸度、油脂感、鲜味”等可比较的维度。
    z=fθ(x)∈Rdz = f_\theta(x) \in \mathbb{R}^d
  3. 类别原型$p_k$ 对第 $k$ 类所有支持样本的特征向量求平均,得到“这一类菜的典型味觉轮廓”。
    pk=1∣Sk∣∑z∈Skzp_k = \frac{1}{|S_k|} \sum_{z \in S_k} z
  4. 最近邻决策对查询样本 $x$ 计算其特征与所有类原型的距离 $d$,归入距离最小的那个类别。
    y^=arg⁡min⁡k  ∥fθ(x)−pk∥2\hat{y} = \mathop{\arg\min}_{k} \; \| f_\theta(x) - p_k \|_2

元学习策略:学过多门菜系的老手

如果老厨师只做过川菜,他学法餐的速度一定很慢。但如果他做过川菜、粤菜、日料、意餐,他学新菜系的路数就会非常老练:先摸清底味、再测火候、最后调比例。元学习(Meta-Learning)正是这种“学会如何学习”的思路。

MAML(Model-Agnostic Meta-Learning)是元学习的代表算法。它把训练过程分成两层循环:内循环在单个任务的支持集上快速做几步梯度下降,模拟“照着菜谱试做一道菜”;外循环在多个任务的查询集上计算平均损失,更新模型的初始参数,目标是让初始参数“稍微学几步就能进步很大”。打个比方:内循环是拿一道具体菜谱试做,外循环是复盘当天试做的所有菜,调整自己的“烹饪基本功”。MAML 训练出的初始参数,相当于“对任何菜系都敏感的舌头”。

内循环与外循环各司其职,一个在“具体任务”上快速试错,一个在“任务总体”上沉淀经验。老厨师之所以能快速上手法餐,不是因为他背过法餐菜谱,而是因为他早已总结出“学新菜系的通用方法论”。

θi′=θ−α∇θLTi(fθ)\displaystyle \theta_i' = \theta - \alpha \nabla_\theta \mathcal{L}_{\mathcal{T}_i}(f_\theta)
θ=θ−β∇θ∑Ti∼p(T)LTi(fθi′)\displaystyle \theta = \theta - \beta \nabla_\theta \sum_{\mathcal{T}_i \sim p(\mathcal{T})} \mathcal{L}_{\mathcal{T}_i}(f_{\theta_i'})
  1. 任务采样从任务分布 $p(\mathcal{T})$ 中随机采样一批跨域任务,每个任务都包含支持集和查询集,相当于厨师准备学习的不同菜系菜谱。
    Ti∼p(T)\mathcal{T}_i \sim p(\mathcal{T})
  2. 内循环快速适应对单个任务 $\mathcal{T}_i$,在其支持集上用学习率 $\alpha$ 做一步或几步梯度下降,得到任务特化参数 $\theta_i'$,模拟“照着菜谱试做一遍”。
    θi′=θ−α∇θLTi(fθ)\theta_i' = \theta - \alpha \nabla_\theta \mathcal{L}_{\mathcal{T}_i}(f_\theta)
  3. 外循环元更新用更新后的 $\theta_i'$ 在查询集上计算损失,对所有任务的损失求和,再对原始参数 $\theta$ 求梯度,用学习率 $\beta$ 更新初始参数。
    θ=θ−β∇θ∑TiLTi(fθi′)\theta = \theta - \beta \nabla_\theta \sum_{\mathcal{T}_i} \mathcal{L}_{\mathcal{T}_i}(f_{\theta_i'})
  4. 双层优化内循环“为单个任务临阵磨枪”,外循环“让初始参数变得容易适应”,最终得到的初始化模型只需很少几步微调就能在新任务上表现良好。
    Meta-Obj(θ)=∑TiLTi(θ−α∇θLTi(θ))\text{Meta-Obj}(\theta) = \sum_{\mathcal{T}_i} \mathcal{L}_{\mathcal{T}_i}\big(\theta - \alpha \nabla_\theta \mathcal{L}_{\mathcal{T}_i}(\theta)\big)

跨域小样本方法:正式挑战新菜系

现在,老厨师把两样法宝合在一起:川菜的功底(源域数据)加三道法餐样品(目标域支持集)。但他还需要一个“分寸感”——不能把川菜技法硬套在法餐上,必须边学边校准。这就是跨域小样本方法要解决的问题:在源域与目标域存在分布差异的前提下,又快又准地完成小样本分类。

主流做法是把域适应与小样本学习联合训练,目标函数通常由三部分组成:分类损失保证类别可分,域对抗损失消除域差异,原型对齐损失拉近跨域同类特征。三部分像三脚架一样共同支撑模型稳定性。域对抗损失让特征提取器与域判别器互相博弈,最终输出“中性化”的域不变特征;原型对齐损失则进一步要求源域与目标域中同一类别在特征空间里“抱团”。

联合训练出来的模型,既吸收了源域积累的类别知识,又在目标域支持集上快速校准。老厨师的做法如出一辙:在川菜厨房里练熟“看配料表知味型”的基本功(特征提取器),请法餐评论家随时点评(域判别器),再把川菜和法餐的同名菜放在一起对比调味(原型对齐),三管齐下,正式开业。

min⁡Fmax⁡D  Exs[log⁡D(F(xs))]+Ext[log⁡(1−D(F(xt)))]\displaystyle \min_{F} \max_{D} \; \mathbb{E}_{x^s}\left[\log D(F(x^s))\right] + \mathbb{E}_{x^t}\left[\log\left(1 - D(F(x^t))\right)\right]
Lalign=∑k=1N∥pks−pkt∥22\displaystyle \mathcal{L}_{\text{align}} = \sum_{k=1}^{N} \left\| p_k^s - p_k^t \right\|_2^2
  1. 域判别器$D$ 看到特征后判断它来自源域还是目标域,判断越准确奖励越大,相当于一位苛刻的美食评论家。
    D:Z→[0,1]D: \mathcal{Z} \to [0, 1]
  2. 特征提取器对抗$F$ 的目标是让 $D$ 判断失误,于是被迫提取不带“域身份信息”的特征,即域不变特征。
    min⁡F  Exs[log⁡D(F(xs))]+Ext[log⁡(1−D(F(xt)))]\min_{F} \; \mathbb{E}_{x^s}[\log D(F(x^s))] + \mathbb{E}_{x^t}[\log(1 - D(F(x^t)))]
  3. 源域原型$p_k^s$ 是源域第 $k$ 类所有样本特征的平均值,代表源域中该类别的典型位置。
    pks=1∣Sks∣∑x∈SksF(x)p_k^s = \frac{1}{|S_k^s|} \sum_{x \in S_k^s} F(x)
  4. 原型对齐损失同一类别跨域原型的欧氏距离平方和越小,说明两域中同类样本在特征空间里靠得越近,分类边界越一致。
    Lalign=∑k=1N∥pks−pkt∥22\mathcal{L}_{\text{align}} = \sum_{k=1}^{N} \| p_k^s - p_k^t \|_2^2

挑战与评估:开业后的考验

开业一个月,问题陆续出现。老厨师照搬川菜的“猛火爆炒”处理法餐的嫩鱼柳,结果鱼柳碎成一盘糊——这就是负迁移:源域里正确的经验,在目标域里反而有害。再比如,服务员为了凑菜单,把客人点的菜猜着记下来(伪标签),结果传错菜越来越多,厨房越忙越乱。

负迁移的根源是过分自信地将源域知识强加给目标域;伪标签噪声的根源则是模型早期置信度虚高、错误预测被当成正确答案反复训练。应对策略包括:用置信度阈值筛选伪标签(只保留高置信度的预测)、周期性用新模型重新生成伪标签、在域间隙较大时先对齐再迁移。在评价维度上,学术界构建了多个跨域小样本基准数据集,如 Office-Home、DomainNet、miniImageNet-CDFSL 等,最常用的指标是查询集上的平均准确率。

一个成熟的跨域小样本系统,不是“在实验室纸上谈兵”,而是要在真实的域偏移、标注稀缺、噪声干扰下仍然稳定工作。三个月后,老厨师的法餐厅不仅没倒闭,还因为“川法融合”的独特风味被评上了米其林一星——AI 工程师的目标,就是在数据壁垒面前做那位举一反三、随机应变的老厨师。

Acc=1∣Q∣∑(x,y)∈QI[y^(x)=y]\displaystyle \text{Acc} = \frac{1}{|\mathcal{Q}|} \sum_{(x, y) \in \mathcal{Q}} \mathbb{I}\left[ \hat{y}(x) = y \right]
  1. 查询集$\mathcal{Q}$ 是目标域中用来测试性能的带标签样本集合,相当于开业后真实客人点的菜。
    Q={(xjt,yjt)}j=1nq\mathcal{Q} = \{ (x_j^t, y_j^t) \}_{j=1}^{n_q}
  2. 指示函数$\mathbb{I}[\cdot]$ 是一个 0/1 函数,当模型预测类别与真实标签一致时取 1,否则取 0,相当于“这道菜做对了吗”。
    I[y^=y]={1,y^=y0,y^≠y\mathbb{I}[\hat{y} = y] = \begin{cases} 1, & \hat{y} = y \\ 0, & \hat{y} \neq y \end{cases}
  3. 平均正确率把所有指示函数的结果累加,再除以查询集样本总数,得到 0 到 1 之间的分类精度,是跨域小样本最通用的性能标尺。
    Acc=预测正确的样本数∣Q∣\text{Acc} = \frac{\text{预测正确的样本数}}{|\mathcal{Q}|}

AI 应用场景

场景一:县级医院的肺结节筛查

阶段:模型适配与部署

解决的问题:省三甲医院积累了几十万张高质量 CT 影像(源域),而县级医院设备型号旧、拍摄参数不同、标注数据极少(目标域)。传统做法要么在本地收集上万张标注图(成本极高),要么直接部署源域模型(精度暴跌)。跨域小样本学习用源域预训练模型对新设备影像做域适应,再结合每类仅 20~50 张本地标注,即可快速达到临床可用精度。

具体案例:某医疗 AI 公司向 50 家县级医院推广肺结节筛查系统,每家只标注约 30 张典型影像,结合源域模型与 MMD 域对齐,部署后平均检出率从 72% 提升到 91%,适应周期从 3 个月缩短到 1 周。

场景二:新产线的工业缺陷检测

阶段:数据工程与模型迁移

解决的问题:手机外壳打磨产线新增一道工序,缺陷类型与老产线相似但外观不同——老产线划痕是直线形的,新产线划痕呈弧形且反光更弱。缺陷样本每类只有十来张,无法从头训练大模型。

具体案例:算法工程师用老产线 5 万张历史图片(源域)预训练特征提取器,新产线仅用 12 张弧痕样本(支持集)建立原型,配合域判别器做对抗对齐。模型上线后弧痕检出率 96%,漏检率低于 2%,上线全程仅 2 小时。

场景三:小语种情感分析

阶段:NLP 模型迁移

解决的问题:英文情感标注语料有上百万条,而斯瓦希里语等小语种标注只有几百条。跨域小样本把英文(源域)成熟的“情绪表达模式”迁移到小语种(目标域),用每类 200 条标注建立情感原型。

具体案例:某出海社交平台用跨域小样本方法为 4 种小语种上线情感分析功能,冷启动一周内准确率达到英文模型的 85%,随后通过伪标签迭代提升至 93%。

Python 演示

python95 行
"""跨域小样本学习演示:MMD 正则化的原型网络"""import numpy as npfrom scipy.optimize import minimize  def generate_domains(seed=42):    """生成源域与目标域的二维特征数据"""    rng = np.random.default_rng(seed)    # 源域:两类各 60 个样本,分布中心相距较远    src_x1 = rng.multivariate_normal([2.2, 2.2], [[0.7, 0.2], [0.2, 0.7]], 60)    src_x2 = rng.multivariate_normal([-2.2, -2.2], [[0.7, -0.2], [-0.2, 0.7]], 60)    src_x = np.vstack([src_x1, src_x2])    src_y = np.array([0] * 60 + [1] * 60)    # 目标域:存在分布偏移,每类 30 个样本用于划分支持集与查询集    tgt_x1 = rng.multivariate_normal([2.6, 1.7], [[0.5, 0.1], [0.1, 0.5]], 30)    tgt_x2 = rng.multivariate_normal([-1.7, -2.6], [[0.5, -0.1], [-0.1, 0.5]], 30)    tgt_x = np.vstack([tgt_x1, tgt_x2])    tgt_y = np.array([0] * 30 + [1] * 30)    return src_x, src_y, tgt_x, tgt_y  def split_support_query(tgt_x, tgt_y, k=3, seed=7):    """目标域每类取 k 个样本作为支持集,其余作为查询集"""    rng = np.random.default_rng(seed)    sup_idx, qry_idx = [], []    for cls in [0, 1]:        idx = np.where(tgt_y == cls)[0]        pick = rng.choice(idx, k, replace=False)        sup_idx.extend(pick)        qry_idx.extend(np.setdiff1d(idx, pick))    return tgt_x[sup_idx], tgt_y[sup_idx], tgt_x[qry_idx], tgt_y[qry_idx]  def rbf_kernel(a, b, sigma=1.0):    """高斯径向基核"""    d2 = ((a[:, None] - b[None, :]) ** 2).sum(-1)    return np.exp(-d2 / (2.0 * sigma ** 2))  def mmd_square(xs, xt):    """最大均值差异的平方"""    return (rbf_kernel(xs, xs).mean()            - 2.0 * rbf_kernel(xs, xt).mean()            + rbf_kernel(xt, xt).mean())  def prototype_accuracy(x, y, protos):    """按最近原型计算分类准确率"""    d2 = ((x[:, None] - protos[None]) ** 2).sum(-1)    pred = d2.argmin(1)    return np.mean(pred == y)  def build_loss(src_x, src_y, sup_x, reg_w):    """构造目标函数:源域原型损失 + MMD 域对齐正则"""    def loss(w_flat):        W = w_flat.reshape(2, 2)        z_src = src_x @ W        z_sup = sup_x @ W        p0 = z_src[src_y == 0].mean(0)        p1 = z_src[src_y == 1].mean(0)        protos = np.stack([p0, p1])        d2 = ((z_src[:, None] - protos[None]) ** 2).sum(-1)        logits = -d2        logits -= logits.max(1, keepdims=True)        exp = np.exp(logits)        prob = exp / exp.sum(1, keepdims=True)        nll = -np.log(prob[np.arange(len(src_y)), src_y] + 1e-12).mean()        mmd = mmd_square(z_src, z_sup)        return nll + reg_w * mmd    return loss  def main():    src_x, src_y, tgt_x, tgt_y = generate_domains()    sup_x, sup_y, qry_x, qry_y = split_support_query(tgt_x, tgt_y)     # 基线:不域适应,直接用源域特征做原型    protos_src = np.stack([src_x[src_y == 0].mean(0), src_x[src_y == 1].mean(0)])    acc_no = prototype_accuracy(qry_x, qry_y, protos_src)     # 跨域小样本:学习线性变换 W,使源域与目标域分布对齐    loss = build_loss(src_x, src_y, sup_x, reg_w=0.8)    res = minimize(loss, np.eye(2).flatten(), method="BFGS")    W = res.x.reshape(2, 2)    protos_align = np.stack([(src_x @ W)[src_y == 0].mean(0),                             (src_x @ W)[src_y == 1].mean(0)])    acc_mmd = prototype_accuracy(qry_x @ W, qry_y, protos_align)     print(f"直接使用源域原型      : {acc_no:.1%}")    print(f"跨域小样本(域对齐)    : {acc_mmd:.1%}")  if __name__ == "__main__":    main()
目的:演示跨域小样本中“域对齐”对目标域分类精度的实际提升——同样的原型分类器,加入 MMD 正则化后精度显著上升。
  1. def generate_domains(seed=42):生成两域分布有偏移的二维数据,模拟“川菜厨房”与“法餐厨房”
  2. rng.choice(idx, k, replace=False)从每类中无放回抽取 k 个样本作为支持集,模拟小样本场景
  3. def mmd_square(xs, xt):用高斯核计算两域分布之间的最大均值差异,值越小说明两域越对齐
  4. p0 = z_src[src_y == 0].mean(0)对源域第 0 类样本的特征向量取平均,得到该类“原型”
  5. logits = -d2用“特征到原型的负平方距离”作为分类分数,距离越近分数越高
  6. mmd = mmd_square(z_src, z_sup)计算变换后源域与目标域支持集的分布差异,作为正则项
  7. res = minimize(loss, np.eye(2).flatten(), method="BFGS")借助 scipy 优化器学习 2×2 特征变换矩阵 W
  8. acc_mmd = prototype_accuracy(qry_x @ W, qry_y, protos_align)将变换后的查询样本按最近原型分类,得到最终精度

常见误区

误区“我先把小样本模型在源域上训练好,再单独跑一遍域适应,两个模块串起来就是跨域小样本学习了吧?”

正解不能割裂成流水线。跨域小样本的核心是让“域对齐”与“小样本分类”互相促进:域对齐让特征分布一致,小样本分类才有迁移基础;两者在同一个训练过程中联合优化,效果远好于先后两次独立操作。就像厨师不是先学会川菜再“忘掉”换成法餐,而是要同时用川菜的功底去理解法餐的规律。

为何常见:两种技术分别学习时都有大量资料可查,初学者习惯把它们当作两个模块依次拼接。

误区“目标域没标注?那就用模型预测结果打伪标签呗,打得越多训练数据越多,一定更好。”

正解伪标签噪声会不断放大错误。跨域初期域差异大,模型大部分预测是错的,加越多错误信号,模型跑得越偏。要用置信度阈值只保留高置信度样本,并周期性更新特征提取器后重新打标签——像厨师试菜一样,先小口尝、确定方向后再放心下料。

为何常见:直觉上“更多数据一定更好”,忽视了低质量标签对训练信号的破坏力。

误区“MAML 学会了'快速初始化',拿到任何新数据集上都应该一步微调就到 90% 准确率吧?”

正解MAML 的“快”是针对元训练阶段任务分布内的任务而言的。若跨域任务与元训练任务分布差异过大,仍需要域适应配合。MAML 相当于厨师总结的“学菜谱三步法”,只有遇到大致类似的菜系才有效,遇到完全陌生的烹饪体系还是得重新理解基本功。

为何常见:元学习论文里动辄“few-shot 效果拔群”的图表,容易让人误以为它无所不能。

误区“模型做完域对齐后,源域上的准确率从 95% 降到了 90%,说明这个方法把源域知识弄丢了,不能用。”

正解源域精度轻微下降是正常代价。域对齐的目的是牺牲部分源域“表面精度”,换取目标域的“泛化精度”——把对源域特有但对目标域有用的特征淡化,保留两域通用的判别特征,就像川菜大厨放下重辣,是为了让舌头更好地分辨法餐的细腻调味。只要目标域精度提升,迁移就是成功的。

为何常见:人们习惯用源域指标评估模型好坏,忽略了真正的部署重点在目标域。

面试题

Q1. 跨域小样本学习中“源域”通常指什么?

单选题 · easy

  • A.标注充足但分布不同的数据← 正确答案
  • B.目标应用中极稀少的数据
  • C.没有标注的测试数据集
  • D.与目标域完全相同的样本

答案:A。源域是标注丰富但分布与目标任务不同的数据集,像老厨师熟练的川菜厨房;目标域才是要解决的稀缺标注场景。B 描述的是目标域,C 是测试集,D 则不存在“跨域”问题。

Q2. 目标域小样本的本质约束是什么?

单选题 · easy

  • A.数据总量极其庞大
  • B.标签数量十分有限← 正确答案
  • C.标签噪声难以控制
  • D.特征空间维度太低

答案:B。小样本的核心矛盾是“标签稀缺”,而不是数据总量或维度。目标域可能有很多未标注数据,但带标签的只有几个,这正是需要借鉴源域经验的原因。

Q3. MMD 度量主要衡量什么?

单选题 · mid

  • A.源域与目标域的标签差异
  • B.变换后两域分布的距离← 正确答案
  • C.训练前后模型的精度差
  • D.支持集查询集的规模比

答案:B。MMD(最大均值差异)计算源域与目标域在特征空间映射后的均值向量距离,衡量的是两域“分布重心”的差距。它不关心标签差异、精度变化或数据集规模。

Q4. 原型网络中的“原型”本质是什么?

单选题 · mid

  • A.支持集样本的聚类中心← 正确答案
  • B.随机初始化的测试锚点
  • C.查询集样本的加权和
  • D.生成对抗网络的生成器

答案:A。原型是对某类别所有支持集样本特征取平均得到的“类别代表点”,相当于几道样品菜的平均味觉轮廓。查询样本只需比较与各原型的距离即可分类。

Q5. 域对抗训练中判别器的职责是什么?

单选题 · mid

  • A.判断样本标签的类别
  • B.判断特征来自哪个域← 正确答案
  • C.生成逼近真实域的数据
  • D.计算跨域的语义距离

答案:B。域判别器输入特征、输出“这是源域还是目标域”的判断。特征提取器努力让它判断失败,最终得到两域通用的域不变特征。判别器不负责分类,也不负责生成数据。

Q6. MAML 内循环与外循环分别起什么作用?

多选题 · mid

  • A.内循环在支持集上快速适应← 正确答案
  • B.外循环在查询集上更新元参数← 正确答案
  • C.内循环直接训练全部样本
  • D.外循环选择最好的测试样本

答案:AB。内循环在单个任务的支持集上做几步梯度下降得到任务特化参数,模拟“照着菜谱试做”;外循环用查询集计算元损失并更新初始参数,模拟“复盘所有试做并调整基本功”。C 和 D 都不符合 MAML 的双层优化结构。

Q7. 跨域小样本中“负迁移”指什么?

单选题 · hard

  • A.源域模型权重全部变为负值
  • B.源域知识损害目标域性能← 正确答案
  • C.目标域损失函数出现负值
  • D.模型完全无法收敛到最优

答案:B。负迁移指源域中有用的经验在目标域上反而帮倒忙,比如老厨师用猛火爆炒处理法餐嫩鱼柳,把鱼柳炒碎了。它不是数值变负或无法收敛,而是“迁移方向错了”。

Q8. 以下哪些策略能有效缓解跨域小样本的伪标签噪声?

多选题 · hard

  • A.置信度阈值筛选伪标签← 正确答案
  • B.无条件复制源域到目标域
  • C.周期用新模型重打伪标签← 正确答案
  • D.直接清除全部未标注样本

答案:AC。置信度阈值只保留模型高置信度的预测,周期性重打伪标签可随着模型变准逐步修正标签。无条件复制源域数据会加剧域偏移,清空未标注数据则浪费了宝贵的无监督信号。

Q9. 支持集与查询集的关系是什么?

单选题 · easy

  • A.支持集训练查询集评估← 正确答案
  • B.查询集训练支持集评估
  • C.二者随机抽取不必划分
  • D.二者全部来自源域数据

答案:A。小样本学习的标准协议是:支持集提供少量标注样本供模型建立分类依据,查询集在模型未见过的新样本上检验效果。两者不能混用,且通常都来自目标域。

Q10. 下列哪些属于跨域小样本常用的评估基准?

多选题 · hard

  • A.Office-Home 跨域基准← 正确答案
  • B.miniImageNet 跨域变体← 正确答案
  • C.ImageNet-1K 全量分类
  • D.DomainNet 跨域基准← 正确答案

答案:ABD。Office-Home 和 DomainNet 是专为跨域迁移设计的基准数据集,miniImageNet 的跨域变体常用于小样本跨域评测。ImageNet-1K 是大规模通用分类基准,不涉及跨域小样本设定,因此不属于这里的选择。