概述

尽管 Vision Transformer 在视觉领域取得了巨大成功,卷积神经网络(CNN)并未被淘汰。相反,2024-2025 年见证了 CNN 架构的重大复兴,ConvNeXt 生态不断壮大,并与状态空间模型(SSM/Mamba)产生了有趣的融合。1


1. ConvNeXt 生态

1.1 ConvNeXt V2

ConvNeXt V2 在 V1 基础上引入了全局响应归一化(Global Response Normalization, GRN)2

核心改进

class GRN(nn.Module):
    """全局响应归一化"""
    def __init__(self, dim, eps=1e-6):
        super().__init__()
        self.gamma = nn.Parameter(torch.zeros(dim))
        self.beta = nn.Parameter(torch.zeros(dim))
        self.eps = eps
    
    def forward(self, x):
        # x: (B, H, W, C) 或 (B, C, H, W)
        # 沿着通道维度计算范数
        norm = torch.norm(x, p=2, dim=(0, 1, 2), keepdim=True)
        norm = norm + self.eps
        
        # 归一化 + 可学习的缩放和偏移
        out = self.gamma * (x / norm) + self.beta
        return out

GRN 的作用

机制效果
响应归一化平衡通道间的激活强度
竞争机制促进通道专业化
替代 LayerNorm更适合卷积架构

1.2 EfficientConvNeXt

针对边缘设备优化的轻量级 ConvNeXt:

关键设计

class EfficientConvNeXtBlock(nn.Module):
    def __init__(self, dim, drop_path=0., kernel_size=7):
        super().__init__()
        # 深度可分离卷积 + 大核
        self.dwconv = nn.Conv2d(
            dim, dim, 
            kernel_size=kernel_size, 
            padding=kernel_size//2, 
            groups=dim
        )
        
        # 跨阶段部分连接 (Cross-Stage Partial)
        self.norm = GRN(dim)
        self.pwconv1 = nn.Linear(dim, 4 * dim)
        self.act = nn.GELU()
        self.pwconv2 = nn.Linear(4 * dim, dim)
        self.drop_path = DropPath(drop_path)
    
    def forward(self, x):
        input = x
        x = self.dwconv(x)
        x = x.permute(0, 2, 3, 1)  # (B, H, W, C)
        x = self.norm(x)
        x = self.pwconv1(x)
        x = self.act(x)
        x = self.pwconv2(x)
        x = x.permute(0, 3, 1, 2)  # (B, C, H, W)
        return x + self.drop_path(input)

1.3 ConvNeXt-Small Data (CSD)

针对小数据集优化的 ConvNeXt:

策略说明
知识蒸馏从大模型蒸馏
自监督预训练MAE 风格
数据增强CutMix + MixUp + RandAugment

2. CNN-Mamba 混合架构

2.1 MambaVision

MambaVision 是 CVPR 2025 提出的混合架构,结合 CNN 的局部特征提取和 Mamba 的长距离建模能力。3

核心设计

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  阶段 1-2: CNN 主干                                        │
│  ┌─────────┐    ┌─────────┐                                │
│  │ Conv3×3 │ → │ Conv3×3 │ → ...                          │
│  └─────────┘    └─────────┘                                │
│                                                             │
│  阶段 3-4: CNN-Mamba 混合                                   │
│  ┌─────────┐    ┌─────────┐    ┌─────────┐              │
│  │ Conv3×3 │ → │ Mamba   │ → │ Conv3×3 │ → ...          │
│  └─────────┘    └─────────┘    └─────────┘              │
│                                                             │
│  阶段 5: CNN 输出                                          │
│  ┌─────────┐    ┌─────────┐                                │
│  │ Conv3×3 │ → │分类头  │                                   │
│  └─────────┘    └─────────┘                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

MambaVision 块

class MambaVisionLayer(nn.Module):
    def __init__(self, dim, state_dim=16):
        super().__init__()
        # 局部特征提取
        self.local_conv = nn.Conv2d(dim, dim, 3, padding=1, groups=dim)
        self.norm = nn.BatchNorm2d(dim)
        
        # Mamba 状态空间模块
        self.mamba = MambaBlock(
            d_model=dim,
            d_state=state_dim,
            expand=2,
        )
        
        # 门控融合
        self.gate = nn.Sigmoid()
    
    def forward(self, x):
        # 局部路径
        local = self.local_conv(x)
        local = self.norm(local)
        
        # 全局路径 (Mamba)
        # 将通道转换为序列
        B, C, H, W = x.shape
        x_seq = x.flatten(2).transpose(1, 2)  # (B, HW, C)
        global_out = self.mamba(x_seq)
        global_out = global_out.transpose(1, 2).reshape(B, C, H, W)
        
        # 门控融合
        gate = self.gate(global_out)
        out = local * gate + global_out * (1 - gate)
        
        return out

2.2 VCMamba

VCMamba(Vision state-space Convolution Mamba)提出多方向 Mamba 用于视觉:

class MultiDirectionalMamba(nn.Module):
    """四个方向的 Mamba"""
    def __init__(self, dim):
        super().__init__()
        # 四个方向的 Mamba 块
        self.directions = nn.ModuleList([
            MambaBlock(d_model=dim) for _ in range(4)
        ])
    
    def forward(self, x):
        B, C, H, W = x.shape
        
        # 四个方向的特征图
        # 方向 1: 左到右
        f1 = self.directions[0](x.flatten(2))
        
        # 方向 2: 上到下
        f2 = self.directions[1](x.flatten(2).transpose(1, 2)).transpose(1, 2)
        
        # 方向 3: 右到左
        f3 = self.directions[2](torch.flip(x, dims=[3]).flatten(2))
        f3 = torch.flip(f3.reshape(B, C, H, W), dims=[3]).flatten(2)
        
        # 方向 4: 下到上
        f4 = self.directions[3](torch.flip(x, dims=[2]).flatten(2).transpose(1, 2))
        f4 = torch.flip(f4.transpose(1, 2).reshape(B, C, H, W), dims=[2]).flatten(2)
        
        # 融合
        out = torch.stack([f1, f2, f3, f4], dim=-1).mean(dim=-1)
        return out.reshape(B, C, H, W)

2.3 CoSNet

CoSNet(Columnar Stage Network)提出完全无注意力、纯并行列积的架构:

核心思想:每层使用多组独立卷积,类似于”列”结构:

┌─────────────────────────────────────────────┐
│  输入                                       │
│   │                                          │
│   ├──────────────────────────────────────────│
│   │                                          │
│  ┌┴───┐  ┌┴───┐  ┌┴───┐  ┌┴───┐  ┌┴───┐   │
│  │Col1 │  │Col2 │  │Col3 │  │Col4 │  │Col5 │   │
│  └──┬──┘  └──┬──┘  └──┬──┘  └──┬──┘  └──┬──┘   │
│     │        │        │        │        │      │
│     └────────┴────────┴────────┴────────┘      │
│                    │                            │
│               ┌────┴────┐                       │
│               │  融合层  │                       │
│               └────┬────┘                       │
│                    │                            │
│               ┌────┴────┐                       │
│               │  输出   │                       │
│               └─────────┘                       │
└─────────────────────────────────────────────┘

3. UniConvNet

UniConvNet 关注于**有效感受野(Effective Receptive Field, ERF)**的扩展:

3.1 问题

传统 CNN 的感受野增长缓慢:

  • 每层 ERF 增长约 2 像素
  • 需要很多层才能覆盖大物体

3.2 解决方案

使用渐进式 ERF 扩展

class ERFExpansion(nn.Module):
    def __init__(self, dim, stages=4):
        super().__init__()
        self.expansion_layers = nn.ModuleList([
            nn.Sequential(
                nn.Conv2d(dim, dim, 3, padding=2**i, dilation=2**i, groups=dim),
                nn.Conv2d(dim, dim, 1),
            )
            for i in range(stages)
        ])
        
        # 渐近高斯混合权重
        self.alphas = nn.Parameter(torch.ones(stages) / stages)
    
    def forward(self, x):
        outputs = []
        for i, layer in enumerate(self.expansion_layers):
            out = layer(x)
            # 高斯权重
            alpha = F.softmax(self.alphas, dim=0)[i]
            outputs.append(alpha * out)
        
        return sum(outputs)

3.3 渐近高斯属性

训练后的权重具有渐近高斯分布

        初始                     训练后
        ┌───┐                   ┌─ ─ ─┐
       /│   │\      →         /│     │\
      / │   │ \              /  │     │  \
     │  │   │  │            │    │     │    │
     │  └───┘  │            │   ─┤     ├─   │
     │         │            │  ──┘     └──  │
     │         │            │      ≈ Gaussian

这使得 ERF 平滑地覆盖大范围区域。


4. TinyML 轻量级架构

4.1 MicroViT

为微型设备设计的极轻量 ViT:

模型参数量FLOPsImageNet Top-1
MicroViT-T1.2M55M68.5%
MicroViT-S2.8M130M73.2%
MicroViT-B5.1M250M76.8%

4.2 TinyNeXt

混合 ViT 架构,专门为 TinyML 优化:

class TinyNeXt(nn.Module):
    def __init__(self, depth=[2, 3, 4, 3], width=[32, 64, 128, 192]):
        super().__init__()
        
        # 阶段 1-2: 高效 CNN
        self.stem = nn.Sequential(
            nn.Conv2d(3, width[0], 3, stride=2, padding=1),
            nn.BatchNorm2d(width[0]),
            nn.ReLU6(inplace=True),
        )
        
        self.stages = nn.ModuleList()
        for i, (d, w) in enumerate(zip(depth, width)):
            stage = nn.Sequential(*[
                TinyConvBlock(w, expansion=4) for _ in range(d)
            ])
            self.stages.append(stage)
        
        # 阶段 3-4: 轻量注意力
        self.attention_stages = nn.ModuleList()
        for i, (d, w) in enumerate(zip(depth[2:], width[2:])):
            attn = nn.Sequential(*[
                LightweightAttention(w) for _ in range(d)
            ])
            self.attention_stages.append(attn)
        
        self.head = nn.Linear(width[-1], 1000)

5. 性能对比

5.1 ImageNet 分类

模型参数量FLOPsTop-1
ConvNeXt-B89M15.4G85.8%
ConvNeXt V2-B89M15.4G86.4%
MambaVision-S50M8.2G85.2%
VCMamba-T28M4.5G83.1%
CoSNet-S45M7.8G84.7%
UniConvNet-B86M14.8G85.5%

5.2 推理速度

在 A100 GPU 上:

模型吞吐量 (images/sec)
ConvNeXt-B850
MambaVision-S1200
CoSNet-S980
ViT-B320

观察:CNN 及其混合变体在效率上仍优于纯 Transformer。


6. 设计原则总结

6.1 ConvNeXt 设计原则

  1. 现代训练策略:AdamW、大 batch、AugReg
  2. 层次化设计:多尺度特征金字塔
  3. ResNeXt 化:分组卷积增加容量
  4. 反转瓶颈:大 → 小 → 大
  5. 大核卷积:7×7 或更大
  6. GELU 激活:替代 ReLU
  7. LayerNorm:替代 BatchNorm(某些场景)

6.2 混合架构原则

  1. CNN 主干:提取局部特征
  2. SSM/Mamba:建模长距离依赖
  3. 门控融合:平衡局部和全局
  4. 多方向扫描:充分覆盖空间

6.3 轻量级设计原则

  1. 深度可分离卷积:减少 FLOPs
  2. 跨阶段部分连接:减少参数
  3. 渐进式下采样:保持信息
  4. 动态精度缩放:适配硬件

7. 未来方向

7.1 动态架构

根据输入动态调整计算量:

class DynamicConvBlock(nn.Module):
    def forward(self, x):
        # 根据输入复杂度决定计算量
        complexity = self.estimate_complexity(x)
        
        if complexity < threshold:
            return self.light_forward(x)
        else:
            return self.full_forward(x)

7.2 硬件协同设计

针对特定硬件(GPU/NPU/TPU)优化的卷积实现:

  • 内存布局优化
  • 算子融合
  • 动态调度

7.3 统一框架

CNN + ViT + SSM 的统一架构可能成为未来主流:

  • 根据任务自动选择计算模式
  • 共享局部和全局表示
  • 端到端可微优化

参考

Footnotes

  1. This document summarizes recent advances in modern CNN architectures from 2024-2025.

  2. Woo, S., et al. (2023). ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders. arXiv:2301.00808.

  3. MambaVision Authors. (2025). MambaVision: A Hybrid Mamba-Transformer Vision Backbone. CVPR 2025.