包學包會,這些動圖和代碼讓你一次讀懂「自注意力」

2021-01-09 手機鳳凰網

BERT 及其多種變體已經在多種語言理解任務上取得了非常出色的表現,這些架構全都基於 Transformer,而 Transformer 又使用了一種名為「自注意力」的方法。 本文將通過圖示和代碼對自注意力機制進行透徹的解讀。 當然,在閱讀本文之前,你可能也想了解什麼是注意力機制。 沒有問題,同一位作者機器學習工程師 Raimi Karim 之前已經通過類似的方式解讀過了: 。

BERT、RoBERTa、ALBERT、SpanBERT、DistilBERT、SesameBERT、SemBERT、MobileBERT、TinyBERT 和 CamemBERT 有什麼共同點?別說「BERT」,那不是我想要的答案。

答案:自注意力(self-attention)。

我們要探討的不僅是名字裡面帶有「BERT」的架構,而是「基於 Transformer」的架構。基於 Transformer 的架構主要用在語言理解任務的建模中;這種架構沒有使用神經網絡中的循環(recurrence)來學習輸入和輸出之間的全局依賴關係,而是完全依靠自注意力。

但自注意力背後的數學原理是怎樣的呢?

這就是本文所要探討的主題。本文的主要內容是帶你縱覽自注意力模塊中所涉及的數學運算。你在讀完本文之後,應該就有能力從頭開始編寫自注意力模塊代碼了。

本文的目標不是提供自注意力模塊中不同數值運算和數學運算背後的直觀理解和解讀,也不是為了說明 Transformer 中使用自注意力的原因和方式(這方面的解釋網上能找到很多)。本文也不會刻意說明注意力(attention)和自注意力的差別。

自注意力是什麼?

你可能會想自注意力與注意力可能有相似之處,你的想法是對的!它們的概念基本一樣,也有很多共同的數學運算。

自注意力模塊有 n 個輸入,並會返回 n 個輸出。這個模塊中發生了什麼?用門外漢的話來說,自注意力機制讓每個輸入都會彼此交互(自),然後找到它們應該更加關注的輸入(注意力)。自注意力模塊的輸出是這些交互的聚合和注意力分數。

圖示

下面將按照以下步驟通過圖示來說明自注意力:

1. 準備輸入

2. 初始化權重

3. 推導鍵(key)、查詢(query)和值(value)

4. 計算輸入 1 的注意力分數

5. 計算 softmax

6. 將分數與值相乘

7. 對加權的值求和,得到輸出 1

8. 為輸入 2 和 3 重複 4-7 步驟

備註:在實踐中,這些數學運算是經過向量化的,即所有輸入會一起經歷這樣的數學運算。我們會在後面的代碼章節看到這一點。

第一步:準備輸入

圖 1.1:準備輸入。

為了方便說明,我們先來 3 個輸入,每個輸入的維度為 4.

Input 1: [1, 0, 1, 0]

Input 2: [0, 2, 0, 2]

Input 3: [1, 1, 1, 1]

第二步:初始化權重

每個輸入必須有 3 個表徵(見下圖)。這些表徵被稱為鍵(key,橙色)、查詢(query,紅色)和值(value,紫色)。在此示例中,我們設這些表徵的維度為 3。因為每個輸入的維度為 4,所以這意味著每組權重的形狀為 4×3。

備註:後面我們會看到,值的維度也就是輸出的維度。

圖 1.2:為每個輸入推導鍵、查詢和值。

為了得到這些表徵,每個輸入(綠色)都要與一組鍵的權重、一組查詢的權重、一組值的權重相乘。在這個示例中,我們按如下方式初始化這三個權重:

鍵的權重:

[[0, 0, 1],

[1, 1, 0],

[0, 1, 0],

[1, 1, 0]]

查詢的權重:

[[1, 0, 1],

[1, 0, 0],

[0, 0, 1],

[0, 1, 1]]

值的權重:

[[0, 2, 0],

[0, 3, 0],

[1, 0, 3],

[1, 1, 0]]

備註:在神經網絡設置中,這些權重通常是較小的數值,初始化也是使用合適的隨機分布來實現,比如高斯分布、Xavier 分布、Kaiming 分布。

第三步:推導鍵、查詢和值

現在我們有三組權重了,我們來實際求取每個輸入的鍵、查詢和值的表徵:

輸入 1 的鍵表徵:

[0, 0, 1]

[1, 0, 1, 0] x [1, 1, 0] = [0, 1, 1]

[0, 1, 0]

[1, 1, 0]

使用同樣一組權重求取輸入 2 的鍵表徵:

[0, 0, 1]

[0, 2, 0, 2] x [1, 1, 0] = [4, 4, 0]

[0, 1, 0]

[1, 1, 0]

使用同樣一組權重求取輸入 3 的鍵表徵:

[0, 0, 1]

[1, 1, 1, 1] x [1, 1, 0] = [2, 3, 1]

[0, 1, 0]

[1, 1, 0]

向量化以上運算能實現更快的速度:

[0, 0, 1]

[1, 0, 1, 0] [1, 1, 0] [0, 1, 1]

[0, 2, 0, 2] x [0, 1, 0] = [4, 4, 0]

[1, 1, 1, 1] [1, 1, 0] [2, 3, 1]

圖 1.3a:推導每個輸入的鍵表徵。

通過類似的方式,我們求取每個輸入的值表徵:

[0, 2, 0]

[1, 0, 1, 0] [0, 3, 0] [1, 2, 3]

[0, 2, 0, 2] x [1, 0, 3] = [2, 8, 0]

[1, 1, 1, 1] [1, 1, 0] [2, 6, 3]

圖 1.3b:推導每個輸入的值表徵。

最後還有查詢表徵:

[1, 0, 1]

[1, 0, 1, 0] [1, 0, 0] [1, 0, 2]

[0, 2, 0, 2] x [0, 0, 1] = [2, 2, 2]

[1, 1, 1, 1] [0, 1, 1] [2, 1, 3]

圖 1.3c:推導每個輸入的查詢表徵。

備註:在實踐中,可能還會為矩陣乘法的積添加一個偏置向量。

第四步:計算輸入 1 的注意力分數

圖 1.4:根據查詢 1 計算注意力分數(藍色)。

為了求取注意力分數,我們首先求輸入 1 的查詢(紅色)與所有鍵(橙色,包括其自身的鍵)的點積。因為有 3 個鍵表徵(因為輸入有 3 個),所以會得到 3 個注意力分數(藍色)。

[0, 4, 2]

[1, 0, 2] x [1, 4, 3] = [2, 4, 4]

[1, 0, 1]

注意這裡僅使用了輸入 1 的查詢。後面我們會為其它查詢重複同一步驟。

備註:上面的運算也被稱為點積注意力(dot product attention),這是眾多評分函數中的一個,其它評分函數還包括擴展式點積和 additive/concat,請參閱。

第五步:計算 softmax

圖 1.5:對注意力分數(藍色)執行 softmax。

對這些注意力分數(藍色)進行 softmax:

softmax([2, 4, 4]) = [0.0, 0.5, 0.5]

第六步:將分數與值相乘

圖 1.6:通過將值(紫色)與分數(藍色)相乘,推導加權的值表徵(黃色)。

每個輸入的經過 softmax 的注意力分數(藍色)與其對應的值(紫色)相乘。這會得到 3 個對齊向量(alignment vector,黃色)。在本教程中,我們稱之為加權值(weighted value)。

1: 0.0 * [1, 2, 3] = [0.0, 0.0, 0.0]

2: 0.5 * [2, 8, 0] = [1.0, 4.0, 0.0]

3: 0.5 * [2, 6, 3] = [1.0, 3.0, 1.5]

第七步:對加權的值求和,得到輸出 1

圖 1.7:對所有加權值(黃色)求和得到輸出 1(深綠色)。

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

[0.0, 0.0, 0.0]

+ [1.0, 4.0, 0.0]

+ [1.0, 3.0, 1.5]

--

= [2.0, 7.0, 1.5]

所得到的向量 [2.0, 7.0, 1.5](深綠色)是輸出 1,這是基於輸入 1 的查詢表徵與所有其它鍵(包括其自身的)的交互而得到的。

第八步:為輸入 2 和 3 重複 4-7 步驟

現在已經完成了對輸出 1 的求解,我們再為輸出 2 和輸出 3 重複步驟 4-7。我相信現在你完全能自己完成這些計算了。

圖 1.8:為輸入 2 和 3 重複之前的步驟。

備註:因為使用了點積評分函數,所以查詢和鍵的維度必須總是一致。但是,值的維度可能不同於查詢和鍵。由此造成的結果是所得輸出的維度與值的維度一致。

代碼

下面是用 PyTorch 寫的代碼。PyTorch 是一個使用 Python 的常用深度學習框架。為了在代碼中享受 @ 算子、.T 和 None 索引方法的 API 的便利,請確保你使用的是 Python 3.6 或更新版本以及 PyTorch 1.3.1。請跟隨以下步驟,直接將代碼複製到 Python/IPython REPL 或 Jupyter Notebook 中。

第一步:準備輸入

第二步:初始化權重

第三步:推導鍵、查詢和值

第四步:計算注意力分數

第五步:計算 softmax

第六步:將分數與值相乘

第七步:對加權值求和

備註:PyTorch 已經為這些運算提供了一個 API,即 nn.MultiheadAttention。但是,這個 API 需要你輸入鍵、查詢和值的 PyTorch 張量。此外,這個模塊的輸出會經過一次線性變換。

擴展用於 Transformer

那麼,接下來又如何呢?Transformer!實際上我們正處於深度學習研究和高計算資源齊頭並進的激動人心的時代。Transformer 源自論文《Attention Is All You Need》https://arxiv.org/abs/1706.03762,最早是為神經機器翻譯而生的。在此基礎上,研究者繼續向前——組合、分拆、添加和擴展,最後將 Transformer 擴展到了更多語言任務上。

這裡我簡要說說我們可以怎樣將自注意力擴展用於 Transformer 架構:

相關焦點

  • 下載這套表情包,一起來「鬥圖」~
    下載這套表情包,一起來「鬥圖」~ 2021-01-13 19:57 來源:澎湃新聞·澎湃號·媒體
  • 一文讀懂自注意力機制:8大步驟圖解+代碼
    輸出是這些交互和注意力得分的總和。圖1.2:從每個輸入得出鍵、查詢和值的表示為了得到這些表示,每個輸入(綠色)都乘以一組鍵的權重、一組查詢的權重,以及一組值的權重。在本示例中,我們將三組權重「初始化」如下。
  • 一張動圖就「忽悠」了你的視覺,LeCun:人腦的對抗性樣本
    金磊 發自 凹非寺 量子位 報導 | 公眾號 QbitAI都說「眼見為實」,但真是這樣嗎?先來看下這張動圖。是不是感覺這2個圓圈,會隨著箭頭方向移動?而就是這樣一張動圖,近日卻在網上引發了熱烈的討論。連深度學習三巨頭之一的LeCun大神,也出面發表言論:大腦的對抗性樣本。每個類似CNN的結構……都有盲點……會被愚弄。
  • 當你離開「動森」3個月後,小島上會發生什麼?
    我為冰莎拍攝的寫真集之一從「棄坑」到「再回流」:原來小動物們真的會掰著手指等你回來轉眼到了 8 月底 9 月初,我手中的工作終於騰出來一些,周末偶然刷起新聞,發現今年「動森」中最後的一次煙火大會將會在 8
  • 生成Python函數一半沒問題,當前最「正統」的代碼生成是什麼樣?
    代碼生成與總結,是一對兄弟之前這兩項研究大多都是獨立的,代碼總結會利用 Encoder-Decoder、抽象語法樹和 Tree RNN 等技術生成意圖,代碼生成會利用 Seq2Seq、語法規則和基於語法的結構化 CNN 來生成代碼,這些研究並沒有深入挖掘它們之間的關係。而北大的這一項研究從對偶學習出發,探索如何利用它們之間的關係促進提升學習效果。
  • 這裡有8個流行的Python可視化工具包,你喜歡哪個?
    這篇文章只擴展到 2D 圖,為下一次講 3D 圖和商業報表(dashboard)留了一些空間,不過這次要講的包中,許多都可以很好地支持 3D 圖和商業報表。因此,這些圖在美化方面是相似的,自定義圖時用的語法也都非常相似。 當提到這些可視化工具時,我想到三個詞:探索(Exploratory)、數據(Data)、分析(Analysis)。這些包都很適合第一次探索數據,但要做演示時用這些包就不夠了。
  • 注意力機制不能提高模型可解釋性?不,你這篇論文搞錯了
    因此 Wiegreffe 和 Pinter 提出四種替代性測試方法,來確定注意力何時可用作「解釋」、是否能作為「解釋」,這四種方法分別是:簡單的統一權重基線、基於多次隨機種子運行的方差校準、使用預訓練模型固定權重的診斷框架、端到端對抗注意力訓練協議。每一種方法都證明 RNN 模型中的注意力機制可以提供有意義的「解釋」。
  • 超多高清 GIF 表情包,讓你稱霸微信鬥圖界
    超多高清 GIF 表情包,讓你稱霸微信鬥圖界 能用表情說清楚的,儘量不打字。現在,不收藏幾個自定義表情,都不好意思聊天了。 身邊總有那麼幾個人,能及時拿到新鮮出爐的表情包。難道是他們對表情包的流行趨勢更為敏感? 也許,他們只是用了一些表情工具,比如我們要講的「表情說說」。 今天,知曉程序(微信號 zxcx0101)為大家推薦的這款小程序,讓你鬥圖更順手。
  • 10張動圖,讓你秒懂這些常見科學的概念
    如何更好的理解這些科學的概念呢?看完這 10 張動圖你就知道了。1、鑽出方孔白細胞又稱為白血球,它對人體有著重要的保護機能,能夠防禦「外敵」的入侵,有「人體衛士」的美稱。那你知道它是如何維持你身體的安全的嗎?
  • 智商高但成績差,不愛動卻得了多動 ?| 那些年被我們誤讀的「多動症...
    ,都至少有一次被懷疑是多動症的機會」。 醫生給出的答案卻讓爸媽又一次大跌眼鏡,小娟患的是多,動,症!>」(Attention Deficit Hyperactivity Disorder,簡稱ADHD),它的主要特徵是活動過多、注意力不集中、易激動、衝動任性、情緒不穩定、攻擊、動作不協調、學業失敗、同伴關係差,所以多動症可以分為三種類型:注意缺陷型、過動衝動型和注意缺陷與多動衝動的混合型。
  • 你的眼裡有銀河:一張圖讀懂「美瞳」的走俏
    彩色隱形眼鏡(即美瞳)之所以受到消費者們的狂熱追捧,一個重要的原因是:和框架眼鏡一樣,它解決了近視問題,不同點在於,它丟掉了看起來正統也不容易美觀、方便的鏡框,還讓眼睛本身更加明亮、有魅力。「你的眼裡有銀河。」
  • 汽車輪胎「鼓包」是什麼意思·為何輪胎會鼓包?
    」是輪胎比較常見的故障,鼓包輪胎是否能繼續使用,輪胎又為什麼會鼓包。相信這些問題困擾了很多汽車用戶,很多量產汽車選擇的是低品質的輪胎,或者是高標準但小扁平比的「寬扁輪胎」;這些輪胎都很容易出現鼓包,尤其是停車環境比較侷促,停車時輪胎有較高概率碰撞道牙石的車輛的問題更突出。
  • 驚為天人,NumPy手寫全部主流機器學習模型,代碼超3萬行
    超過 3 萬行代碼、30 多個模型,這也許能打造「最強」的機器學習基石?NumPy 作為 Python 生態中最受歡迎的科學計算包,很多讀者已經非常熟悉它了。它為 Python 提供高效率的多維數組計算,並提供了一系列高等數學函數,我們可以快速搭建模型的整個計算流程。毫不負責任地說,NumPy 就是現代深度學習框架的「爸爸」。
  • 哈佛大學提出變分注意力:用VAE重建注意力機制
    不過這會導致一個常見的 KL collapsing 問題,導致的現象就是直接訓練的 VAE 得到的 KL 接近於 0,也就意味著近似後驗和先驗一樣,隱變量被模型所忽略。二、實驗效果與傳統的注意力機制進行對比,傳統的注意力機制僅能通過之前生成的單詞確定當前即將生成單詞的注意力(上圖藍色部分,僅能觀測到已經預測的單詞,由於存在多種翻譯方式,因此會注意到和實際翻譯的單詞並不對應的位置),研究人員通過全部的源文本和目標文本去得到更準確的後驗注意力(上圖紅色部分,通過全部信息得到後驗
  • 「放空」指南,別說你會!
    你以為你會,其實你根本不會!
  • 一圖讀懂血常規,門診坐班有訣竅
    血常規是臨床中最常見的檢驗項目之一,血常規結果可以反映出人體許多的變化,但眾多的檢查結果你真的都完全掌握了嗎?這項基本功你是否夯實了呢? 接下來看一下,你對血常規的解讀到了哪個階段吧。
  • 無需標註數據集,自監督注意力機制就能搞定目標跟蹤
    接著介紹了這個概念如何啟發深度學習跟蹤系統,以及自監督和視覺注意力在這些系統的開發中如何發揮關鍵作用。文中所討論的技術主要應用於行人跟蹤、自動車輛導航以及許多新的應用。如果你在為數據集的製作發愁,或許自監督注意力機制可以幫助到您。本文作者 Rishab Sharma。稠密光流估計首先科普一下光流的小知識。
  • 「艦隊collection」艦娘萌萌噠Gif動圖放送
    「艦隊collection」艦娘萌萌噠Gif動圖放送 2015-03-24 18:02:25   1月番「艦隊
  • 百度推「一次包會」模型:「一次性」教會智能體認知新事物
    through a Conversational Game」,排在「AI影響因子」前列。AI 智能體的「主動」體現在,它能夠主動向老師問關於未知事物的信息,與此形成對比的是目前大多數的 AI 智能體範例還只能被動地學習預先收集好的標籤數據。「一次性」意味著,在部署之後,被老師教會過一次的 AI 智能體就可以在無需進一步訓練的情況下,學會識別一個此前從未見過的事物並且還將能正確地回答老師針對該新事物提出的相關問題。
  • 自注意力可以替代CNN,能表達任何卷積濾波層
    每個卷積層可以學習大小為K x K的卷積濾波器,輸入和輸出的維度分別是Din和Dout。用一個4D核張量(維度為K x K x Din x Dout)和一個偏置向量b(維度為Dout)來對層進行參數化。下面這張動圖便展示了如何計算q的輸出值。△對於個K x K的卷積,計算給定像素(藍色)的輸出值。