用Attention玩转CV,一文总览自注意力语义分割进展( 二 )

Nonlocal

Nonlocal[2]中的核心操作为:

其中,是像素个数,是像素特征维度(通道数),计算和之间的相关度(或称“能量”),对进行变换。可以看作对的加权平均得到,作为对的重构,这里权重为。

关于和的选择,作者列出了多个选项,并最终选择了

的形式,其中分别对应 NLP Transformer 里的 query , key 和 value 。此外,经过卷积后和相加,作为 Non-local 模块的输出。最后结构图如下:

用Attention玩转CV,一文总览自注意力语义分割进展

图1/13

Non-local Block

其实,这里和的具体选择,对效果影响不大。在笔者做过的语义分割实验中, query 和 key 共享,节省一些参数,并且这样计算出的是个对称矩阵。甚至可以考虑将转换省略,直接用本身计算,而把卷积放在模块之前之后,这样的效果也不逊色。当然,不同的任务应该对应于不同的最优选项。今年 arxiv 有篇文章[16]详细对比分析了这些细节在不同任务中的影响。笔者认为此处最关键的是加权平均,而非转换。

推荐阅读