资讯动态

元迁移学习:冻结主干网络只学特征缩放偏移,解决小样本学习过拟合

发布时间:2026/10/14 12:29:37 来源:尧图企业网站定制
论文阅读笔记《Meta-Transfer Learning for Few-Shot Learning》这篇《Meta-Transfer Learning for Few-Shot Learning》是我反复读了三遍才敢说自己基本看懂的一篇工作。标题里叠了两个大词Meta-Learning元学习和Transfer Learning迁移学习乍看像个概念拼盘但核心思路其实很朴素——先用大规模数据训练一个足够好的特征提取器然后在每个小样本任务上只学习一组特征的缩放scale和偏移shift参数。这篇论文解决的是Few-Shot Learning小样本学习里最让人头疼的问题数据太少模型太容易过拟合。它最大的贡献是证明了“冻结主干网络、只学特征变换”这条路走得通而且效果不输那些端到端更新全部参数的方法。无论你是刚接触小样本学习的初学者还是已经在MAML、ProtoNet上踩过坑的复现选手这篇笔记应该都能给你一些新的视角。1. 论文在解决什么问题1.1 小样本学习的核心困境Few-Shot Learning的任务设定是N-way K-shot训练时给你N个类别每个类别K个带标签样本比如5-way 1-shot就意味着5个类、每类只有1张标注图需要在这样的条件下让模型学会区分新类别。这个设定放到实际场景里非常诱人——新品类识别、罕见病影像分类、快速原型验证都受益于此。但它也把传统监督学习的命门直接暴露出来当代深度模型动辄几百万参数想在几十张图上完成训练几乎必然过拟合。早期方法想了很多招比如数据增强、正则化、用额外无标注数据预训练但本质上都是在“样本不够”这个前提上做修补。真正能拉开差距的思路是把模型的“学习能力”本身变成被学习的对象——也就是元学习的理念。模型不再只是在一个数据集上训练而是在大量小的few-shot任务上训练学的是“如何更快适应新任务”的通用策略。1.2 两类主流路线的短板在MTL之前小样本学习主要分成两个流派。第一派是端到端元学习代表是MAML以及它的变体。MAML的思路是学习一个好的模型初始化参数让模型在新任务的几步梯度更新后就能达到好效果。这个方法理论上有魅力但在实践中很难伺候——内层更新涉及整个网络的梯度回传二阶导数计算量巨大而且它对学习率、内循环步数非常敏感稍有不慎就发散。很多复现过MAML的人应该都有体会1-shot还好5-shot收敛就变得很不稳定想要稳定复现论文数字需要调很久。第二派是迁移学习典型做法是在大规模数据集上预训练一个卷积网络然后在小样本任务上做全局微调fine-tune。这个思路简单直接但当新任务的样本量只有个位数时全局微调依然容易过拟合。有些工作退而求其次只微调最后几层或分类头但到底该微调哪几层、哪层保留多少原特征这些问题基本靠经验没有系统答案。MTL这篇论文想解决的就是这样一个尴尬局面元学习太激进迁移学习太粗糙能不能找到一个折中方案既保留预训练特征的质量又具备元学习对任务的适应能力2. MTL方法的核心设计思路2.1 三个阶段的整体流程MTL的整体流程可以拆成三段读论文的时候需要始终记住整个框架里主干网络Backbone参数只有第一阶段被更新之后全程冻结。这个设计决策是全文最关键的。第一阶段是预训练。在一组“基类”数据上训练一个常规分类网络目标就是标准交叉熵分类损失相当于先把一个通用特征提取器训练到位。第二阶段是元训练Meta-training。在这个阶段任务从一个分布中采样每个任务都有自己的支持集和查询集模型要学习的是初始的scale和shift参数让任意新任务在基于支持集做几步更新后查询集上能获得低损失。第三阶段是推理适配Adaptation。给一个新的few-shot任务先用支持集做几步梯度更新得到任务特定的scale和shift再用它处理查询集。有一定元学习基础的人到这里应该发现了这个流程和MAML非常像都是“学初始化然后任务内快速更新”。区别在于更新对象完全不同。MAML更新的是整个网络参数MTL只更新一组逐层的仿射变换系数。这个改动看似微不足道实际效果却非常显著参数空间从百万级降到千级过拟合风险大幅下降训练稳定性也大大提升。2.2 为什么只学scale和shift论文的核心观察到一句话就能讲清楚预训练好的特征提取器已经具备了足够强的表达能力新任务和旧任务之间的差异主要体现在特征分布的偏移上而不需要重写整个特征空间。打个比方预训练网络像一个通用乐器调音师已经知道不同乐器怎么演奏只是不知道每个新乐队喜欢什么样的音高和音量。scale参数控制“音量”——特征每个通道该放大多少shift参数控制“音高”——特征整体偏移多少。两者配合就能把基类上训练出的特征分布调整到适合新任务的状态。这个思路在领域自适应Domain Adaptation里早就被验证过MTL的贡献在于把它嵌入到元学习的框架中用任务级别的梯度元训练来获得scale和shift的初始值而不是手工设计或逐任务单独学习。从这个角度说MTL其实是在回答一个更根本的问题迁移学习时到底什么该迁移、什么该更新它的答案非常明确表达力强的深层卷积特征值得迁移而特征的统计量均值和方差应该被新任务校准。这也解释了为什么论文中的方法能适配不同的网络结构因为它在任何卷积层后面都能插入这样一组参数。3. Meta-Transfer Learning机制详解3.1 预训练阶段打好特征地基预训练阶段看似普通但有几个细节值得注意。论文使用的是标准分类损失在基类数据上训练一个带有全连接分类头的网络。基类数量通常远大于新任务的类别数比如miniImageNet有64个基类而few-shot评测是5-way分类这保证了预训练阶段有充足的监督信号。经验上这个阶段有几个实操要点。首先是数据标准化ImageNet风格数据集的均值和方差一定要做对否则迁移阶段特征分布会偏差很大。其次是预训练epoch要足够长论文默认的训练轮数比普通分类任务要多一些原因在于后续元训练完全依赖预训练特征的稳定性如果特征本身还在颠簸学出来的scale和shift也没有意义。最后是分类头的初始化虽然预训练完这个分类头就被丢弃了但它的训练过程直接决定了backbone最后一层特征的质量不能敷衍。3.2 元训练在小任务上学习怎么初始化到了元训练阶段网络结构会做一个调整把预训练的分类头去掉在backbone的若干层后插入task-specific的scale和shift模块。具体来说论文在网络的多个卷积层后都加了一组参数每组参数的数量等于该层特征图的通道数。前向计算时特征图的每个通道乘以对应的scale值再加上对应的shift值。元训练的过程是双层循环优化。内层循环中采样一个任务把这个任务的支持集喂进网络计算分类损失再用普通梯度下降更新scale和shift参数——注意只更新这些参数backbone完全冻结。此时scale和shift会从初始值出发向该任务方向跑几步。外层循环中用更新后的scale和shift去处理该任务的查询集计算损失再通过这个损失反向传播更新scale和shift的初始值。这个双层更新的套路和MAML如出一辙但有两个重要差异。第一由于只更新少量参数外层梯度计算负担很小不需要MAML那种复杂的二阶近似第二由于参数维度低一小批support样本就能提供足够稳定的梯度这在1-shot场景下尤其关键。我个人理解这就是为什么论文在1-shot上的提升比5-shot更明显——参数空间小了单样本带来的信息损失被最小化了。3.3 少样本适配阶段推理时快速校准到了推理阶段模型面对一个全新的few-shot任务。此时scale和shift的初始值已经固定为元训练学到的值。流程是把新任务的支持集放入网络从初始值出发做几步梯度更新得到一组任务特定的scale和shift然后把查询集样本输入用分类器预测类别。这里有个容易被忽略的分类器问题。新任务的类别数和基类不同原来的全连接分类头不能直接用。论文的做法是在元训练时也用一个类似分类头的结构其权重要么是动态生成的要么基于一个可学习的基准。实际复现时最常见的做法是把分类器权重设置为支持集样本特征的平均值或者直接在支持集特征上训练一个线性分类器。无论哪种核心原则都一样支持集的特征必须通过调好的scale和shift处理过否则分类器和新特征就对不上。整个适配过程只需要几步梯度更新论文实验里通常是10到30步而且不需要更新backbone所以速度很快。我在实际测试中一个5-way 5-shot任务在单张GPU上适配耗时不超过零点几秒比起MAML动辄需要前向和反向若干轮整个网络速度优势非常明显。4. Task Augmentation被低估的细节4.1 任务增强到底做了什么Task Augmentation任务增强并不是这篇论文的首创但它在MTL框架里的作用被很多读者低估了。这个方法的本质很简单不要让任务分布只局限在“N-way K-shot”这种固定组合上而是通过随机改变way数类别数和shot数每类样本数来生成更多样化的训练任务。举个例子如果主要评测目标是5-way 5-shot训练时可以混合采样3-way 5-shot、5-way 1-shot、8-way 10-shot之类的任务。这样做的理论动机是元学习同样存在过拟合问题——如果任务分布太窄模型学到的“适应策略”可能只能应对这一种设置当任务种类足够丰富时学到的scale和shift初始化会更具泛化能力不会过度耦合到某个特定的way和shot组合上。论文里几个消融实验都验证了这一点。去掉TA之后几个benchmark上的准确率统统下降有的数据点甚至掉了将近两三个百分点。这个幅度在few-shot这种“级别竞争”的领域里相当可观。另外由于多个任务共享同一个backbone训练成本并不会随着way数增加而成倍增长只会增加前向计算量这个收益在小样本领域算是性价比很高的改进了。4.2 在复现时怎么理解和运用TA从复现的角度任务增强应该被看作一个标准配置而不是可选项。我见过不少复现者直接照搬论文里的主配置结果发现效果和论文数字差着一截查来查去才发现是没有加任务增强。不过做任务增强时要注意一个坑way或shot数量不能盲目增大到模型难以处理的程度。比如在GPU显存受限的情况下过大的way会让支持集和查询集的前向计算卡住反而拖慢训练。合理的做法是从一个小范围开始比如在满配置的way加2、shot乘以2左右的范围里采样这样能在不显著增加训练时间的前提下获得更广的任务分布。论文中提供的具体增广范围是6-way到10-wayshot数也做了类似扩展实操中可以根据显存和batch大小做调整。5. 实验结论与关键对比5.1 四大基准上的表现提升论文的实验覆盖了当时小样本学习领域最常见的四个基准miniImageNet、tieredImageNet、CIFAR-FS和FC100评测设置统一采用5-way 1-shot和5-way 5-shot。在miniImageNet上MTL在1-shot和5-shot设置下都取得了当时的新最优结果在tieredImageNet这样的更大规模数据集上提升同样明显而在CIFAR-FS和FC100这样的低分辨率数据集上由于类别更接近、特征更容易迁移准确率普遍更高1-shot甚至能接近部分方法5-shot的水平。值得注意的是论文为了证明MTL不是只对特定backbone有效实验里同时用了两种网络结构一种较浅、一种更深的ResNet。结果显示在两种结构上MTL都比各自对应的基线有所提升。这个细节很重要——一个小样本方法如果只能在某个具体网络上生效那它的实用价值就会大打折扣。5.2 与MAML等端到端元学习方法的对比和MAML相比MTL的优势主要体现在三个方面。第一是性能在同样以ResNet为backbone的条件下MTL的准确率明显高于当时的端到端元学习方法。第二是计算效率MAML每次内循环都要更新整个网络对显存和算力要求非常高而MTL因为冻结backbone单次任务迭代的成本要低得多。第三是稳定性MAML在1-shot设置下训练曲线经常波动非常大甚至有时会发散而MTL由于参数空间极小训练曲线相对平滑调参难度也低不少。论文里还和另一种经典方法Reptile做了对比Reptile的设计理念比MAML更简单——只做前向计算用最后的权重作为初始化。但它在复杂数据上的表现不如MTL原因在于它仍然需要更新整个网络参数容易在任务差异大的时候陷入次优。在我看来这种对比凸显了“在哪个空间里做元学习”才是真正决定成败的问题。MTL的选择本质上是用一个低维参数空间换来了更好的泛化。6. 复现与实操经验6.1 任务采样与数据组织复现MTL的第一步是搞定数据组织。传统数据集由一个全连接的数据加载器一次读入但few-shot训练要求的是“按任务采样”。具体来说每个epoch要生成一批任务每个任务先从类别集合里随机采样N个类别注意不要和查询集类别重合再从这N个类别中分别采样K个支持集样本和若干查询集样本。我习惯把这部分封装成一个TaskSampler返回每个任务的数据索引列表而不是直接返回张量这样可以在数据处理流程里更灵活地做增广。miniImageNet的图片大小是84x84和ImageNet原图224x224不一样直接用ImageNet预训练权重会出问题。论文里是直接在miniImageNet上从零预训练的并没有直接加载ImageNet预训练模型。复现时要特别注意这一点不要偷懒否则预训练的特征分布就跟后续元训练对不上。6.2 两个关键超参数的调参心得MTL的超参数不算多但有两个非常关键。一个是内循环梯度更新的步长。论文里用了一个相对较小的学习率内循环步数在10到30之间。我在复现中发现步长太大会让scale和shift在前几步就冲到太远查询集损失反而升高步长太小则适配不足尤其在1-shot情况下适配方差会变大。建议的做法是先用5-shot任务做粗调找到一个稳定的区间再回过去调1-shot。第二个关键是scale参数的初始值。论文默认把scale初始化成1shift初始化成0这本身就是一种合理的先验——初始状态下不做任何变换。但如果预训练特征已经很好了把scale初始化成一个略小的值比如0.9有时能带来微小的提升。这个现象我猜测是因为小值约束了初始梯度振幅让任务适配更稳。不过这只是经验之谈建议在固定超参搜索框架下谨慎尝试。6.3 踩坑记录我在复现过程中踩过两个印象深刻的坑。第一个是批次归一化BatchNorm的问题。如果backbone里带了BatchNorm预训练阶段使用的是数据集整体统计量但元训练时每次只喂一个任务任务内样本量又少BatchNorm的统计量会变得非常不稳定。论文里其实没有特别强调这一点但实际复现时要么把BatchNorm的running stats冻结要么换成LayerNorm或GroupNorm否则准确率会波动得很厉害。第二个坑是查询集的标签过滤。有些任务采样的实现会把支持集和查询集混在一起打包但却忘了过滤查询集中不属于当前任务的样本。这样一来每个任务的有效信息被稀释训练效率直线下降。排查方法很直观在每次采样后打印一下任务里类别索引的唯一值个数确保它等于设定的way数。7. 个人评价价值在哪里局限在哪里这篇论文最值得学习的地方是它的“减法”思维。在大家都在想办法把元学习做得越来越复杂的时候它选择缩小参数更新范围用一个非常克制的设计获得了好效果。这种思路对后来的工作影响很深现在很多小样本研究都会默认区分“主干特征”和“任务适配层”把元学习的作用范围限定在后者这种范式转变的源头之一就是MTL。不过它当然也有局限。首先是它对预训练数据质量的依赖——如果基类数据和目标任务的领域差异很大预训练特征迁移的意义就会打折扣。论文里的实验还都停留在图像分类范畴检测、分割等结构化输出的任务适配效果如何论文并没有覆盖。另外scale和shift作为线性变换表达能力终归有限对于那些需要非线性特征重组才能解决的任务这套方法会碰壁。我自己在实际使用中还有一个体会如果在固定的benchmark上MTL想要再往上冲一个点需要花很多功夫在任务增强的分布设计和内循环步数上精调边际收益比较明显递减。但如果从零开始做一个新领域的few-shot系统MTL作为基线非常合适——它稳定、快速、容易扩展比起那些依赖大量工程技巧才能跑起来的方法它给你省下的时间和精力足以让你把注意力放在真正重要的数据与任务设计上。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑