
原论文信息如下:
先讲个反常识的事儿:你把一个训练好的卷积神经网络塞进单片机(MCU),为了省内存和算力,得把网络里的批量归一化层(BN)直接“融化”进前面的卷积层里,再把权重全部量化成 int8。这一套操作下来,模型是能跑了,但它也“瞎”了——遇到没见过的模糊、噪声、光线变化,模型直接躺平,而且你想在现场临时救它一把都不行。为什么?因为 BN 层没了,那些原本能在测试时帮你自适应(TTA)的统计量也一起没了。今天聊的这篇 FORGE,干的事就是:在 BN 已经被折叠、纯 int8 卷积的部署模型上,只靠前向计算做测试时自适应,在 ESP32-S3 上实测只多花 8.3 毫焦(约 6.8% 推理能耗),就能找回 20.9 个准确率点。
很多搞端侧 AI 的朋友应该都有这种感觉:论文里的测试时自适应(TTA)动辄在 GPU 上跑,一听说要部署到几 MB 内存的 MCU 上就只能苦笑。即使是号称“面向微型设备”的 TinyTTA,本质还是要梯度、要反传,只是把内存占用降了一些而已。所有梯度类的 TTA(像 TENT、CoTTA)在真正的 int8 推理运行时里根本跑不起来——因为压根没有 autograd 图和优化器状态。另一类“前向自适应”方法(像 BN-adapt、LeanTTA)虽然不需要梯度,可它们都依赖一个前提:BN 层还活着。结果 MCU 上为了做整数推理,BN 早就被卷积“吃”掉了,于是这类方法也没有用武之地。FORGE 这个工作最戳痛点的地方就在这里:它专门解决“BN 已折叠”后的部署模型自适应问题,而且整个方法还简单到令人惊讶。
一、微控制器上的视觉模型为何“失明”?——BN折叠引发的自适应困境
FORGE 这个方法全称是 Forward-Only Recalibration for the edge,来自巴基斯坦国立科技大学(NUST)和 FAST-NUCES 的研究团队。作者单位虽然不像斯坦福、MIT 那样如雷贯耳,但工作本身非常扎实:他们在 OpenReview 上公开评审,做了位精确(bit-exact)的 int8 卷积验证,还真的用 Nordic PPK2 功率分析仪在 ESP32-S3 开发板上把能量测了出来——这在 MCU 上的 TTA 工作里几乎是独一份。整个论文的逻辑就是:先指出一个大家没意识到的部署陷阱(BN 折叠导致 TTA 失效),再用一个轻到极致的前向重校准把自适应能力“复活”,最后用大量实验和真机实测证明这件事在单片机上是可行的、便宜的。
为了方便大家理解,本文会按照这个方法“为什么存在 → 核心机制是什么 → 实验效果如何 → 在真实硬件上表现怎样 → 有什么局限”的顺序来拆解。不讲废话,直接上干货。
先补个背景。在 MCU 上做视觉推理,内存往往只有几百 KB,算力更是捉襟见肘。为了让模型能跑起来,工程上有一套标准流水线:把 Conv→BN 融合成一个带偏置的卷积,再把权重和激活都量化成 int8。这套操作对推理精度几乎没有影响(论文里 clean accuracy 基本不变),但它有一个很少有人明说的副作用——模型失去了“自适应”的能力。
什么意思呢?神经网络在现实世界里部署后,经常会遇到训练时没见过的数据分布偏移,比如镜头脏了、光线变了、图片压缩出噪点。这种时候模型的准确率会哗哗往下掉。在服务器上,人们可以用测试时自适应(TTA)来救:用测试数据本身的信号(比如预测熵)原地微调一下模型,让它适应新的数据分布。TENT 就是这类方法的代表。
但 MCU 上的 int8 模型想 TTA,遇到的是双重打击:第一,推理运行时里没有反向传播需要的那套东西——没有 autograd 图、没有 fp32 主权重、没有优化器状态,梯度类 TTA 直接出局;第二,就算想用不需要梯度的“前向 TTA”(比如重新估计 BN 的均值方差),可 BN 层已经被折叠进卷积删掉了,统计量早就被“焊死”在卷积权重里,你连改都没得改。
论文里把这称为“自适应鸿沟”(Adaptation Gap),并且专门做了个实验来证明:同样的 CIFAR-10-C 测试数据(15 种 corruption,severity 5,int8),如果模型保留了 BN 层,前向 BN 重校准能恢复 +20.1 个点;可一旦把 BN 折叠进卷积(就是实际部署到 MCU 上的那种形态),同样的方法恢复量直接变成 +0.0。模型遭遇的数据偏移完全一样,但因为折叠,唯一的自救手段也失效了。
之前确实也有人在 MCU 上做 TTA,比如 TinyTTA,是当前最接近的先验工作,也是唯一在 MCU 上验证过的 TTA 方法。但 TinyTTA 骨子里还是梯度法,只是用“早退集成”策略把反传的内存占用给降低了,而且它自适应时要求 BN 层还在。在真正部署的折叠 int8 模型上,它和 TENT 一样跑不起来——需要梯度、需要活着的 BN 层,这两样折叠后都不存在。
一句话总结这个困境:部署折叠量化,是为了让模型在 MCU 上跑得快、跑得省,但这个工程上“必须做”的动作,顺手把模型最后的自救能力也给剥夺了。这不是算法不够好,而是一个大家都没意识到的结构性盲区。
二、FORGE核心机制:前向逐通道重校准如何“复活”部署模型
FORGE 的思路可以用一句话概括:既然 BN 折叠把统计量抹掉了,那我们就“绕过”这个事实——在原来 BN 所在的位置,重新引入一层极轻量的、逐通道的前向重校准,把每一通道的输出分布拉回训练时的干净状态。
关键在于回答一个问题:BN 折叠之后,到底什么东西被留下了?
在 BN 被折叠前,每一层 Conv→BN 都在用训练时累积的运行均值 μ 和方差 σ² 把预激活归一化成零均值单位方差,然后再做 γ、β 的仿射变换。这个操作的最终效果是,每个通道的输出分布有固定的均值 β_c 和标准差 |γ_c|。折叠操作做的事情,是把这个变换用训练时的 μ、σ²“融化”进卷积权重里,然后把这个层删掉。μ 和 σ² 从此不再能被单独修改——但每个通道输出分布的“形状标准”(β_c 和 |γ_c|)其实依然隐含在折叠后的卷积里。
FORGE 做的事情非常朴素:在模型折叠时,顺手把每个原 BN 位置需要两个常量——β 和 |γ|——记录下来,然后到测试时,对每个通道的卷积输出做这样三步操作:先算当前一个 batch 上该通道输出激活值的均值 μ 和方差 ν;再用指数滑动平均(EMA)维护运行估计 μ̄ 和 σ̄²(初始化为干净目标 β、γ²,使无偏移的数据流开始时相当于“无操作”);最后做标准化:x̂_c = (x_c − μ̄_c) / √(σ̄_c² + ε) · |γ_c| + β_c,把当前被偏移的输出分布“拉回”到干净训练状态下。
整个过程不需要任何梯度,不需要学习参数,也不需要额外的模型前向过程,只多了两次逐通道的 reduction 和一次逐通道的仿射变换。
为了方便理解 FORGE 每个原 BN 位置做的那几步操作,原论文里给了一段非常清晰的伪代码(图3),基本就是把 BN 重校准从“依赖活着的层”改成“拿着折叠时保存的 β、|γ| 两个量,在折叠后重新把分布拽回去”。
Algorithm 1 FORGE recalibration at one former-BN site
Require: folded conv output x ∈ R^{B×C×H×W}; clean targets (β_c, |γ_c|)
from fold time; momentum m; running (μ̄_c, σ̄_c²) init. to (β_c, γ_c²)
1: μ_c = mean_{B,H,W}(x_c); ν_c = var_{B,H,W}(x_c) ▷ per-channel batch stats
2: μ̄_c ← (1−m)·μ̄_c + m·μ_c; σ̄_c² ← (1−m)·σ̄_c² + m·ν_c ▷ forward-only EMA
3: x̂_c ← (x_c − μ̄_c) / √(σ̄_c² + ε) · |γ_c| + β_c ▷ re-center to clean target
4: return x̂_c (no gradients, no learnable parameters)
论文还从理论上证明了一件事:如果一次数据偏移在某个折叠卷积通道上表现为“仿射映射”(ỹ_c = a_c · y_c + d_c,即分布整体被缩放和平移了),那 FORGE 的重校准可以做到几乎精确抵消这种偏移——不管缩放系数 a_c 有多大、偏移量 d_c 有多大,把当前估计的均值和方差标准化后,仿射偏移的系数就正好对消掉了,输出直接回到干净的 y_c。这也是为什么这个方法能恢复大部分 TENT 的效果(+20.9 点 vs +24.9 点)——差的那 4 个点,来自 TENT 可以针对每个样本做梯度更新持续改善,而 FORGE 这类运行统计估计的方法会收敛到一个平台期。
具体到部署实现上,FORGE 的重校准是 fp32 精度的——它跑在 MCU 的 FPU 上,是 int8 卷积路径外围的一个轻量 fp32 校正模块。卷积还是真正的 int8(权重激活 int8,int32 累加,整数运算重新量化),只是每次卷积输出的激活会被先反量化到 fp32,做完逐通道统计和仿射后再量化回 int8 给下一层。额外引入的状态只有每通道 2 个 fp32 标量。没有 autograd 图、没有主权重、没有优化器状态。
所以论文很严谨地称自己是 mixed-precision 的自适应:int8 卷积 + fp32 重校准。这里的“integer-only”指的是 FORGE 运行的卷积引擎本身是整数运算的,而不是说整个自适应路径全是整数运算。
三、实验验证:从CIFAR到Tiny-ImageNet,从仿真到ESP32-S3实测
说完成机制,来看看实验。论文的实验设计得相当完整:ResNet-20 和 MobileNetV2(0.5×)两个架构,CIFAR-10、CIFAR-100、Tiny-ImageNet(200类、64×64 分辨率)三个数据集,corruption benchmark 用的是 CIFAR-10/100-C 和 Tiny-ImageNet-C,severity 取 5,模型折叠并量化为 int8。对比基准则横跨了三大类:不可部署的“精度天花板”类(TENT、CoTTA,梯度法跑在 fp32 模型上)、可部署但需要 BN 的(BN-adapt、LeanTTA)、以及一类专门面向量化模型的前向方法(FOA/ZOA/PACE/PEA,但都在 GPU/服务器级硬件上)。
实验验证:从CIFAR到Tiny-ImageNet,从仿真到ESP32-S3实测
安全门控与选择性层:让自适应更精准更节能
局限与展望:Forge的边界与未来方向
龙迷三问
龙哥点评
论文创新性分数:★★★★☆
提出Forge方法,在部署的BN折叠整数卷积模型上,通过前向传播中逐通道EMA统计量重校准,将漂移的通道输出分布恢复到干净训练目标(β,|γ|),无需梯度即可实现测试时自适应。实验合理度:★★★★☆
平均准确率(mean accuracy)和恢复量(recovery,即相对未自适应源模型的准确率提升),报告5次随机测试流顺序的均值±标准差学术研究价值:★★★★☆
提出Forge方法,在部署的BN折叠整数卷积模型上,通过前向传播中逐通道EMA统计量重校准,将漂移的通道输出分布恢复到干净训练目标(β,|γ|),无需梯度即可实现测试时自适应;更关键的是问题定义是否可复用到同类任务。稳定性:★★★☆☆
现有材料未提供充分的极端条件、重复运行或扰动测试,稳定性暂按中性评价。适应性以及泛化能力:★★★☆☆
现有材料未完整展示跨数据集、跨场景或分布外实验,泛化能力仍需进一步验证。硬件需求及成本:★★★☆☆
在ESP32-S3上,推理耗时286ms,自适应仅增加21.9ms(约7.7%额外时间);能耗方面,推理121.7mJ,自适应仅增加8.3mJ(6.8%额外能耗)。复现难度:★★★☆☆
现有材料未确认完整代码、配置、数据处理脚本和权重是否齐备,复现难度暂按中性评价。产品化成熟度:★★★☆☆
论文验证以研究实验为主,真实部署中的时延、成本、维护和异常场景仍需补充验证。可能的问题:,填补关键空白;(2)前向-only设计无需梯度机制,适合MCU部署;(3)仅需少量层即可恢复大部分性能;(4)实测能耗极低,具有实际部署价值。缺点:(1)精度略低于梯度方法TENT(约4点差距);(2)混合精度设计(int8卷积+fp32重校准),非端到端整数路径;
*本文仅代表个人理解及观点,不构成任何论文审核或者项目落地推荐意见,具体以相关组织评审结果为准。欢迎就论文内容交流探讨,理性发言哦~ 想了解更多原文细节的小伙伴,可以点击"阅读原文",查看更多原论文细节哦!