(attn-comparison)=
# 注意力机制的选择与应用

{ref}`se-net`、{ref}`spatial-attn` 和 {ref}`cbam` 我们学习了三种注意力方法。现在问题来了：**实际项目中应该选哪个？** 本章通过实验数据和实用指南帮你做出选择。

## SE-Net vs 空间注意力 vs CBAM

### 性能对比

在 ImageNet 上用 ResNet-50 {cite}`he2016deep` 做骨干网络的实验结果 {cite}`woo2018cbam`：

| 模型 | Top-1 准确率 | 参数量增加 | 计算开销 |
|------|-------------|-----------|---------|
| ResNet-50（基线） | 76.15% | — | — |
| + SE-Net（通道） | 77.62% | +2.53M | +1% |
| + 空间注意力 | 77.28% | +49 | +1% |
| + CBAM（串行） | **78.49%** | +2.55M | +2% |

### 在不同任务上的表现

| 任务 | 最佳注意力类型 | 原因 |
|------|----------------|------|
| 图像分类 | 通道注意力为主 | 分类更依赖语义特征 |
| 目标检测 | 空间注意力为主 | 检测需要精确定位 |
| 语义分割 | 两者结合（CBAM） | 需要语义和位置信息 |

## 选择指南

```{mermaid}
graph TD
    A[选哪种注意力？] --> B{任务类型?}
    B -->|图像分类| C[通道注意力 SE-Net]
    B -->|目标检测/分割| D[CBAM]
    B -->|计算资源受限| E["ECA-Net 或 SE-Net<br/>r=16"]
    B -->|追求极致精度| F[CBAM或SKNet]
```

### 压缩比 $r$ 的选择

$r$ 控制通道注意力的瓶颈维度，$r$ 越大参数越少但表达能力也越弱：

| 压缩比 $r$ | Top-1 Acc | 参数量增加 | 训练速度 |
|-----------|-----------|-----------|---------|
| 无注意力 | 76.15% | 0 | 1250 img/s |
| $r=4$ | 77.85% | +10.24M | 1220 img/s |
| $r=8$ | 77.70% | +5.12M | 1235 img/s |
| $r=16$（默认） | 77.62% | +2.53M | 1245 img/s |
| $r=32$ | 77.45% | +1.28M | 1248 img/s |

**建议**：从 $r=16$ 开始，计算资源充足时可尝试 $r=8$。

## 插入位置的选择

注意力模块插入到残差块中的不同位置效果不同：

```{list-table} 插入位置对性能的影响（SE模块）
:header-rows: 1

* - **插入位置**
  - **Top-1 Acc**
  - **稳定性**
* - 前置（卷积前）
  - 77.21%
  - 中等
* - 中间（两卷积之间）
  - 77.58%
  - 良好
* - 后置（残差连接前）
  - 77.62%
  - 优秀
* - 双重（前后都加）
  - 77.65%
  - 优秀但参数量翻倍
```

**建议**：默认放在残差块的最后、残差连接之前。

## 常见陷阱

### 陷阱1：注意力不是越多越好

在每个残差块都加注意力，效果并不比每隔几个块加更好。通常**在 stage3 和 stage4**（深层特征图）添加注意力效果最明显，因为深层特征语义更丰富。

### 陷阱2：注意力和 BN 的顺序

实验表明，BN → 注意力 → 激活的顺序通常效果最好。如果把注意力放在 BN 之前，批归一化会破坏已经学习好的注意力权重。

### 陷阱3：小数据集上注意力可能过拟合

注意力模块增加了模型容量，在极小数据集（<1000 张）上可能反而导致过拟合。这种情况下，可以：
- 使用更小的压缩比（$r=32$）
- 只加一层注意力而非每层都加
- 配合更强的数据增强

## 实践建议总结

1. **从简单的开始**：先尝试 SE-Net（通道注意力）——实现最简单，效果也最稳定
2. **根据任务调整**：如果任务对位置敏感（检测、分割），加入空间注意力（CBAM）
3. **控制计算成本**：压缩比 $r=16$ 是安全起点；每层都加不如加在关键层
4. **性能瓶颈时再升级**：如果 SE-Net 已经带来足够提升，不必强求 CBAM

### 下一步

掌握了注意力机制的选择策略后，{doc}`practice` 将带你深入了解实际部署中的超参数调优和工程实现细节。

---

## 参考文献

```{bibliography}
:filter: docname in docnames
```
