打开网易新闻 查看精彩图片

有一台推理专用芯片,它只会往前算,不会往回传梯度。你的模型部署在这块芯片上,工厂测出来的图像和训练时长得不太一样,光照变了,材质变了,颜色也偏了。你想让模型适应一下这个新环境,但你打不开反向传播的开关。

这不是一个假设场景。

很多实际部署环境就是这样:推理加速芯片本身不支持反向计算,第三方模型只给你一个前向接口,内存和延迟预算根本放不下优化器状态。测试时适应领域这几年出了不少厉害的方法,Tent、EATA、CoTTA、SAR,这些方法的共同前提是模型参数可以在推理时被更新。可一旦这个前提不成立,这些方法就全都用不上了。

更麻烦的是,即便你的硬件支持反向传播,还有一个隐藏的坑。Tent和EATA这类方法依赖BatchNorm层的可调参数来完成适应,但现在很多主流架构,比如ConvNeXt、ViT、DeiT、Swin Transformer,用的是LayerNorm而不是BatchNorm。

BatchNorm和LayerNorm*:两种神经网络里常见的归一化方式,前者对一个批次内的样本做统计归一化,依赖批次大小;后者对单个样本内部的特征做归一化,不依赖批次。

这意味着,如果你直接把Tent或EATA套到ConvNeXt-T、ViT-B/16这些LayerNorm架构上,它们能调整的参数集合是空的,模型的预测会原封不动地退化成没有做任何适应的原始模型。论文的作者们发现,很多论文在报告"跨架构"的适应效果时,其实悄悄把这种"实际上什么都没做"的情况和真正生效的情况混在一起平均,数字好看,但掩盖了方法本身在特定架构上已经失效的事实。

这篇论文提出了CASTER,一个完全不需要梯度、不需要反向传播、也不需要保存原始训练数据特征库的适应方法。它的核心思路简单到有点朴素:把训练时学到的类别统计特征,通过一个从当前测试批次估计出来的仿射变换,搬运到新环境里去。

CASTER是怎么工作的

先说清楚一个基本设定。模型的特征提取器是完全冻结的,也就是说,图片进去,特征出来,这个过程不会因为适应而改变。CASTER要做的所有事情,都发生在提取出来的特征空间里,而不是网络参数里。

具体来说,CASTER先用有标签的原始训练数据构建一个判别性子空间。这个子空间是通过类间散度矩阵和类内散度矩阵的广义特征向量算出来的,维度上限是类别数减一。

判别性子空间*:一种降维后的特征空间,专门保留最有助于区分不同类别的方向,丢弃对分类没帮助的冗余信息。

在这个子空间里,CASTER为每个类别只存三样东西:投影后的均值、协方差矩阵、还有类别先验概率。注意,它存的是统计量,不是原始样本。这一点很重要,因为像k近邻(k-NN)这类方法,要做预测就得把所有训练样本的特征全部背在身上,样本越多,占用的内存越大。CASTER的存储量只跟类别数量和子空间维度有关,跟训练集有多少张图片完全无关。

到了测试阶段,面对一个新的数据批次,CASTER会计算这批数据的均值和协方差,然后用这两个统计量和原始训练数据的对应统计量,算出一个仿射变换,包括一个矩阵和一个偏移向量。这个变换的意思是:如果新环境的数据分布相对于训练时的分布发生了某种整体的缩放和平移,那么把训练时每个类别的统计分布也做同样的缩放和平移,理论上应该能让它重新匹配上新环境。

这里有个技术细节值得说一下。当批次样本数量不够大的时候,直接用完整的协方差矩阵做变换会不稳定,因为矩阵里的自由度太多,样本撑不起来。CASTER设了一个阈值,样本数够多就用完整矩阵,样本数不够就退化成只用对角线上的方差,牺牲一点精细度换取稳定性。

想象你要给一件衣服估算尺码,你手头没有这个人的具体量体数据,只有几个粗略的参照点:身高、体重。如果这几个参照点足够多,你可以精细地估算肩宽、袖长、腰围各是多少;但如果参照点很少,你贸然去估算每一个细节尺寸,反而容易算错,不如退一步只估算最基本的几个大类尺寸,比如"整体偏大还是偏小"。样本不够时用对角矩阵代替完整矩阵,就是这个道理:不是不想要精细的估计,而是数据量撑不起精细估计时,退到粗糙但可靠的估计反而更安全。

变换算出来之后,原始的类别分布就被搬运到了新环境里,搬运后的类别高斯分布会被用来做一个判别式分类,谁的概率密度高,样本就归为哪一类。整个过程没有一次梯度计算,没有一次参数更新。

这套方法在四个骨干网络(ViT-B/16、ResNet-50、DeiT-B、Swin-T)和七个数据集上和k-NN对比,用的是完全相同的冻结特征。结果是28个骨干网络加数据集的组合里,CASTER在27个组合里赢了k-NN,唯一打平的是ViT-B/16在CIFAR-10上,差距不到0.04个百分点。而且CASTER占用的存储空间,中位数只有k-NN的十八分之一。在Flowers-102这个类别多、每类样本少的数据集上,CASTER领先k-NN能达到18到22个百分点。

k-NN*:k近邻算法,预测时找出训练集中和待预测样本最相似的k个邻居,通过邻居的类别投票决定预测结果,需要保留全部训练样本才能工作。

这个结果本身已经说明,把统计量搬运过去,比死记硬背每一个训练样本更有效,也更省地方。

但故事没有到此为止。仿射变换这套逻辑,建立在一个假设上:整个批次的分布偏移可以用一个所有类别共享的变换来描述。这个假设在什么情况下会崩掉?

当搬运失效的时候:一个安全阀

在ImageNet-C这个测试集上,CASTER遇到了麻烦。这个数据集有1000个类别,但每个测试批次只有64张图片。你算一下,平均每个类别在一个批次里分不到零点一张图片,绝大多数类别在这个批次里根本没有出现过。

这时候如果强行估计"这批数据的整体分布长什么样",估计出来的东西是不可靠的,因为你手里的样本量根本不足以刻画1000个类别共同构成的分布形态。论文里的数据很直接:在这种情况下,不加区分地做仿射搬运,会让准确率比什么都不做的原始模型倒退21.2个百分点。这不是小打小闹的损失,是一次实打实的方法失效。

问题不在于冻结的特征本身没用,而在于批次里的证据量支撑不起搬运所需要的类别几何结构。这就像你根据早高峰地铁站里随机抽到的64个人的穿衣风格,去猜测这座城市今年冬天1000种不同职业人群的整体着装偏好。抽样太稀疏,你猜出来的东西不是无害的噪音,而是会系统性地带偏方向,越用越错。如果不设置任何门槛就直接把这个猜测应用到所有人身上,代价就是全盘出错。

于是CASTER引入了一个可迁移性证书,用来判断当前这个批次是否值得信任这次搬运。

可迁移性证书*:一种在做出适应决策之前的自检机制,通过检查搬运后的类别中心是否合理,来判断这次搬运是否安全,如果不安全就放弃搬运,退回原始模型。

具体做法是,先把搬运后置信度较高的样本挑出来,按照它们被预测的类别分组,形成一些"伪类别"。然后把这些样本反向变换回原始的特征空间,算出每个伪类别的中心点和原始类别真实中心点之间的偏差,叫做残差。再拿这个残差,除以原始训练数据里最难区分的两个类别之间的最小间隔,这个比值就是证书分数。分数越低,说明搬运后的几何结构和原本训练时学到的几何结构越吻合,这次搬运越值得信任。

这里有个容易被忽略但很关键的设计。分子的残差和分母的间隔,必须用同一种度量方式计算,也就是马氏距离,而不能一个用欧氏距离一个用马氏距离。为什么较真到这个地步?因为如果两边用的度量方式不一致,这个比值会随着特征坐标的任意缩放而改变,等于这个证书本身是不稳定的,你换一种特征归一化方式,同一次搬运的证书分数可能就从"安全"变成"危险"。论文里提到,在Flowers-102数据集上,如果用了不一致的度量方式,证书数值会在明明搬运已经出错的情况下依然显示"安全",这个门槛就形同虚设了。

那这个证书到底管不管用?论文里汇总了307个测试场景,横跨CIFAR-10-C、CIFAR-100-C、ImageNet-C等多个数据集。结果显示:所有损失超过10个百分点的灾难性搬运,证书分数全部高于3.9。这是一个相当干净的分界线,意味着这个证书确实能揪出那些几何上站不住脚的搬运。

不过论文也很坦诚地承认,这条线不是完美的。安全区和危险区之间有重叠,至少有一个明明没有造成伤害的批次,证书分数也高达8.9。作者们还专门提到一个真实发生过的乌龙:早期分析用的测试数据流不小心按类别排好了序,导致很多批次里97%到100%的样本都属于同一个类别,这本身就是一种数据管道错误,重新打乱成真正随机的顺序之后,这些异常点才消失。这个细节挺值得玩味的,说明就算是做安全机制研究,研究者自己也会踩到"数据没打乱"这种最基础的坑。

设定这个安全阀之后,效果怎么样?论文里说,不加门槛的无差别搬运,平均会让准确率比原始模型倒退3.35个百分点。加上门槛之后,变成正向提升1.69个百分点。而且这个门槛的具体取值并不敏感,阈值在1.0到3.9这个大约四倍的区间内浮动,最终效果都稳定在距离最优结果0.3个百分点以内。这说明这不是一个需要精心调参才能生效的脆弱开关,而是一个有相当容错空间的实用机制。

但这个证书有一个明确的边界,论文用相当大的篇幅讲清楚了这件事:它只能判断"这次搬运是不是灾难性的",不能判断"这次搬运能带来多大好处"。在没有出现灾难的正常范围内,证书分数和搬运带来的收益反而是正相关的,分布偏移越大,证书分数越高,同时原始模型退化得也越厉害,搬运能挽回的损失也越多。所以如果你想用这个证书去挑选"最值得搬运"的批次,方向反而是反的。作者们很直接地把这个局限写了出来,而不是藏起来假装证书是万能的。

证书能不能用到别的方法上

这是全文我觉得最有意思的一个实验。既然CASTER的证书能有效识别自己方法里的坏情况,那能不能拿这套逻辑去监督别的适应方法,比如Tent?

答案是不能,而且失败得很彻底。

论文在57个CIFAR-10-C的测试场景里做了对比。Tent不加任何门槛,能带来15.35个百分点的提升。把CASTER的证书当门槛套在Tent前面,结果只有4.3%的更新被放行,最终只保留了Tent原本收益的0.6%。换句话说,这个证书几乎把Tent的效果全部掐灭了,却几乎没有拦住任何真正有害的更新。作者还试了一个更宽松的门槛,用和原始模型预测是否一致来判断,接受率提高到46.3%,但依然只保留了32.3%的收益。

更能说明问题的是相关性分析。在批次层面,证书的接受率和Tent不加门槛时的实际收益之间,相关系数是负的0.86,意思是Tent效果越好的批次,反而越容易被这个证书拦下来。而对CASTER自己的搬运机制,这个相关系数是正的0.72,方向完全相反。

这背后的原因其实不难理解。CASTER的证书是拿冻结的、更新之前的特征空间算出来的。而Tent这类方法的本质,就是要去改变归一化层的参数,从而改变特征空间本身。你拿一把量身定制的尺子,量的是衣服改动之前的样子,却指望用它来判断改动之后合不合身,这中间的逻辑链条是断掉的。这不是调参数能解决的小毛病,是这套证书的设计前提和Tent的工作方式根本不兼容。

如果你只用一个固定的、事先算好的标准,去判断一件事情改变之后好不好,而这件事情本身正在被这个标准所评判的动作不断改变,那这个标准从一开始就没有资格去做这个判断。这就像拿孩子小学一年级时的体检报告,去判断他上高中之后要不要转专业,报告本身没有错,只是它测量的是很久以前那个人,而现在这个人已经被十年的成长彻底改变了。用旧的度量去裁决新的状态,得出的结论天然是错位的。

这个发现的价值在于,它提醒所有做类似"安全门槛"研究的人:一个针对某种适应机制设计并验证过的证书,不能不做任何验证就搬到另一种机制上使用,哪怕看起来它们都属于"测试时适应"这个大类。

性能和资源开销

顺带说一下实际跑起来的成本。在同一块GPU上单独测试CIFAR-10-C的一个场景,CASTER每秒能处理1076张图片,而Tent是667张,EATA是649张,SAR只有386张。CASTER比Tent快1.6倍,比SAR快2.8倍。内存占用上,CASTER峰值是1249MiB,只有梯度类方法5510MiB的22.7%。这些数字背后的意义很直接:不需要反向传播,意味着不需要保存计算图,不需要优化器状态,省下来的不只是时间,还有实打实的显存空间。

在正常的BatchNorm架构上,比如ResNet系列,Tent、EATA这些梯度方法依然表现得很强,CASTER并没有说自己能全面碾压它们,在CIFAR-10-C这个数据集上EATA甚至略微领先。但在LayerNorm架构上,情况完全不同。四个LayerNorm骨干网络的汇总结果里,CASTER的平均准确率是87.4%,而Tent和EATA因为找不到可调的BatchNorm参数,退化成了和原始冻结模型完全一样的86.7%。

在ImageNet-C这个1000类64样本的极限场景里,CASTER的证书直接拒绝了每一个测试批次,最终结果和原始冻结模型一模一样,没有额外损失。而不加约束的搬运会倒退21.2个百分点,T3A这种基于伪原型的方法倒退更多,达到33.5个百分点。唯一在这个场景里真正提升了效果的方法是SAR,提升了4.6个百分点,因为它调整的是归一化参数,走的是完全不同的路子,不依赖对类别几何结构的估计。

写在后面

读完这篇论文,我一直在想一个问题:一个"安全机制"到底应该对什么负责?

很多时候我们设计一个检测器或者门槛,潜意识里会希望它是万能的,能拦住所有坏事,能放行所有好事。但CASTER的证书故事恰恰在提醒我们,一个诊断工具的有效性,和它诞生时所绑定的具体机制是深度耦合的。它能准确识别"仿射搬运在这个批次里站不住脚",是因为它的数学结构就是从仿射搬运的失败模式里反推出来的。一旦换了机制,这套数学结构失去了它赖以成立的前提,它给出的判断就变成了噪音,甚至是误导。

这让我联想到医学检验里的一个常识:一个针对某种特定病毒设计的抗体检测试剂,拿去测另一种完全不同的病毒,阴性阳性的结果可能毫无参考价值,哪怕两种病毒都属于"呼吸道病毒"这个大类。领域相邻不等于方法可以直接迁移,这个道理说起来简单,但在工程实践里,"看起来差不多就先用着"的诱惑其实很大。

另外一个让我意外的细节是,作者们专门提到自己踩过数据没打乱的坑,而且把这件事写进了论文正文里,没有藏起来。这种坦诚在学术写作里其实不算常见,大部分论文倾向于把弯路抹平,只呈现最终结果。但恰恰是这个细节,让我对整篇论文的可信度提高了不少,因为一个愿意告诉你哪里踩过坑的团队,大概率也认真检查过其他没有踩坑的地方。

如果你的模型部署在一块永远无法更新参数的芯片里,你会更倾向于接受一个"知道自己什么时候不该出手"的保守方法,还是一个"永远在尝试适应但偶尔会失控"的激进方法?

Q&A

Q1:CASTER是什么?

A:CASTER是一种不需要梯度更新的测试时适应方法,它把训练时学到的类别统计特征,通过从当前测试批次估计出的仿射变换搬运到新环境,全程不用反向传播,也不用保存原始训练样本。

Q2:CASTER的可迁移性证书能不能用来判断Tent的更新是否安全?

A:不能。实验显示这个证书套在Tent上只放行了4.3%的更新,却只保留了Tent原本收益的0.6%,因为证书是基于更新前的冻结特征计算的,无法评估会改变特征空间的机制。

Q3:CASTER在什么情况下会失效?

A:当测试批次类别数远多于样本数时容易失效,比如ImageNet-C每批次只有64张图对应1000个类别,此时无差别搬运会让准确率倒退21.2个百分点,需要靠证书机制拒绝这类批次。