CV 中几种 Attention 机制横向对比,附 Single-Path NAS 笔记

最近读了几篇关于 CV 里 attention 机制的论文,以及一篇新出的 NAS 工作,把各自的思路整理对比一下,顺便记录一些自己的想法。

SENet:对 Channel 做加权

《Squeeze-and-Excitation Networks》的核心思路是考虑 channel 之间的相关性,在特征图后面加了一个 SE 模块——先对每个 channel 做全局平均池化(squeeze),再经过 FC 层学出每个 channel 的权重(excitation),最后用这个权重对原始 feature map 做重新标定。本质上是给不同 channel 加一个 attention。

Squeeze-and-Excitation 模块示意:特征图经 squeeze(全局池化)、excitation(FC 学权重)、scale(按通道重标定)三步
图 1:Squeeze-and-Excitation 模块。Squeeze 对每个 channel 做全局池化得到通道描述子,Excitation 用 FC 学出各 channel 的权重,Scale 再用这些权重对原始 feature map 逐通道重标定。

SENet 在 ImageNet 上的分数相当高,效果很明显。

模型224×224 top-1 err.224×224 top-5 err.320×320 / 299×299 top-1 err.320×320 / 299×299 top-5 err.
ResNet-152 [13]23.06.721.35.5
ResNet-200 [14]21.75.820.14.8
Inception-v3 [20]--21.25.6
Inception-v4 [21]--20.05.0
Inception-ResNet-v2 [21]--19.94.9
ResNeXt-101 (64×4d) [19]20.45.319.14.4
DenseNet-264 [17]22.156.12--
Attention-92 [60]--19.54.8
PyramidNet-200 [77]20.15.419.24.7
DPN-131 [16]19.935.1218.554.16
SENet-15418.684.4717.283.79

Non-local NN:对空间像素做 Self-Attention

《Non-local Neural Networks》走的是另一条思路,寻找的是 feature map 像素之间的相关性,是一种 self-attention 机制,能让每个位置的特征都和其他所有位置发生交互,捕获长程依赖。这种 attention 机制确实能取得比较好的效果。读完这篇之后,我在想能不能在 NAS 里也考虑到这方面的问题——在搜索空间里把这类 attention 操作纳入候选。

Non-local block 结构:输入经 θ、φ、g 三个 1×1×1 卷积,θ 与 φ 做矩阵乘并 softmax 得到注意力,再与 g 相乘、过 1×1×1 卷积后残差相加
图 2:Non-local block 的结构。输入 X 经 θ、φ、g 三路 1×1×1 卷积;θ 与 φ 的特征做矩阵乘并 softmax 得到位置间的注意力权重,与 g 相乘后经 1×1×1 卷积,再与输入残差相加得到 Z。

CBAM:把 Channel 和空间 Attention 串联起来

《CBAM: Convolutional Block Attention Module》可以看作是对 SE 模块的扩展,分两个部分。

Channel attention 部分: 分别做全局平均池化和全局最大池化,两路各过同一个 FC,加起来再 sigmoid,得到每个 channel 的权重。

Spatial attention 部分: 沿 channel 维度做平均池化和最大池化,把两个结果 concat 到一起,经过一个卷积层加 sigmoid,得到空间维度上的 attention map。

两个部分顺序串联,先 channel attention 再 spatial attention。

CBAM 的两个子模块:上为 channel attention(MaxPool/AvgPool 各过共享 MLP 相加),下为 spatial attention(沿通道池化后 concat 过卷积层)
图 3:CBAM 的两个子模块。上:channel attention,对特征同时做最大/平均池化、各过共享 MLP 后相加;下:spatial attention,沿 channel 维做最大/平均池化并 concat,再过卷积层得到空间注意力图。

Dual Attention Network:面向分割的双路 Attention

《Dual Attention Network》是把 channel 和 feature map 空间两个维度的 attention 同时用在语义分割里,两路并联,最后融合到一起。设计思路和 CBAM 类似,只是应用场景换成了分割,两路是并联而非串联。

Dual Attention Network 结构:ResNet 特征分两路,上路为 position attention(空间注意力),下路为 channel attention(通道注意力),最后 sum fusion 融合
图 4:Dual Attention Network 的结构。ResNet 提取的特征分为两路并联:上路 position attention 建模空间维度的注意力,下路 channel attention 建模通道维度的注意力,最后通过 sum fusion 融合用于分割。

Single-Path NAS:把多路径搜索压缩成单路径

《Single-Path NAS: Designing Hardware-Efficient Mobile Networks》的主要思路是把多路径的操作选择都放到一个卷积核里,相当于一种比较小尺度的权值共享,从而在训练时只维护一条路径。

对比图:左为以往 NAS 的多路径搜索空间(每个候选卷积是一条独立路径),右为本文提出的单路径搜索空间(所有卷积合并进一个 superkernel)
图 5:多路径与单路径搜索空间对比。左:以往 NAS 把每个候选卷积当作一条独立路径,开销大;右:Single-Path NAS 把所有候选操作合并进一个「superkernel」,只在 kernel 级别做选择。

时间上来说也不算快,花了 30 TPU hours,直接在 ImageNet 上进行搜索,performance 中规中矩。搜索空间基于 MobileNet-v2,主要搜索 depthwise conv 的 kernel 大小。

Single-Path NAS 搜索空间三层结构:ConvNet 宏观架构(Block 序列)、MBConv 微观结构(含可搜索 depthwise conv)、单路径可搜索 superkernel
图 6:Single-Path NAS 的搜索空间。建立在类 MobileNet-v2 的层级搜索空间上,从 ConvNet 宏观架构到 MBConv 微观结构,核心是用一个可搜索的「superkernel」编码所有 MBConv 类型,无需为每个候选操作单列一条路径。

最后搜索到的结果如下,感觉是在 follow ProxylessNAS 的工作,只不过把多路径换成了单路径。

Single-Path NAS 搜索到的硬件高效 ConvNet 逐层结构图,各层标注 MBConv 的 kernel 大小与扩张率
图 7:Single-Path NAS 搜索到的硬件高效 ConvNet。逐层标注了各 MBConv 的 kernel 大小与扩张率,在 ImageNet 上 top-1 精度 74.96%,Pixel 1 手机上推理时间 79.48ms。

搜索方法细节: 用了一个指示函数来确定是否使用子 kernel。

wk=w3×3+1(use 5×5)w5×53×3(1)\mathbf{w}_k = \mathbf{w}_{3\times3} + \mathbb{1}(\text{use } 5\times5)\cdot \mathbf{w}_{5\times5\setminus 3\times3} \tag{1}

其中 1()\mathbb{1}(\cdot) 是编码架构(NAS)选择的指示函数,即:若 1()=1\mathbb{1}(\cdot)=1,则 wk=w3×3+w5×53×3=w5×5\mathbf{w}_k = \mathbf{w}_{3\times3} + \mathbf{w}_{5\times5\setminus 3\times3} = \mathbf{w}_{5\times5};否则 1()=0\mathbb{1}(\cdot)=0,则 wk=w3×3\mathbf{w}_k = \mathbf{w}_{3\times3}

指示函数里使用了一个阈值 tk=5t_k = 5,这个阈值是可学习的。原本的指示函数为:

g(x,t)=1(x>t)g(x,t) = \mathbb{1}(x > t)

为了让梯度能够回传,将指示函数松弛为 sigmoid:

g^(x,t)=σ(x>t)\hat{g}(x,t) = \sigma(x > t)

松弛后变为:

wk=w3×3+1 ⁣(w5×53×32>tk=5)w5×53×3\mathbf{w}_k = \mathbf{w}_{3\times3} + \mathbb{1}\!\left(\left\lVert \mathbf{w}_{5\times5\setminus 3\times3}\right\rVert^2 > t_{k=5}\right)\cdot \mathbf{w}_{5\times5\setminus 3\times3}

从这个设计可以看出,是否使用某个 kernel 和权重本身密切相关,主要取决于子 kernel 之外权重的重要性。总体来说,这个方法把整个 MBConv 层泛化成了一个可搜索的 block。

最终实验效果看上去也是中规中矩。

MethodTop-1 Acc (%)Top-5 Acc (%)Mobile Runtime (ms)Search Cost (epochs)
MobileNetV1 [11]70.6089.50113
MobileNetV2 1.0x [17]72.0091.0075.00
MobileNetV2 1.0x (our impl.)73.5991.4173.57
Random search73.78 ± 0.8591.42 ± 0.5677.31 ± 0.9
MnasNet 1.0x [20]74.0091.8076.0040,000
MnasNet 1.0x (our impl.)74.6191.9574.6540,000
ChamNet-B [6]73.80240‡
ProxylessNAS-R [4]74.6092.2078.00200*
ProxylessNAS-R (our impl.)74.6592.1877.48200*
FBNet-B [21]74.1--90
FBNet-B (our impl.)73.7091.5178.3390
Single-Path NAS (proposed)74.9692.2179.488 (3.75 hours)
表 1:Single-Path NAS 在相近 mobile latency 设定(Pixel 1 上 ≤80ms)下达到 SOTA 精度(%),搜索成本(以 epoch 数计)最多减少 5000 倍。带 * 的搜索成本是按「ProxylessNAS 比 MnasNet 快 200×」的说法估算的;‡ 表示 ChamNet 未给出受运行时约束的模型,无法重训或测延迟。