1 摘要
CCNet的优点:
- 占用较少的GPU内存。循环的交叉注意模块有效减少GPU内存使用。
- 计算效率高。在计算远程依赖关系时,反复出现的交叉注意显著减少了约85%的非本地块。
- 性能先进
主要贡献:
- 提出了一个新颖的纵横交叉关注模块,可以利用它以更有效和更有效的方式从远程依赖中捕获上下文信息.
- 通过利用两个经常性的交叉关注模块来提出CCNet,在基于细分的基准测试中实现领先的性能,包括Cityscapes,ADE20K和MSCOCO。
(a)是Non-local,含蓝色中心的feature map是输入,分为上下两个分支处理:深绿色分支代表已经完成Non-local操作,得到了 [公式] (绿色的深浅则代表了当前位置与蓝色中心点的相关性大小);
下面灰色分支代表进行了 [公式] 操作。将两个结果相乘,得到 [公式] (含红色中心的feature map).
(b)即为CCNet的改进,可以看到,深绿色 [公式] 部分是十字型结构,意即只计算当前 [公式] 周围十字型区域像素 [公式] 与它的相关性。当然,我们需要知道是 所有像素 与 [公式] 的相关性,于是作者将这个过程进行堆叠,并且通过实验发现,只需堆叠两次即可覆盖所有点,并超越non-local的效果。
那么为什么堆叠两次就可以了呢?
先来看看信息是如何通过十字型结构传递的吧
上图展示了蓝色像素点的信息传递到左下角的全过程:
第一次 loop 1时。当我们计算左下角的 f 时候,最多只能包含左上角和右下角的信息,此时还没有计算到左下角的点和蓝色像素点的信息
但是在计算左上 or 右下角时,已经计算了蓝色点关于他们的信息了,
第二次loop 2,当我们再次计算左下角点的 [f] 时,再次包含左上&右下点的信息,此时的左上 or 右下已经不是当初那个它们了(已经被其他的点计算过了),它们已经有了蓝色点 的信息,此时便可以间接地将蓝色点信息传递给左下点。
同理,其他不在左下点十字型位置的像素点,都可以通过这种方式在第二次loop的时候就将信息传递给左下点。于是实现两次loop便“遍历”了所有点。
事实上,我们可以发现蓝色点信息是传递了两遍给左下点的(左上传递了一次,右下传递了一次),虽然是间接传递没有直接计算得到的结果强度大,但这种对于信息的两次加强也很有可能是最终效果 略胜于 Non-local的原因之一。
于是本来要计算 [HW][HW] 次,现在变为了 [HW][H+W-1] (一共 [HW] 个像素点,每个点只"计算"十字型区域 [H+W-1] 面积的像素)。计算效率大大提升!
整个的attention的结构图如下:
以下是CCNet的网络结构:
参照 Lingyun Zeng