小样本学习(Few-Shot Learning)这个方向,越做越发现难的不是怎么让模型在base类上刷高准确率,而是面对只有三五张图的新类别时怎么不翻车。最近重读CVPR 2020这篇关于注意力权重生成与信息最大化的论文,依然觉得它把两个看似不相关的东西拧到了一起,思路干净,而且复现成本不高,特别适合作为少样本实验的强baseline。这篇笔记我会按自己的理解把方法拆开来讲,重点聊注意力权重生成到底在做什么、信息最大化为什么有效,以及我复现时踩过的几个坑。
先说结论:整篇论文可以浓缩成两件事——用注意力机制从support set里生成分类器权重,而不是简单做个均值原型;再用信息最大化(Information Maximization,IM)去约束模型的预测分布,让输出既自信又不偏向某个类。无论你是刚接触少样本学习,还是已经跑过不少meta-learning方法,这篇笔记应该都能给你一点新东西。
1. 少样本学习的痛点与这篇论文的破题思路
1.1 传统少样本方法的两种范式与各自瓶颈
少样本学习的主流做法大致可以分成两派。一派是度量学习,代表是原型网络(Prototypical Networks)、匹配网络(Matching Networks)这类方法,核心思想是把每个类的K个样本聚合到一个原型向量上,然后用距离度量做分类。另一派是元学习优化,代表是MAML这类方法,核心思想是学习一个好的初始化参数,让模型在新任务上只需要几步梯度更新就能快速适应。
这两派各有各的问题。度量学习的问题在于"聚合"的方式太简单了——通常就是取平均。一旦某类的support样本里有遮挡、光照异常或者标注噪声,一个离群点就能把原型拉偏,这在类内差异大的细粒度数据集上尤其致命。元学习优化的问题则在于训练开销大,MAML要算二阶梯度,跑起来又慢又吃显存,而且对分布偏移比较敏感,新类跟base类差异大的时候,几步更新往往不够用。
所以我一直觉得,少样本学习真正的瓶颈不是"模型不够强",而是"怎么从极少量样本里稳定地提取可用的分类信息"。
1.2 论文的破题思路:权重生成 + 信息最大化
这篇论文走的是第三条路:直接生成分类器权重。思路其实很直觉——既然线性分类器的权重向量可以看作度量学习里的原型,那与其取平均,不如训练一个网络,从support set的特征映射出分类器权重。这样得到的权重不是对样本的机械平均,而是经过学习的、带判别性的。
论文标题里两个关键词也正好对应两个组件:
- 注意力权重生成(Attentive Weights Generation):在生成分类器权重时,使用注意力机制对support样本(以及特征通道)进行加权,不等权看待所有样本。
- 信息最大化(Information Maximization):在生成权重之后,用一个正则化损失约束模型输出,要求每个样本的预测分布尽量尖锐,同时整个batch的平均预测尽量分散到各个类别。
这种组合的好处在于:权重生成解决了"分类器从哪来"的问题,信息最大化解决了"生成之后怎么让分类器在新数据上更可靠"的问题。两者各管一块,而且都不需要额外标注数据,所以迁移到新任务时非常灵活。
2. 方法核心拆解:注意力权重生成到底在做什么
2.1 从线性分类器视角理解权重生成
要理解注意力权重生成,得先建立一个大前提:少样本分类完全可以看作一个线性分类问题。对每个类别c,模型维护一个权重向量w_c,某个样本x的特征z的分类得分就是w_c和z的内积,再加上一个偏置。在少样本场景下,这个权重向量没法通过常规的梯度下降充分训练,因为样本太少,所以需要想办法从support set里"算"出来。
最朴素的办法是原型网络的做法:把类别c的K个support样本特征取平均,得到的就是w_c。这个做法的好处是简单、稳定,坏处是过于平滑,丢掉了样本之间的差异性信息。
这篇论文的注意力权重生成,本质上还是在做"从support特征得到权重向量"这件事,但把简单的平均替换成了可学习的注意力聚合。也就是说:
对类别c的K个support样本,先计算每个样本的注意力分数,再用注意力分数对所有support特征做加权求和,得到该类的分类器权重。
这个注意力分数不是人为设定的,而是由一个小型网络学习得到。它可以同时做到两件事:给质量高的样本更高权重,给噪声样本低权重;以及在特征维度上选择更有判别力的通道。
2.2 注意力权重的计算细节
具体实现上,假设类别c的support特征为 z_1, ..., z_K,每个特征是一个d维向量。注意力网络接收每个特征,输出一个标量分数。为了让分数在类内可比,通常会在类内做一次softmax归一化:
- 样本级注意力分数: a_i = softmax( g(z_i) ),其中g是两个全连接层组成的小网络
- 类别权重: w_c = ∑_{i=1}^{K} a_i · z_i
这个式子的直观理解就是:先用注意力网络对每个support样本打分,然后把所有support特征按照分数加权求和,得到的就是这个类的分类器权重。当所有注意力分数完全相等时,这个式子就退化成原型网络的平均原型,所以原型网络实际上是本文方法的一个特例。
在实际复现时,我建议把g设计得轻量一些——隐藏层维度设成特征维度的一半,输出一个标量,再接一个类内softmax。整个注意力网络参数量只有几千,几乎不会引入过拟合风险。另外,输入注意力网络之前,特征最好做一次L2归一化,我实测下来能够显著提升注意力分数的稳定性。
2.3 为什么不用简单原型,要用注意力加权
从数学上看,简单原型是样本的等权平均,注意力加权是样本的非等权平均。两者的差别只有在support样本质量不均匀时才体现出来。但少样本场景,恰恰就是样本质量最不均匀的时候——每个类只有K个样本,其中任何一个被遮挡、模糊或者标注错误,等权平均都会被显著拉偏。
我举一个例子:5-way 5-shot任务里,某个类的5张support图片里有1张带了强遮挡。原型网络会把遮挡特征和正常特征等权平均,导致原型被噪声污染;注意力网络则可以在训练中学到一种能力,自动把这个遮挡样本的注意力分数压低,让决策更依赖另外4张干净样本。这种"从数据中学习如何信任数据"的能力,是简单原型给不了的。
还有一个好处是,注意力机制带来了可解释性——训练完你可以把每个support样本的注意力分数打印出来,直观地看到模型认为哪些样本重要、哪些样本不可靠。这在调试少样本系统时非常有价值。
3. 信息最大化:让模型"又自信又均衡"
3.1 信息最大化损失的直觉
权重生成解决了分类器权重"怎么来"的问题,但生成出来的权重未必在新数据上表现稳定。原因在于:少量support样本形成的决策边界往往比较粗糙,模型对很多query样本的预测概率是模糊的——几个类别的概率都差不多。这种情况下,直接取argmax很容易出错。
信息最大化要做的事情,就是把这个"软绵绵"的预测分布给"拧紧"。它包含两个目标:
- 每个样本的预测要自信:即预测分布的熵尽量低,不要模棱两可。
- 整个batch的预测要均衡:即平均预测分布要尽量均匀,不要所有样本都倒向同一个类。
这两个目标缺一不可。只要求自信,模型很容易把所有样本都预测到同一个类上,因为这样每个样本的分布都很尖锐;只要求均衡,模型又可能回到每个样本都平均分布的模糊状态。两者一起作用,模型才会"该确定时确定,该分散时分散"。
3.2 损失函数的具体形式
用公式来表达信息最大化损失,假设一个batch里有B个样本,类别数为N,每个样本的预测分布为p_i,那么:
- 置信度项(confidence term):对每个样本的预测分布计算熵,取负号加到损失里,表示希望熵越小越好,数学形式是 -∑_i H(p_i)。
- 多样性项(diversity term):先计算batch的平均预测分布 \bar{p} = (1/B) ∑_i p_i,然后对这个平均分布取熵,加到损失里,表示希望它的熵越大越好,数学形式是 +H(\bar{p})。
两项合起来就是:
L_IM = -∑_i H(p_i) + H(\bar{p})
这里一个容易混淆的点是:第一项是"每个样本熵的负号",第二项是"平均分布熵的正号"。符号千万不能搞反,否则模型会反向工作——每个样本越来越模糊,而整体预测越来越集中到少数类。
在实际实现时,很多代码库会把第一项等价写成用argmax得到的伪标签计算交叉熵,本质是一样的。用伪标签的好处是梯度更稳定,对噪声更鲁棒,我复现时更推荐这种做法。
3.3 为什么信息最大化在少样本场景格外有效
少样本分类器最常见的病态表现就是预测概率太软。支撑集样本少,学到的决策边界置信度低,模型对大部分query样本的预测都处于临界状态。信息最大化作用在模型输出端,直接优化预测分布的形状——让确定的样本彻底确定下来,同时阻止模型把所有样本一股脑划分到同一个类。
更重要的是,这个损失不依赖任何标签,天然适配半监督和transductive场景。在推理阶段,把无标签的query集样本也纳入计算,用L_IM对分类器权重做几轮梯度更新,往往能带来肉眼可见的提升。论文在验证这一点时做得非常充分,transductive设置下的收益明显高于inductive设置,这也从侧面验证了信息最大化确实是在"利用无标签数据"这件事上起到了核心作用。
4. 训练流程与实验观察
4.1 完整的训练循环
整篇论文的训练流程其实非常规整,用一个episode-based循环就可以概括。我梳理成伪代码的形式:
- 从base类的训练数据中随机采样一个N-way K-shot任务,包括support集合和query集合。
- 用特征提取器提取所有样本的特征。
- 对每个support类别,将support特征输入注意力网络,生成该类的分类器权重。
- 用生成的权重对support和query特征计算分类logits和交叉熵损失。
- 计算信息最大化损失。在inductive设置下通常加在query集上,在transductive设置下则对全部样本一起计算。
- 总损失 = 交叉熵损失 + λ × 信息最大化损失,端到端反传更新特征提取器和注意力网络。
测试阶段的流程有所不同。新类的support set喂给冻结的注意力网络,生成新类的分类器权重。如果使用transductive设置,则把无标签query数据也纳入进来,通过迭代优化权重来最大化信息最大化损失,这样生成的决策边界会更贴合当前任务的数据分布。
4.2 实验设置与观测要点
这类论文的标准评估设定是N-way K-shot分类,常用的backbone包括Conv4、ResNet12,数据集包括miniImageNet、tieredImageNet和CUB等。从复现的体验和论文报告的趋势来看,本方法在5-way 1-shot和5-way 5-shot上都具备明显的竞争力,在transductive设定下优势尤其突出。
复现的时候我建议重点关注三点:
- 观察transductive增益是否明显。如果IM的λ设置合理,使用query集迭代优化之后,准确率应当有稳定提升。
- 观察注意力分数是否合理。训练收敛后,打印几个task的attention分数,正常情况下,同类的support样本分数应当相对均匀,个别离群样本分数会被压低。
- 观察训练曲线的稳定性。相比MAML这类二阶方法,本文的训练曲线要平滑很多,收敛速度也快,这也是权重生成方法的固有优势。
4.3 消融实验反映的三个关键结论
消融实验是理解这篇论文贡献最重要的入口。我印象比较深的三个结论是:
- 只保留注意力权重生成,去掉信息最大化,效果明显下降——说明IM不是锦上添花,而是与注意力生成互补的核心组件。
- 只保留信息最大化,把权重生成换成简单的均值原型,效果同样下降——说明注意力聚合的贡献是独立的,不能被IM替代。
- IM中只保留置信度项或只保留多样性项,效果都不如完整版本——说明两个项各有不可替代的作用。
这三组消融放在一起,恰好印证了论文标题的用意:注意力权重生成和信息最大化,是真正意义上"1+1>2"的组合,缺了任何一边都不完整。
5. 复现时容易踩的坑与细节心得
5.1 特征提取器的更新策略
复现这篇论文,第一个容易踩的坑是特征提取器的更新方式。很多新手在meta-training阶段直接把整个backbone放进任务循环里一起训练,结果训练特别不稳定,甚至发散。
实际经验是:先在base类上做一轮充分的预训练,得到一个质量不错的特征提取器,然后再进入episode训练阶段。进入episode训练后,backbone当然要继续更新,但学习率要调得比预训练阶段小得多。我习惯的做法是预训练阶段学习率0.01,episode阶段降到0.001,这样既能微调特征,又不会破坏预训练已经学到的良好表示。
5.2 信息最大化系数的调整
λ这个超参数控制着信息最大化损失在总损失中的占比,是需要认真调的。论文里对λ的取值不算特别敏感,但不同任务的最优λ差别不小。
我的建议是在0.01到0.1之间搜索,搜索步长取对数尺度。如果λ太大,模型会被IM带偏,在base类上的分类精度明显下降;如果λ太小,transductive阶段利用无标签数据的增益就体现不出来。可以每50个episode记录一次验证集精度,选验证精度最高且稳定的λ,而不是追求训练集上的低loss。
5.3 transductive阶段迭代步数的控制
推理阶段用IM对权重做迭代优化时,步数控制是个关键细节。太少,IM还没起作用;太多,分类器会对当前这批无标签数据过拟合,出现验证精度"先涨后跌"的现象。
我实测下来,5到10步是一个比较安全的区间。另外建议在最后一步预测时加一个温度缩放,把logits除以一个小于1的温度系数再取softmax,让输出分布更集中一些,配合IM的方向,最后的argmax会更可靠。
5.4 注意力网络的初始化与正则化
注意力网络虽然小,但初始化依然重要。我踩过的坑是:如果用全零偏置初始化注意力网络,刚开始所有样本的注意力分数几乎相等,模型退化成一个原型网络,训练前期提升非常慢。后来改成在预训练阶段就把注意力网络和特征提取器一起训几个epoch,让注意力有一个合理的初始分布,再进入episode训练,整个收敛速度快了一截。
还有一个正则化细节:在计算注意力分数之前,对support特征做L2归一化非常关键。特征尺度不统一时,注意力网络对尺度更敏感,训练很不稳定。我试过不做归一化,验证集精度会波动好几个点。
6. 我的个人思考与延伸
6.1 为什么"注意力+信息最大化"能打赢单独任何一个
从原理层面来说,这个组合恰好命中了少样本分类器的两个软肋:判别性和确定性。注意力权重生成解决的是"分类权重怎么从少量样本中提取",它让模型学会了主动筛选可靠的support信息;信息最大化解决的是"生成的权重在新数据上如何自我优化",它让模型能在无标签数据上校正自己的决策边界。
这两个机制互补性很强:注意力机制是在输入端做选择,信息最大化是在输出端做约束。输入端选得准,输出端的优化就更有方向;输出端约束得好,注意力网络学到的特征也就更干净。这种"输入端+输出端"的双重设计,比单点改进要稳健很多。
6.2 这套方法能往哪些方向扩展
我在自己的项目里尝试过几个扩展方向,效果都值得记录:
- 把backbone换成轻量网络,比如MobileNet。因为注意力网络本身很小,额外的推理开销几乎可以忽略,所以部署到移动端做少样本分类是可行的。
- 把IM中的多样性项替换成类别间距离约束,在细粒度少样本任务(比如鸟类、车型分类)上的效果更好,因为细粒度数据的类别彼此非常相似,均匀分布的约束不如直接拉开类间距离有效。
- 把注意力权重生成和特征提取器解耦,推理时先在support集上对注意力网络做一次快速适应,再生成权重,能提升对新分布的整体鲁棒性。
6.3 最后说点实操体会
如果让我给一个复现顺序的建议,那就是不要一上来就照搬完整模型。我当时是先在一个简单的prototypical baseline上把IM加进去,立刻看到了transductive设置的提升,然后再把均值原型替换成注意力权重生成,继续涨点。这种"先加正则项、再加结构"的渐近式做法,能帮你清晰地定位每个模块的收益来源,调试起来心里有底得多。
还有一点体会是关于这套方法的适用范围。它对support集样本质量的依赖,比我想象中要低。即使在标注含噪声的数据上,注意力机制也会自动给异常样本降权。这种内在的鲁棒性,让它在真实数据上比很多花哨的少样本方法更实用。这也是我把这篇论文长期留在对比baseline里的原因。