
最近完整读了几遍 Restormer 这篇论文第一遍看结构图的时候觉得平平无奇第二遍推公式才意识到转置注意力这个操作有多巧等到自己动手复现、在几张高分辨率测试图上跑完推理之后才算真正理解它为什么能成为高分辨率图像复原任务里绕不开的一个方案。一句话概括这篇工作的核心要做图像去雨、去模糊、降噪这类任务时不能简单把视觉 Transformer 的全局自注意力直接搬过来因为标准自注意力的复杂度会随分辨率平方级增长。Restormer 的思路是把自注意力从空间维度搬到通道维度同时引入门控前馈网络再搭配多尺度编码-解码结构从而兼顾全局建模能力和可接受的计算开销。如果你正在学习视觉 Transformer 在底层视觉任务中的应用或者准备复现一个图像复原模型这份学习笔记应该能帮你省不少时间。1. 先回答一个问题CNN为什么搞不定高分辨率图像复原1.1 局部算子的天花板图像复原本质上是一个病态逆问题我们只知道退化后的图像要去推测原本清晰的图像。这种问题必须靠先验信息约束解空间而卷积神经网络天然提供了一种先验图像局部光滑、相邻像素高度相关。卷积核在特征图上滑动每个输出位置只和输入特征图的一个小邻域有关这种局部归纳偏置让 CNN 在提取边缘、纹理等细节时非常高效。但局部性同时也是天花板。高分辨率图像里的退化模式往往不是局部的。雨线可以横跨整张图运动模糊可能让同一个物体的信息扩散到大片区域雾霾模糊了全局对比度。要恢复这类退化模型需要建立远距离像素之间的联系这恰恰是卷积不擅长的事。有人会说网络够深之后感受野不就变大了吗理论上堆叠几十层 3x3 卷积感受野确实能覆盖全图但实际训练出来的有效感受野远小于理论值。深层网络的梯度很容易在反向传播中衰减远端位置的贡献非常微弱真正起作用的还是局部邻域。我之前在一张 2048 分辨率的模糊图上做过简单感受野可视化中间位置的输出对几百像素以外区域的响应基本可以忽略这就是 CNN 在高分辨率复原任务上力不从心的根源。1.2 高分辨率场景里的非局部到底是什么把 Transformer 的自注意力引入视觉本质就是让任意两个位置直接交互不需要信息经过中间像素逐层传递。在图像复原里这种非局部交互恰好命中要害远处干净区域的结构信息可以指导当前区域的去雨天空区域的平滑先验可以约束噪声区域的复原结果。但标准自注意力做不到高分辨率场景。把图像拉成序列以后特征图维度是 B×C×H×W序列长度 NH×W。标准注意力的复杂度是 O(N²C)注意力的 N×N 矩阵在 512×512 输入下就是约 7 万个 token 之间的两两相似度显存直接爆炸。1024 或更高分辨率的输入更是想都不用想。所以 Restormer 要解决的根本问题不是要不要用 Transformer而是怎么在合理计算开销内用 Transformer。它给出的答案是转置注意力加门控前馈接下来我拆开讲。2. Restormer的两板斧转置注意力与门控前馈网络2.1 MDTA把注意力从空间搬到通道MDTAMulti-Dconv Head Transpose Attention是整个模型最核心的设计。标准多头自注意力中Q、K、V 的序列长度都是空间维度注意力矩阵形状是 N×NMDTA 的思路是把 Q 和 K 的矩阵乘法转置一下让注意力矩阵变成 C×C。由于底层视觉任务的通道数通常远小于空间像素数这一步直接把复杂度从平方级降了下来。具体的流程是这样的输入特征先经过 LayerNorm然后分别用 1x1 卷积加 3x3 深度卷积生成 Q、K、V。这里加深度卷积很关键它是在通道注意力之前注入局部上下文信息避免注意力只看到全局平均感的特征。生成 Q、K、V 之后把它们展平成 B×C×N注意这个 N 是 H×W 展平得到的空间长度。然后执行def mdta_core(q, k, v, scale): # q, k, v: [B, C, N] N H * W attn (q k.transpose(-1, -2)) * scale # [B, C, C] attn attn.softmax(dim-1) out attn v # [B, C, N] return out注意力矩阵的形状是 B×C×C对最后维度做 softmax相当于为每个空间位置在通道维度上计算一组权重然后加权融合所有通道的特征。个人理解这是把哪些通道的模式应该被同时激活看作全局关系而哪些空间位置共享相似内容由前面的深度卷积在局部完成。两套机制一配合既能看全局又没有 N×N 矩阵的内存压力。有人可能会质疑C×C 的注意力真的能表达空间上的长距离依赖吗从实验结果看能至少在实际任务中够用。这背后的合理性在于底层视觉特征本身是高度结构化的空间上重复出现的纹理、边缘模式会反映在通道激活的相关性上通道间的注意力相当于一种自适应滤波器组的选择机制。2.2 GDFN用门控替代简单激活Transformer 的前馈网络通常是一个全连接-激活-全连接结构作用是给注意力层补充非线性变换能力。Restormer 没有用这个标准结构而是把激活函数的部分替换成了门控机制。GDFN 的具体形式输入先经过两个并行的 1x1 卷积展开分支一个分支经过 GELU 激活后作为门控信号另一个分支保持线性变换得到需要调制的特征两者逐元素相乘再通过一个 1x1 卷积投影回原始宽度。公式可以理解为 y Linear( Gating(x) ⊙ Value(x) )Gating 负责决定哪些信息应该被保留、哪些应该被压低Value 负责提供变换后的特征内容。为什么这样改有效图像复原任务的输出和输入是非常相似的大部分区域只需要微调一小部分区域需要大幅重绘。门控机制天然适合这种稀疏修正的需求。它不像标准激活那样对特征做全局非线性映射而是逐通道、逐位置地决定信息流的强度表达能力强不少。作者在相同计算预算下对比了标准 FFN 和 GDFN替换之后指标有明显提升。2.3 一条复杂度对比这里把标准自注意力和 MDTA 的复杂度放在一起看会更直观。假设输入特征通道数为 C空间位置数为 NH×W模块计算复杂度典型变化趋势标准多头自注意力O(N²·C)N 是空间分辨率分辨率翻倍复杂度变四倍MDTA 转置注意力O(C²·N)C 固定时与分辨率线性相关标准 FFNO(N·C²)线性于分辨率代价在通道变换GDFN 门控前馈O(N·C²)线性于分辨率非线性能力更强一个简单数值印象输入 512×512、通道数 64N 约 26 万。标准自注意力的相似度计算量大约是 N²C数量级在十的十二次方以上MDTA 是 C²N数量级只有十的八次方到九次方。差了三个数量级还多。当然实际实现里不会有人真的把 N×N 全矩阵展开但即使有分块技巧内存和算力的差距依然巨大。这也是为什么很多高分辨率模型最终都顺着这条思路走。3. 编码-解码框架里尺度与细节怎么配合3.1 四级编码-解码流程Restormer 的整体骨架是类似 U-Net 的多尺度编码-解码结构一共四个层级。输入图像先通过一个卷积层把 RGB 映射到高维特征然后进入第一层处理每往下一层特征图分辨率减半、通道数翻倍。这样最深层对应的分辨率最低但通道数最多MDTA 在这里的计算代价也最小。有意思的地方在于MDTA 的复杂度是 O(C²N)在浅层高分辨率、小通道数的配置下很划算在深层低分辨率、大通道数的配置下也能承受。这刚好和 U-Net 结构互补。如果反过来用标准空间注意力浅层 N 太大做不了深层 N 虽然小了但信息量也少了怎么都不合适。每一层内部由若干 Restormer Block 堆叠组成。浅层放较少的 Block主要做细节提取深层放更多 Block负责全局语义和结构恢复。这个配置逻辑和很多视觉模型一致低层信息量大但处理简单高层信息抽象但需要更多轮交互。3.2 尺度分工与跳跃连接编码器逐步压缩空间分辨率解码器负责把特征逐步恢复到原始尺寸。解码过程中每上升一层特征图分辨率翻倍同时需要和对应编码器层的特征融合。这种跳跃连接设计保留了浅层的高频细节避免恢复出来的图像一片光滑、丢失纹理。我在学习中最深的感受是多尺度不是锦上添花而是必需品。图像复原任务同时需要两类信息一类是局部的边缘、结构、纹理另一类是大范围的光照一致性、模糊核估计、背景上下文。单尺度模型无论把分辨率放在哪个层级都会顾此失彼。编码-解码结构通过不同层级的感受野天然实现了由粗到精的渐进恢复深层先估计全局结构浅层再修正局部细节。这里也顺便理解了一个设计取舍作者没有选择 Swin Transformer 那种窗口注意力来降低复杂度而是用全图交互放在通道维度的方案。窗口注意力的问题是窗口之间信息交换依赖跨窗口 shift 操作深层需要多次交互才能覆盖全局MDTA 每次注意力都天然覆盖所有通道维度配合深度卷积的局部建模实现路径更直接。4. 读消融实验时我重新理解了各模块的分工4.1 三个让我重新理解模型的消融结果论文里的消融实验是这个模型真正的精华部分。我把几个关键组对比整理了一下定性描述它们的影响方向配置相对基准的变化我的理解去掉 MDTA换成标准空间注意力高分辨率输入下训练不可行指标也未受益复杂度限制是实际瓶颈而不仅仅是理论问题去掉生成 Q/K/V 前的 3x3 深度卷积复原指标下降局部信息注入是通道注意力的必要条件把 GDFN 换回标准 FFN复原指标下降门控机制带来的非线性能力在复原任务中更关键去掉多尺度结构只用单尺度指标明显下降全局上下文和局部细节需要分层配合第一组结果尤其值得玩味。我不是说标准空间注意力性能一定差而是在高分辨率条件下它根本没法做同样的实验。这就让转置注意力看起来像专为高分辨率复原量身定做的方案。第三组结果说明GDFN 不是一个可有可无的 trick门控机制确实贡献了独立的增益。4.2 真正值得抄进自己项目里的结论如果你只想从这篇论文里拿点经验到自己的项目我认为就两条。第一条做高分辨率图像复原时可以把全局自注意力放在通道维而不是空间维。这个思路不限于 Restormer很多后续工作都在用类似设计。通道注意力计算量小可以放心地在每个 Block 里都用不需要像窗口注意力那样考虑跨窗口交互问题。第二条在注意力算子里加一个深度卷积支路来补充局部信息几乎是无成本提点。深度卷积的参数量和计算量都很小但它能让通道注意力感知到空间结构避免全局操作把细节拉平。我后来在另一个轻量去噪网络上尝试了这个设计只加一层 3x3 深度卷积在 attention 之前PSNR 就能涨零点几个 dB。5. 复现Restormer时最容易被卡住的三个细节5.1 显存控制理论复杂度下来了实际训练时显存该爆还是会爆。MDTA 只是把注意力矩阵变小了但整个模型在前向过程中仍然要保留多尺度特征图尤其是高层大通道数的特征内存占用不小。我的经验是第一优先控制 batch size不要一上来就开大。其次可以开自动混合精度训练fp16 对这类 Transformer 结构收益非常明显显存能省不少而且图像复原任务用混合精度基本不会掉点。还有一个容易被忽略的地方是梯度 checkpoint把每个 Restormer Block 作为 checkpoint 的边界用一点计算换大量显存很划算。如果显存仍然不够再考虑缩减通道数而不是缩减分辨率。通道数影响的是整体容量缩减分辨率则直接影响模型处理细节的能力在高分辨率复原任务里这是最不想动的维度。5.2 训练数据裁剪复现论文的时候最容易犯的错是不看训练设置直接用自己的数据开跑。Restormer 这类模型训练时通常是在高分辨率退化图像上随机裁剪固定大小的 patch比如 512x512 或 256x256。这里不要为了省事把整张图 resize 成固定方形再训练因为 resize 本身会引入额外的重采样伪影模型会把这种伪影也学进去推理时反而对着真实退化图像不知所措。更好的做法是保持原始图像的长宽比随机裁剪固定大小的区域。数据增强方面随机水平翻转和旋转基本够用不需要太复杂的增强策略。还有一个小点很多图像复原数据集的退化图是成对生成的训练时确保输入图的裁剪位置和目标图的裁剪位置完全一致否则模型会学到错误映射。5.3 大图推理与拼接痕迹训练用的小 patch推理时面对的却是几千像素的大图。直接把整张大图喂进模型即便显存允许速度也很慢。更常见的做法是分块推理把大图切成 overlap 的块分别送入模型再把结果拼回去。拼接时要注意重叠区域的处理。如果只是硬拼接重叠区域会看到明显的块状边界。我习惯用带羽化的加权融合每个块保留中心区域的完整权重边缘区域权重线性降低重叠区域按权重叠加。重叠率一般设 1/8 到 1/4 就够太高浪费计算太低容易出现拼接缝。实测下来这种处理方式在视觉上基本看不到分块痕迹PSNR 也比硬拼接高一截。6. 学完这篇论文我脑子里留下的东西6.1 能迁移到哪些任务Restormer 的原始任务是去雨、去模糊和高斯噪声去除但它的模块设计并不绑定具体任务。低光图像增强、水下图像复原、医学图像去噪这类底层视觉任务只要退化模式里同时存在局部伪影和全局结构依赖MDTA 加 GDFN 的组合基本都能直接迁移。我后来在一个视频去噪的简化实验里试过类似结构思路是把相邻帧对齐后的特征堆叠到通道维度再用通道注意力做跨帧融合。效果比单独用 3D 卷积好一些而且训练过程更稳定。这说明转置注意力在处理通道之间关系时的通用性很强不只适用于图像复原。还有一个更实际的应用方向是作为大模型的高效适配模块。比如把 MDTA 插到现有 U-Net 骨干网络的某些层用很低的开销获得全局建模能力而不是推倒重来换整个 backbone。6.2 个人对MDTA机制的一点理解读到最后我对 MDTA 的理解可以浓缩成一句话它把空间全局交互换成了通道全局交互但这个交换之所以有效是因为图像复原任务里的低频全局信息更适合用通道相关性来表达。高频的空间细节由卷积和深度卷积负责它们天生擅长捕捉局部结构而通道维度上承载的是特征的语义模式比如某个通道响应雨纹、某个通道响应纹理边缘这些模式之间的组合关系才是全局的。与其在一个像素和另一个像素之间算相关性不如在一种模式和另一种模式之间算相关性后者更抽象、更高效也更符合图像复原的自适应滤波直觉。当然通道注意力不是万能的。它很难代替真正需要空间长距离关系的场景比如视频帧之间的大位移匹配。这也不是 Restormer 想解决的问题。它真正做得好的是在给定约束下找到一个高效合理的平衡点让 Transformer 在高分辨率图像复原里变得可用。这个在约束下重新思考设计的过程比我记住模型结构本身更有价值。