Attention機制詳解(二)——Self-Attention與Transformer


Transformer模型詳解(圖解最完整版) - 初識CV的文章 - 知乎 https://zhuanlan.zhihu.com/p/338817680    一篇transformer詳細介紹

RNN由於其順序結構訓練速度常常受到限制,既然Attention模型本身可以看到全局的信息, 那么一個自然的疑問是我們能不能去掉RNN結構,僅僅依賴於Attention模型呢,這樣我們可以使訓練並行化,同時擁有全局信息?

這一篇就主要根據谷歌的這篇Attention is All you need論文來回顧一下僅依賴於Attention機制的Transformer架構,並結合Tensor2Tensor源代碼進行解釋。

直觀理解與模型整體結構

先來看一個翻譯的例子“I arrived at the bank after crossing the river” 這里面的bank指的是銀行還是河岸呢,這就需要我們聯系上下文,當我們看到river之后就應該知道這里bank很大概率指的是河岸。在RNN中我們就需要一步步的順序處理從bank到river的所有詞語,而當它們相距較遠時RNN的效果常常較差,且由於其順序性處理效率也較低。Self-Attention則利用了Attention機制,計算每個單詞與其他所有單詞之間的關聯,在這句話里,當翻譯bank一詞時,river一詞就有較高的Attention score。利用這些Attention score就可以得到一個加權的表示,然后再放到一個前饋神經網絡中得到新的表示,這一表示很好的考慮到上下文的信息。如下圖所示,encoder讀入輸入數據,利用層層疊加的Self-Attention機制對每一個詞得到新的考慮了上下文信息的表征。Decoder也利用類似的Self-Attention機制,但它不僅僅看之前產生的輸出的文字,而且還要attend encoder的輸出。以上步驟如下動圖所示:

Transformer模型的整體結構如下圖所示

這里面Multi-head Attention其實就是多個Self-Attention結構的結合,每個head學習到在不同表示空間中的特征,如下圖所示,兩個head學習到的Attention側重點可能略有不同,這樣給了模型更大的容量。

Self-Attention詳解

了解了模型大致原理,我們可以詳細的看一下究竟Self-Attention結構是怎樣的。其基本結構如下

對於self-attention來講,Q(Query), K(Key), V(Value)三個矩陣均來自同一輸入,首先我們要計算Q與K之間的點乘,然后為了防止其結果過大,會除以一個尺度標度 [公式] ,其中 [公式] 為一個query和key向量的維度。再利用Softmax操作將其結果歸一化為概率分布,然后再乘以矩陣V就得到權重求和的表示。該操作可以表示為 [公式]

這里可能比較抽象,我們來看一個具體的例子(圖片來源於,該博客講解的極其清晰,強烈推薦),假如我們要翻譯一個詞組Thinking Machines,其中Thinking的輸入的embedding vector用 [公式] 表示,Machines的embedding vector用 [公式] 表示。

當我們處理Thinking這個詞時,我們需要計算句子中所有詞與它的Attention Score,這就像將當前詞作為搜索的query,去和句子中所有詞(包含該詞本身)的key去匹配,看看相關度有多高。我們用 [公式] 代表Thinking對應的query vector, [公式][公式] 分別代表Thinking以及Machines對應的key vector,則計算Thinking的attention score的時候我們需要計算 [公式][公式] 的點乘,同理,我們計算Machines的attention score的時候需要計算[公式][公式] 的點乘。如上圖中所示我們分別得到了[公式][公式] 的點乘積,然后我們進行尺度縮放與softmax歸一化,如下圖所示:

顯然,當前單詞與其自身的attention score一般最大,其他單詞根據與當前單詞重要程度有相應的score。然后我們在用這些attention score與value vector相乘,得到加權的向量。

如果將輸入的所有向量合並為矩陣形式,則所有query, key, value向量也可以合並為矩陣形式表示

其中 [公式] 是我們模型訓練過程學習到的合適的參數。上述操作即可簡化為矩陣形式

而multihead就是我們可以有不同的Q,K,V表示,最后再將其結果結合起來,如下圖所示:

這就是基本的Multihead Attention單元,對於encoder來說就是利用這些基本單元疊加,其中key, query, value均來自前一層encoder的輸出,即encoder的每個位置都可以注意到之前一層encoder的所有位置。

對於decoder來講,我們注意到有兩個與encoder不同的地方,一個是第一級的Masked Multi-head,另一個是第二級的Multi-Head Attention不僅接受來自前一級的輸出,還要接收encoder的輸出,下面分別解釋一下是什么原理。

第一級decoder的key, query, value均來自前一層decoder的輸出,但加入了Mask操作,即我們只能attend到前面已經翻譯過的輸出的詞語,因為翻譯過程我們當前還並不知道下一個輸出詞語,這是我們之后才會推測到的。

而第二級decoder也被稱作encoder-decoder attention layer,即它的query來自於之前一級的decoder層的輸出,但其key和value來自於encoder的輸出,這使得decoder的每一個位置都可以attend到輸入序列的每一個位置。

總結一下,k和v的來源總是相同的,q在encoder及第一級decoder中與k,v來源相同,在encoder-decoder attention layer中與k,v來源不同。

論文其他細節解讀

我們再來看看論文其他方面的細節,一個使position encoding,這個目的是什么呢?注意由於該模型沒有recurrence或convolution操作,所以沒有明確的關於單詞在源句子中位置的相對或絕對的信息,為了更好的讓模型學習位置信息,所以添加了position encoding並將其疊加在word embedding上。該論文中選取了三角函數的encoding方式,其他方式也可以,該研究組最近還有relation-aware self-attention機制,可參考這篇論文[1803.02155] Self-Attention with Relative Position Representations

再來看看模型中這些Add & Norm模塊的作用。

其中Add代表了Residual Connection,是為了解決多層神經網絡訓練困難的問題,通過將前一層的信息無差的傳遞到下一層,可以有效的僅關注差異部分,這一方法之前在圖像處理結構如ResNet等中常常用到。

而Norm則代表了Layer Normalization,通過對層的激活值的歸一化,可以加速模型的訓練過程,使其更快的收斂,可參考這篇論文Layer Normalization

轉載:https://zhuanlan.zhihu.com/p/47282410


免責聲明!

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



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