1. 程式人生 > >Attention is all you need 論文詳解(轉)

Attention is all you need 論文詳解(轉)

一、背景

自從Attention機制在提出之後,加入Attention的Seq2Seq模型在各個任務上都有了提升,所以現在的seq2seq模型指的都是結合rnn和attention的模型。傳統的基於RNN的Seq2Seq模型難以處理長序列的句子,無法實現並行,並且面臨對齊的問題。

所以之後這類模型的發展大多數從三個方面入手:

  • input的方向性:單向 -> 雙向

  • 深度:單層 -> 多層

  • 型別:RNN -> LSTM GRU

但是依舊收到一些潛在問題的制約,神經網路需要能夠將源語句的所有必要資訊壓縮成固定長度的向量。這可能使得神經網路難以應付長時間的句子,特別是那些比訓練語料庫中的句子更長的句子;每個時間步的輸出需要依賴於前面時間步的輸出,這使得模型沒有辦法並行,效率低;仍然面臨對齊問題。

再然後CNN由計算機視覺也被引入到deep NLP中,CNN不能直接用於處理變長的序列樣本但可以實現平行計算。完全基於CNN的Seq2Seq模型雖然可以並行實現,但非常佔記憶體,很多的trick,大資料量上引數調整並不容易。

本篇文章創新點在於拋棄了之前傳統的encoder-decoder模型必須結合cnn或者rnn的固有模式,只用Attention。文章的主要目的在於減少計算量和提高並行效率的同時不損害最終的實驗結果。

二、整體框架

整體模型看上去看上去很複雜,其實這就是一個Seq2Seq模型,左邊一個encoder把輸入讀進去,右邊一個decoder得到輸出:

左邊的encoders和右邊的decoders都是由6層組成,內部左邊encoder的輸出是怎麼和右邊decoder結合的呢?再畫張圖直觀的看就是這樣:

三、分別展開

從上面可知,Encoder的輸出,會和每一層的Decoder進行結合。我們取其中一層進行詳細的展示:

整體框架細節展示:

1)Encoder

Encoder有N=6層,每層包括兩個sub-layers:

  • 第一個sub-layer是multi-head self-attention mechanism,用來計算輸入的self-attention

  • 第二個sub-layer是簡單的全連線網路。

  • 在每個sub-layer我們都模擬了殘差網路,每個sub-layer的輸出都是:

其中Sublayer(x) 表示Sub-layer對輸入 x 做的對映,為了確保連線,所有的sub-layers和embedding layer輸出的維數都相同

2)Decoder

Decoder也是N=6層,每層包括3個sub-layers:

    • 第一個是Masked multi-head self-attention,也是計算輸入的self-attention,但是因為是生成過程,因此在時刻 i 的時候,大於 i 的時刻都沒有結果,只有小於 i 的時刻有結果,因此需要做Mask

    • 第二個sub-layer是全連線網路,與Encoder相同

    • 第三個sub-layer是對encoder的輸入進行attention計算。
      同時Decoder中的self-attention層需要進行修改,因為只能獲取到當前時刻之前的輸入,因此只對時刻 t 之前的時刻輸入進行attention計算,這也稱為Mask操作。

圖示參考上述總體框架細節圖