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

2020-12-16 騰訊網

新智元報導

來源: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/

相關焦點

  • 包學包會,這些動圖和代碼讓你一次讀懂「自注意力」
    BERT 及其多種變體已經在多種語言理解任務上取得了非常出色的表現,這些架構全都基於 Transformer,而 Transformer 又使用了一種名為「自注意力」的方法。 本文將通過圖示和代碼對自注意力機制進行透徹的解讀。 當然,在閱讀本文之前,你可能也想了解什麼是注意力機制。
  • 一文解讀NLP中的注意力機制
    NLP中注意力機制隨著注意力機制的廣泛應用,在某種程度上緩解了源序列和目標序列由於距離限制而難以建模依賴關係的問題。現在已經湧現出了一大批基於基本形式的注意力的不同變體來處理更複雜的任務。Self-Attention(自注意力),也稱為intra-attention(內部注意力),是關聯單個序列的不同位置的注意力機制,以便計算序列的交互表示。它已被證明在很多領域十分有效比如機器閱讀,文本摘要或圖像描述生成。
  • 圖解神經機器翻譯中的注意力機制
    深紫色表示注意力得分更高。(圖源:https://distill.pub/2016/augmented-rnns/#attentional-interfaces)[2] 中有兩種類型的注意力機制。使用所有編碼器隱藏狀態的注意力類型也稱為全局注意力。而局部注意力僅使用編碼器隱藏狀態的子集。
  • 代碼詳解:從頭開始學習注意力機制!
    相反,人類將注意力集中於局部視覺空間,以便在需要的時間和場合獲取信息並對不同時段的信息進行合併,構建內在場景表現,指導日後的注意力分配及決策過程。《視覺注意循環模型》,2014本文將探討如何實施注意力,以及在實施過程如何脫離更大的模型。這是因為在現實模型中實施注意力時,很多時的重點在於管理數據與控制不同的向量,而非注意力本身。
  • 圖深度學習入門教程(六)——注意力機制與圖注意力
    Transformer 超脫於其中,是第一個使用自注意力機制,徹底擺脫循環或卷積神經網絡依賴的模型。其結構如下 自注意力機制自注意力機制又叫內部注意力機制,用於發現序列數據的內部特徵。具體做法是將Q、K、V都變成X。即Attention(X,X,X)。使用多頭注意力機制訓練出的自注意力特徵可以用於Seq2Seq模型(輸入輸出都是序列數據的模型,會在下冊詳細介紹)、分類模型等各種任務,並能夠得到很好的效果,即Y=MultiHead(X,X,X)。
  • 自注意力機制(Self-Attention)的基本知識
    自2017年發布以來,他們已經佔領了seq2seq的主流架構(LSTMs),幾乎無所不在地出現在任何關於NLP突破的新聞中(比如OpenAI的GPT-2甚至出現在主流媒體上!)。圖1:機器翻譯 英->德本篇將作為一個非常溫和、漸進的介紹Transformer架構背後的數學、代碼和概念。
  • 資源|帶自注意力機制的生成對抗網絡,實現效果怎樣?
    在前一段時間,Han Zhang 和 Goodfellow 等研究者提出添加了自注意力機制的生成對抗網絡,這種網絡可使用全局特徵線索來生成高解析度細節。本文介紹了自注意力生成對抗網絡的 PyTorch 實現,讀者也可以嘗試這一新型生成對抗網絡。
  • 圖解谷歌神經機器翻譯核心部分:注意力機制
    可以這麼說,沒有注意力機制,機器翻譯的水平只有60-70分。有了注意力機制,翻譯的水平就能夠達到80-90分了。它是如何發揮作用的呢?很多人一解釋起來,就是鋪天蓋地的數學公式,讓人還沒來得及看,就直接懵逼了。
  • 一文讀懂Attention機制
    Attention 的本質是什麼Attention機制源自於人類視覺注意力機制:將有限的注意力集中在重點信息上,「從關注全部到關注重點」,從而節省資源,快速獲得最有效的信息。對於Attention而言,就是一種權重參數的分配機制,目標是協助模型捕捉重要信息,「帶權求和」就可以高度概括,在不同的 context 下,focusing 不同的信息。
  • 直播預告 | ICCV Oral:語義分割中的自注意力機制和低秩重建
    雷鋒網AI研習社按:本周五(10月25日)晚8:00點,「大講堂」第128講邀請到了北京大學計算機應用技術碩士李夏來分享,本場主題為「語義分割中的自注意力機制和低秩重建」上一期我們主要聚焦通用醫學影像三維預訓練模型「Models Genesis」,這次我們來講講語義分割,本次分享依舊對AI研習社成員免費開放。
  • 視覺注意力機制 | 視覺注意力機制用於分類:SENet、CBAM、SKNet
    點擊上方「AI算法修煉營」,選擇加星標或「置頂」標題以下,全是乾貨前面的話上次文章中,我們主要關注了視覺應用中的Self-attention機制及其應用——Non-local網絡模塊,從最開始的了解什麼是視覺注意力機制到對自注意力機制的細節把握,再到Non-local模塊的學習。
  • 一文讀懂「Attention is All You Need」| 附代碼實現
    而在 Google 的論文中,大部分的 Attention 都是 Self Attention,即「自注意力」,或者叫內部注意力。 所謂 Self Attention,其實就是 Attention(X,X,X),X 就是前面說的輸入序列。也就是說,在序列內部做 Attention,尋找序列內部的聯繫。
  • 完全圖解GPT-2:看完這篇就夠了(二)
    在本文中,我們將詳細介紹 GPT-2 所使用的自注意力機制,並分享只包含解碼器的 transformer 模型的精彩應用。第二部分:圖解自注意力機制在前面的文章中,我們用這張圖來展示了自注意力機制在處理單詞「it」的層中的應用:在本節中,我們會詳細介紹該過程是如何實現的。
  • 循環神經網絡的增強方法:注意力機制以及更多
    雷鋒網 AI 科技評論按:一提起 RNN,我們最容易想到的實現就是 LSTM + attention。LSTM 作為經典的網絡結構可謂是老當益壯,而另一方面注意力機制過於常見,我們甚至會覺得它是「理所當然的」。但其實注意力機制其實並不是唯一一種網絡增強的方式。
  • 深入理解圖注意力機制(Graph Attention Network)
    作為一種代表性的圖卷積網絡,Graph Attention Network (GAT) 引入了注意力機制來實現更好的鄰居聚合。通過學習鄰居的權重,GAT 可以實現對鄰居的加權聚合。因此,GAT 不僅對於噪音鄰居較為魯棒,注意力機制也賦予了模型一定的可解釋性。下圖概述了 Graph Attention Network 主要做的事情。
  • 哈佛大學提出變分注意力:用VAE重建注意力機制
    注意力 (attention) 模型在神經網絡中被廣泛應用,不過注意力機制一般是決定性的而非隨機變量。一、背景近年來很多論文將 VAE 應用到文本生成上,通過引入隱變量對不確定性進行建模。為了解決這個問題,在哈佛研究人員的工作中,注意力被建模成隱變量,由於解碼器 (decoder) 和解碼器 (encoder) 之間的主要信息傳輸通道是通過注意力來傳輸的,如果忽略了這個隱變量,就會因無法得到源文本的信息而得到很大的懲罰 (penalty)(這相比之前的許多工作中直接把隱變量加入到每個解碼步驟不同,因為那樣即使解碼器忽略了隱變量,也可以達到很好的模型表現
  • 獨家 | 一文讀懂Adaboost
    【集成學習】系列往期回顧:獨家 | 一文讀懂集成學習(附學習資源) 參考資料:1. 李航.《統計學習方法》2. 周志華.《機器學習》3. 曹瑩,苗啟廣,劉家辰,高琳. AdaBoost 算法研究進展與展望.
  • 一文讀懂深度學習文本分類方法
    由於句子中的每個單詞對於句子表示並不是同等的貢獻,因此,作者引入注意力機制來提取對句子表示有重要意義的詞彙,並將這些信息詞彙的表徵聚合起來形成句子向量。同樣地,為了獎勵對文檔進行正確分類的線索句,作者再次使用注意力機制,來衡量句子的重要性,得到文檔向量。最後將文檔向量均輸入到softmax層,得到標籤的概率分布。
  • 一文讀懂Python裝飾器
    打開APP 一文讀懂Python裝飾器 工程師3 發表於 2018-04-28 10:48:00 先來看一個簡單例子,雖然實際代碼可能比這複雜很多:
  • 獨家 | 一文讀懂Hadoop(三):Mapreduce
    讀者可以通過閱讀「一文讀懂Hadoop」系列文章,對Hadoop技術有個全面的了解,它涵蓋了Hadoop官網的所有知識點,並且通俗易懂,英文不好的讀者完全可以通過閱讀此篇文章了解Hadoop。本期獨家內容「一文讀懂Hadoop」系列文章先介紹Hadoop,繼而分別詳細介紹HDFS、MAPREDUCE、YARN的所有知識點,分為四期內容在近幾天推送。敬請關注後續內容。