【自然語言處理】:自注意力機制(self-attention)原理介紹


一.最常見的self-attention  

  對於自注意力機制而言,我們有的時候會遇到詞性分類的任務,比如說給定一句話,我想知道這句話當中每一個單詞的詞性。但是使用雙向lstm呢,會有很多信息被忽略掉,尤其是一些位於后面的詞很可能前面的詞對它的影響沒有那么大,即使我們的lstm考慮了一些遺忘門,增強記憶的一些機制,位於最前面的單詞和最后面的單詞之間始終是具有一定距離的,而self-attnetion則可以直接對收尾的單詞計算其相關性,沒有任何的數據損失。因此我們可以采用自注意力機制,也就是self-attention來解決這個問題。同時self-attention在transformer當中也有着廣泛的應用。

 

 

   如上圖所示,藍色部分表示self-attention,首先我們self-attention找到每一個向量之間的聯系,看是否考慮某一個向量對第一個向量a1會產生影響。而我們可以通過如下的方法來計算兩個向量之間的相關聯程度。如下圖所示:

 

 

  首先,我們拿到綠色的部分 。綠色的部分表示的就是我們輸入的向量,a1和a2 ,灰色的Wq和Wk表示我們用a1去和Wq相乘,得到一個向量q,然后使用a2和Wk相乘,得到一個數值k。最后使用q和k進行一個dot product。得到我們的a,a也就是表示兩個向量之間的相關聯程度。在 transformer當中使用了這樣的結構來計算向量之間的相關聯性。另外一種方法我們有事也會用到,如下圖所示:

 

 這種機制也是想相乘,后相加,然后使用tanh投射到一個新的函數空間內,再相乘,得到最后的結果。我們對每一個輸入的向量都做這樣的操作。

當然在得到這個相關程度的結果之后,我們使用softmax計算出一個attention distribution。當然你也可以使用relu來計算,完全看你自己的意願了。擁有了這個attention distribution我們就知道了哪些向量和我們的a1是最有關系的。

 

 接下來,就來到了我們self-attention當中的一個難點,既然我們目前已經得到了每一個向量和a1之間的相關聯程度,那么我們通過這些相關聯的程度,再做一次計算。得到一個唯一的數值,再將所有的相關聯程度和這個唯一的數值b1相比較,就可以得到最終我們某個向量和某個向量之間的相似程度了。越接近b1的數值,那么我們就越和a1相似。

 

 如上圖所示,我們使用新的矩陣WV乘上原始矩陣a1,得到一個新的矩陣v1,然后這個矩陣a1再和上main的矩陣相乘,最后每一個向量都做這樣的一個操作,就可以得到最后的矩陣,也就是b1了!

二.Multi-Head Self-Attention

在transformer當中,其中應用最廣泛的一種self-attention機制,還有一種叫做multi-head self-attention。

這種attention也就是說,對於同一個向量a而言,我們可以具備多組q,k,v來描述a這同一個向量。之前我們僅僅才用了一組q,k,v來描述我們的向量。采用多組向量之后,我們分別對每一組進行計算其b的值,如果有兩組,則有兩個b的值。如下圖所示:

 

由於這張圖我們只對v2做了一個weighted sum,得到一個b1的值。當然我們由於兩組這樣的值,因此我們會得到兩個b值。最后的結果如下所示

最后我們將兩個b的值一起乘以一個矩陣W0,得到最終的bi的值,也就是這個self- attention向量ai的輸出。

三.Positional Encoding

由於我們在訓練self attention的時候,實際上對於位置的信息是缺失的,對於lstm或者rnn而言,位置的信息是非常明顯的。因此我們可以對每個輸入的向量進行positianl encoding,也就是說,在每個輸入的向量之間我們可以新建立一個向量,對我們的position進行相應的描述。下面是positianl encoding的一個定義:

 

 也就是說我們可以在插入向量的左邊,插入一個有關位置信息的向量ei,插入后的向量如下所示:

而這個技術經常會在我們的transformer當中所采用到。


免責聲明!

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



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