淺談有意識的 AI: 注意力機制介紹
Introduction to Attention Mechanism in Deep Learning
前言
目前注意力機制已經成為神經網路中的一個重要概念,並廣泛的應用在自然語言處理、圖像識別及語音處理等各種不同類型的機器學習任務中。2018 年圖靈獎得主同時也是深度學習三大巨頭之一的 Yoshua Bengio 也曾經說過:Attention is a core ingredient of ‘conscious’ AI。透過有意識的認知系統,進一步模仿人類的行為,以提高模型學習的效果,這就是注意力機制 (Attention Mechanism) 的研究主題。你可能會有疑問,所謂”有意識AI”指的是什麼意思? 大家可以參考這篇文章:注意力是「有意識」AI的核心要素。在文章中整理了 Yoshua Bengio 於 ICLR 2020 的演講。關於 Deep Learning 2.0 以及 Conscious AI 的內容,並從人類神經科學角度探討是否可以賦予模型獨立思考能力。
何謂注意力機制?
Attention 就字面上的意思是關注重點。以人類的角度,我們的視覺系統就是一種 Attention 機制,將有限的注意力集中在重要訊息上,提取重要內容並快速獲得最有效的資訊。
若從數學上來解釋,它只是一個以權重分數所組成的一組向量。此外注意力可以被看作是一種使 RNN 在 decoder 有更好地工作的方法,它能夠讓神經網絡在執行任務時關注更有利的重要資訊。
Attention Mechanism 演進歷史
接著我們以深度學習模型的角度探討注意力機制的方法。圖3顯示了注意力機制的演進,我們可以發現早期的注意力機制涵蓋各種不同的神經網路。例如 RNN+Attention 或是 CNN+Attention 來為模型得到更好的特徵萃取。由於 RNN 先天上的限制無法有效的平行運算,直到 2017 年發表了一篇論文 Attention Is All You Need ,使用了 self-attention 自己與自己計算注意力的方式並構成了 Transformer。
注意力機制於 RNN 模型
所謂的 Encoder-Decoder 及代表輸入輸出都是一串序列。最典型的例子就是機器翻譯的應用。早期的方法我們會使用 RNN 將輸入的序列進行 Encoder 編碼成一個向量(Contex vector) 。
在引入注意力機制後的 Encoder-Decoder 每次 Decoder 要輸出時會根據目前的位置對 Encoder 計算注意力分數。其含義就是當前的輸出應該關注於輸入資料的哪一段訊息。如圖4所示,RNN+Attention 是對自然語言處理中基於編碼器解碼器的神經機器翻譯系統的改進。 後來,這種機機制或其變體被用於其他應用,包括計算機視覺、語音處理等。
注意力機制於 CNN 模型
在影像識別的任務當中我們是否也能使用 Attention 的技巧為模型提取重要的資訊呢?答案是可以的!注意力機制其實最早出現於影像識別任務上,對於同一場景不同的人或任務會有不同的關注對象。我們可以在 CNN 的架構上添加注意力機制在通道域和空間域擷取更有利的特徵資訊來幫助完成下游任務。圖5是一個卷積塊的注意機制(CBAM)模型,其基底是一個 RestNet 架構,並透過 Channel Attention Module 與 Spatial Attention Module 為卷基層所輸出的 FeatureMap 進行重點提取。我們可以從實驗結果發現加入注意力機制的 CNN 模型,從 Grad-CAM 可以發現辨識一個物體可以更關注目標物的整體範圍了。
注意力機制於 Transformer 模型
自從 2017 年 Google 在 Attention Is All You Need 這篇論文所提出的 Transformer 架構完整打破了神經網路上的限制。在該論文提出了一種不使用 RNN、CNN,僅使用自注意力機制 (self-attention mechanism) 的 Transformer 網路架構。並透過 self-attention 可以自由地在 Encoder-Decoder 中更彈性的操作。
注意力模型的種類
依據 An Attentive Survey of Attention Models 這篇論文我們將注意力模型分為四大類,每個類別都有不同類型的注意力模型。 分別有:模型架構、注意力抽象層次、注意力計算區域以及輸入的特徵數量。其中這四類是彼此間並無互斥,是可以互相對應的。若想知道更詳細資訊的讀者可以參考[論文導讀] 注意力機制模型的分類這篇文章。
注意力機制於深度學習
在本篇文章中我們以機器翻譯為例子,讓大家知道整個注意力機制引入的來龍去脈。 2014 年 Google 提出了一個 Encoder-Decoder 架構並採用 LSTM 實現機器翻譯。
Sequence to Sequence with RNNs
機率模型主要是透過 Markov Assumption,由於 Sentence 是由許多的單詞順序所組成,所以我們可以使用 RNN 來描述不同單詞間的條件機率。經由公式可以看到當預測第 t 單位時間的狀態,我們經歷了第 1~(t — 1) 單位時間,但是他只需要用前一個時間單位的狀態就可以預測下一個狀態,前面很多狀態都是不必要的,這我們稱為一階馬可夫模型。
這裡我們來看 RNN 有哪些問題。首先在 Decoder 中都依賴於同一組 C,因此很容易遺失訊息。第二點是很難去建立一個長時間的序列預測,因為隨著輸入的序列越長 C 可能會在 Decoder 過程中遺失一些重要的訊息。最後一點是模型難以平行化訓練,因為在 Decoder 中必須取得上一個時間點的輸出才能預測下一個輸出,沒辦法平行化計算因此訓練過程耗時且無法有效利用 GPU 加速。
RNNs with Attention
2015 年 Bengio 實驗室提出了 Attention 概念,在 Decoder 中預測每個輸出時都會重新計算 c。每個 c 的計算方式就是使用 Decoder 目前的隱藏狀態 s 去跟 Encoder 中所有輸入的隱藏狀態 h 做計算,最後再經過一個 softmax 得到每一個的機率。透過這種方式就可以知道目前的輸入必須關注所有的輸入句子中的哪些部分。每一個 c 就是將得到的注意力分數與這些輸入的 h 做加權和。
此方法雖然解決了一個 C 的問題,但依然保持著兩個問題。分別是 h 經過太多的非線性(nonlinearities)計算,例如 h4 是經過了 h1~h3 很多次的非線性轉換才得到 h4 的表徵 (representation)。由於 RNN 先天上的限制,每個時間的隱藏層狀態都是依賴上一個時間的輸出,因此還是難以去訓練一個長時間序列的模型。最後平行化的問題在 RNN 架構上依然尚未解決,這也是機器翻譯當時一個重要的解決問題。
Transformer without RNN
Transformer 完全基於 Attention 注意力機制。Attention 原先是被應用在 RNN,之後 2017 年由 Google 所發表的 Attention is all you need 論文,提出的 Transformer 保留了原先 Attention 的優勢並移除了 RNN 的架構。
Self-attention
透過輸入的序列自己與自己做 Attention,去看與自身序列相關的重要程度關聯。self-attention 的輸入是一串向量,這些向量可能是整個網路的輸入,也可能是某個 Hidden Layer 的輸出。輸入一排 X 向量後,self-attention 要輸出另一排 C 向量。至於每一個 c 都是考慮了所有 x 才生成出來的。
我們就必須要有一個計算 attention 的模組。它就是拿兩個向量作為輸入Attn(X, X),然後就直接輸出 α ,此時每個數值可以作為兩個向量的關聯程度。計算 α 數值有很多種方法,比較常見的做法就是 dot product (Google 論文中採用此方法),每個輸入的 x 向量分別乘上一個 wq 、wk 、wv 矩陣得到 Q、K 和 V 向量。之後 qk 進行 dot product 相乘再全部相加起來就會得到 α。之後再乘上一個根號 dk 目的是為了避免內積後數值過大,在論文中會除以 8(dk=64 即為 query 與 key 向量的維度)。接著會再通過一個 softmax 將所有的輸入所計算的結果正規化為機率分佈,此時輸出的分數可以當作是計算當前輸出應該關注輸入區域的重要程度。最後再乘以矩陣 V 就得到權重和。以上做法就是一個典型的 self-attention 計算流程。
Transformer Model
Attention is all you need 這篇論文中所提到的 Transformer 其實就是一個 Seq2Seq 的模型。然而 Seq2seq 模型 Encoder 要做的事情,就是給一排向量輸出另外一排向量。其中在 Transformer 中的 Encoder 與 Decoder 用的就是 self-attention 技術。值得一提的是在該架構裡面的 Multi-head Attention 其實就是多個 Self-Attention 的結合,每個 head 學習到在不同表示空間中的特徵。因為 Q、K、V 是自己產生的,因此可以生很多組做很多次 self-attention。
首先我們來看 Transformer 的 Encoder。我們可以將 Encoder 中的灰色區塊當作是一個模塊 (Block),然而在論文中 Encoder 是由 6 個模塊堆疊而成。其中每個模塊又由兩個子模塊構成,這兩個子模塊分別為 Multi-head Attention,以及一個前饋神經網路。
Decoder 部分作為解碼器同樣由 6 個模塊堆疊而成。其中每個模塊又由三個子模塊構成,這三個子模塊分別為 Masked Multi-head Attention、Encoder-Decoder Attention 以及一個前饋神經網路模塊所構成。其中在 Masked Multi-Head Attention 其實與 Encoder Multi-Head Attention 計算方式一樣,差別僅在於輸入的數量不同。因為 Decoder 在輸出答案的同時並不知道未來的輸出內容,因此必須使用一個遮罩將未來時間點的內容把它遮起來。
結論
在本篇文章中首先介紹為什麼要使用注意力機制,其目的是要模仿人類利用有限的注意力資源,取得需要重點關注的目標區域。並且簡單介紹注意力機制在這幾年的演進,以及不同種類的注意力模型。我們可以發現在實務的應用中各種領域模型加上注意力機制都能得到明顯的改善。最後在注意力機制於深度學習部分介紹了 Sequence to Sequence with RNNs,並以機器翻譯為例說明在 RNN 的架構下有無使用注意力機制所帶來的瓶頸與影響。最後再提到 Transformer 架構的模型,擺脫 CNN 和 RNN 的束縛。透過 self-attention 自己與自己計算注意力分數,大幅解決 RNN 無法平行計算問題。