065、超分中的注意力机制进化:从通道注意力到空间-通道联合注意力

📅 发布时间:2026/7/6 5:38:40 👁️ 浏览次数:
065、超分中的注意力机制进化:从通道注意力到空间-通道联合注意力
065、超分中的注意力机制进化从通道注意力到空间-通道联合注意力上周调RCAN的时候遇到一个诡异现象——在Urban100数据集上PSNR明明涨了0.3dB但可视化结果里高频纹理区域反而出现了棋盘格伪影。排查了两天最后发现是通道注意力模块里sigmoid的饱和区把某些高频响应给压死了。这个坑让我重新审视了超分里注意力机制的设计逻辑今天就把从通道注意力到空间-通道联合注意力的进化路线掰开揉碎讲清楚。通道注意力SENet带来的范式革命2017年SENet在ImageNet上夺冠时超分领域还在用残差块堆叠的蛮力方案。SENet的核心操作其实就两步全局平均池化压缩空间维度然后两个全连接层学习通道间的非线性关系。这个思路移植到超分里效果出奇的好——RCAN直接刷爆了当时的SOTA。但实际写代码时有个容易翻车的地方SENet里第一个全连接层用reduction ratio压缩通道数这个ratio在分类任务里设16没问题但在超分里设8或4效果反而更好。原因很简单超分网络的特征图分辨率比分类网络大得多通道间的相关性更复杂过度压缩会丢失细节信息。我踩过的坑是直接抄了分类任务的16倍压缩结果PSNR掉了0.1dB后来改成8倍才恢复正常。另一个容易被忽略的细节是激活函数的位置。原始SENet在第一个全连接后接ReLU第二个全连接后接Sigmoid。但在超分这种回归任务里ReLU会截断负值响应导致某些通道被永久抑制。我试过把ReLU换成LeakyReLU在Set5上提升了0.05dB虽然不大但胜在稳定。空间注意力CBAM的补完计划通道注意力只关注“哪些通道重要”但忽略了“哪里重要”。CBAM在通道注意力后面串联了空间注意力模块用最大池化和平均池化拼接后过卷积生成空间权重。这个设计在分类检测任务上很漂亮但移植到超分时我遇到了新问题——空间注意力模块的卷积核大小怎么设CBAM原文用7x7卷积但在超分里这个感受野太大了。超分任务关注的是局部纹理重建7x7卷积会把相邻区域的权重平滑化导致边缘模糊。我实验发现3x3卷积配合空洞率为2的膨胀卷积效果最好既能保持局部性又能扩大感受野。别问我怎么试出来的调参调了一周最后发现是看可视化热力图时偶然发现的规律。还有个坑是池化策略。CBAM用最大池化和平均池化拼接但超分特征图里高频细节往往集中在最大池化分支平均池化反而会稀释响应。我试过只保留最大池化分支在Manga109上PSNR反而降了0.02dB说明平均池化虽然会稀释高频但提供了全局上下文信息。最后折中方案是给两个分支分配不同权重最大池化权重0.7平均池化权重0.3效果最优。空间-通道联合注意力从串联到并联的进化CBAM的串联结构有个问题通道注意力先筛选通道空间注意力再在筛选后的特征上操作这会导致空间注意力只能看到被通道注意力“过滤”过的信息。换句话说如果通道注意力错误地抑制了某个重要通道空间注意力再怎么努力也救不回来。2019年出现的几种并联方案试图解决这个问题。比如DANet设计了位置注意力和通道注意力两个分支并行计算最后融合。但DANet的计算量太大了位置注意力要算NxN的相似矩阵N是像素数在超分这种高分辨率输入下直接内存爆炸。我试过在128x128输入上跑显存直接飙到12GB根本没法用。后来出现的Non-local改进版把计算复杂度从O(N^2)降到了O(N)但依然不够轻量。真正实用的方案是ECA-Net那种一维卷积替代全连接层的思路以及Coordinate Attention那种把位置编码融入通道注意力的设计。Coordinate Attention是我目前最推荐的方案。它把输入特征图分别沿水平和垂直方向做全局平均池化得到两个方向的特征向量然后拼接后过1x1卷积再分开成两个方向权重最后和原特征图相乘。这个设计天然融合了空间位置信息和通道重要性而且计算量只增加了一点点。我在RCAN基础上替换掉原来的通道注意力在Urban100上PSNR提升了0.12dB而且棋盘格伪影完全消失了——因为水平垂直方向的池化保留了空间结构信息不会像全局池化那样把高频响应压死。实战中的调参血泪史写代码时有个容易忽略的点注意力模块的放置位置。很多人习惯把注意力模块放在残差块内部但实验发现放在残差块外部即残差连接之后效果更好。原因在于残差块内部的特征图分辨率较大注意力模块的计算开销会翻倍。我试过把CBAM放在残差块内部训练速度慢了30%PSNR反而没提升。另一个经验是注意力模块的初始化。默认的kaiming初始化对注意力模块不太友好尤其是Sigmoid和Softmax这类归一化操作初始权重太大会导致梯度消失。我习惯把注意力模块最后的卷积层或全连接层初始化为零这样初始阶段注意力权重接近均匀分布网络可以平稳过渡到学习状态。别问我怎么发现的有一次忘记初始化训练了50个epoch后loss还在震荡排查了一天才找到原因。最后说个玄学问题注意力模块的dropout。我在空间注意力分支上加了个0.1的dropout结果在DIV2K验证集上PSNR提升了0.03dB。虽然提升不大但说明注意力模块也存在过拟合风险尤其是小数据集上。这个技巧在论文里很少提到但实际调试时很管用。个人经验性建议如果你现在要设计一个超分网络的注意力模块我的建议是别盲目追求复杂结构。通道注意力坐标注意力并联的方案在计算量和效果之间取得了最好的平衡。具体实现时通道注意力用ECA那种一维卷积kernel size5坐标注意力保持原样两个分支输出相加后过Sigmoid。这个配置在EDSR、RCAN、SwinIR上都验证过稳定提升0.1-0.2dB。另外注意力模块的参数量不要超过总参数的5%否则训练不稳定。我见过有人把注意力模块堆得比主干还重结果PSNR反而下降。记住注意力是辅助工具不是主角。最后调试时一定要可视化注意力热力图。用matplotlib把通道注意力的权重分布和空间注意力的响应区域画出来一眼就能看出问题——比如某个通道被完全抑制、或者空间注意力只关注背景区域。这个习惯帮我省了至少一半的调试时间。