當前位置:
首頁 > 新聞 > 一文讀懂自注意力機制:8大步驟圖解+代碼

一文讀懂自注意力機制:8大步驟圖解+代碼

新智元報道

來源:towardsdatascience

作者:Raimi Karim 編輯:肖琴

【新智元導讀】NLP領域最近的快速進展離不開基於Transformer的架構,本文以圖解 代碼的形式,帶領讀者完全理解self-attention機制及其背後的數學原理,並擴展到Transformer。來新智元AI朋友圈和AI大咖們一起討論吧。

BERT, RoBERTa, ALBERT, SpanBERT, DistilBERT, SesameBERT, SemBERT, MobileBERT, TinyBERT, CamemBERT……它們有什麼共同之處呢?答案不是「它們都是BERT」。

正確答案是:self-attention

我們討論的不僅是名為「BERT」的架構,更準確地說是基於Transformer的架構。基於Transformer的架構主要用於建模語言理解任務,它避免了在神經網路中使用遞歸,而是完全依賴於self-attention機制來繪製輸入和輸出之間的全局依賴關係。但這背後的數學原理是什麼呢?

這就是本文要講的內容。這篇文章將帶你通過一個self-attention模塊了解其中涉及的數學運算。讀完本文,你將能夠從頭開始寫一個self-attention模塊。

讓我們開始吧!

完全圖解——8步掌握self-attention

self-attention是什麼?

如果你認為self-attention與attention有相似之處,那麼答案是肯定的!它們基本上共享相同的概念和許多常見的數學運算。

一個self-attention模塊接收n個輸入,然後返回n個輸出。這個模塊中發生了什麼呢?用外行人的話說,self-attention機制允許輸入與輸入之間彼此交互(「self」),並找出它們應該更多關注的對象(「attention」)。輸出是這些交互和注意力得分的總和。

寫一個self-attention模塊包括以下步驟

準備輸入

初始化權重

推導key, query 和 value

計算輸入1的注意力得分

計算softmax

將分數與值相乘

將權重值相加,得到輸出1

對輸入2和輸入3重複步驟4-7

註:實際上,數學運算是矢量化的,,即所有的輸入都一起經曆數學運算。在後面的代碼部分中可以看到這一點。

步驟1:準備輸入

圖1.1: 準備輸入

在本教程中,我們從3個輸入開始,每個輸入的維數為4。

步驟2:初始化權重

每個輸入必須有三個表示(見下圖)。這些表示稱為鍵(key,橙色)查詢(query,紅色)值(value,紫色)。在本例中,我們假設這些表示的維數是3。因為每個輸入的維數都是4,這意味著每組權重必須是4×3。

註:

稍後我們將看到value的維度也是輸出的維度。

圖1.2:從每個輸入得出鍵、查詢和值的表示

為了得到這些表示,每個輸入(綠色)都乘以一組鍵的權重、一組查詢的權重,以及一組值的權重。在本示例中,我們將三組權重「初始化」如下。

key的權重:

query的權重:

value的權重:

註:

在神經網路設置中,這些權重通常是很小的數字,使用適當的隨機分布(例如高斯、Xavier和Kaiming分布)進行隨機初始化。

步驟3:推導鍵、查詢和值

現在,我們有了三組權重,讓我們實際獲取每個輸入的鍵、查詢和值表示。

輸入1的鍵表示:

使用相同的權重集合得到輸入2的鍵表示:

使用相同的權重集合得到輸入3的鍵表示:

一種更快的方法是對上述操作進行矢量化:

圖1.3a:從每個輸入推導出鍵表示

同樣的方法,可以獲取每個輸入的值表示:

圖1.3b:從每個輸入推導出值表示

最後,得到查詢表示

圖1.3b:從每個輸入推導出查詢表示

註:

在實踐中,偏差向量(bias vector )可以添加到矩陣乘法的乘積。

步驟4:計算輸入1的attention scores

圖1.4:從查詢1中計算注意力得分(藍色)

為了獲得注意力得分,我們首先在輸入1的查詢(紅色)和所有(橙色)之間取一個點積。因為有3個表示(因為有3個輸入),我們得到3個注意力得分(藍色)。

註:現在只使用Input 1中的查詢。稍後,我們將對其他查詢重複相同的步驟。

步驟5:計算softmax

圖1.5:Softmax注意力評分(藍色)

在所有注意力得分中使用softmax(藍色)。

步驟6:將得分和值相乘

圖1.6:由值(紫色)和分數(藍色)的相乘推導出加權值表示(黃色)

每個輸入的softmaxed attention 分數(藍色)乘以相應的值(紫色)。結果得到3個對齊向量(黃色)。在本教程中,我們將它們稱為加權值

步驟7:將加權值相加得到輸出1

圖1.7:將所有加權值(黃色)相加,得到輸出1(深綠色)

將所有加權值(黃色)按元素指向求和:

結果向量[2.0,7.0,1.5](深綠色)是輸出1,該輸出基於輸入1與所有其他鍵(包括它自己)進行交互的查詢表示。

步驟8:重複輸入2和輸入3

現在,我們已經完成了輸出1,我們對輸出2和輸出3重複步驟4到7。接下來相信你可以自己操作了。

圖1.8:對輸入2和輸入3重複前面的步驟

代碼上手

這是PyTorch代碼,PyTorch是Python的一個流行的深度學習框架。

步驟1:準備輸入

步驟2:初始化權重

步驟3: 推導鍵、查詢和值

步驟4:計算注意力得分

步驟5:計算softmax

步驟6:將得分和值相乘

步驟7:求和加權值

擴展到Transformer

那麼,接下來怎麼辦呢?Transformer

的確,我們生活在一個深度學習研究和高計算資源的激動人心的時代。Transformer是Attention is All You Need裡面提出的,最初用於執行神經機器翻譯。研究人員在此基礎上進行了重組、切割、添加和擴展,並將其應用到更多的語言任務中。

在這裡,我將簡要地介紹如何將self-attention擴展到Transformer架構。

在self-attention模塊中:

Dimension

Bias

self-attention模塊的輸入:

Embedding module

Positional encoding

Truncating

Masking

增加更多的self-attention模塊:

Multihead

Layer stacking

self-attention模塊之間的模塊:

Linear transformations

LayerNorm

這就是所有了!希望你覺得內容簡單易懂。

參考文獻:

Attention Is All You Need

https://arxiv.org/abs/1706.03762

The Illustrated Transformer

https://jalammar.github.io/illustrated-transformer/

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!


請您繼續閱讀更多來自 新智元 的精彩文章:

AI燃到爆!中關村人工智慧產業論壇十位大咖演講乾貨
馬斯克、馬雲「二馬對話」完整記錄!馬化騰反對產業割裂和技術脫鉤