【ARXIV2105】Beyond Self-attention: External Attention using Two Linear Layers for Visual Tasks
阿新 • • 發佈:2022-01-19
論文:https://arxiv.org/abs/2105.02358
大部分內容來自論文作者 國孟昊 的B站視訊,講解的非常細緻,強烈推薦
典型的 self-attention 計算方法如下圖所示。 \(Q\) 和 \(K\) 相乘,使用 softmax 歸一化,然一和\(V\)相乘,然後得到輸出的特徵,這個大家應該都相當熟悉了。
第一類是子空間方法。
在這個工作中,作者提出使用兩個記憶模組計算 attention,具體為建立一個共享空間\(M\),把輸入特徵\(F\) 對映到 \(M\),再恢復,如下圖所示:
實現時是通過兩個線性層來替代的,具體如下:
演算法的虛擬碼如下圖所示。其實中的關注一步就是雙歸一化,先使用 Softmax 歸一化,然後再使用 l1_norm 歸一化。作者也說,這個雙歸一化是相當關鍵的,相對於只使用 Softmax 歸一化,能夠顯著提升效能。
在PASCAL VOC 資料集上的語義分割結果如下表所示,可以看出,使用雙歸一化可以顯著提升效能。 作者也表示,external attention 非常依賴這種雙歸一化方式,但作者也指出,歸一化的方法和安排次序,仍然是相當值得關注的問題。
通過檢視作者的原始碼,可以看出,兩個歸一化所處理的維度不一樣,softmax 是作用在 n 上,l1_norm是作用在 k 上。其實我不是特別清楚這麼設計的原因,如果有網友比較清楚可以隨時交流。
x = x.view(b, c, h*w) # b, c, n
attn = self.linear0(x) # b, k, n
attn = F.softmax(attn, dim=-1) # b, k, n
attn = attn / (1e-9 + attn.sum(dim=1, keepdim=True)) # b, k, n
x = self.linear1(attn) # b, c, n
x = x.view(b, c, h, w)