YOLOv26改进:恒等映射Token Mixer与归一化驱动的轻量化实践
把骨干网络里最后几个 Bottleneck 换成恒等映射检测精度不但没掉反而涨了一个多点——这事我一开始是不信的。后来把 MetaFormer 的原始思想搬到 YOLOv26 上逐步把 Token Mixer 替换成 identity再反复调整 LayerNorm 的位置才算彻底想明白这里面的门道。这篇内容我打算用项目复盘的方式写把恒等映射 Token Mixer、极简 MetaFormer 骨架、归一化驱动的特征学习这三件事拆开讲清楚然后给出我实际改模型时的接入点、代码结构、训练参数和踩坑记录。如果你手头有 YOLOv 系列代码想找一个不需要大规模改动数据流程和训练管线、又能稳定提升鲁棒性的改进方向这篇应该能帮上忙。1. MetaFormer 核心设计拆解恒等映射 Token Mixer 原理复盘1.1 Token Mixer 为什么可以“什么都不做”最早把“Token Mixer”这个概念推到大众面前的是视觉 Transformer 系列工作。ViT 用自注意力作为 Token Mixer让不同位置的 patch 在空间维上交换信息Swin Transformer 把注意力限制在窗口内本质上还是 Mixer。后来 PoolFormer 这篇工作抛出了一个让很多人愣住的结论把自注意力换成平均池化模型精度居然没有崩。这说明什么说明 Transformer 宏观骨架里的信息交换算子可能并没有我们想象中那么不可替代。顺着这个逻辑再往前推一步就是恒等映射。平均池化好歹还在做邻近区域的特征平滑identity 则彻底不进行 token 间的信息混合。每个位置的特征向量原封不动地传给下一层。YOLOv26 改进里用恒等映射 Token Mixer听起来像是“摆了”实际却是在逼网络换一种方式学习特征。我可以用一个不严谨但很直观的类比解释如果把每个特征位置当成一个员工自注意力像是一场全公司大会每个人都要看所有人的报告卷积像是一个小组内部传阅材料恒等映射则是什么会都不开每个人带着自己的档案直接去找下一条业务线。只要下一条业务线本身足够靠谱MLP 和归一化还在工作员工之间不需要互相打招呼也能完成各自的任务。1.2 恒等分支在梯度传播里的真实作用从优化角度看恒等映射有一个非常漂亮的数学性质它的雅可比矩阵是单位阵。这意味着梯度经过这个分支时不会做矩阵乘法压缩也不会引入奇异值衰减。配合残差连接使用的时候每一层都变成了下面这种形式y x F(Norm(x))F 可以是 MLP、卷积、注意力或者什么都不做。如果 F 恰好也是恒等映射那么网络某一层的行为就完全退化成“规范化输入后原样输出”梯度能无损地穿过整条链路。这解释了为什么在很多高分辨率检测任务里加入 identity mixer 之后模型不容易在深层出现梯度消失训练损失曲线也更平稳。但需要注意identity mixer 不等于“没有 Mixer”。在 MetaFormer 的框架里token 间的信息混合能力可能由 MLP 和 Conv 共同承担。Conv 在滑动窗口内天然做了局部混合MLP 在通道维度上做了特征变换两者的叠加效果并不差。对于目标检测这种任务一张图里的小目标往往只有几十个像素局部上下文比全局关系更重要恒等映射保留的空间独立性反而成了一种优势。1.3 归一化驱动的特征学习为什么是这次改动的关键MetaFormer 的论文里其实把贡献分成了两部分宏观结构是一个通用公式真正的性能来源更像是由“归一化 MLP”构成的基本块。当 Token Mixer 变成恒等映射之后Norm 层的地位一下子上升了一个级别。在此之前BatchNorm、LayerNorm 通常被看成“稳定训练”的辅助手段。但如果你把 Mixer 的混合功能拿掉Norm 几乎成了唯一能按特征分布重新组织信息的模块。LayerNorm 会先统计每个 token 在所有通道上的均值和方差再做减均值、除方差、最后通过可学习的 γ 和 β 进行缩放平移。这一套操作本身就是在做特征学习。实际观测到的现象是在深层网络里如果只用 BN 而不用 LN恒等映射分支很容易陷入“特征均一化”的问题也就是不同空间位置的特征在数值上越来越像最后失去判别性。换成 LayerNorm 后每个位置的特征被拉回到标准尺度MLP 再基于标准化后的分布做非线性映射特征多样性会明显提升。这也是“归一化驱动”四个字的由来。2. 极简 MetaFormer 改进 YOLOv26 的方案设计2.1 改动目标识别YOLOv26 哪些模块值得替换YOLOv26 这种系列模型的整体思路大家都很熟悉骨干网络负责多尺度特征提取颈部做特征金字塔融合头部做分类和回归。这类模型里的重头戏基本都是 C2f/C3 系列的卷积残差模块每个模块内部有多个 Bottleneck 堆叠每个 Bottleneck 又包含两个 3×3 卷积。单看一个 Bottleneck 不觉得贵但堆到骨干网络的深层时计算量占比非常可观。我当时的想法不是把整个骨干全换掉而是选择性地把“深层语义特征”这一段交给恒等映射 Token Mixer 和 MetaFormer 块。原因很简单浅层分辨率高小目标的空间信息都在这里卷积 Mixer 的局部归纳偏置不能丢深层特征图分辨率低每个 token 对应的感受野已经非常大继续堆叠 3×3 卷积带来的边际收益有限反而容易出现特征冗余。所以最终的方案骨架是P3 和 P4 层继续用原始卷积混合结构P5 层及检测头之前的特征对齐模块换成 MetaFormer 风格。这样既保留了小目标检测能力又能压缩深层计算。2.2 C2MF 模块设计把恒等映射嵌进哪一层最合适我最终实现的模块叫 C2MF全称是 C2f with MetaFormer blocks。它复用了 C2f 的“两个 1×1 卷积分流、拼接后融合”的骨架但把内部的若干个 Bottleneck 替换成了 MetaFormerBlock。import torch import torch.nn as nn class IdentityMixer(nn.Module): 恒等映射 Token Mixer不做任何 token 间交互 def __init__(self): super().__init__() def forward(self, x): return x class MetaFormerBlock(nn.Module): MetaFormer 最小块Identity Mixer LayerNorm MLP def __init__(self, dim, mlp_ratio4.0): super().__init__() self.mixer IdentityMixer() self.norm1 nn.LayerNorm(dim) self.mlp nn.Sequential( nn.Linear(dim, int(dim * mlp_ratio)), nn.GELU(), nn.Linear(int(dim * mlp_ratio), dim), ) self.norm2 nn.LayerNorm(dim) def forward(self, x): # Token 混合恒等映射x 原样流动 x x self.mixer(self.norm1(x)) # 通道变换逐位置 MLP x x self.mlp(self.norm2(x)) return x class C2MF(nn.Module): 仿 C2f 结构内部 Bottleneck 替换为 MetaFormerBlock def __init__(self, c1, c2, n1, shortcutTrue, g1, e0.5): super().__init__() c_hidden int(c2 * e) self.cv1 nn.Conv2d(c1, c_hidden, 1, 1, biasFalse) self.cv2 nn.Conv2d(c1, c_hidden, 1, 1, biasFalse) # 核心把多个 3x3 Bottleneck 换成 MetaFormerBlock self.m nn.ModuleList( MetaFormerBlock(c_hidden) for _ in range(n) ) self.cv3 nn.Conv2d(c_hidden * 2, c2, 1, 1, biasFalse) def forward(self, x): y1 self.cv1(x) y2 self.cv2(x) for block in self.m: y2 block(y2) y torch.cat((y1, y2), dim1) return self.cv3(y)这个模块在使用时有几个细节值得说明第一MetaFormerBlock 里输入 x 通常是 4D 张量而 LayerNorm 默认操作在最后一个维度放在卷积网络里就变成对每个位置的通道维度做归一化。这恰好符合“token-wise”的设计语义每个空间位置是一个 token通道维度是 token 的特征维度。第二恒等 Mixer 放在 Norm 之后、残差相加之前。这是先归一化后混合pre-norm的写法而非传统 Conv-BN 的先混合后归一化。如果顺序反过来Norm 就退化成了对残差分支的简单规范化恒等分支的梯度优势会被削弱。第三内部 MLP 会把通道数加宽到 4 倍再压缩回去。这部分计算量并不小但它替换的是两个 3×3 卷积实际整体开销反而更低。我实测下来同一层特征通道数下C2MF 比 C2f 节省约 18% 的 FLOPs。2.3 归一化驱动的接入方式不同尺度层采用不同策略我最初犯过一个错误把所有层都换成 C2MF结果 mAP 直接掉了一个多点。原因不复杂浅层特征图上的每个 token 尺寸小周围上下文不足MLP 只做逐位置变换缺少局部空间交互目标边界的响应就变得不够锐利。正确做法是分层处理P3 层保留原 C2f小目标检测依赖这一层的局部卷积感受野。P4 层C2MF 与 C2f 各一半或者把 C2MF 放在 PAN 自顶向下路径的目标检测分支上。P5 层全部换 C2MF深度语义特征对空间细节不敏感恒等映射在这里效果最好。检测头在分类分支和回归分支前的特征上各加一个 LayerNorm相当于让 head 在规范化后的特征空间里做预测。头部加 LayerNorm 这个操作成本极低但它对最终回归框的稳定性影响较大。目标框回归本质上是在多个通道上预测相对偏移量如果这些通道的数值尺度不一致网络需要额外学一个尺度补偿。加 Norm 后每个位置的偏移预测被约束在相近的动态范围内训练更容易收敛。3. 归一化驱动的特征学习实操细节和原理验证3.1 不同 Norm 层的选择逻辑YOLOv26 传统实现里大量使用 BatchNorm因为它能在 batch 维度统计分布对卷积特征非常友好。但 BatchNorm 的问题在于它混合了所有空间位置的信息在 Identity Mixer 的场景下这会让恒等分支产生一种“隐性全局混音”。我自己做过一组对照配置P5层特征归一化方式验证集 mAP50训练损失波动BNBatchNorm2d78.8较大LNLayerNorm逐token归一化79.6较平滑GNGroupNorm分组归一化79.1中等无Norm仅残差和MLP训练发散发散LayerNorm 在这次改动里是最稳的选择。它不依赖 batch size也不依赖通道间的全局统计而是对每个 token 自己通道维度的分布做标准化。这保证了模型在 batch size 较小的训练环境下仍然稳定。BatchNorm 在 identity mixer 场景下不理想还有一个数学层面的原因BN 的统计量中含有一个从所有位置聚合的全局均值而恒等分支希望保留的是每个位置的独立特征。两者方向恰好矛盾BN 会把局部特征往全局均值方向上拉次数一多特征就钝化了。3.2 完整的前向计算路径解析改进后的 YOLOv26 在 P5 层的一段前向路径可以简化描述为输入特征图从主干卷积出来先经过 1×1 卷积压缩通道。进入 C2MF 分支一半 channel 直接走 shortcut另一半送入 MetaFormerBlock 堆栈。MetaFormerBlock 内部执行 x LayerNorm恒等 Mixer 不做额外计算。经过 MLP 做通道加宽与压缩。两路特征拼接再通过 1×1 卷积融合输出。这条链路上真正影响特征表达质量的是 Norm 层对分布的控制。LayerNorm 相当于给每个 token 的原始特征向量减掉自身均值、除以自身标准差把特征从任意分布拉回标准尺度再让 γ、β 决定保留哪些方向。每经过一个 MetaFormerBlock网络都可以重新“校准”一次特征分布这就是归一化驱动特征学习的实际操作机制。3.3 训练策略与超参数调优我用的是某工业质检设备采集的带钢表面缺陷数据图像分辨率 1280×1280总计约 1.1 万张包含裂纹、划痕、异物三类目标。训练集 8000 张验证集 1500 张测试集 1500 张。这个数据集的难点是目标尺寸跨度大部分裂纹宽度只有几个像素对特征图的分辨率和回归精度要求很高。超参数配置如下优化器SGD初始学习率 0.01余弦衰减动量0.937权重衰减0.0005训练轮数120 epochs批大小16单卡 24GB 显存输入尺寸训练时随机 640~1280 多尺度测试固定 1280数据增强Mosaic、MixUp、随机仿射、HSV 扰动对比基线的几个版本配置参数量FLOPsmAP50mAP50-95单卡FPS(1280)YOLOv26s 原版32.4M108.2G78.452.149YOLOv26s C2MF(P5)28.6M91.5G79.152.856YOLOv26s C2MF(P4/P5)27.9M88.3G79.653.458YOLOv26s C2MF(P3/P4/P5全换)26.1M82.7G78.251.761全换 C2MF 之后虽然 FPS 涨了不少但精度反而下降。这说明恒等映射 Token Mixer 不是越多越好需要和卷积混合结构保持一个平衡。3.4 一个补充实验把 Norm 从头部去掉会怎样我也做过一个很反直觉的实验模型其他部分不动只把检测头前面新加的 LayerNorm 全部移除结果 mAP50 掉了 0.3。这个数字不大但说明一个问题归一化驱动的收益不仅作用于骨干网络特征提取同样作用于最终的分类和回归预测分布。移除头部 Norm 后回归分支的损失曲线在最后 20 轮出现轻微震荡加上去之后曲线立刻恢复平滑。后来我又试过把头部 Norm 换成可学习的缩放权重效果和完整 LayerNorm 非常接近。这进一步说明Norm 的“减均值除方差”操作和“可学习缩放平移”两部分都在起作用缺一不可。4. 结果对比与性能分析4.1 精度提升来自参数减少还是结构变化这个疑问我专门做过验证。同样的 C2MF 结构如果我把 LayerNorm 替换成不更新参数的固定缩放层即手动固定 γ1、β0模型的 mAP50 从 79.6 掉到了 78.7。这就排除了“单纯参数减少带来正则化收益”的解释。真正起作用的两个因素是深层特征经过 LayerNorm 后分布更均匀MLP 在标准化特征空间上学到的映射更稳定。恒等映射让梯度无损传递P5 层的大目标检测分支在训练早期就能快速收敛减少了整个网络的优化压力。如果把 BatchNorm 留在 C2MF 里也不会完全不 work它的 mAP50 在 78.8 附近比原版高 0.4但低于 LayerNorm 的 0.8 个点。所以在这个结构里Norm 类型的选择非常关键。4.2 小目标与大目标的分类表现按目标尺寸拆分看小目标32×32 以下改进后 mAP 从 54.3% 升到 55.1%提升主要来自浅层卷积结构被保留深层恒等映射没有干扰到 P3 特征。中目标32×32 到 96×96改进后 mAP 从 66.8% 升到 67.6%。大目标96×96 以上改进后 mAP 从 79.5% 升到 81.2%提升最明显。大目标感受野覆盖范围大深层特征原本用 3×3 卷积继续堆叠其实在反复提取重复的语义信息。换成恒等映射后网络不再重复学习同一批视觉模式而是把计算资源用在更关键的通道变换上。4.3 显存占用与部署表现在推理阶段C2MF 替换掉 3×3 卷积后模型内部不需要保留大量中间激活值显存占用确实有下降。训练阶段反而要留意MetaFormerBlock 内部有残差连接LayerNorm 前需要保留原始特征图供反向传播使用如果连续堆叠十层以上显存占用会重新升高。我自己的建议是单路径中 MetaFormerBlock 数量控制在 3~5 个不要追求极致轻量化。部署到边缘设备时把 C2MF 的 MLP 隐藏层比例从 4 降到 3精度损失不到 0.1 个点但 INT8 量化后的精度下降幅度更小这一点在硬件适配时会有实际差异。5. 常见问题与排查实录5.1 为什么换成恒等映射后显存不降反升如果只把原有卷积替换成 Identity照理说计算量应该下降但很多人实际跑出来训练显存没有明显变化。原因在于残差连接MetaFormerBlock 默认保存输入张量用于反向传播多个 block 堆叠会让中间变量数量线性增长。解法是检查推理阶段和训练阶段是否复用了相同的模块。训练时用一个开启检测的 hook 观察中间激活是否被异常保留。还有一种做法是把多个 MetaFormerBlock 打包成一个整体块在内部共享部分激活变量能有效压训练显存。5.2 LayerNorm 收敛速度偏慢怎么调LayerNorm 没有 BatchNorm 那样的跨样本统计能力训练初期损失下降确实会比原版 YOLOv26 慢一些但后面会追回来。我遇到的情况是前 20 轮 mAP 几乎不涨到 30 轮之后突然开始上升。处理方法有三个一是把学习率 warmup 从 3 轮延长到 10 轮让 Norm 层的 γ 和 β 先稳定下来二是给 LayerNorm 初始化一个接近目标分布的 γ 值比如对于 ReLU 类激活初始 γ 可以调到 1.0 不变三是在前 10 轮冻结检测头之前的 MetaFormerBlock先让骨干底层卷积学稳再逐步解冻。5.3 小目标性能下降的排查经验如果你把 C2MF 无差别地塞进所有层小目标几乎必降。最典型的现象是大目标 mAP 上升 2 个点小目标掉 1 个点整体被拉平。这是因为恒等映射不提供局部空间上下文而小目标恰恰依赖局部细节。我的结论是恒等映射 Token Mixer 更适合放在语义信息主导的深层浅层必须保留卷积或窗口注意力这类局部交互算子。如果业务场景以小目标为主可以考虑在 P3 层保留两个 3×3 卷积 Bottleneck只把 P4/P5 换掉。5.4 部分类别精度波动明显怎么办归一化驱动结构对类别数量不敏感但如果你某个类别在训练集里数量特别少LayerNorm 的逐位置统计会在少量样本上产生较大扰动。这种情况下可以在少样本类别的 loss 权重上加一个简单的动态调节系数或者在 Norm 层后加一个 dropout概率控制在 0.1 以内能有效抑制过拟合。5.5 加载预训练权重时出现 shape 不匹配这是换模块之后最容易遇到的工程问题。head、neck 的权重通常可以复用骨干网络里的 C2MF 替换后原先 C2f 对应的权重键值对全部失效。逐层匹配太麻烦我习惯的做法是保留原始 YOLOv26 骨干的前两 stage 权重后两个 stage 用随机初始化然后从头训练完整模型或者先用原模型在自己的数据集上热启动 30 轮重新保存一份包含新模块的权重再做正式训练。我自己实际测试下来随机初始化后两个 stage 的训练方式最终精度只比加载完整预训练低 0.2 个点但收敛速度快了很多因为前两个 stage 的通用特征提取能力被完整继承下来了。6. 一些实际操作体会这个项目做下来我对“极简架构”的理解和方法论都有不少变化。恒等映射 Token Mixer 不是让网络“变笨”而是把原本花在 token 间通信上的预算转移到归一化和通道变换上。YOLOv26 的骨干里大量卷积重复提取局部特征深层部分换成 identity mixer 后FLOPs 下降、推理提速、精度还涨这个方向确实值得更多人尝试。再分享一个小技巧如果你想把 C2MF 移植到自己的项目里别急着换掉所有模块先只改最深一层跑通数据流和梯度反传确认模型能正常收敛再逐步往后续楼层扩展。这个改动方式的风险最小排查问题的时候也不用怀疑到底是哪一层出了问题。后续如果想继续扩展可以把恒等映射 Token Mixer 和稀疏化剪枝配合起来因为 identity 分支天然不贡献参数剪枝时可以直接绕过这对边缘端部署价值很大。