小李进了一家大排档当学徒,每天都有新菜要学:麻婆豆腐、红烧狮子头、清蒸鲈鱼……若每道菜都从洗锅、切葱、热油一步步练起,恐怕十年也出不了师。老师傅告诉他一个秘密:先别急着学菜,先学会“怎么学做菜”——写一本属于自己的基本功笔记:刀工怎么练、火候怎么控、调味怎么平衡。之后每来一道新菜,翻几页笔记,试炒两三遍就能像模像样。这就是“学会学习”。MAML 干的就是这件事:它不训练一个能直接完成某个任务的模型,而是训练一套“初始参数”——一本万能基本功笔记。拿到新任务时,模型只需在这套初始参数上做几步梯度下降(试炒几遍),就能快速进入状态。本篇文章我们就用这本笔记作向导,从目标函数、二阶梯度到 FOMAML 和 Reptile,把 MAML 的来龙去脉讲清楚。

岗位关联

对 AI 从业者而言,MAML 是理解“元学习”的第一块基石,掌握它能让你在少样本、冷启动、快速适应等真实工程难题上有更系统的建模思路。

目录
  1. 可视化演示
  2. 元学习初衷
  3. 双循环训练
  4. 二阶梯度解析
  5. 一阶近似变体
  6. 应用场景盘点
  7. 方法对比Reptile
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

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

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

元学习初衷

小李问老师傅:“基本功笔记怎么找?”老师傅指着满满一墙菜谱说:“从你练过的菜里找共性。番茄要切、土豆要切、丝瓜也要切,那就先练刀工;鱼要蒸、肉要炖、蛋要煎,那就再练火候。”元学习的第一步,正是从一堆“菜谱”——也就是任务——里提炼出“如何快速学习”的规律。传统监督学习把一份训练集喂给模型,训练完模型就只会做这一道菜;元学习则把“任务”本身当作样本,希望模型在面对从未见过的新任务时,能凭借过往经验迅速上手。

任务可以形式化为一个分布 \(p(\mathcal{T})\),好比大排档的“每周菜单”:客人点什么菜是有规律的,这个规律就是任务分布。从任务分布中采样,就相当于随意抽出几道菜来练。少样本问题也随之浮出水面:如果我们只在菜谱上写了 5 个步骤、给了 3 张成品图,要让徒弟端出一盘像样的菜,靠的就是那本基本功笔记——也就是“少量样本 + 好的初始参数 = 快速适应”。

如果只想要“在平均意义上做菜最好”,我们会优化一个普通的目标:让所有任务上的期望损失最小。这个目标虽然直观,但它不关心“学得快不快”。

老师傅看到这个目标摇了摇头:“我要的不是你现在能做得多好,而是你拿到新菜谱后,三两下就能做好。”普通训练追求“做得好”,元学习追求“学得快”——这正是 MAML 与普通训练分道扬镳的起点。

θ∗=arg⁡min⁡θET∼p(T)[LT(θ)]\displaystyle \theta^{*} = \arg\min_{\theta} \mathbb{E}_{T \sim p(\mathcal{T})}\left[\mathcal{L}_{T}(\theta)\right]
这个公式表示:在所有可能任务上,让平均损失最小的参数 \(\theta\)。它衡量的是“端出来好不好吃”,而不是“学做菜快不快”。
  1. 任务分布采样从大排档的每周菜单里随机抽一道菜,也就是抽一个任务 \(T\)。
    T∼p(T)\displaystyle T \sim p(\mathcal{T})
  2. 单任务损失这道菜当前的“味道分”——模型在任务 \(T\) 上的损失函数。
    LT(θ)\displaystyle \mathcal{L}_{T}(\theta)
  3. 对所有任务求期望把菜单上所有菜的味道分求平均,看整体水平。
    ET∼p(T)[LT(θ)]\displaystyle \mathbb{E}_{T \sim p(\mathcal{T})}\left[\mathcal{L}_{T}(\theta)\right]
  4. 最小化平均损失找到让平均味道分最高的参数,即只会“做菜好吃”而不保证“学得快”的参数。
    θ∗=arg⁡min⁡θET∼p(T)[LT(θ)]\displaystyle \theta^{*} = \arg\min_{\theta} \mathbb{E}_{T \sim p(\mathcal{T})}\left[\mathcal{L}_{T}(\theta)\right]

双循环训练

老师傅写笔记有个习惯:每写一版,就随手抽几道菜试炒,按试炒结果修改笔记。如果一道麻婆豆腐按笔记炒出来偏咸,他就在调味那页划一笔。MAML 的双循环训练,就是把这套“试菜—改笔记”的流程公式化。外循环是“改笔记”,内循环是“按笔记试炒一道新菜”。

具体地,每次训练先采样一批任务 \(T_1, T_2, \dots, T_n\),对应抽几道菜;内循环里,模型从当前初始参数 \(\theta\) 出发,对每个任务做几步梯度下降,得到任务专属参数 \(\theta_i'\)——这是“按笔记试炒两遍”;外循环里,我们计算“试炒后的菜”的损失,再把这个损失对初始参数 \(\theta\) 求梯度,更新笔记。于是元学习的目标函数变成:找一个初始参数,使得“在每个任务上适应一步之后”的损失都尽可能小。

如果说普通训练只有“试炒”和“改笔记”中的一层循环,那么 MAML 是“试炒一步,尝一口,回头改笔记,再试炒一步”的嵌套循环。正是这层嵌套,让笔记(初始参数)变得“越学越快”——它不是一本菜谱,而是一本教你如何快速写出菜谱的方法论。

min⁡θ∑Ti∼p(T)LTi(θ−α∇θLTi(θ))\displaystyle \min_{\theta} \sum_{T_i \sim p(\mathcal{T})} \mathcal{L}_{T_i}\left(\theta - \alpha \nabla_{\theta}\mathcal{L}_{T_i}(\theta)\right)
这个公式是 MAML 的灵魂:它不优化“当前参数的表现”,而是优化“适应一步之后的表现”。\(\alpha\) 是内循环的学习率,相当于试炒时每个菜的调整幅度。
  1. 采样一批任务从任务分布中抽出若干道菜来当练习对象。
    Ti∼p(T)\displaystyle T_i \sim p(\mathcal{T})
  2. 计算内循环梯度对每道菜,先看当前笔记在支持集上的“味道分梯度”。
    ∇θLTi(θ)\displaystyle \nabla_{\theta}\mathcal{L}_{T_i}(\theta)
  3. 做一步适应笔记按梯度方向改进一小步,得到这道菜的专属做法。
    θi′=θ−α∇θLTi(θ)\displaystyle \theta_i' = \theta - \alpha \nabla_{\theta}\mathcal{L}_{T_i}(\theta)
  4. 评估适应后的损失用专属做法重新炒一遍,看这道菜现在好不好吃。
    LTi(θi′)\displaystyle \mathcal{L}_{T_i}(\theta_i')
  5. 外层最小化把所有菜适应后的表现加起来,反向传播更新初始笔记。
    min⁡θ∑TiLTi(θi′)\displaystyle \min_{\theta} \sum_{T_i} \mathcal{L}_{T_i}\left(\theta_i'\right)

二阶梯度解析

老师傅在改笔记时遇到一个微妙的问题:如果这道菜偏咸,他该在笔记上调多少盐?这取决于“笔记改一小点,最终菜的味道变多少”。可问题是,笔记不仅直接影响菜的味道,还会影响“试炒的过程”——笔记改了,内循环里走的那一步也会变。前者是一阶效应,后者是二阶效应:梯度的梯度。

在数学上,内循环产生的适应参数 \(\theta_i'\) 是初始参数 \(\theta\) 的函数。外层要对 \(\theta\) 求梯度,就必须把“适应路径”也纳入求导,这需要链式法则穿过整个内循环计算图,相当于在对“梯度”再求一次梯度。

老师傅把这页笔记翻了又翻,最后叹气:“要是每次都算这条弯弯曲曲的路径,一个月也改不完一本笔记。”二阶梯度虽然数学上严谨,但计算开销很大——于是 FOMAML 出场了:它决定把那条弯曲的路径“拉直”。

∇θLTi(θi′)=∇θi′LTi(θi′)⋅(I−α∇θ2LTi(θ))\displaystyle \nabla_{\theta}\mathcal{L}_{T_i}(\theta_i') = \nabla_{\theta_i'}\mathcal{L}_{T_i}(\theta_i') \cdot \left(I - \alpha \nabla_{\theta}^{2}\mathcal{L}_{T_i}(\theta)\right)
直观理解:外层的真实梯度 = “适应后位置上的梯度” 乘上 “适应路径对初始位置的敏感度”。括号里的海森矩阵就是那条“会因为笔记修改而弯曲的路径”。
  1. 写适应参数的表达式内循环一步适应后的参数,显式依赖初始参数。
    θi′=θ−α∇θLTi(θ)\displaystyle \theta_i' = \theta - \alpha \nabla_{\theta}\mathcal{L}_{T_i}(\theta)
  2. 计算适应后位置的梯度先不管路径,只看“炒完后这道菜的味道梯度”。
    ∇θi′LTi(θi′)\displaystyle \nabla_{\theta_i'}\mathcal{L}_{T_i}(\theta_i')
  3. 计算适应路径的导数初始参数一动,适应过程本身也会跟着动,于是出现对梯度的梯度。
    I−α∇θ2LTi(θ)\displaystyle I - \alpha \nabla_{\theta}^{2}\mathcal{L}_{T_i}(\theta)
  4. 链式法则组合两个部分相乘,得到对初始参数的完整梯度。
    ∇θLTi(θi′)=∇θi′LTi(θi′)⋅(I−α∇θ2LTi(θ))\displaystyle \nabla_{\theta}\mathcal{L}_{T_i}(\theta_i') = \nabla_{\theta_i'}\mathcal{L}_{T_i}(\theta_i')\cdot\left(I - \alpha\nabla_{\theta}^{2}\mathcal{L}_{T_i}(\theta)\right)

一阶近似变体

FOMAML 的偷懒方式很聪明:既然内循环只走了一两步,适应路径很短,那么“路径弯曲”造成的误差就没那么大。干脆把外层梯度里的 Jacobian 因子 \(I - \alpha \nabla_{\theta}^{2}\mathcal{L}\) 直接当作单位阵丢掉,只保留适应后位置上的梯度。就像改笔记时只相信“尝到的味道”,不再去考虑“练的过程中手抖不抖”。

这个近似带来两个好处:第一,省掉了对海森矩阵的计算,GPU 显存和算力压力骤降;第二,代码实现极为简单——只需要“先适应,再在适应后的参数上算一次普通梯度”,与常规训练的代码几乎没有差别。

有趣的是,论文实验表明:当内循环只走一步时,FOMAML 与完整 MAML 的性能几乎持平。原因正如老师傅所说:“试炒就炒一遍,路径还没来得及弯,拉直了也不亏。”不过当内循环步数增多时,路径弯曲变得显著,一阶近似就会逐渐失真——这算是一种“用精度换速度”的工程权衡。

θ←θ−β∑Ti∼p(T)∇θi′LTi(θi′)\displaystyle \theta \leftarrow \theta - \beta \sum_{T_i \sim p(\mathcal{T})} \nabla_{\theta_i'}\mathcal{L}_{T_i}(\theta_i')
FOMAML 的更新公式:直接用“适应后参数上的梯度”来更新初始参数,省略了对适应路径的求导。当 \(\alpha\) 很小或内循环步数很少时,这个近似非常准。
  1. 近似外层梯度把“对初始参数的梯度”替换成“对适应参数的梯度”。
    ∇θLTi(θi′)≈∇θi′LTi(θi′)\displaystyle \nabla_{\theta}\mathcal{L}_{T_i}(\theta_i') \approx \nabla_{\theta_i'}\mathcal{L}_{T_i}(\theta_i')
  2. 外层更新初始参数朝着所有任务“适应后梯度”的合力方向走一大步。
    θ←θ−β∑Ti∇θi′LTi(θi′)\displaystyle \theta \leftarrow \theta - \beta \sum_{T_i} \nabla_{\theta_i'}\mathcal{L}_{T_i}(\theta_i')

应用场景盘点

有了这本基本功笔记,小李开始在不同厨房里验证它的威力。第一个厨房是 Omniglot——一个手写字符数据集,里面有一千多个异国文字符号,每个类别只有几十个样本。MAML 的任务被构造成“5-way 1-shot“:随机挑 5 个字符类别,每个类别只给 1 张图作参考,模型要能正确认出新的手写字符。这些”异国文字”就像不同菜系,每道菜只允许看一张成品图,但靠着元学习得到的初始参数,模型照样能迅速上手。

第二个厨房是 miniImageNet,比 Omniglot 更难:100 个自然图像类别,每个类别 600 张图,任务同样是少样本分类。这里每个任务的适应可以写成支持集上的交叉熵损失,再在查询集上评估元学习效果。第三个厨房则完全不同——强化学习。MAML 把策略网络参数当作“初始笔记”,适应过程变成在奖励函数不同的环境中做几步策略梯度,让机器人或智能体快速适应新地形、新马达。

无论是手写字符、自然图像,还是机器人策略,MAML 的核心始终没变:先在一批任务上学会“怎么学”,再利用这本笔记去迎接每个具体的小样本任务。它的“模型无关”正体现在这里——只要模型可微,就能套上这套双循环框架。

LT(θ′)=−1∣ST∣∑(x,y)∈STlog⁡pθ′(y∣x)\displaystyle \mathcal{L}_{T}(\theta') = -\frac{1}{|\mathcal{S}_T|}\sum_{(x,y)\in \mathcal{S}_T} \log p_{\theta'}(y|x)
这是少样本分类任务中常用的损失:给定支持集 \(\mathcal{S}_T\),让适应后的模型尽量给正确标签分配高概率。本质上就是在“只给一张成品图”的条件下,尝出这道菜的味。
  1. 支持集上的对数似然衡量模型给正确标签打的分数。
    log⁡pθ′(y∣x)\displaystyle \log p_{\theta'}(y|x)
  2. 取平均一个支持集只有几个样本,平均掉批次差异。
    −1∣ST∣∑(x,y)∈ST\displaystyle -\frac{1}{|\mathcal{S}_T|}\sum_{(x,y)\in \mathcal{S}_T}
  3. 负号让损失变小等于分变高交叉熵损失越小,分类越准。

方法对比Reptile

大排档里还有一位师傅,方法更简单粗暴:Reptile。它不计算二阶梯度,也不显式建模“适应轨迹”,只是让每道菜都按笔记试炒两步,然后把初始参数直接往“试炒后参数的平均位置”挪一挪。如果说 MAML 是精心计算每条路径的微分来改进笔记,Reptile 则凭手感把笔记往“各菜谱试做结果的中点”推。

这两个方法的关系,有点像“精算师”和“老江湖”。MAML 像精算师,把每一条适应路径的导数都算得清清楚楚;Reptile 像老江湖,凭经验往任务折中方向迈一步,却往往也能走到差不多的好地方。实践中的选择指南是:如果算力充足、任务分布复杂,MAML 的二阶信息更稳健;如果追求工程效率、任务分布较简单,Reptile 的一阶近似往往更快且效果不俗。

θ←θ+β⋅1N∑i=1N(θi′−θ)\displaystyle \theta \leftarrow \theta + \beta \cdot \frac{1}{N}\sum_{i=1}^{N}\left(\theta_i' - \theta\right)
这是 Reptile 的更新公式:先让 \(N\) 个任务各自从当前初始参数适应几步,得到 \(\theta_i'\),然后朝这些适应后参数的均值方向移动一步。整个过程只涉及一阶运算。
  1. 每个任务适应几步从同一初始参数出发,分别得到任务专属参数。
    θi′=Adapt⁡(θ,Ti)\displaystyle \theta_i' = \operatorname{Adapt}(\theta, T_i)
  2. 求适应位移的平均值每个任务都指了一个“该往哪走”的方向。
    Δ=1N∑i=1N(θi′−θ)\displaystyle \Delta = \frac{1}{N}\sum_{i=1}^{N}\left(\theta_i' - \theta\right)
  3. 顺着平均方向更新初始参数相当于把笔记朝所有菜谱折中的方向拨一下。
    θ←θ+βΔ\displaystyle \theta \leftarrow \theta + \beta \Delta

AI 应用场景

少样本医学影像分类

阶段:模型预训练与快速微调

解决的问题:医院常常只有几种罕见病的少量影像切片(比如几十张 CT),传统方法一上来就用这么少数据训练很容易过拟合;用 MAML 先在大量历史病种的影像任务上做元学习,得到一个“善于快速适应”的初始参数,面对新病种时只需少量标注样本和几步梯度下降就能达到可用精度。

具体案例:一家三甲医院积累了心、肝、肺等常见病灶的影像分类任务,新出现一种罕见肺病的影像数据只有 50 张。算法工程师用 MAML 在已有病种数据上预训练模型初始参数,再用 50 张新数据做 5 步内循环微调,最终在查询集上的 F1 比从零训练高 20 个百分点。

机器人快速适应新环境

阶段:策略学习与部署

解决的问题:四足机器人从一个实验室搬到另一个实验室,地面摩擦、电机响应都有差异,直接部署旧策略会摔倒;把策略参数视为“初始笔记”,用 MAML 在多套仿真环境中做外循环训练,使机器人在真实环境中只需几步试错就能适应新地形。

具体案例:研究团队在仿真环境里构造 50 种不同摩擦系数和电机延迟的“任务”,用 MAML 训练策略初始参数。部署到真实机器人上后,机器人通过 3 次强化学习内循环更新,就从“原地打转”变成“正常行走”,适应时间比传统迁移学习缩短一半。

推荐系统冷启动

阶段:用户建模与个性化适配

解决的问题:新用户只有一两次点击记录,推荐模型难以建模其偏好;把“每个新用户”看作一个新任务,用 MAML 在历史用户少量交互记录上训练初始参数,让模型用新用户的少量点击快速完成个性化适配。

具体案例:某内容平台的召回模型改用 MAML 训练初始参数后,新用户在注册当天只需 3 次点击即可触发个性化召回,冷启动期次日留存率提升约 6%。

Python 演示

python57 行
import numpy as np np.random.seed(0)  def sample_task(n=6):    # 任务分布:目标直线斜率在区间 [0.5, 1.5] 上波动    w_true = np.random.uniform(0.5, 1.5)    b_true = np.random.uniform(-0.3, 0.3)    x = np.random.uniform(-1.0, 1.0, size=n)    y = w_true * x + b_true + np.random.normal(0, 0.05, size=n)    return x, y  def inner_update(w, b, x, y, lr=0.2):    # 单步梯度下降,模拟"试炒一遍"    pred = w * x + b    dw = np.mean(2.0 * (pred - y) * x)    db = np.mean(2.0 * (pred - y))    return w - lr * dw, b - lr * db  def meta_train(meta_w=0.0, meta_b=0.0, iters=300, meta_lr=0.1):    for _ in range(iters):        x_s, y_s = sample_task()  # 支持集:试炒用的样本        x_q, y_q = sample_task()  # 查询集:检验用的样本        aw, ab = inner_update(meta_w, meta_b, x_s, y_s)        pred = aw * x_q + ab        dw = np.mean(2.0 * (pred - y_q) * x_q)        db = np.mean(2.0 * (pred - y_q))        meta_w -= meta_lr * dw        meta_b -= meta_lr * db    return meta_w, meta_b  def evaluate(w0=0.0, b0=0.0, adapt_steps=2):    errors = []    for _ in range(200):        x_s, y_s = sample_task()        x_t, y_t = sample_task()        w, b = w0, b0        for _ in range(adapt_steps):            w, b = inner_update(w, b, x_s, y_s)        pred = w * x_t + b        errors.append(np.mean((pred - y_t) ** 2))    return float(np.mean(errors))  def main():    meta_w, meta_b = meta_train()    print("随机初始参数适应误差: %.4f" % evaluate(0.0, 0.0))    print("MAML初始参数适应误差: %.4f" % evaluate(meta_w, meta_b))    print("元学习到的初始参数: w=%.3f b=%.3f" % (meta_w, meta_b))  if __name__ == "__main__":    main()
目的:用 FOMAML 风格在合成线性回归任务上做元学习,展示“学到的初始参数”比“随机初始参数”在两步适应后误差更小。
  1. def sample_task(n=6):生成一个线性回归任务,斜率在 0.5 到 1.5 之间随机浮动,模拟不同的“菜谱”。
  2. def inner_update(w, b, x, y, lr=0.2):内循环单步梯度下降,对应“按笔记试炒一遍”。
  3. x_s, y_s = sample_task()取支持集样本,用来做内循环适应。
  4. x_q, y_q = sample_task()取查询集样本,用来评估适应后的表现并计算外层梯度。
  5. pred = aw * x_q + ab用适应后的参数在查询集上预测,注意这里没有对适应路径再求导,正是 FOMAML 的近似。
  6. meta_w -= meta_lr * dw外层更新初始参数,让“试炒后的菜”越来越好吃。
  7. evaluate()在 200 个全新任务上分别测试随机初始和元学习初始的适应效果。

常见误区

误区我以为 MAML 会针对每个任务训练一个独立模型,最后从里面选表现最好的那个作为元模型。

正解MAML 从头到尾只维护一个参数 \(\theta\)。它是在一堆任务上反复做“试炒—改笔记”的循环,最后得到的不是某个任务上的最优模型,而是一个“在多数任务上几步适应就能表现好”的初始参数。它更像一本通用基本功笔记,而不是任何一道菜的成品。

为何常见:因为元学习听起来像“多任务学习”,容易让人误以为要把多个模型的结果做集成或选择。

误区我调试代码时发现 FOMAML 跑得快多了,心想它只是把 MAML 里冗余的运算优化了一下,数学上应该完全等价。

正解FOMAML 不是单纯优化实现,而是做了数学上的近似:它省略了外层梯度中适应路径对初始参数的二阶依赖。当内循环步数少、学习率小时误差不大,但内循环步数一旦变多,两者结果会出现明显差异。它像一个“拉直路径的精算师”,估算很快,但路径真的弯弯绕绕时就会算偏。

为何常见:因为很多开源库默认用一阶近似,跑出来结果与论文一致,容易让人误以为两者在数学上等同。

误区既然内循环是“适应任务”,那我在内循环里多走几步梯度下降,模型对新任务应该适应得更充分。

正解步数越多,适应轨迹越长,外层的二阶梯度计算图越深,训练显存和耗时爆炸式增长,还会带来梯度消失或爆炸的数值风险。MAML 原论文在多数实验里内循环只用 1 到 5 步,因为元学习的目标不是“充分适应”,而是“几步之内快速适应”。

为何常见:把元学习的内循环误当成普通训练的完整训练,忽略了它的目标是“少样本快适应”而非“充分拟合”。

误区预训练也是先在一个大数据集上训一个初始模型,再微调到新任务上,这不就是 MAML 吗?

正解预训练优化的是“当前参数在所有任务上的平均表现”,MAML 优化的是“适应一步之后的参数在任务上的表现”。好比预训练是让小李直接端出一桌好菜,MAML 是训练小李“拿到任何新菜谱都能快速学会”。前者优化结果,后者优化学习能力,数学目标完全不同。

为何常见:两者确实都产出“可微调的初始参数”,容易混淆;但看公式就会发现,MAML 的损失函数里嵌入了内循环适应这一步,这是它区别于预训练的本质特征。

面试题

Q1. MAML 训练的目标是什么?

单选题 · easy

  • A.训练一个在所有任务上都完美的最终模型
  • B.学习一组适应新任务很快的初始参数← 正确答案
  • C.为每个任务分别训练独立的子模型
  • D.设计一种全新的神经网络结构

答案:B。MAML 优化的是初始参数 \(\theta\),使得模型在任意新任务上做几步梯度下降后表现良好。A 错在“最终模型”——MAML 的产出是“起始点”而非“终点”;C 是普通多任务学习的做法;D 与模型结构无关。

Q2. “模型无关”在 MAML 中的准确含义是什么?

单选题 · easy

  • A.只能用于卷积神经网络
  • B.适用于任意可微的模型结构← 正确答案
  • C.不需要任何梯度信息
  • D.只能在无监督数据上使用

答案:B。MAML 的优化过程只要求模型的损失对参数可微,不限定网络类型,因此 CNN、RNN、策略网络都能用。A 过于狭窄,C 错误因为它恰恰依赖梯度,D 与有监督少样本分类场景不符。

Q3. MAML 内循环的作用是什么?

单选题 · mid

  • A.扩大训练数据的批次规模
  • B.让模型从初始参数快速适应单个任务← 正确答案
  • C.减小模型参数量以降低显存
  • D.提高梯度计算的数值稳定性

答案:B。内循环就是“按笔记试炒”:从初始参数出发,在任务的支持集上做几步梯度下降,得到该任务专属的适应参数。A、C、D 都不是内循环的设计目的。

Q4. 为什么 MAML 外层梯度需要计算二阶导数?

单选题 · mid

  • A.因为适应参数是初始参数的函数← 正确答案
  • B.因为损失函数一定是非凸的
  • C.因为需要加速模型推理
  • D.因为训练数据中含有噪声

答案:A。内循环得到的 \(\theta_i'\) 依赖于 \(\theta\),外层对 \(\theta\) 求梯度时,链式法则必然穿过这条依赖路径,产生对梯度的梯度(海森矩阵项)。B 不是充分理由,C、D 与二阶梯度无关。

Q5. FOMAML 通过什么方式降低算力开销?

单选题 · mid

  • A.把内循环步数直接减为 0
  • B.用适应后参数上的梯度近似初始参数梯度← 正确答案
  • C.只使用单层网络做内循环
  • D.将浮点数精度降到半精度

答案:B。FOMAML 省略了外层梯度中 \(\left(I - \alpha \nabla_{\theta}^{2}\mathcal{L}\right)\) 这一项,直接用 \(\nabla_{\theta_i'}\mathcal{L}\) 更新 \(\theta\)。B 准确描述了该近似;A 会让模型完全无法适应;C 和 D 并非 FOMAML 的加速原理。

Q6. 下列哪些场景适合使用 MAML?

多选题 · mid

  • A.手写字符的少样本分类← 正确答案
  • B.机器人策略的快速适应← 正确答案
  • C.少样本文本情感分类← 正确答案
  • D.对数据库记录做去重排序

答案:ABC。MAML 是模型无关的元学习框架,只要任务能表达为“从一个初始参数快速适应”并且损失可微,就能用。少样本图像分类、强化学习策略适应、少样本文本分类都是经典应用。数据库去重不涉及可微的适应过程,D 不合适。

Q7. 关于 MAML 的二阶梯度计算,下列说法正确的是?

多选题 · hard

  • A.需要对适应轨迹关于初始参数求导← 正确答案
  • B.内循环步数越多计算图越深← 正确答案
  • C.内循环只走一步时 MAML 与 FOMAML 完全等价
  • D.海森矩阵在训练中恒为正定

答案:AB。A 正确,外层梯度要穿过适应路径;B 正确,步数越多计算图越深,二阶开销越大。C 错误,即使一步内循环,\(\theta_i' = \theta - \alpha \nabla L(\theta)\) 中梯度仍依赖 \(\theta\),MAML 会保留海森项而 FOMAML 会去掉它,两者并非严格等价。D 错误,海森矩阵不保证正定。

Q8. 关于 Reptile 与 MAML 的对比,正确的说法是?

多选题 · hard

  • A.Reptile 只使用一阶梯度更新← 正确答案
  • B.MAML 显式建模了适应路径的微分← 正确答案
  • C.Reptile 把初始参数朝任务适应后参数的均值方向更新← 正确答案
  • D.Reptile 不需要从任务分布中采样

答案:ABC。A 正确,Reptile 的更新公式只含一阶运算;B 正确,MAML 的损失函数内嵌了内循环适应并对其求导;C 正是 Reptile 的更新规则 \(\theta + \beta \cdot \frac{1}{N}\sum(\theta_i' - \theta)\);D 错误,Reptile 同样需要按任务分布采样任务。

Q9. 少样本分类中"5-way 1-shot"指的是什么?

单选题 · easy

  • A.5 个类别,每类只给 1 个标注样本← 正确答案
  • B.1 个类别,每类给 5 个标注样本
  • C.训练 5 轮,每轮测试 1 个样本
  • D.使用 5 个损失函数和 1 个优化器

答案:A。"N-way K-shot"是少样本分类的标准说法,N 是类别数,K 是每类支撑样本数。因此 5-way 1-shot 就是 5 个类别、每个类别 1 个样本,模型要在这种极稀疏信息下做分类。

Q10. 下列哪些说法符合 MAML 的实际训练流程?

多选题 · extreme

  • A.外层更新使用适应后的查询集损失← 正确答案
  • B.支持集与查询集来自同一个任务分布← 正确答案
  • C.每一轮外层更新只需要一个任务即可收敛
  • D.支持集用于内循环适应,查询集用于外循环评估← 正确答案

答案:ABD。A 正确,外循环目标是让适应后的参数在查询集上表现好;B 正确,支持集和查询集从同一任务分布中采样(通常就是同一个任务的不同样本);D 正确,这是标准协议。C 错误,虽然一个任务也能更新,但元学习通常需要批量任务才能学到任务间的共性,单个任务会让初始参数被某个任务带偏。