注意力機制整理


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來得出的。

這個公式很難理解,首先將上述的這個公式簡化為

[公式]

然后我們可以一點點拆分這個公式進行分析

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要做的一個額外的步驟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM