加入極市專業CV交流羣,與  1 0000+來自港科大、北大、清華、中科院、CMU、騰訊、百度  等名校名企視覺開發者互動交流!

同時提供每月大咖直播分享、真實項目需求對接、乾貨資訊彙總,行業技術交流。關注  極市平臺  公衆號  , 回覆  加羣, 立刻申請入羣~

來源|sliderSun@知乎,https://zhuanlan.zhihu.com/p/161733629

本文介紹了11篇attention相關研究,參考了paperswithcode。

鏈接: https://paperswithcode.com/methods/category/attention-mechanisms

Linearized Attention(核函數)

Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention

論文鏈接: https://arxiv.org/pdf/2006.16236.pdf

Transformer中的Attention機制,形式爲:

爲了給計算複雜度降低到線性,使用核函數來簡化Attention的計算過程,並且替換掉SoftMax。

我們可以將任何相似函數的廣義Attention定義一般化:

爲了保留Attention的相似特性,我們要求恆成立。

我們可以給各自加個激活函數,

重寫爲如下所示

然後利用矩陣乘法的結合能進一步簡化

當分子寫成向量化的形式時,上面的方程更簡單

請注意,特徵映射是按行向量應用於矩陣Q和K的。

本文選擇的是。

Linear Attention最主要的想法是去掉標準Attention中的Softmax,就可以使得Attention的複雜度降低到。

Multi-Head Linear Attention

Linformer: Self-Attention with Linear Complexity

論文鏈接: https://arxiv.org/pdf/2006.04768v3.pdf

代碼鏈接: https://github.com/tatp22/linformer-pytorchgithub.com

Multi-Head Linear Attention是線性多頭自我注意模塊,是與Linformer體系結構一起提出的。主要思想是添加兩個線性投射矩陣。首先投影原始的(n×d)維和層和投射到維度的上下文映射矩陣。然後使用縮放的點積注意力計算(n×k)維上下文映射矩陣。

最後,我們使用計算每個頭的上下文嵌入。

詳細介紹參見之前的一篇: https://zhuanlan.zhihu.com/p/147225773

LSH Attention

Reformer: The Efficient Transformer

論文鏈接: https://arxiv.org/pdf/2001.04451v2.pdf

代碼鏈接: https://github.com/huggingface/transformersgithub.com

Locality sensitive hashing:Reformer的論文選擇了局部敏感哈希的angular變體。它們首先約束每個輸入向量的L2範數(即將向量投影到一個單位球面上),然後應用一系列的旋轉,最後找到每個旋轉向量所屬的切片。這樣一來就需要找到最近鄰的值,這就需要局部敏感哈希(LSH)了,它能夠快速在高維空間中找到最近鄰。一個局部敏感哈希算法可以將每個向量 x 轉換爲 hash h(x),和這個 x 靠近的哈希更有可能有着相同的哈希值,而距離遠的則不會。在這裏,研究者希望最近的向量最可能得到相同的哈希值,或者 hash-bucket 大小相似的更有可能相同。

圖1:局部敏感哈希算法使用球投影點的隨機旋轉,通過argmax在有符號的軸投影上建立bucket。在這個高度簡化的2D描述中,對於三個不同的角哈希,兩個點x和y不太可能共享相同的哈希桶(上圖),除非它們的球面投影彼此接近(下圖)。

該圖演示了一個用4個桶進行3輪哈希的設置。下面的圖中的向量映射到了同一個bucket,因爲它們的輸入很接近,而上一張圖中的向量映射到第一個和最後一個bucket。

找到給定的向量選擇之後屬於哪個桶也可以看成是找到和輸入最一致的向量——下面是Reformer的代碼:


# simplified to only compute a singular hash

random_rotations = np.random.randn(hidden_dim, n_buckets // 2)

rotated_vectors = np.dot(x, random_rotations)

rotated_vectors = np.hstack([rotated_vectors, -rotated_vectors])

buckets = np.argmax(rotated_vectors, axis=-1)

把每個向量映射爲一個哈希值叫做局部敏感哈希,如果比較近的向量能以高概率映射到同一個哈希值,而比較遠的向量能以高概率被映射到不同的哈希值。爲了得到個不同的哈希值,我們隨機一個矩陣,大小爲[dimension, b/2],然後定義h(x) = arg max([xR;−xR]) [u;v]表示兩個向量的連接。這樣,對所有的,我們就可以把它們分配到個哈希桶裏面。

LSH attention:瞭解了我們的LSH方案和散列注意的一般思想之後,我們現在將正式定義我們在本文中使用的LSH注意。我們首先重寫了正常注意的公式(1),一次只查詢一個位置i:

我們引入Pi表示在位置i處查詢所處理的集合,z表示配分函數(即softmax中的規格化項)。爲了清晰,我們還省略了的縮放。

出於成批處理的目的,我們通常對更大的集合Pei={0,1,…l}⊇Pi,掩蓋元素不在Pi:

在爲每個token計算一個桶之後,將根據它們的桶對這些token進行排序,並將標準的點積注意力應用到桶中的token的塊上。

圖2:簡化的局部敏感哈希注意力,展示了 hash-bucketing、排序和分塊步驟,並最終實現注意力機制。

現在我們轉向LSH注意力,我們可以把它看作是通過只允許一個散列桶中的注意力來限制我可以關注的查詢位置的目標項的集合Pi。

圖2(a-b)顯示了全注意力與散列變體的示意圖比較。第(a)部分描述了全注意的注意矩陣通常是稀疏的,但是計算沒有利用這種稀疏性。在(b)中,查詢和鍵按照它們的散列桶排序。由於相似的物品很有可能落在同一個桶裏,所以只允許在每個桶裏集中注意力就可以近似地得到完整的注意力模式。

在這種格式中,散列桶的大小往往不均勻,這使得很難跨桶進行批處理。此外,一個bucket中的查詢數量和鍵的數量可能是不相等的——實際上,一個bucket可能包含許多查詢,但是沒有鍵。爲了緩解這些問題,我們首先通過設置來確保h(kj) = h(qj)。接下來,我們根據桶號對查詢進行排序,在每個桶內,根據序列位置對查詢進行排序;這定義了一個排序後i 7→si的排列。在排序後的注意矩陣中,來自同一桶的對將聚集在對角線附近(如圖2c所示)。我們可以採用成批處理的方法,其中m個連續的查詢塊(排序後)相互處理,一個塊返回(圖2d)。按照我們之前的符號,這對應於設置:

所以Reformer將Attention的複雜度降到了。Reformer是通過LSH(近似地)快速地找到最大的若干個Attention值,然後只去計算那若干個值。

詳細介紹參見之前的一篇: https://zhuanlan.zhihu.com/p/139220925

Sparse Attention

Longformer: The Long-Document Transformer

論文鏈接: https://arxiv.org/abs/2004.05150

代碼鏈接: https://github.com/allenai/longformergithub.com

圖1是原版自注意力(每個字符都能關注其他所有字符),圖2是基於CNN的局部自注意力(以窗口的形式移動,每個窗口內的字符可以互相關注),圖3是基於Dilated CNN的局部自注意力(跨越式滑動窗口),圖4是結合局部自注意力和全局自注意力的稀疏自注意力。其中,“全局”的意思是,讓小部分字符既能關注其他。

Sliding window attention

滑動窗口attention就是圍繞每一個token採用固定大小的窗口計算局部注意力。假設窗口大小是w,序列長度是n,那麼計算複雜度就是O(n*w),其中w遠小於n。

Dilated Sliding Window attention

空洞滑動窗口,窗口的縫隙大小是d,假設窗口大小是w,transformer的層數是l,那麼窗口能覆蓋到的範圍就是l*d*w。這種做法與CNN裏頭的空洞卷積類似。

Global + Sliding attention

圖中有大量的“白色方塊”,表示不需要關注,而隨着文本長度的增加,這種白色方塊的數量會呈平方級增加,所以實際上“綠色方塊”數量是很少的。

作者在一些預先選擇的位置上添加了全局注意力。在這些位置上,會對整個序列做attention。根據具體任務決定選擇位置:

  • 分類任務,global attention就使用[CLS]標籤上。

  • QA任務,整個句子上計算global attention。

詳細介紹參考: https://zhuanlan.zhihu.com/p/133491514

Synthesizer: Rethinking Self-Attention in Transformer Models

論文鏈接: https://arxiv.org/abs/2005.00743

Random Synthesized Attention

Factorized Random Synthesized Attention

Dense Synthesized Attention

Factorized Dense Synthesized Attention

詳細介紹參見: https://spaces.ac.cn/archives/7430

Sparse Attention

Generating Long Sequences with Sparse Transformers

論文鏈接: https://arxiv.org/abs/1904.10509

代碼鏈接: https://github.com/openai/sparse_attentiongithub.com

蘇劍林之前介紹過OpenAI的 Sparse Attention ,通過“只保留小區域內的數值、強制讓大部分注意力爲零”的方式,來減少Attention的計算量。

詳細介紹參見: https://spaces.ac.cn/archives/6853

Strided Attention 和Fixed Factorized Attention

論文鏈接: https://openreview.net/pdf?id=Hye87grYDH

Sparse Transformer 仍然是基於Transformer的框架。不同之處在於self attention的實現。通過top-k選擇,將注意退化爲稀疏注意。這樣,保留最有助於引起注意的部分,並刪除其他無關的信息。這種選擇性方法在保存重要信息和消除噪聲方面是有效的。注意力可以更多地集中在最有貢獻的價值因素上。

Single-Headed Attention

Single Headed Attention RNN: Stop Thinking With Your Head

論文鏈接: https://paperswithcode.com/paper/single-headed-attention-rnn-stop-thinking

代碼鏈接: Smerity/sha-rnngithub.com

模型是由幾個部分組成的:一個可訓練的嵌入層,一層或者多層堆疊的單頭注意力RNN (SHA-RNN) ,再加一個softmax分類器。

SHA-RNN用的是單頭的、基於指針的注意力 (Pointer Based Attention) ,借鑑了2017年作者本人領銜的研究;還包含一個改造過的前饋層,名叫“Boom”,帶有層歸一化。

SHA-RNN模型的注意力是簡化的,只留一個頭,唯一的矩陣乘法出現在query (下圖Q) 那裏,A是縮放點乘注意力 (Scaled Dot-Product Attention) ,是向量之間的運算。

前饋層(“Boom” Layer) 。用了一個v∈ℝH向量,又用矩陣乘法 (GeLU激活) 得到另一個向量。然後,把u向量分解成N個向量,再求和,得到向量。

Low-Rank Factorization-based Multi-Head Attention

論文鏈接: https://arxiv.org/pdf/1912.00835.pdf

圖1描述了模型的架構示意圖及其主要組成部分,包括句子提出了多線程注意機制LAMA,結構化句子嵌入,最後提出了MLP分類器。對單個單詞的注意力計算進行了演示。

基於低秩分解的多頭注意力機制( LAMA )是一種注意模塊,它使用低秩分解來降低計算複雜性。它使用低秩雙線性池來構造涉及句子多個方面的結構化句子表示。

Convolutional Block Attention Module

代碼鏈接:

https://github.com/Jongchan/attention-modulegithub.com

https://kobiso/CBAM-kerasgithub.com

https://github.com/kobiso/CBAM-tensorflow-slimgithub.com

詳細介紹參見: https://zhuanlan.zhihu.com/p/65529934

Attention Is All You Need

詳細介紹參見: http://jalammar.github.io/illustrated-transformer/jalammar.github.io

參考文獻

1、Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention

2、Linformer: Self-Attention with Linear Complexity

3、Reformer: The Efficient Transformer

4、Longformer: The Long-Document Transformer

5、Synthesizer: Rethinking Self-Attention in Transformer Models

6、Sparse Transformer

7、Generating Long Sequences with Sparse Transformers

8、Single Headed Attention RNN: Stop Thinking With Your Head

9、Low Rank Factorization for Compact Multi-Head Self-Attention

10、Convolutional Block Attention Module

11、[Attention Is All You Need(https://arxiv.org/pdf/1706.03762.pdf)

推薦閱讀

添加極市小助手微信 (ID : cv-mart) ,備註: 研究方向-姓名-學校/公司-城市 (如:目標檢測-小極-北大-深圳),即可申請加入 極市技術交流羣 ,更有 每月大咖直播分享、真實項目需求對接、求職內推、算法競賽、 乾貨資訊彙總、行業技術交流 一起來讓思想之光照的更遠吧~

△長按添加極市小助手

△長按關注極市平臺,獲取 最新CV乾貨

覺得有用麻煩給個在看啦~   

相關文章