① 注意力機制
本文大部分的內容來自於 深度學習中的注意力機制
意力機制借鑒了人類注意力的說法,比如我們在閱讀過程中,會把注意集中在重要的信息上。在訓練過程中,輸入的權重也都是不同的,注意力機制就是學習到這些權重。最開始attention機制在CV領域被提出來,但後面廣泛應用在NLP領域。
需要注意的是,注意力機制是一種通用的思想和技術,不依賴於任何模型,換句話說,注意力機制可以用於任何模型。只是我們介紹注意力機制的時候更多會用encoder-decoder框架做介紹。
Encoder-Decoder 框架可以看作是一種深度學習領域的研究模式,應用場景異常廣泛。下圖是文本處理領域里Encoder-Decoder 框架最抽象的一種表示。
在NLP領域,可以把Encoder-Decoder框架看作是:將一個句子(篇章)轉換成另一個句子(篇章)。最直觀的例子就是機器翻譯,將一種語言的表達翻譯成另一種語言。對於句子對<source,target>,將給定輸入句子
source,通過Encoder-Decoder框架生成目標句子target。其中,source和target都是一組單詞序列:
Encoder是對source進行編碼,轉換成中間語義 :
對於解碼器Decoder,其任務是根據中間語義C和當前已經生成的歷史信息來生成下一時刻要生成的單詞:
我們從最常見的Soft Attention模型開始介紹attention的基本思路。
在上一節介紹的Encoder-Decoder框架是沒有體現出「注意力模型」的,為什麼這么說呢?我們可以看下target的生成過程:
其中, 是Decoder的非線性變換函數。從上面式子中可以看出,在生成目標句子的單詞時,不論生成哪個單詞,它們使用的輸入句子source的語義編碼 都是一樣的,沒有任何區別。而語義編碼 又是通過對source經過Encoder編碼產生的,因此對於target中的任何一個單詞,source中任意單詞對某個目標單詞 來說影響力都是相同的,這就是為什麼說圖1中的模型沒有體現注意力的原因。
下面從一個例子入手,具體說明下注意力機制是怎麼做的。
比如機器翻譯任務,輸入source是英文句子:Tom chase Jerry;輸出target想得到中文:湯姆 追逐 傑瑞。在翻譯「Jerry」這個單詞的時候,在普通Encoder-Decoder模型中,source里的每個單詞對「傑瑞」的貢獻是相同的,很明顯這樣不太合理,因為「Jerry」對於翻譯成「傑瑞」更重要。如果引入Attention模型,在生成「傑瑞」的時候,應該體現出英文單詞對於翻譯當前中文單詞不同的影響程度,比如給出類似下面一個概率分布值:
每個英文單詞的概率代表了翻譯當前單詞「傑瑞」時注意力分配模型分配給不同英文單詞的注意力大小。同理,對於target中任意一個單詞都應該有對應的source中的單詞的注意力分配概率,可以把所有的注意力概率看作 ,其中 表示source長度, 表示target長度。而且,由於注意力模型的加入,原來在生成target單詞時候的中間語義 就不再是固定的,而是會根據注意力概率變化的 ,加入了注意力模型的Encoder-Decoder框架就變成了如圖2所示。
根據圖2,生成target的過程就變成了下面形式:
因為每個 可能對應著不同的注意力分配概率分布,比如對於上面的英漢翻譯來說,其對應的信息可能如下:
其中, 表示Encoder對輸入英文單詞的某種變換函數,比如如果Encoder是用RNN模型的話,這個 函數的結果往往是某個時刻輸入 後隱層節點的狀態值;g代表Encoder根據單詞的中間表示合成整個句子中間語義表示的變換函數,一般的做法中,g函數就是對構成元素加權求和,即:
其中, 代表輸入句子Source的長度, 代表在Target輸出第 個單詞時Source輸入句子第 個單詞的注意力分配系數,而 則是Source輸入句子中第 個單詞的語義編碼。假設下標 就是上面例子所說的「湯姆」生成如下圖:
那另一個問題來了:注意力概率分布是怎麼得到的呢?為了便於說明,我們假設圖1的Encoder-Decoder框架中,Encoder和Decoder都採用RNN模型,那麼圖1變成下圖4:
那麼注意力分配概率分布值的通用計算過程如圖5:
上面就是經典的soft Attention模型的基本思想,區別只是函數 會有所不同。
從我的角度看,其實Attention機制可以看作,Target中每個單詞是對Source每個單詞的加權求和,而權重是Source中每個單詞對Target中每個單詞的重要程度。因此,Attention的本質思想會表示成下圖6:
將Source中的構成元素看作是一系列的<Key, Value>數據對,給定Target中的某個元素Query,通過計算Query和各個Key的相似性或者相關性,即權重系數;然後對Value進行加權求和,並得到最終的Attention數值。將本質思想表示成公式如下:
其中, 表示Source的長度。
深度學習中的注意力機制 中提到:
因此,Attention機制的具體計算過程實際上分成了3個階段,如圖7:
第一階段可以引入不同的函數和計算機制,根據Query和某個 ,計算兩者的相似性或者相關性,最常見的方法包括:求兩者的向量點積、求兩者的向量cosine相似性或者引入額外的神經網路來求值,如下:
第二階段引入類似SoftMax的計算方式,對第一階段的得分進行數值轉換,一方面可以進行歸一化,將原始計算分值整理成所有元素權重之和為1的概率分布;另一方面也可以通過SoftMax的內在機制更加突出重要元素的權重。即一般採用的公式如下:
第三階段的計算結果 即為 對應的權重系數,然後進行加權求和即可得到Attention數值:
通過如上三個階段的計算,就可以求出針對Query的Attention數值。
上面介紹的是soft Attention,hard Attention的區別在於soft Attention中 是概率分布,而hard Attention取值為0/1。Hard Attention在圖像上有使用,具體可見 引入attention機制 。
這里的global attention其實就是soft Attention,global attention需要考慮encoder中所有的 ;而local Attention直觀上理解是只考慮局部的 。
Self-attention是Google在transformer模型中提出的,上面介紹的都是一般情況下Attention發生在Target元素Query和Source中所有元素之間。而Self Attention,指的是Source內部元素之間或者Target內部元素之間發生的Attention機制,也可以理解為Target=Source這種特殊情況下的注意力機制。當然,具體的計算過程仍然是一樣的,只是計算對象發生了變化而已。
上面內容也有說到,一般情況下Attention本質上是Target和Source之間的一種單詞對齊機制。那麼如果是Self Attention機制,到底學的是哪些規律或者抽取了哪些特徵呢?或者說引入Self Attention有什麼增益或者好處呢?仍然以機器翻譯為例來說明,如圖8和圖9:
具體做法是點乘 和 ,然後除以 ,並經過Softmax,以此得到 的權重。也就是說Attention計算過程如下式,其中 是scaled factor:
注意力的計算一般有兩種:加性注意力(additive attention)、乘法(點積)注意力(multiplicative attention)。(這里可以和第3部分計算相似度對應)
加性注意力是最經典的注意力機制,它使用了有一個隱藏層的前饋網路(全連接)來計算注意力; 乘法注意力就是Transformer用的方式。這兩種注意力在復雜度上是相似的,但是乘法注意力在實踐中要更快速、具有高效的存儲,因為它可以使用矩陣操作更高效地實現。
Transformer原文:
Multi-Head Attention是用不同的 得到不同的Attention,最後將這些Attention拼接起來作為輸出。公式如下:
其中, ;在Transformer模型中, 。
Scaled Dot-Proct Attention和Multi-Attention如下圖所示: