本文以QA形式對自然語言處理中注意力機制(Attention)進行總結,並對Transformer進行深入解析。

目錄

一、Attention機制剖析

1、爲什麼要引入Attention機制?

2、Attention機制有哪些?(怎麼分類?)

3、Attention機制的計算流程是怎樣的?

4、Attention機制的變種有哪些?

5、一種強大的Attention機制:爲什麼自注意力模型(self-Attention model)在長距離序列中如此強大?

(1)卷積或循環神經網絡難道不能處理長距離序列嗎?

(2)要解決這種短距離依賴的“局部編碼”問題,從而對輸入序列建立長距離依賴關係,有哪些辦法呢?

(3)自注意力模型(self-Attention model)具體的計算流程是怎樣的呢?

二、Transformer(Attention Is All You Need)詳解

1、Transformer的整體架構是怎樣的?由哪些部分組成?

2、Transformer Encoder 與 Transformer Decoder 有哪些不同?

3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?

4、multi-head self-attention mechanism具體的計算過程是怎樣的?

5、Transformer在GPT和Bert等詞向量預訓練模型中具體是怎麼應用的?有什麼變化?

一、Attention機制剖析

1、爲什麼要引入Attention機制?

根據通用近似定理,前饋網絡和循環網絡都有很強的能力。但爲什麼還要引入注意力機制呢?

  • 計算能力的限制 :當要記住很多“信息“,模型就要變得更復雜,然而目前計算能力依然是限制神經網絡發展的瓶頸。

  • 優化算法的限制 :雖然局部連接、權重共享以及pooling等優化操作可以讓神經網絡變得簡單一些,有效緩解模型複雜度和表達能力之間的矛盾;但是,如循環神經網絡中的長距離以來問題,信息“記憶”能力並不高。

可以藉助人腦處理信息過載的方式,例如Attention機制可以提高神經網絡處理信息的能力。

2、Attention機制有哪些?(怎麼分類?)

當用神經網絡來處理大量的輸入信息時,也可以借鑑人腦的注意力機制,只 選擇一些關鍵的信息輸入進行處理,來提高神經網絡的效率。按照認知神經學中的注意力,可以總體上分爲兩類:

  • 聚焦式(focus)注意力 :自上而下的有意識的注意力,主動注意——是指有預定目的、依賴任務的、主動有意識地聚焦於某一對象的注意力;

  • 顯著性(saliency-based)注意力 :自下而上的有意識的注意力,被動注意——基於顯著性的注意力是由外界刺激驅動的注意,不需要主動干預,也和任務無關;可以將 max-pooling和門控(gating)機制 來近似地看作是自下而上的基於顯著性的注意力機制。

在人工神經網絡中,注意力機制一般就特指聚焦式注意力。

3、Attention機制的計算流程是怎樣的?

Attention機制的實質:尋址(addressing)

Attention機制的實質其實就是一個尋址(addressing)的過程 ,如上圖所示:給定一個和任務相關的查詢 Query 向量  q ,通過計算與 Key 的注意力分佈並附加在 Value 上,從而計算 Attention Value ,這個過程實際上是 Attention機制緩解神經網絡模型複雜度的體現 :不需要將所有的N個輸入信息都輸入到神經網絡進行計算,只需要從X中選擇一些和任務相關的信息輸入給神經網絡。

注意力機制可以分爲三步:一是信息輸入;二是計算注意力分佈α;三是根據注意力分佈α 來計算輸入信息的加權平均。

step1-信息輸入 :用 X = [x1, · · · , xN ]表示N 個輸入信息;

step2-注意力分佈計算 :令 Key = Value = X ,則可以給出注意力分佈

我們將稱之爲注意力分佈(概率分佈),  爲注意力打分機制,有幾種打分機制:

step3-信息加權平均 :注意力分佈 可以解釋爲在上下文查詢 q 時,第i個信息受關注的程度,採用一種“軟性”的信息選擇機制對輸入信息 X 進行編碼爲:

這種編碼方式爲 軟性注意力機制(soft Attention) ,軟性注意力機制有兩種:普通模式( Key = Value = X )和鍵值對模式( Key! = Value )。

軟性注意力機制(soft Attention)

4、Attention機制的變種有哪些?

與普通的Attention機制(上圖左)相比,Attention機制有哪些變種呢?

  • 變種1-硬性注意力: 之前提到的注意力是軟性注意力,其選擇的信息是所有輸入信息在注意力 分佈下的期望。還有一種注意力是隻關注到某一個位置上的信息,叫做硬性注意力(hard attention)。硬性注意力有兩種實現方式:(1)一種是選取最高概率的輸入信息;(2)另一種硬性注意力可以通過在注意力分佈式上隨機採樣的方式實現。硬性注意力模型的缺點:

硬性注意力的一個缺點是基於最大采樣或隨機採樣的方式來選擇信息。因此最終的損失函數與注意力分佈之間的函數關係不可導,因此無法使用在反向傳播算法進行訓練。爲了使用反向傳播算法,一般使用軟性注意力來代替硬性注意力。硬性注意力需要通過強化學習來進行訓練。——《神經網絡與深度學習》

  • 變種2-鍵值對注意力: 即上圖右邊的鍵值對模式,此時Key!=Value,注意力函數變爲:

  • 變種3-多頭注意力: 多頭注意力(multi-head attention)是利用多個查詢Q = [q1, · · · , qM],來平行地計算從輸入信息中選取多個信息。每個注意力關注輸入信息的不同部分,然後再進行拼接:

5、一種強大的Attention機制:爲什麼自注意力模型(self-Attention model)在長距離序列中如此強大?

(1)卷積或循環神經網絡難道不能處理長距離序列嗎?

當使用神經網絡來處理一個變長的向量序列時,我們通常可以使用卷積網絡或循環網絡進行編碼來得到一個相同長度的輸出向量序列,如圖所示:

基於卷積網絡和循環網絡的變長序列編碼

從上圖可以看出,無論卷積還是循環神經網絡其實都是對變長序列的一種“ 局部編碼 ”:卷積神經網絡顯然是基於N-gram的局部編碼;而對於循環神經網絡,由於梯度消失等問題也只能建立短距離依賴。

(2)要解決這種短距離依賴的“局部編碼”問題,從而對輸入序列建立長距離依賴關係,有哪些辦法呢?

如果要建立輸入序列之間的長距離依賴關係,可以使用以下兩種方法:一 種方法是增加網絡的層數,通過一個深層網絡來獲取遠距離的信息交互,另一種方法是使用全連接網絡。——《神經網絡與深度學習》

全連接模型和自注意力模型:實線表示爲可學習的權重,虛線表示動態生成的權重。

由上圖可以看出,全連接網絡雖然是一種非常直接的建模遠距離依賴的模型, 但是無法處理變長的輸入序列。不同的輸入長度,其連接權重的大小也是不同的。

這時我們就可以利用注意力機制來“動態”地生成不同連接的權重,這就是自注意力模型(self-attention model)。由於自注意力模型的權重是動態生成的,因此可以處理變長的信息序列。

總體來說, 爲什麼自注意力模型(self-Attention model)如此強大利用注意力機制來“動態”地生成不同連接的權重,從而處理變長的信息序列。

(3)自注意力模型(self-Attention model)具體的計算流程是怎樣的呢?

同樣,給出信息輸入:用X = [x1, · · · , xN ]表示N 個輸入信息;通過線性變換得到爲查詢向量序列,鍵向量序列和值向量序列:

上面的公式可以看出, self-Attention中的Q是對自身(self)輸入的變換,而在傳統的Attention中,Q來自於外部。

self-Attention計算過程剖解(來自《細講 | Attention Is All You Need 》)

注意力計算公式爲:

自注意力模型(self-Attention model)中,通常使用縮放點積來作爲注意力打分函數,輸出向量序列可以寫爲:

二、Transformer(Attention Is All You Need)詳解

從Transformer這篇論文的題目可以看出,Transformer的核心就是Attention,這也就是爲什麼本文會在剖析玩Attention機制之後會引出Transformer,如果對上面的Attention機制特別是自注意力模型(self-Attention model)理解後,Transformer就很容易理解了。

1、Transformer的整體架構是怎樣的?由哪些部分組成?

Transformer模型架構

Transformer其實這就是一個Seq2Seq模型,左邊一個encoder把輸入讀進去,右邊一個decoder得到輸出:

Seq2Seq模型

Transformer=Transformer Encoder+Transformer Decoder

(1)Transformer Encoder(N=6層,每層包括2個sub-layers):

Transformer Encoder
  • sub-layer-1multi-head self-attention mechanism ,用來進行self-attention。

  • sub-layer-2Position-wise Feed-forward Networks ,簡單的全連接網絡,對每個position的向量分別進行相同的操作,包括兩個線性變換和一個ReLU激活輸出(輸入輸出層的維度都爲512,中間層爲2048):

每個sub-layer都使用了殘差網絡:

(2)Transformer Decoder(N=6層,每層包括3個sub-layers):

Transformer Decoder
  • sub-layer-1Masked multi-head self-attention mechanism ,用來進行self-attention,與Encoder不同:由於是序列生成過程,所以在時刻 i 的時候,大於 i 的時刻都沒有結果,只有小於 i 的時刻有結果,因此需要做 Mask

  • sub-layer-2Position-wise Feed-forward Networks ,同Encoder。

  • sub-layer-3Encoder-Decoder attention計算

2、Transformer Encoder 與 Transformer Decoder 有哪些不同?

(1)multi-head self-attention mechanism不同,Encoder中不需要使用Masked,而Decoder中需要使用Masked;

(2)Decoder中多了一層Encoder-Decoder attention,這與 self-attention mechanism不同。

3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?

它們都是用了 multi-head計算,不過Encoder-Decoder attention採用傳統的attention機制,其中的Query是self-attention mechanism已經計算出的上一時間i處的編碼值,Key和Value都是Encoder的輸出,這與self-attention mechanism不同。代碼中具體體現:

## Multihead Attention ( self-attention)
            self.dec = multihead_attention(queries=self.dec,
                                           keys=self.dec,
                                           num_units=hp.hidden_units,
                                           num_heads=hp.num_heads,
                                           dropout_rate=hp.dropout_rate,
                                           is_training=is_training,
                                           causality=True,
                                           scope="self_attention")

## Multihead Attention ( Encoder-Decoder attention)
            self.dec = multihead_attention(queries=self.dec,
                                           keys=self.enc,
                                           num_units=hp.hidden_units,
                                           num_heads=hp.num_heads,
                                           dropout_rate=hp.dropout_rate,
                                           is_training=is_training,
                                           causality=False,
                                           scope="vanilla_attention")

4、multi-head self-attention mechanism具體的計算過程是怎樣的?

multi-head self-attention mechanism計算過程

Transformer中的Attention機制由 Scaled Dot-Product AttentionMulti-Head Attention 組成,上圖給出了整體流程。下面具體介紹各個環節:

  • Expand :實際上是經過線性變換,生成Q、K、V三個向量;

  • Split heads : 進行分頭操作,在原文中將原來每個位置512維度分成8個head,每個head維度變爲64;

  • Self Attention :對每個head進行Self Attention,具體過程和第一部分介紹的一致;

  • Concat heads :對進行完Self Attention每個head進行拼接;

上述過程公式爲:

5、Transformer在GPT和Bert等詞向量預訓練模型中具體是怎麼應用的?有什麼變化?

  • GPT中訓練的是單向語言模型,其實就是直接應用 Transformer Decoder

  • Bert中訓練的是雙向語言模型,應用了 Transformer Encoder 部分,不過在Encoder基礎上還做了 Masked操作

BERT Transformer 使用雙向self-attention,而GPT Transformer 使用受限制的self-attention,其中每個token只能處理其左側的上下文。雙向 Transformer 通常被稱爲“Transformer encoder”,而左側上下文被稱爲“Transformer decoder”,decoder是不能獲要預測的信息的。

Reference

  1. 《神經網絡與深度學習》

  2. Attention Is All You Need

  3. 谷歌BERT解析----2小時上手最強NLP訓練模型

  4. 細講 | Attention Is All You Need

  5. 深度學習中的注意力模型(2017版)

推薦閱讀

百度aistudio事件抽取比賽總結——記一次使用MRC方式做事件抽取任務的嘗試

文本自動摘要任務的“不完全”心得總結

模型壓縮實踐系列之——bert-of-theseus,一個非常親民的bert壓縮方法

這個NLP工具,玩得根本停不下來

徵稿啓示| 200元稿費+5000DBC(價值20個小時GPU算力)

中文命名實體識別工具(NER)哪家強?

學自然語言處理,其實更應該學好英語

斯坦福大學NLP組Python深度學習自然語言處理工具Stanza試用

太讚了!Springer面向公衆開放電子書籍,附65本數學、編程、機器學習、深度學習、數據挖掘、數據科學等書籍鏈接及打包下載

數學之美中盛讚的 Michael Collins 教授,他的NLP課程要不要收藏?

自動作詩機&藏頭詩生成器:五言、七言、絕句、律詩全了

這門斯坦福大學自然語言處理經典入門課,我放到B站了

關於AINLP

AINLP 是一個有趣有AI的自然語言處理社區,專注於 AI、NLP、機器學習、深度學習、推薦算法等相關技術的分享,主題包括文本摘要、智能問答、聊天機器人、機器翻譯、自動生成、知識圖譜、預訓練模型、推薦系統、計算廣告、招聘信息、求職經驗分享等,歡迎關注!加技術交流羣請添加AINLPer(id:ainlper),備註工作/研究方向+加羣目的。

閱讀至此了,點個在看吧 :point_down:

相關文章