操控注意力与长程依赖:信息该走哪条路#
第三件装备:聚焦。盯裂缝,忽略光滑岩面。通道注意力、空间注意力、长程依赖。
下篇:真正的未登峰 详细介绍了 SE-Net 和 CBAM 的具体实现。现在我们从设计心法的角度来理解——注意力不是一种"技巧",而是神经网络中信息路由的通用机制。
重新理解注意力:从"模块"到"路由"#
卷积:发现装备 告诉我们卷积有 归纳偏置——平移等变性、局部感受野。这些归纳偏置让 CNN 很高效,但也带来了一个代价:所有输入位置被同等对待。
池化后,所有特征不管来自背景还是关键目标,都一视同仁地进入下一层。这就像高速公路所有车道的通行权一样——效率高,但不合理。
注意力的作用是:在信息通路上设置红绿灯,动态控制每个通道、每个位置的通行权。
三种注意力,三种路由策略#
从路由的角度,注意力分为三个层次:
层次 |
路由问题 |
典型实现 |
信息论解释 |
|---|---|---|---|
通道注意力 |
哪个特征重要? |
SE-Net、ECA-Net |
在通道间分配信息权重 |
空间注意力 |
哪里重要? |
CBAM 空间分支 |
在空间位置间分配信息权重 |
长程依赖 |
远处和近处能关联上吗? |
Self-Attention、Non-local |
全局信息路由,破除距离限制 |
通道注意力——分配"什么"#
通道注意力回答:这 256 个特征通道中,哪些对当前任务更重要?
SE-Net:学会聚焦 详细介绍了 SE-Net 的三步机制(压缩→激励→缩放)。从架构设计角度,通道注意力的核心价值在于:用极小的额外代价(<3% 参数),实现全局上下文对局部特征的动态调控。
架构层面的关键决策#
在将 SE-Net 集成到你的网络时,需要考虑:
决策点 |
选项 |
影响 |
建议 |
|---|---|---|---|
降维比例 \(r\) |
4/8/16/32 |
参数量 vs 表达能力 |
通常 16 是 sweet spot,轻量网络可用 32 |
插入位置 |
每个卷积后 / 仅深层 |
计算代价 vs 效果 |
只在深层(分辨率低)插入,节省计算 |
与残差连接的关系 |
残差内 / 残差外 |
梯度流动 |
建议放残差内(如 SE-ResNet),与跳跃连接协同 |
设计心法#
通道注意力的本质是一个轻量化的信息路由决策器:
输入:所有通道的全局统计信息(通过 Squeeze 获得)
决策:学习通道间的重要性关系(通过 Excitation 实现)
输出:动态调节各通道的信息流(通过 Reweight 执行)
这种"全局指导局部"的机制,让网络学会了根据输入内容自适应地重新分配计算资源——重要的特征被放大,无关的特征被抑制。
空间注意力——分配"哪里"#
空间注意力回答:图像中哪些位置更重要?看背景还是看目标?
CBAM:哪里重要 + 什么重要 展示了如何用通道压缩和 7×7 卷积生成空间注意力图。
长程依赖——破除距离的限制#
这是传统 CNN 最微妙却最根本的一个局限。
问题:图像中两个相距较远的区域需要关联——比如篮球运动员的手和篮筐。卷积能看到吗?
答案:理论上能,但代价很大。
CNN 的感受野随深度线性增长。要让两个相距 100 像素的区域产生关联,需要堆很多层。而在层层传递中,远距离的关联信息很容易丢失。
Self-Attention 的方案:不管位置多远,直接计算关联。这彻底绕过了卷积的层层传递。
架构层面的权衡#
Self-Attention 的核心机制是 Query-Key-Value 计算(详见 步骤四:分离"查询"和"被查询"——引入可学习的投影):每个位置通过可学习的投影生成 Q/K/V,通过 \(QK^T\) 计算相似度,再对 V 加权求和。从架构设计角度,关键是理解它的能力-代价权衡:
维度 |
卷积 |
Self-Attention |
影响 |
|---|---|---|---|
感受野 |
局部(随深度增长) |
全局(一步到达) |
远距离依赖建模能力 |
计算复杂度 |
\(O(N \cdot C \cdot k^2)\) |
\(O(N^2 \cdot d_k)\) |
图像尺寸平方增长 vs 线性增长 |
归纳偏置 |
强(平移等变性) |
弱(需从头学习位置关系) |
数据效率 vs 灵活性 |
并行性 |
高 |
极高(矩阵运算) |
硬件友好度 |
关键洞察:对于 \(H \times W\) 的特征图,Self-Attention 的 \(N^2 = (H \times W)^2\) 复杂度意味着:
224×224 输入:\(N^2 \approx 2.5 \times 10^9\) —— 不可行
14×14 特征图:\(N^2 = 38,416\) —— 可行
因此 Self-Attention 在 CNN 中通常只用于深层低分辨率特征。
设计心法:何时使用 Self-Attention#
推荐使用场景:
需要捕捉长距离依赖(如视频中的跨帧关联)
空间分辨率已经较低(如 14×14 的特征图)
计算资源充足,追求最佳性能
不推荐场景:
高分辨率输入(如 224×224 原始图像)
实时应用(如移动端实时检测)
简单任务(如 MNIST 分类)
缓解高复杂度的策略:
限制感受野:局部窗口注意力(如 7×7 邻域)
下采样后再计算:只在低分辨率特征图上使用
稀疏注意力:只计算特定模式(如轴向注意力)
什么时候需要长程依赖#
场景 |
是否需要长程依赖 |
原因 |
|---|---|---|
分类猫 vs 狗 |
不太需要 |
局部特征(耳朵、鼻子)已足够 |
场景理解 |
中等需要 |
需要关联天空(上)和草地(下) |
目标检测 |
需要 |
关联物体的不同部分 |
语义分割 |
非常需要 |
像素级一致性需要全局上下文 |
视频理解 |
必须 |
跨帧关联 |
设计心法
判断是否需要长程依赖的方法:问自己——“这张图里,一个像素的类别是否依赖于远处的像素?”
如果每一小块都能独立判断 → 不需要
如果需要全局结构推理 → 需要
注意力的代价#
注意力不是免费午餐:
注意力类型 |
计算复杂度 |
显存 |
何时用 |
|---|---|---|---|
通道注意力 |
\(O(C^2)\)——很小 |
几乎不增加 |
默认推荐,几乎所有模型 |
空间注意力 |
\(O(k^2 \cdot H \cdot W)\)——中等 |
略增加 |
目标检测、分割 |
自注意力/Non-local |
\(O(C \cdot H^2 \cdot W^2)\)——极大 |
显著增加 |
长程依赖必不可少时 |
全局池化 attention |
\(O(C)\)——极小 |
忽略不计 |
轻量级通道注意力 |
失败案例:注意力的误用#
案例一:MNIST 上加 SE 模块#
场景:MNIST 分类网络(3 层 CNN),你在每层后加了 SE 通道注意力模块。
结果:
参数量从 50K 增加到 65K(+30%)
准确率从 99.1% 提升到 99.15%(几乎无提升)
训练时间增加 20%
为什么失败:
MNIST 是灰度图,只有 1 个输入通道,特征通道本身也很少(8-16 通道)
SE 模块学习"哪个通道重要",但通道数太少,选择空间有限
任务太简单,没有复杂特征需要筛选
教训:注意力解决的是"选择困难",不是"能力不够"。如果 baseline 本身就能很好地完成任务,注意力只是徒增计算。
案例二:高分辨率特征图用 Self-Attention#
场景:目标检测网络中,你在 \(56\times56\) 分辨率的特征图上用了标准的 Non-local Self-Attention。
结果:
训练 batch size 从 8 降到 2(显存不足)
推理一张图从 50ms 变成 500ms
mAP 提升 0.3%(几乎不可感知)
为什么失败:
Self-Attention 复杂度是 \(O(H^2 \times W^2 \times C)\),对于 \(56\times56\) 就是 \(56^4 \approx 1000\) 万的计算量
高分辨率时空间像素太多,全局关联的计算成本爆炸
大多数关联是局部的,全局计算是浪费
教训:Self-Attention 只适用于低分辨率特征图(\(\leq 14\times14\))。高分辨率请用局部窗口注意力或直接不用。
案例三:所有层都加注意力#
场景:你在 ResNet-50 的每一层(包括浅层的 \(56\times56\) 和 \(28\times28\))都加了 CBAM(通道+空间注意力)。
结果:
训练不稳定,loss 震荡
最终准确率比不加注意力还低 1%
为什么失败:
浅层特征(边缘、纹理)本身就很基础,不需要复杂的注意力筛选
过早的注意力会抑制低级特征的提取
深层才需要注意力来筛选高级语义
教训:注意力应该加在深层,不是每一层。通常只在最后 1-2 个 stage(分辨率最低的部分)添加。
案例四:注意力权重全部趋于相同#
场景:你训练了一个带 SE 模块的网络,但发现所有样本的 attention weight 都差不多(接近均匀分布)。
结果:
SE 模块没有起到筛选作用
相当于加了一层无用的全连接
为什么失败:
可能是学习率太小,注意力没有被充分训练
可能是任务本身不需要通道筛选(如单通道输入的任务)
可能是 squeeze 操作的池化方式不对(全局平均池化丢失了重要信息)
教训:注意力需要被"训练出来"。如果权重趋于均匀,说明要么超参不对,要么任务本身不适合。
决策树:注意力使用指南#
flowchart TD
START[网络深度?] --> SHALLOW{浅层<br/>分辨率 ≥ 56×56}
SHALLOW -->|是| NOATT[不加注意力<br/>提取基础特征]
SHALLOW -->|否| DEEP{深层<br/>分辨率 ≤ 14×14}
DEEP -->|是| CHANNEL{需要通道筛选?}
CHANNEL -->|是| SE[SE-Net / ECA]
CHANNEL -->|否| SPATIAL{需要空间定位?}
SPATIAL -->|是| CBAM[CBAM 空间分支]
SPATIAL -->|否| LONG{需要长程依赖?}
LONG -->|是| SELF[Self-Attention<br/>注意计算量]
LONG -->|否| RESOURCE{资源紧张?}
RESOURCE -->|是| POOL[全局平均池化注意力]
RESOURCE -->|否| NOATT2[不加注意力]
核心原则:
注意力是高级认知功能,浅层不需要
通道注意力几乎是"免费"的,可以默认加上
空间注意力和自注意力有显著代价,只在必要时使用
信息论视角:注意力 = 最大化任务相关互信息#
从信息论来看,注意力解决的是 诊断入门:信息论听诊器 中讨论的容量vs信息流之外的第三个维度:相关性。
网络既要有足够容量(感受野)、信息要能流动(连接),还要懂得区分有用信息和噪声。
通道注意力在通道维度做信息选择,空间注意力在空间维度做信息选择,而长程依赖确保信息不因距离而丢失。
三种注意力协同工作,最大化的是任务相关的互信息 \(I(X;Y_{\text{task}})\)——不是保留所有信息,而是保留任务需要的信息。
知道看哪了。但背包太重,爬不动。第四件装备——操控效率:效果、速度与硬件的三角权衡。