☰
注意力权重生成与信息最大化:少样本学习的新解法
2026/10/15 7:07:31 网站建设 项目流程

最近大半年我一直在读少样本学习(Few Shot Learning)的论文,越读越觉得这个领域已经到了拼细节的阶段。像CVPR 2020这篇《Attentive Weights Generation for Few Shot Learning via Information Maximization》——“注意力权重生成”加“信息最大化”,如果只看题目会觉得是两个独立技术点的拼接,读完才发现作者是把它们拧成一股绳:前一个解决“权重从哪里来”,后一个解决“权重怎么生成才靠谱”。这篇论文阅读笔记,我会按照自己读论文的习惯,先说问题、再拆方法、然后看实验,最后写一些复现过程中很可能踩到的细节。适合正在准备少样本学习方向的同学参考,尤其是那些想从度量学习往“生成分类器权重”方向跨的人。

1. 为什么要在少样本学习里“生成分类器权重”

1.1 三条技术路线谁在解决什么问题

少样本学习的核心矛盾很直白:训练时你有成千上万的带标注样本,测试时一个类别只给你一两张图,模型还得能分出新类。过去几年大家基本是沿着三条路线在打。

第一条是度量学习。思路是学一个嵌入空间,让同类靠近、异类远离,分类时直接用距离判断。最典型的代表就是原型网络(Prototypical Network)和匹配网络(Matching Network)。这类方法的好处是简单、稳定,训练基本不愁收敛;坏处是分类器本质上是“最近邻”式的,特征比较粗糙,遇到细粒度分类或类间差异很小的场景很容易翻车。因为最后的决策函数被限制在了“距离”这个度量上,你很难为某个新类别定制更复杂的分类边界。

第二条是优化驱动的元学习,最经典的是MAML这类方法。它的目标不是学一个分类器,而是学一组“初始化参数”,让模型在新任务上微调几步就能收敛。理论上这很符合“学会学习”的直觉,实际上问题是训练内部要反复展开梯度计算,计算开销大,而且二阶导的处理对工程实现要求不低。如果只是做分类,收益容易被实现成本吃掉。

第三条就是权重生成路线。核心想法是:我不去设计距离函数,也不去调初始化,而是直接训练一个小网络,输入新类别的支持集特征,输出一个完整可用的分类器权重。推理阶段就是标准的线性分类层加softmax,跟普通分类网络完全一致。这个想法之所以有吸引力,是因为它把“少样本分类”变成了“权重预测问题”,一旦生成器训练好,新类别的分类器就是一次前向传播的事。

这篇CVPR 2020论文站在第三条路线上,但它不甘心只做一个简单的映射器,而是往里面加入了注意力机制和信息最大化约束。这让我当时读完挺兴奋的,因为它不是又换一个backbone然后刷个点,而是在“生成权重”这个环节本身做了文章。

1.2 权重生成路线看起来很美,但有一个隐患

如果你第一次接触权重生成,可能会觉得这个问题挺简单的:支持集每类有K张图,把特征平均一下,过一个小网络,得到每类对应的分类器权重,不就完了吗?

实际操作中你会发现事情没那么顺利。最大的隐患是:生成器是在基类上训练的,而推理时要面对的是全新类别。基类样本充足,哪怕生成器瞎蒙也能靠数据量的惯性稳住;可新类别只有一两张图,生成器稍微有一点“惯性”,输出权重就会偏差。换句话说,生成器可能根本没有学到“生成好权重”的本质规律,只是在记忆“基类权重长什么样”。

更麻烦的是少样本本身带来的噪声。一个任务的某类支持集里如果混入了一张模糊、遮挡、或者姿态特别诡异的图,类别的原型特征会被这张图带偏。这时候如果生成器只是拿平均特征做文章,注意力机制就有了用武之地:它需要判断哪些支持样本更可信、哪些特征维度更值得保留,而不是一视同仁地平均。

还有一个容易被忽略的细节:生成器训练时的监督信号只有分类交叉熵。交叉熵只会让模型“在基类上分对”,并不会告诉模型“在新类上也要保持类别可分”。这正好给信息最大化留了位置——它是一种不依赖标签、只依赖预测分布形态的正则,相当于在分类损失之外,额外给生成器立了一条规矩:你生成出来的权重,不能偏向某一个类,也不能让所有查询样本都变得含糊不清。

1.3 这篇论文把“信息最大化”当作判质量的标尺

我读这篇论文之前一直有个疑问:生成出来的权重是好是坏,谁说了算?最朴素的答案是用验证集上的分类精度来判,但这是一种事后评价,没法直接变成训练时的损失函数指导生成器更新。

这篇论文的一个聪明之处在于:它把“高质量权重”这个模糊概念,转化成了信息论里的互信息最大化问题。互信息的直觉并不复杂——如果模型对查询集样本的预测和样本本身有很强的关联,说明特征和权重之间的匹配是有效的;如果预测只是均匀瞎猜,那权重就是一堆没有信息量的数字。

所以作者给出的方案是:在训练生成器的时候,除了交叉熵,再加一个信息最大化损失,让模型对查询集的预测既要有信心、又要有多样性。这两个要求听起来矛盾,实际上正好从两个方向夹逼出健康预测分布:每个样本都要敢做决定,但整体上不能把所有样本归到同一个类。这样生成的权重就不会把决策边界压到某一边。

2. 方法拆解:注意力权重生成加信息最大化

2.1 整体框架:支持集特征如何变成分类器权重

这篇论文的框架我把它拆成四步,读起来会清晰很多。

第一步是特征提取。输入是一个少样本任务,包含支持集和查询集。它们都先经过一个共享的backbone,把图像映射成特征向量。这里要注意,backbone是在基类数据上预训练过的,在少样本任务训练时继续和生成器联合调优,而不是冻结。

第二步是特征聚合。对每个类别,它的支持集有K个样本,K通常只有1到5。单纯把这K个特征取平均作为类别原型是祖传做法,但论文不是这么干的。它会对支持集特征做一次注意力加权处理,让模型自己决定每个样本对类别描述的贡献有多大。

第三步是权重生成。聚合好的类别特征会进入一个权重生成网络,输出对应类别的分类器权重。这个网络本身不需要太复杂,但输入的特征表达要够好,否则生成的权重上限不高。

第四步是分类决策。查询集样本提取特征后,直接和新生成的各类别权重做内积,过softmax得到每个类的概率。

整个流程跑下来,新类别的分类器完全是“现场生成”的。这在部署时是一个非常友好的特性:测试阶段来了一个新任务,你不需要运行梯度下降,不需要微调骨干网络,只要一次前向传播就能得到分类头。

2.2 注意力在哪里起作用

论文标题里“Attentive”这个词不是装饰。我理解它包含两层注意力,分别在特征聚合和权重生成阶段起作用。

第一层是支持集内部的自我参考。假设当前任务是5-way 1-shot,每个类只有一张图,这时候没有“多张图取平均”的操作,但如果有5-shot,类别内部的不同样本之间会有质量差异。注意力机制会计算这些样本两两之间的相似度,自动给更重要、更典型的样本分配更高权重,让被遮挡或偏视角的样本不至于拖累整体特征。这一点在细粒度分类里非常重要,因为鸟类、车型这类数据,姿态和角度对特征影响极大。

第二层是类别之间的相互参考。生成某一个类的权重时,模型不是只看这个类的特征,而是要考虑它和其他类的关系。道理也很简单:如果几个类长得特别像,那么生成器在生成这几个类的分类器权重时,需要主动让它们的权重方向更“分得开”;如果各类本身差异很大,则不需要过度用力。交叉注意力就是用来捕捉这种“类间关系”的。

我记得第一次看这个设计时以为会很重,实际读下来发现它只是在特征进入权重生成器前做了几次注意力变换,没有改变backbone,也没有使用那种特别重的自注意力编码器,计算量是可控的。

2.3 信息最大化损失的三层逻辑

信息最大化损失是这篇论文的方法核心。它并不是凭空发明的,而是把互信息最大化这个经典目标搬到了少样本权重生成的语境里。

互信息写成熵的形式是 I(X;Y)=H(Y)−H(Y|X)。最大化互信息,等价于让边缘熵H(Y)尽量大,同时让条件熵H(Y|X)尽量小。翻译成人话就是:模型对每个输入的预测要确定,但整体上各类别的预测频率要均衡。

仔细想想就能感受到这个约束的合理之处。如果只有H(Y|X)最小化,也就是所谓的熵最小化,模型会倾向于把所有样本都高置信度地判给同一个类——因为这样条件熵也很低,但预测分布完全坍缩。如果只有H(Y)最大化,模型可能会让每个类都分到差不多的样本数,但对单个样本却没有把握,甚至暗示预测概率均匀分配也能让边缘熵很大。两者必须配合使用,才算真正在最大化互信息。

论文在权重生成这个环节加入这个损失,相当于给生成器提出了额外要求:生成出来的权重不仅要让基类分类正确,还要让模型对查询集的预测分布保持“确定但不偏科”。这样一来,生成器就不能偷懒地记住某个基类特有模式,而是必须生成在新类上同样能产生良好预测分布的权重。

2.4 一个生活化类比

我第一次向朋友解释这个思想时,用了转学生认人的例子。一个学生刚转到一个新班级,手里只握着几个同学的照片,现在要认全班同学。如果他对每张照片都犹豫不决、说不出名字,那说明他手里照片的信息没利用起来;如果他把所有人都叫“小明”,虽然每次都很肯定,但显然也没学会辨认。正确的状态是:每张照片他都能明确说出一个名字,但同时不会把所有人认成同一个人。

信息最大化损失就是这个转学生调整学习状态的“老师”。熵最小化不断提醒他“你要敢下判断”,边缘熵最大化则提醒他“你不能只喊一个人的名字”。少样本生成器的训练,本质上就是让模型在种类极少、样本极少的超低信息环境下,仍然保持这两条准则。

3. 实验验证:提升到底来自哪里

3.1 少样本评估协议的严格之处

在聊实验结果之前,必须先把评估协议讲清楚,不然很多数字的意义会失真。少样本分类通常采用“基类训练,新类测试”的划分:训练阶段,模型只在基类的任务上学习,基类和新类不重叠;测试阶段,从新类里随机抽取N-way K-shot的任务评估精度。

这篇论文的实验基本按照5-way 1-shot和5-way 5-shot两种设置来做,也就是任务里包含5个类别,每个类别分别给1张或5张支持图。数据集方面,我记得它重点选择了偏细粒度的鸟类和汽车类型数据,也覆盖了通用物体的小型基准。选择细粒度数据是挺有讲究的,因为这类任务对“注意力”和“生成权重”的考验更明显——类间差异极小,平均池化类原型根本不够用。

我刻意不去背诵某个具体的精度数字,因为表格细节建议直接看原文,但结论趋势我记得比较清楚:它在不少设置下都能超过简单的原型网络基线,而且在1-shot设置上的领先幅度往往比5-shot更大。这个趋势是符合直觉的:样本越少,信息最大化提供的正则约束越有价值。

3.2 和三路模型的对比说明了什么

论文的对比对象覆盖了我们开头说的三条路线。

对比度量学习时,它的优势体现在分类边界的灵活性上。原型网络本质上是拿类均值和距离函数做分类,而权重生成网络输出的是真正的线性分类器权重,可以理解为它比“距离度量”多了一个可学习的映射,权重每个维度的尺度、方向都由生成器自行决定,不再被余弦距离或欧氏距离的框架锁死。

对比优化驱动的元学习时,它的优势体现在效率和稳定性上。MAML类方法需要在测试任务上展开梯度更新,而权重生成是直接推理,速度上的优势是天然的。更重要的是,权重生成只需要训练一次生成器,就能覆盖任意数量的新类,不需要为每个新任务重新跑优化过程。

对比同属权重生成路线的早期方法时,它的核心区别就是信息最大化和注意力两点。这两点让生成器不再只是把支持集平均特征“搬”到权重空间,而是让生成过程受到更明确的分布约束。

3.3 消融实验里的信息量

论文里的消融实验大概是这个领域最容易看穿作者思路的部分。我自己读后的感觉是,它主要回答了三个问题。

第一个问题是注意力到底有没有用。如果去掉注意力加权,把支持集特征改成直接平均,生成器的输入就少了对样本质量的感知,整体精度会掉一截。这说明在5-shot这种样本量下,支持集内部并不总是“越多越好”,模型需要学会挑着用。

第二个问题是信息最大化到底重不重要。如果只用普通分类损失训练生成器,1-shot设置下特别容易出现所有查询样本都偏向某一个类的情况,这正好对应我们前面说的边缘熵坍缩问题。加入信息最大化之后,预测分布的均衡性明显改善。

第三个问题是两个组件叠加是不是更好。答案基本是肯定的,这也解释了为什么论文要把这两个关键词同时放进标题里,而不是只做其中一项。

4. 论文的边界:缺少什么、后续能做什么

4.1 我最看重的三个点

这篇论文在我心里排位比较高,有三个原因。

第一,它对“权重生成”这件事的思考没有停留在工程层面。很多工作会直接训练一个映射器完事,它却多问了一步:什么样的生成结果才算是好的?然后从信息论里找了一个有理论基础的回答——互信息最大化。这种“先定义好,再优化好”的思路,是很多数据驱动论文缺少的。

第二,它的注意力设计非常克制。注意力在少样本里太容易变成炫技工具了,动不动就上大Transformer,训练成本翻几倍。它这里只是把注意力用在支持集聚合和类别间关系建模两个局部环节上,不改变整体backbone和推理流程,实用性强很多。

第三,它的损失函数有很强的可移植性。信息最大化并不是只能用于权重生成,后来很多做半监督少样本学习、自监督预训练、甚至领域自适应方向的工作都借鉴了类似思路。读一篇论文如果能带出一个“可迁移的损失设计思维”,比单品刷分有价值。

4.2 三个不容忽略的局限

当然,这篇论文也不是没有可以挑剔的地方。

第一个局限是它对超参数比较敏感。信息最大化损失里,边缘熵和条件熵这两个目标之间需要一个平衡系数。这个系数调大了,模型会偏保守,所有预测都变得“均匀”但缺乏区分度;系数调小了,熵最小化的作用又被削弱。我在自己实验中体会过这种痛苦,它不是那种给个经验值就一路畅通的量,换了backbone或者任务难度,可能都得重新扫。

第二个局限是它没有解决支持集本身被采样偏的问题。注意力能做的只是在一组给定的支持集里找相对重要的样本,如果整个类别的样本恰好都是同一姿态,或者全是模糊图,注意力再强也巧妇难为无米之炊。这也是少样本学习的通病,不怪这篇论文,但读者要认清边界。

第三个局限是它主要在分类任务上验证。少样本学习还包括检测、分割、目标重识别等更复杂的输出空间任务,这套“权重生成+信息最大化”的思想要迁移过去,需要重新设计生成目标和损失形态,不是直接拿去用就行。

4.3 对后续工作的启发

从这篇论文往后看,我认为它给后续研究者留下了一个很清晰的线索:分类器权重不需要手工设计,也不需要用梯度下降去拟合,它可以被一个受到信息论约束的生成器直接产生。后来的不少少样本工作开始采用更灵活的注意力机制和Transformer结构来做权重生成,其实都能追溯到这个思路上来。

如果你要沿着这个方向做延伸,我建议重点考虑两个问题。一是如何让生成器对“支持集质量较差”的任务更鲁棒,这可能要把退化样本检测做到注意力机制内部。二是如何让信息最大化从分类任务走向更通用的表征任务,比如让生成权重的同时,让backbone学到的特征本身也具有更好的互信息性质。两个方向都有空间,也都有挑战。

5. 复现或自研时的几个实操注意点

5.1 先搭基线再上注意力

如果你看了这篇笔记之后想自己复现或者做改进,我最想给的一条建议是:不要一上来就把注意力、信息最大化、权重生成全堆在一起。先把最朴素的“原型网络”搭出来,跑通数据流程,确认基线没有问题,然后一步步加组件。

我见过不少同学一上来就追求复现论文的所有细节,结果在注意力模块的维度对齐问题上卡了三周,最后发现还说不清提升来自哪里。正确节奏应该是:第一步,用统一的backbone跑通ProtoNet;第二步,把“类别原型到分类器权重”的生成器加上;第三步,再加信息最大化损失;第四步,再加注意力。每一步都在验证集上记录变化,这样哪一步加了分、哪一步拉了垮都一清二楚。

5.2 信息最大化损失的平衡系数怎么调

前面我提过这个损失对平衡系数敏感,这里展开说一下实操中的调法。

初始化时把平衡系数设成一个较小值,比如0.1这个量级,然后观察训练过程中两个熵指标的变化曲线。你需要关注的是:训练后期,平均每个查询样本的预测熵是不是降得够低,同时整体预测的类别分布是不是还算均衡。如果条件熵降了但边缘熵也在跟着降,说明平衡系数太小,模型倾向坍缩;如果两边都下不去,说明平衡系数太大,梯度方向被正则项压过了分类损失。

我个人的习惯是先在少量验证任务上做一个系数网格搜索,候选值按照0.05、0.1、0.2、0.5这样指数级取,先找数量级,再做精细化调整。这比盲猜一个值然后训练十几个小时高效得多。

5.3 训练任务采样与backbone更新的策略

还有一个容易踩的坑是任务采样的设计。少样本训练时每个task的类别数不能低于目标测试的N-way,这是常识,但很多人会忘记让每个task里类别的支持集样本数量保持均衡。如果某个task里某个类有4张图、另一个类只有2张图,注意力机制会学到“用样本数量判断重要性”,而不是“用内容质量判断重要性”,这会导致测试时遇到均衡的task时表现不稳。

backbone是否参与联合更新也需要想清楚。预训练好的backbone在基类上已经有很强的特征表达,如果一开始就让生成器和backbone一起大规模更新,backbone很容易遗忘预训练知识。常见做法是先冻结backbone训练生成器一段时间,等生成器稳定了再解冻backbone做低学习率微调。这个策略虽然不是这篇论文明确写的,但在类似架构里是相当通用的实操经验。

我在复现时还发现一个小技巧:信息最大化损失最好只在有查询集的任务上计算,因为查询集的预测分布在训练早期波动很大,如果强行在支持集上也算这个损失,会引入不少噪声。让查询集这个更“新鲜”的数据子集去提供正则信号,训练反而更稳定。

最后再补一句个人体会:论文阅读笔记不是把公式抄一遍就结束的,真正值钱的是搞清楚作者为什么设计这一步、这一步在什么条件下失效。这篇论文给了我一个很有用的视角——在少样本这种信息稀缺的场景里,约束条件往往比网络结构更能决定上限。如果你也在研究少样本学习,建议把“信息最大化”这类不依赖标签的约束多往自己任务里套一套,收获可能比换一个更强的骨干网络大得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询