老周在镇上开了一家小饭馆,最拿手的菜是红烧肉。到了冬天,他想添一道梅菜扣肉,但他没有从零学起——同样是五花肉、冰糖、酱油,只是把红烧肉的“炒糖色”换成“蒸透”,三天就上新了。这道新菜,就是 AI 里的“迁移学习”。隔壁奶茶店的小陈更绝,他练出了一套“学新配方”的本事:不管来的是柠檬茶还是芋泥波波,先看原料、再尝口味、最后定甜度。他卖的不是某一种配方,而是“快速学会新配方”的能力——这种能力,就是“元学习”。AI 里的模型也像厨师:预训练模型是刚出锅的拿手菜,微调是学会梅菜扣肉,元学习则是把“学会学习”的方法反复练熟。这篇文章,就带你走进后厨,看看这两门手艺到底怎么配合。

岗位关联

迁移学习与元学习是 AI 工程师在小数据场景下“少折腾、快上手”的核心技能,掌握它们,你才能用更少标注、更短训练时间,解决真实业务里的冷启动与数据稀缺问题。

目录
  1. 可视化演示
  2. 核心思想
  3. 分类体系
  4. 关键概念
  5. 微调技术
  6. 领域自适应
  7. 元学习框架
  8. MAML算法
  9. 少样本学习
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

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

核心思想

老周的红烧肉能变成梅菜扣肉,靠的不是重新学烹饪,而是看清两盘菜共享的底牌:五花肉要先焯水、冰糖要炒出琥珀色、酱油要用老抽。迁移学习也如此——模型在源任务上已经练出了轮廓、纹理、语法等通用特征,这些特征就是那套底牌。相比从零开始随机初始化训练,迁移让模型在目标数据很少时依然拥有靠谱的起点。

正式地说,迁移学习里有两个角色:源任务先练出通用能力,目标任务再把这份能力用到新场景。二者不是随便组合的:如果源任务和目标任务毫不相关,强行迁移反而会拖累效果,就像拿火锅底料去做甜点。只有当两个任务共享某些底层结构,迁移才有价值。

在技术层面,迁移学习的目标可以写成“在目标任务上找到一组最优参数”。它不追求源任务分数更高,只关心目标任务的最终表现。

老周没有推翻菜谱,而是在新菜品上重新算了一遍“哪个环节最值得改”。迁移学习的核心思想正是如此:找到一个好起点,再用目标数据小幅调整,让新任务更快出锅。

θ∗=arg⁡min⁡θLDT(fθ(x),y)\displaystyle \theta^\ast = \arg\min_{\theta} \mathcal{L}_{\mathcal{D}_{\mathrm{T}}}\left( f_{\theta}(x), y \right)
这个式子是在说:寻找参数 θ*,使得模型在目标任务的数据上预测得最准。损失越大,说明模型越离谱。
  1. 参数 θ模型里所有可调权重,相当于老周的整本菜谱。
    θ\displaystyle \theta
  2. 损失函数 L模型预测值 f_θ(x) 与真实标签 y 的差距,差距越小越好。
    L(fθ(x),y)\displaystyle \mathcal{L}\left( f_{\theta}(x), y \right)
  3. 目标域数据 D_T 上取最小把候选参数在目标任务数据上逐个打分,选损失最小的那一个。
    arg⁡min⁡θLDT(fθ(x),y)\displaystyle \arg\min_{\theta} \mathcal{L}_{\mathcal{D}_{\mathrm{T}}}\left( f_{\theta}(x), y \right)

分类体系

老周面对新菜时会分类处理:有的菜几乎照搬,有的要换配菜,有的连汤底都要重调。迁移学习也根据源任务和目标任务的相似度,把所有情况分成了不同类别。

最常见的分法是看特征空间和标签空间是否一致。如果源任务和目标任务使用相同维度的特征、相同的标签集合,那叫同构迁移,比如两个图像分类任务都用 224×224 的 RGB 图片,类别都是猫和狗。如果特征维度不同、标签集合不同,或者需要跨语言跨模态,那就是异构迁移,比如中文评论情感分类迁移到英文评论。

按解决方案还可以分成基于实例的迁移、基于特征的迁移、基于参数的迁移等范式。它们背后都共享同一个判断框架:对比源任务和目标任务的定义,看看哪里能借、哪里要改。

这张分类表就是老周那张“哪些菜能互相借力”的对照表。看清类别,才知道是照搬、微调,还是干脆重新设计。

TS={pS(x), pS(y∣x)},TT={pT(x), pT(y∣x)}\displaystyle \mathcal{T}_{S} = \left\{ p_{S}(x),\ p_{S}(y|x) \right\},\qquad \mathcal{T}_{T} = \left\{ p_{T}(x),\ p_{T}(y|x) \right\}
源任务和目标任务分别由各自的输入分布和标签条件分布决定。两者差异越大,迁移难度越高。
  1. 源任务 T_S包含源域输入分布 p_S(x) 和源域标签条件分布 p_S(y|x)。
    TS={pS(x), pS(y∣x)}\displaystyle \mathcal{T}_{S} = \left\{ p_{S}(x),\ p_{S}(y|x) \right\}
  2. 目标任务 T_T包含目标域输入分布 p_T(x) 和目标域标签条件分布 p_T(y|x)。
    TT={pT(x), pT(y∣x)}\displaystyle \mathcal{T}_{T} = \left\{ p_{T}(x),\ p_{T}(y|x) \right\}
  3. 比较两者如果输入分布或标签条件分布不同,就说明需要迁移或领域自适应。
    pS(x)≠pT(x),pS(y∣x)≠pT(y∣x)\displaystyle p_{S}(x) \neq p_{T}(x),\quad p_{S}(y|x) \neq p_{T}(y|x)

关键概念

老周后厨里贴着一张“基础食材清单”:五花肉、冰糖、老抽、梅菜。这张清单对应 AI 里的“域”,也就是数据长什么样、来自哪里。而“先焯水再炒糖色”是工序,对应“任务”——要把输入变成什么输出。

在正式定义里,域由特征空间 X 和特征分布 P(X) 组成,任务由标签空间 Y 和条件分布 P(Y|X) 组成。预训练模型就是在源域大规模数据上先练好的模型;特征泛化则指模型底层学到的边缘、纹理、词性等信息,在不同任务之间仍然通用。

比如一个在 ImageNet 上预训练的图像模型,底层卷积核可能学到了“横线、竖线、圆角”这类通用结构。换到医疗影像任务时,这些底层能力可以直接复用,只需要在高层特征上重新组织。

基础清单越通用,能套用的菜越多;预训练模型学到的特征越基础,能迁移的任务也越广。这就是关键概念给我们的直觉。

D={X, P(X)},T={Y, P(Y∣X)}\displaystyle \mathcal{D} = \left\{ \mathcal{X},\ P(X) \right\},\qquad \mathcal{T} = \left\{ \mathcal{Y},\ P(Y|X) \right\}
域管“数据环境”,任务管“学习目标”。迁移学习做的事情就是在域和任务之间搬运知识。
  1. 域 D由特征空间 X 和特征分布 P(X) 组成,回答“数据从哪来”。
    D={X, P(X)}\displaystyle \mathcal{D} = \left\{ \mathcal{X},\ P(X) \right\}
  2. 任务 T由标签空间 Y 和条件分布 P(Y|X) 组成,回答“要预测什么”。
    T={Y, P(Y∣X)}\displaystyle \mathcal{T} = \left\{ \mathcal{Y},\ P(Y|X) \right\}
  3. 预训练的位置在大规模源域上训练模型,使 P(X) 中的通用结构被编码进参数里。
    fθpre≈P(YS∣XS)\displaystyle f_{\theta}^{\mathrm{pre}} \approx P(Y_S | X_S)

微调技术

老周拿到梅菜扣肉的想法后,第一反应不是换锅,而是问:哪些步骤照搬?哪些必须换?微调就是这个思路——在预训练模型基础上继续训练,用新任务数据更新参数。

实际操作中有一套固定打法:先把模型最后一层输出头换成新任务需要的结构,比如二分类换成新类别数;然后冻结大部分底层参数,只训练高层和新头;再逐步解冻更多层,让模型慢慢适应新数据。学习率也要刻意调小,因为预训练参数已经处于一个不错的区域,步子太大容易走出好位置。

微调最大的风险是灾难性遗忘:新任务学得太猛,把旧知识冲掉了。所以我们会给优化目标加一个“别忘了旧参数”的约束。

老周用小火慢炖,既让梅菜入味,又保留红烧肉的底味。微调同理:小学习率、短训练轮数、必要时加正则,才能既学新任务又不弄丢通用特征。

θ∗=arg⁡min⁡θ LFT(θ)+λ∥θ−θpre∥2\displaystyle \theta^\ast = \arg\min_{\theta}\ \mathcal{L}_{\mathrm{FT}}(\theta) + \lambda \|\theta - \theta_{\mathrm{pre}}\|^2
这个式子在说:新任务要学好,但参数也别离预训练参数太远。λ 越大,越强调保留旧知识。
  1. 新任务损失 L_FT衡量模型在新任务上的预测误差,是微调的主要目标。
    LFT(θ)\displaystyle \mathcal{L}_{\mathrm{FT}}(\theta)
  2. 距离惩罚项计算当前参数与预训练参数的欧氏距离,阻止参数漂移太远。
    ∥θ−θpre∥2\displaystyle \|\theta - \theta_{\mathrm{pre}}\|^2
  3. 平衡系数 λ控制“学新任务”和“保旧知识”的权重,λ 大则更保守。
    λ∥θ−θpre∥2\displaystyle \lambda \|\theta - \theta_{\mathrm{pre}}\|^2

领域自适应

老周把红烧肉带到隔壁镇,发现客人嫌太甜。他没有重新研发菜品,只把糖减半、添了一撮盐——这就是领域自适应:源域和目标域解决同一个任务,但数据分布不一样。

在真实业务里,源域往往有大量标注,比如网上爬来的商品评论;目标域只有少量标注,比如某个细分市场的评论。两边任务相同,但说话风格、用词习惯存在分布漂移。领域自适应要做的,就是让模型忽略这些表面差异,抓住真正有用的特征。

主流做法分两路:一路做统计匹配,把源域和目标域的特征均值、方差拉近;另一路用对抗训练,让一个判别器分不清特征来自哪个域,逼迫特征编码器提取两边共有的信息。

领域自适应就像老周试菜:先尝一口目标客人的口味,再调整佐料,让同一道菜在新地方也能被接受。

W(μ1,μ2)=inf⁡γ∈Π(μ1,μ2)E(x1,x2)∼γ[∥x1−x2∥]\displaystyle \mathrm{W}(\mu_1,\mu_2) = \inf_{\gamma \in \Pi(\mu_1,\mu_2)} \mathbb{E}_{(x_1,x_2)\sim \gamma}\left[ \| x_1 - x_2 \| \right]
这是推土机距离,也叫 Wasserstein 距离。它把源分布看成一座沙堆,把目标分布看成另一座沙堆,计算最少搬运量。
  1. 两个分布 μ_1、μ_2分别代表源域和目标域的特征分布。
    μ1, μ2\displaystyle \mu_1,\ \mu_2
  2. 联合分布方案 γ描述从源域哪个点搬运到目标域哪个点的所有可能方式。
    γ∈Π(μ1,μ2)\displaystyle \gamma \in \Pi(\mu_1,\mu_2)
  3. 最小期望距离在所有搬运方案里取期望运输距离的最小值,值越小,两个域越接近。
    inf⁡γE(x1,x2)∼γ[∥x1−x2∥]\displaystyle \inf_{\gamma} \mathbb{E}_{(x_1,x_2)\sim \gamma}\left[ \| x_1 - x_2 \| \right]

元学习框架

老周开店久了,练出一种“学新菜”的本事:看到原料就能猜到做法,尝一口就能调出甜度。普通迁移学会的是某一任务的能力,元学习学的却是“如何快速学会新任务”。

元学习的训练单位和普通监督学习完全不同。普通训练给模型一批样本,元学习给模型一批“任务”。每个任务都有自己的支持集和查询集:支持集相当于考试前的例题,查询集相当于正式考题。训练时随机采样很多任务,模型先快速适应支持集,再在查询集上评估适应效果。

这种“任务采样→元训练→元测试”的流程,让小陈练出的不是某个配方,而是一套学习配方的方法。

小陈卖的不是柠檬茶的配方,而是“快速学会柠檬茶的流程”。元学习框架学的正是这个流程,所以它能在全新任务上快速上手。

min⁡θ ∑i=1NLDiquery(fθi),θi=θ+Δi(θ)\displaystyle \min_{\theta}\ \sum_{i=1}^{N} \mathcal{L}_{\mathcal{D}_i^{\mathrm{query}}}\left( f_{\theta_i} \right),\qquad \theta_i = \theta + \Delta_i(\theta)
元学习的目标是找到一组共享初始参数 θ,使得每个任务经过自己的小调整 Δ 后,在查询集上表现都好。
  1. 共享初始参数 θ所有任务共用的起点,相当于小陈的“学习反应”。
    θ\displaystyle \theta
  2. 任务专属参数 θ_i从共享起点出发,用第 i 个任务的支持集做快速调整后得到。
    θi=θ+Δi(θ)\displaystyle \theta_i = \theta + \Delta_i(\theta)
  3. 查询集损失求和把所有任务在查询集上的损失加起来,作为元训练的总目标。
    ∑i=1NLDiquery(fθi)\displaystyle \sum_{i=1}^{N} \mathcal{L}_{\mathcal{D}_i^{\mathrm{query}}}\left( f_{\theta_i} \right)

MAML算法

在众多元学习算法里,MAML 的思路特别直接:找一个好的参数初始点,让模型从这个点出发,只做几步梯度更新就能在新任务上表现优秀。这就像小陈不是背下所有奶茶配方,而是把“看、尝、调”的初始反应练到极致。

MAML 的全称是 Model-Agnostic Meta-Learning,模型无关,意思是无论你用卷积网络还是 Transformer,都能套用这套框架。它把所有任务分成内层和外层两个循环:内层循环快速适应单个任务,外层循环更新共享初始参数。

外层更新时,MAML 需要对“适应后的参数”再求梯度,这会产生二阶导数。为了省计算量,常用的 FO-MAML 会忽略高阶项,只用一阶近似,效果依然不错。

MAML 就是小陈的“初始反应训练”:每一次新配方都是考验,每一次调整都让下一次学得更快。

θ←θ−β∇θ∑iLitest(θ−α∇θLitrain(θ))\displaystyle \theta \leftarrow \theta - \beta \nabla_{\theta} \sum_{i} \mathcal{L}_{i}^{\mathrm{test}}\left( \theta - \alpha \nabla_{\theta} \mathcal{L}_{i}^{\mathrm{train}}(\theta) \right)
这是一个“先快适应、再评估、最后更新初始点”的过程。α 控制任务内适应步长,β 控制元学习率。
  1. 内层快适应每个任务在自己的训练集上做一次梯度下降,得到任务专属参数。
    θ−α∇θLitrain(θ)\displaystyle \theta - \alpha \nabla_{\theta} \mathcal{L}_{i}^{\mathrm{train}}(\theta)
  2. 测试损失用任务专属参数在查询集上计算损失,衡量这个起点在适应后是否好用。
    Litest(θ−α∇θLitrain(θ))\displaystyle \mathcal{L}_{i}^{\mathrm{test}}\left( \theta - \alpha \nabla_{\theta} \mathcal{L}_{i}^{\mathrm{train}}(\theta) \right)
  3. 外层元梯度对所有任务的测试损失求和,再对初始参数求梯度。
    ∇θ∑iLitest(θi)\displaystyle \nabla_{\theta} \sum_{i} \mathcal{L}_{i}^{\mathrm{test}}\left( \theta_i \right)
  4. 更新初始参数用元学习率 β 更新 θ,让下一次面对新任务时起点更好。
    θ←θ−β⋅∇θ∑iLitest(θi)\displaystyle \theta \leftarrow \theta - \beta \cdot \nabla_{\theta} \sum_{i} \mathcal{L}_{i}^{\mathrm{test}}\left( \theta_i \right)

少样本学习

小陈遇到一种全新的饮料,只尝一口样品,就能猜出大概配方。少样本学习要解决的正是这种问题:每个类别只给几个样本,模型也能快速识别新样本属于哪一类。

少样本任务通常写成 N-way K-shot:N 个类别,每个类别 K 个样本。这些样本合起来叫支持集,需要被预测的样本叫查询集。很多少样本方法会先让模型在大量模拟任务上做元训练,学会“怎么用支持集提取有区分度的特征”。

一旦模型练好了,面对一个 5-way 1-shot 的新任务,它只需要看 5 张图片,就能把它们编码成 5 个类心,再拿查询图片和这 5 个类心比相似度。

少样本学习就像小陈只凭两三勺样品,在脑中快速确定“配方中心”:样本虽少,但类心够稳,判断就够准。

pθ(y∣x)=exp⁡(sim(fθ(x),cy)/τ)∑y′∈Yexp⁡(sim(fθ(x),cy′)/τ)\displaystyle p_{\theta}(y|x) = \frac{\exp\left( \mathrm{sim}(f_{\theta}(x), c_y)/\tau \right)}{\sum_{y' \in \mathcal{Y}} \exp\left( \mathrm{sim}(f_{\theta}(x), c_{y'})/\tau \right)}
这是软分类概率:新样本 x 先被映射成向量,再和每个类中心比相似度,最后用 Softmax 转成概率。
  1. 特征编码器 f_θ把原始样本映射成向量,相当于小陈“尝一口”后形成的味道画像。
    fθ(x)\displaystyle f_{\theta}(x)
  2. 类心 c_y支持集里同一类别样本向量的平均,代表这个类的“标准味道”。
    cy=1K∑xk∈Syfθ(xk)\displaystyle c_y = \frac{1}{K} \sum_{x_k \in \mathcal{S}_y} f_{\theta}(x_k)
  3. 带温度相似度计算新样本与每个类心的相似度,再用 τ 缩放,控制概率分布的锐利程度。
    sim(fθ(x),cy)/τ\displaystyle \mathrm{sim}(f_{\theta}(x), c_y) / \tau
  4. Softmax 归一化对所有类别求和,把相似度变成概率,概率最高的类别就是预测结果。
    exp⁡(⋅)∑y′∈Yexp⁡(⋅)\displaystyle \frac{\exp(\cdot)}{\sum_{y' \in \mathcal{Y}} \exp(\cdot)}

AI 应用场景

工业质检中的预训练迁移

阶段:模型微调

解决的问题:工厂只有几千张缺陷样本,从零训练一个视觉检测模型很容易过拟合;传统方式需要人工设计缺陷特征,耗时且泛化差。用 ImageNet 预训练模型做特征提取,再微调最后几层,就能用少量缺陷样本快速得到可用模型。

具体案例:某电子产品工厂需要检测电路板上的焊点虚焊。工程师加载一个预训练 ResNet,替换最后的分类头为“正常/虚焊”两类,冻结大部分卷积层,用小学习率微调,三天内上线了一套准确率超过 95% 的质检系统。

跨领域文本分类的领域自适应

阶段:领域自适应

解决的问题:源域是公开的电商评论数据,目标域是某品牌自己的客服工单,用词差异大、标注稀缺。传统模型直接迁移准确率骤降,因为两边的特征分布不一致。用对抗对齐把两边特征拉近,让分类器学到领域无关的语义。

具体案例:某 SaaS 公司要做“投诉/咨询/表扬”三分类,源域标注 10 万条,目标域只有 500 条。工程师在特征提取器后接了一个梯度反转层,让判别器无法区分评论来源,最终目标域准确率从 68% 提升到 87%。

客服意图识别的少样本元学习

阶段:元学习与少样本学习

解决的问题:新客户上线时总会带来全新意图,比如“查发票”“改地址”,每个意图只有 3-5 条样本。传统意图分类器需要大量标注才能新增类别。用原型网络做少样本意图识别,模型先在其他业务线做元训练,学会“看几个样本就能形成类心”的能力。

具体案例:某智能客服平台在 10 个历史业务上做 episodic 元训练,新客户上线时,每个新意图只给 5 条标注,就能以 89% 的正确率识别用户问题,部署时间从两周缩短到一天。

Python 演示

python74 行
import torchimport torch.nn as nn  def forward_weights(model, x, weights):    out = x    idx = 0    for layer in model:        if isinstance(layer, nn.Linear):            out = out @ weights[idx].T + weights[idx + 1]            idx += 2        elif isinstance(layer, nn.ReLU):            out = torch.relu(out)    return out  def simple_maml(    meta_datasets,    inner_lr=0.01,    meta_lr=0.001,    inner_steps=5,    meta_iters=200):    model = nn.Sequential(        nn.Linear(5, 16),        nn.ReLU(),        nn.Linear(16, 1)    )    meta_optimizer = torch.optim.Adam(model.parameters(), lr=meta_lr)     for _ in range(meta_iters):        task_grads = []        for task in meta_datasets:            x = torch.tensor(task[0], dtype=torch.float32)            y = torch.tensor(task[1], dtype=torch.float32)             fast_weights = list(model.parameters())            for _ in range(inner_steps):                pred = forward_weights(model, x, fast_weights)                loss = nn.functional.mse_loss(pred, y)                grads = torch.autograd.grad(loss, fast_weights)                fast_weights = [                    p - inner_lr * g for p, g in zip(fast_weights, grads)                ]             meta_pred = forward_weights(model, x, fast_weights)            meta_loss = nn.functional.mse_loss(meta_pred, y)            task_grads.append(                torch.autograd.grad(meta_loss, model.parameters())            )         avg_grads = [            torch.stack([g[i] for g in task_grads]).mean(dim=0)            for i in range(len(task_grads[0]))        ]        meta_optimizer.zero_grad()        for p, g in zip(model.parameters(), avg_grads):            p.grad = g        meta_optimizer.step()     return model  if __name__ == "__main__":    torch.manual_seed(0)    datasets = [        (            torch.randn(8, 5) * 0.5,            torch.randn(8, 1)        )        for _ in range(10)    ]    maml_model = simple_maml(datasets, meta_iters=50)    print("MAML 训练完成,模型参数量:", sum(p.numel() for p in maml_model.parameters()))
目的:演示 MAML 的内层快速适应与外层元更新,让模型在多个小回归任务上练出一个更容易快速适应的初始参数。
  1. fast_weights = list(model.parameters())把初始参数当作任务专属参数的起点,相当于先复制一份菜谱做实验。
  2. forward_weights(model, x, fast_weights)使用临时权重做前向计算,不动模型本身的参数。
  3. torch.autograd.grad(loss, fast_weights)对临时权重求梯度,模拟在单个任务上的快速学习。
  4. [p - inner_lr * g for p, g in zip(fast_weights, grads)]内层更新:每个临时参数沿负梯度走一小步。
  5. torch.autograd.grad(meta_loss, model.parameters())对初始参数求元梯度,衡量“从这个起点出发好不好用”。
  6. torch.stack([g[i] for g in task_grads]).mean(dim=0)把所有任务的元梯度取平均,得到最终更新方向。
  7. p.grad = g把平均梯度交给元优化器,让 Adam 更新初始参数。

常见误区

误区很多人以为迁移学习就是把别人训练好的模型拿过来,参数原封不动直接用。我刚开始也以为“加载权重就等于完成了迁移”。

正解迁移学习的关键是“复用后还要适配”。就像老周把红烧肉菜谱拿过来,还要把炒糖色改成蒸透,才会变成梅菜扣肉。加载预训练权重只是第一步,后续的冻结、微调、替换输出头才是真正解决目标任务的部分。如果直接套用,特征分布不匹配,模型在目标数据上通常会表现很差。

为何常见:因为 PyTorch 里 load_state_dict 一行代码就能加载权重,让人误以为“加载”就是“迁移”的全部。

误区预训练模型已经很厉害了,所以微调时用和从零训练一样大的学习率应该也没问题,大不了多跑几个 epoch。

正解预训练参数已经处在一个比较平滑的低损失区域,学习率太大会让参数一步跨出好位置,破坏学到的基础特征。实际场景中,微调通常使用预训练学习率的 1/10 到 1/100,并且配合早停。老周做新菜时也不敢把火开到最大,否则梅菜没入味,红烧肉底味也烧糊了。

为何常见:从零训练时大学习率能加速收敛,这个经验被错误平移到微调场景,忽略了参数的初始状态完全不同。

误区提到元学习,很多人只记得 MAML,以为学会 MAML 就等于学会了元学习。

正解MAML 只是元学习里的一条技术路线,它的思路是学一个好的参数初始化。元学习还有基于度量的原型网络、基于记忆的 Memory Augmented Networks、基于学习率的 Learned Optimizer 等多种路线。就像小陈既会“快速调整配方”,也会“用标准味道做类比”,MAML 只是其中一种手艺。

为何常见:MAML 因为公式优雅、效果惊艳,在论文和教程里出现频率最高,容易让人产生“元学习 = MAML”的错觉。

误区元学习学的是“学会学习”,所以到了测试阶段,新任务一来,模型应该直接就能预测,不用再训练。

正解元学习测试阶段通常仍然需要少量样本做快速适应,只是这个过程被训练得很快。MAML 在 meta-test 阶段还是要用支持集做几步梯度更新,然后再预测查询集。小陈见到新饮料,也得先尝一口、调一下糖度,才能给出配方,只是这个过程比别人快得多。

为何常见:“学会学习”这个说法被过度简化,导致大家忽略了“快速学习”仍然是学习,只不过学习成本被压到了极小。

误区看到很多教程都用图片风格迁移、图像分类举例,以为领域自适应只有视觉任务能用。

正解领域自适应处理的是“源域和目标域分布不一致”的问题,跟模态无关。文本分类里不同平台的用词差异、语音识别里不同口音的声学差异、推荐系统里不同用户群体的行为差异,都能用领域自适应解决。老周从本地菜场搬到隔壁镇,变化的不是菜本身,而是客人口味——这和图片、文本、语音都没关系。

为何常见:图像数据直观、容易可视化,教程偏爱用它举例,让学习者误以为技术本身绑定模态。

面试题

Q1. 迁移学习的核心思想是什么?

单选题 · easy

  • A.从零训练全部参数
  • B.复用源任务已有知识← 正确答案
  • C.只靠随机梯度下降
  • D.无限扩大训练数据集

答案:B。迁移学习的关键是把源任务上学到的特征或参数复用到目标任务,而不是从零开始。A 是普通训练,C 是优化手段,D 是数据策略,都没有抓住“复用知识”的本质。

Q2. 预训练模型在目标任务上继续训练,通常叫什么?

单选题 · easy

  • A.交叉验证
  • B.模型压缩
  • C.端到端微调← 正确答案
  • D.数据增强

答案:C。预训练模型在当前任务数据上继续训练,习以为常叫“微调”或 Fine-tuning。交叉验证是评估流程,模型压缩是减小体积,数据增强是扩充样本,三者都不是在预训练基础上继续训练。

Q3. 特征提取式迁移中,源任务和目标任务的关系通常是?

单选题 · mid

  • A.两者完全互不相关
  • B.共享低层通用特征← 正确答案
  • C.所有层都必须冻结
  • D.输出类别必须一致

答案:B。迁移能成立的前提是源任务和目标任务共享低层通用特征,比如边缘、纹理、词性。A 是负迁移的来源,C 过于绝对,D 也非必要条件,因为新任务通常需要换输出层。

Q4. 元学习的目标是什么?

单选题 · easy

  • A.在单一任务上做到过拟合
  • B.学会多个任务共有的学习方式← 正确答案
  • C.所有任务都永远不做梯度更新
  • D.只使用无标签的数据训练

答案:B。元学习把“任务”当成训练样本,目标是学会一个能快速适应新任务的学习算法或初始参数。A 是错误训练,C 不现实,D 描述的是无监督学习。

Q5. MAML 中的内层循环主要负责什么?

单选题 · mid

  • A.在单一任务上快速适应← 正确答案
  • B.对元学习器做元更新
  • C.对数据做增广与压缩
  • D.对特征做预处理

答案:A。MAML 分两层:内层在单个任务的支持集上做几次梯度更新,得到任务专属参数;外层汇总所有任务的表现,更新共享初始参数。所以内层对应的是“快速适应”。

Q6. 以下哪些属于领域自适应的常见手段?

多选题 · mid

  • A.对抗对齐特征分布← 正确答案
  • B.统计矩匹配← 正确答案
  • C.只训练模型的最后一层
  • D.使用领域标记做数据增强

答案:AB。对抗对齐和统计矩匹配都是拉近源域与目标域分布的做法。C 只是某些微调策略,不是领域自适应的核心思想;D 中的“领域标记”不是标准数据增强概念。

Q7. MAML 外层更新时需要使用什么梯度?

单选题 · hard

  • A.任务更新之前的普通梯度
  • B.适应后参数的二阶或一阶近似梯度← 正确答案
  • C.仅支持向量机的对偶梯度
  • D.随机拒绝采样的梯度

答案:B。MAML 计算的是“经过内层快速适应后的损失”对初始参数的梯度,严格来说含二阶信息,一阶近似 FO-MAML 可以省略高阶项。这个梯度依赖适应后的参数,而不是更新前的普通梯度。

Q8. 少样本学习的常见解决思路有哪些?

多选题 · hard

  • A.扩充训练样本← 正确答案
  • B.元学习范式← 正确答案
  • C.类中心度量← 正确答案
  • D.放弃模型泛化

答案:ABC。少样本学习可以通过数据增强扩大样本量,也可以通过元学习训练模型快速适应,还可以用类中心等度量方法做比较。D 完全错误,少样本学习恰恰是为了保留泛化能力。

Q9. FO-MAML(一阶 MAML)主要忽略了什么?

单选题 · extreme

  • A.内层梯度对初始参数的高阶依赖← 正确答案
  • B.损失函数的单调性
  • C.数据采样的随机噪声
  • D.模型参数量级

答案:A。MAML 内层更新会让任务专属参数成为初始参数的函数,外层再对初始参数求导时会有高阶导数。FO-MAML 用一阶近似忽略这些高阶项,以换来计算速度,而不是忽略损失单调性或噪声。

Q10. 关于迁移学习与元学习的关系,下列说法正确的是?

多选题 · hard

  • A.迁移学习重在复用源任务特征← 正确答案
  • B.元学习重在学会学习过程← 正确答案
  • C.两者完全没有任何关联
  • D.元学习能为新任务提供快速适应能力← 正确答案

答案:ABD。迁移学习的核心是特征或参数复用,元学习的核心是学出快速适应新任务的能力。两者都服务于小数据场景,而且在少样本学习中经常结合使用,因此 C 错误。