attention機制原多用於NLP領域,是谷歌提出的transformer架構中的核心概念。現在cv領域也開始越來越多的使用這種方法。本次分享對注意力機制進行了相關的梳理,旨在幫助大家入門attention機制,初步了解attention的結構以及背后原理。
1. attention概念
1.1 什么是attention
attention機制可以認為它是一種資源分配的機制,可以理解為對於原本平均分配的資源根據attention對象的重要程度重新分配資源,重要的單位就多分一點,不重要或者不好的單位就少分一點,在深度神經網絡的結構設計中,attention所要分配的資源基本上就是權重了。
視覺注意力分為幾種,核心思想是基於原有的數據找到其之間的關聯性,然后突出其某些重要特征。
最近讀了一些論文,目前接觸過的有
- 通道注意力 (CBAM: Convolutional Block Attention Module)
- 時間注意力 (EDVR: Video Restoration with Enhanced Deformable Convolutional Networks)
- 空間注意力 (CBAM: Convolutional Block Attention Module)
- 軟注意力 (Learning Texture Transformer Network for Image Super-Resolution)
- 硬注意力 (Learning Texture Transformer Network for Image Super-Resolution)
括號里是提出的論文,感興趣的同學可以自己了解
1.2 為什么要用attention
attention會參考各個特征之間的關系,從而分配權重。對比起RNN網絡attention能夠並行化處理。
2. Self-Attention
2.1 Self-Attention的簡單理解
可以理解位將隊列和一組值與輸入對應,即形成querry,key,value向output的映射,output可以看作是value的加權求和,加權值則是由Self-Attention來得出的。

這個公式很難理解,首先將上述的這個公式簡化為
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1Tb2Z0bWF4JTI4WFglNUVUJTI5WA==.png)
然后我們可以一點點拆分這個公式進行分析
1.\(XX^T\)代表什么
一個矩陣\(X\)乘以它自己的轉置\(X^T\),矩陣可以看作由一些向量組成,一個矩陣乘以它自己轉置的運算,其實可以看成這些向量分別與其他向量計算內積。
向量的內積,其幾何意義是什么?
答:表征兩個向量的夾角,表征一個向量在另一個向量上的投影 ,投影的值大,說明兩個向量相關度高。
向量之間相關度高表示什么?是不是在一定程度上(不是完全)表示,在特征A的時候,應當給予特征B更多的關注?
2.Softmax的意義

至此,我們理解了公式
中,
的意義。
我們進一步,Softmax的意義何在呢?

答:歸一化
我們結合上面圖理解,Softmax之后,這些數字的和為1了。我們再想,Attention機制的核心是什么?
加權求和
那么權重從何而來呢?就是這些歸一化之后的數字。
在該圖中,我們以一個“早上好”作為矩陣\(X\),並以此進行計算\(XX^T\),然后通過\(softmax\),得到每個字相關的權重。即當我們關注"早"這個字的時候,我們應當分配0.4的注意力給它本身,剩下0.4關注"上",0.2關注"好"。
2.2 Self-Attention的具體實施細節
下圖就是Self-Attention的計算機制。已知輸入的單詞embedding,即\(x_1\)和\(x_2\),想轉換成\(z_1\)和\(z_2\)。

step 1. 特征向量X
step 2. 計算Q,K,V
先把x1轉換成三個不一樣的向量,分別叫做q1、k1、v1,然后把x2轉換成三個不一樣的向量,分別叫做q2、k2、v2。那把一個向量變換成另一個向量的最簡單的方式是什么?就是乘以矩陣進行變換了。所以,需要三個不同的矩陣Wq、Wk、Wv,即


step 3. 計算組合權重
有了q1、k1、v11和q2、k2、v2,怎么才能得到z1和z2呢?計算過程是這樣子的:我們用v1和v2兩個向量的線性組合,來得到z1和z2,即

那怎么才能得到組合的權重 θ呢?有


通過上述的整個流程,就可以把輸入的x1和x2轉換成了z1和z2。這就是Self-Attention機制。


Note
注意,上式中的\(d_k\)是向量q或k的維度,這兩個向量的維度一定是一樣的,因為要做點積。但是v的維度和向量q或k的維度不一定相同。上式為什么要除以\(d_k\)呢?因為為了防止維數過高時\(QK^T\)的值過大導致softmax函數反向傳播時發生梯度消失。那為什么是\(\sqrt{d_k}\)而不是\(d_k\)呢?這就是個經驗值,從理論上來說,就是還需要讓\(QK^T\)的值適度增加,但不能過度增加,如果是\(d_k\)的話,可能就不增加了。
2.3 如何理解Q,K,V向量
講到這里,你肯定很困惑為什么要有q、k、v向量,因為這個思路來自於比較早的信息檢索領域,q就是query,k就是key,v就是值,(k,v)就是鍵值對、也就是用query關鍵詞去找到最相關的檢索結果。
舉個例子,假設query是5G,然后k-v鍵值對有
k-v: 5G : Huawei
k-v: 4G : Nokia
那query(5G)和key(5G)的相關性是100%,和key(4G)的相關性是50%。這就是為什么用query,key,value這種概念。
2.4 attention 與 self-attention對比
以Encoder-Decoder框架為例,輸入Source和輸出Target內容是不一樣的,比如對於英-中機器翻譯來說,Source是英文句子,Target是對應的翻譯出的中文句子,Attention發生在Target的元素Query和Source中的所有元素之間。
Self Attention,指的不是Target和Source之間的Attention機制,而是Source內部元素之間或者Target內部元素之間發生的Attention機制,也可以理解為Target=Source這種特殊情況下的Attention。
兩者具體計算過程是一樣的,只是計算對象發生了變化而已。
2.5. 擴展 Multi-Head Attention
如果用不同的\(W^Q\)、\(W^K\)、\(W^v\),就能得到不同的Q、K、V。multi-headed Attention就是指用了很多個不同的\(W^Q\)、\(W^K\)、\(W^v\)。

那這樣的好處是什么呢?可以讓Attention有更豐富的層次。有多個Q,K,V的話,可以分別從多個不同角度來看待Attention。這樣的話,輸入x,對於不同的multi-headed Attention,就會產生不同的z

那現在一個x就有了多個版本的z,那該怎么結合為一個z呢?
那就將多個版本的z拼接稱為一個長向量,然后用一個全連接網絡,即乘以一個矩陣,就能得到一個短的z向量。

把multi-headed輸出的不同的,組合成最終想要的輸出的,這就是multi-headed Attention要做的一個額外的步驟。

