大部分内容来自论文作者 国孟昊 的B站视频,讲解的非常细致,强烈推荐
典型的 self-attention 计算方法如下图所示。 Q Q Q 和 K K K 相乘,使用 softmax 归一化,然一和 V V V相乘,然后得到输出的特征,这个大家应该都相当熟悉了。

第一类是子空间方法。 如下图所示,研究人员发现,当 query 落在车上时, 得到的结果中车的响应比较强(第1行);当query落在人上时,行人的响应比较强(第2行);落在道路上时,道路上的响应就比较强(第3行)。因此,可以把像素点聚为一些代表性的点,在代表性的点上计算相似性。典型的方法是 EMANet (ICCV 2019),OCRNet(ECCV2020)。 还有一类方法是进行矩阵分解来降低计算复杂度, 典型的方法是 Performer。

在这个工作中,作者提出使用两个记忆模块计算 attention,具体为建立一个共享空间 M M M,把输入特征 F F F 映射到 M M M,再恢复,如下图所示:

实现时是通过两个线性层来替代的,具体如下:
A = Norm ( F M k T ) , F o u t = A M v A=\textrm{Norm}(FM^T_k), ~~~ F_{out}=AM_v A=Norm(FMkT), Fout=AMv
算法的伪代码如下图所示。其实中的关注一步就是双归一化,先使用 Softmax 归一化,然后再使用 l1_norm 归一化。作者也说,这个双归一化是相当关键的,相对于只使用 Softmax 归一化,能够显著提升性能。
