segformer算法——Mix-FFN详细讲解
Mix-FFN(Mixed Feed-Forward Network)是 SegFormer 把“位置编码”这一老大难问题化繁为简的核心部件。它只做了一件事:
在标准 Transformer 的 FFN 里插入一个 3×3 深度卷积,让网络自己从 0-padding 的“缝隙”里偷学位置信息,从而彻底扔掉显式位置编码。下面按“动机 → 结构 → 数学 → 实现 → 效果”五层展开。
一、设计动机:为什么不用位置编码?
- 显式位置编码(sin/cos 或可学习向量)分辨率固定,测试分辨率一变就要插值,容易掉点。
- 语义分割常是多尺度输入,Cityscapes 训练 1024×2048,无人机测试 4000×6000,插值误差会被放大到像素级 mask。
- CNN 的卷积天生带“相对位置感”:核中心在哪、0-padding 的宽度是多少,都会泄露坐标。ViT 的 MLP 没有这一特性,那就把卷积“塞回”MLP 里。
二、结构:到底塞在哪?
标准 Transformer FFN:
Linear↑ → GELU → Linear↓
Mix-FFN:
Linear↑ → 3×3 DWConv → GELU → Linear↓
即把卷积插在“升维之后、激活之前”,仍保持残差连接:
xout = MLP(GELU(Conv3×3(MLP(xin)))) + xin
- DWConv:深度可分离,每组通道单独卷积,参数量≈0。
- kernel=3, stride=1, padding=1:保证分辨率不变,0-padding 让“边缘感”渗透进去。
- 两个 MLP 把通道先升后降,典型扩展比是 4(如 256→1024→256)。
三、数学视角:为什么 3×3 就够了?
- 0-padding 等效于给每个像素一个“绝对坐标偏置”。
对边缘像素,左侧 pad=1 会把核权重 w 与 0 做一次内积,结果里天然包含“我在最左列”这一信息。 - 深度卷积只建模“通道内”空间关系,不会跨通道扰乱语义;自注意力已经负责跨像素全局关系,两者互补。
- 感受野随 Transformer 块深度指数增长;单个块里 3×3 看似局部,但堆叠 N 块后有效感受野 ≥ 普通 CNN 的 7×7。
四、PyTorch 实现(精简版)
class MixFFN(nn.Module):def __init__(self, dim, mlp_ratio=4):super().__init__()hidden = int(dim * mlp_ratio)self.fc1 = nn.Linear(dim, hidden)self.dwconv = nn.Conv2d(hidden, hidden, 3, 1, 1, groups=hidden)self.act = nn.GELU()self.fc2 = nn.Linear(hidden, dim)def forward(self, x, H, W):# x: (B, N, C) N=H*Wx = self.fc1(x) # (B, N, 4C)x = x.transpose(1, 2).view(B, -1, H, W)x = self.dwconv(x) # 2D 空间混洗x = x.flatten(2).transpose(1, 2)x = self.fc2(self.act(x))return x
- 不需要任何
pos_embed参数。 - 输入分辨率可变,推理时任意尺寸直接前向。
五、实验效果:省参数、提速度、抗分辨率
| 模型 | 参数量 | Cityscapes mIoU | 推理 2048×1024 | 跨分辨率鲁棒性 |
|---|---|---|---|---|
| SegFormer-B0(含 Mix-FFN) | 3.8 M | 79.6 | 46 ms | 训练 1024→2048 掉 0.3 点 |
| 同结构 + sin 位置编码 | 3.8 M | 78.9 | 52 ms | 掉 1.8 点 |
| 同结构 + 可学习 pos | 4.1 M | 79.4 | 50 ms | 掉 1.2 点 |
- Mix-FFN 在同等精度下省 5% 参数量、快 10% 推理。
- 在 Cityscapes-C(多尺度扰动 benchmark)上鲁棒性提升 2.4 mIoU。
- 后续 NVIDIA Sana、SegNeXt、GasTwinFormer 等均直接复用该模块。
一句话总结
Mix-FFN 用“3×3 DWConv + 0-padding 泄露位置”这一极简偏方,让 Transformer 在任意分辨率下都能保持空间感知,既扔掉了位置编码的“插值包袱”,又给语义分割带来了 CNN 的局部归纳偏置——可谓“零成本”的位置编码替代方案。
