(四)Transformer中的關鍵


Transformer
在這裏插入圖片描述

一、Transformer的結構是什麼樣的?

Transformer本身還是一個典型的encoder-decoder模型,如果從模型層面來看,Transformer實際上就像一個seq2seq with attention的模型,下面大概說明一下Transformer的結構以及各個模塊的組成。

1.1 Encoder端&Decoder端總覽

Encoder端由N(原論文中N=6)個相同的大模塊堆疊而成,其中每個大模塊又由兩個子模塊構成,這兩個子模塊分別爲多頭self-attention模塊,以及一個前饋神經網絡模塊

  • Encoder端每個大模塊接收的輸入是不一樣的,第一個大模塊接收的輸入是輸入序列的embedding(embedding可以通過word2vec預訓練得來),其餘大模塊接收的是其前一個大模塊的輸出,最後一個模塊的輸出作爲整個Encoder端的輸出。

Decoder端同樣由N(原論文中N=6)個相同的大模塊堆疊而成,其中每個大模塊由三個子模塊構成,這三個子模塊分別爲多頭self-attention模塊、多頭Encoder-Decoder attention 交互模塊,以及一個前饋神經網絡模塊。

  • Decoder端第一個大模塊訓練時和測試時接收的輸入是不一樣的,並且每次訓練時接收的輸入也是不一樣的(shifted right)。
    • 在實際實現中,不會這樣動態的輸入,而是一次性把目標序列的embedding通通輸入到第一個大模塊中,然後在多頭attention模塊對序列進行mask即可。
    • 測試時,先生成第一個位置的輸出,有了這個之後,第二次預測時,再將其加入到輸入序列,以此類推直至預測結束。

1.2 Encoder端各個子模塊

1.2.1 多頭self-attention模塊

在這裏插入圖片描述
上述attention可以被描述爲將query和key-value鍵值對的一組集合映射到輸出,其中query,keys,values和輸出都是向量,其中query和keys的維度均爲dk,values的維度爲dv(論文中dk=dv=dmodel/h=64),輸出被計算爲values的加權和,其中分配給每個values的權重由query與對應的key的相似函數計算得來。這種attention的形式被稱爲Scaled Dot-Product Attention

而多頭self-attention模塊,則是將Q,K,V通過參數矩陣映射後(給Q,K,V分別接一個全連接層),然後再做self-attention,將這個過程重複h(原論文中h=8)次,最後再將所有的結果拼接起來,再送入一個全連接層即可,圖示如下:
在這裏插入圖片描述

1.2.2 前饋神經網絡模塊

前饋神經網絡模塊(即圖示中的Feed Forward)由兩個線性變換組成,中間有一個ReLU激活函數。

論文中前饋神經網絡模塊輸入和輸出的維度均爲dmodel=512,其內層的維度dff=2048.

1.3 Decoder端各個子模塊

1.3.1 多頭self-attention模塊

Decoder端多頭self-attention模塊與Encoder端的一致,但是Decoder端的多頭self-attention需要做mask,因爲它在預測時,是“看不到未來的序列的”,所以要將當前預測的單詞(token)及其之後的單詞(token)全部mask掉

1.3.2 多頭Encoder-Decoder attention 交互模塊

多頭Encoder-Decoder attention 交互模塊的形式與多頭self-attention模塊一致,唯一不同的是其Q,K,V矩陣的來源,其Q矩陣來源於下面子模塊的輸出(對應到圖中即爲masked多頭self-attention模塊經過Add&Norm後的輸出),而K,V矩陣則來源於整個Encoder端的輸出,仔細想想其實可以發現,這裏的交互模塊就跟seq2seq with attention中的機制一樣,目的就在於讓Decoder端的單詞(token)給與Encoder端對應的單詞(token)“更多的關注(attention weight)”。

1.3.3 前饋神經網絡模塊

與Encoder端一致。

1.4 其他模塊

1.4.1 Add&Norm模塊

Add&Norm模塊接在Encoder端和Decoder端每個子模塊的後面,其中Add表示殘差連接,Norm表示LayerNorm,因此Encoder端和Decoder端每個子模塊實際的輸出爲:LayerNorm(x+Sublayer(x)),其中Sublayer(x)爲子模塊的輸出。

1.4.2 Position Encoder

Position Encoding添加到Encoder端和Decoder端最底部的輸入embedding。Position Encoding具有與Embedding相同的維度dmodel,因此可以對兩者進行求和。

**需要注意的是,Transformer中的Position Encoding不是通過網絡學習得來的,而是直接通過上述公式計算而來的,論文中也實驗了利用網絡學習Position Encoding,發現結果與上述基本一致,但是論文中選擇了正弦和餘弦函數版本。

二、Transformer Decoder端的輸入具體是什麼?

三、Transformer中一直強調的self-attention是什麼?self-attention的計算過程?爲什麼它能發揮如此大的作用?

3.1 self-attention是什麼?

self-attention也叫intra-attention,是一種通過自身和自身相關聯的attention機制,從而得到一個更好的representation來表達自身,self-attention可以看成一般attention的一種特殊情況。在self-attention中,Q=K=V,序列中的每個單詞(token)和該序列中其餘單詞(token)進行attention計算。

self-attention的特點在於無視詞(token)之間的距離,直接計算依賴關係,從而能夠學習到序列的內部結構,實現起來也比較簡單。

3.2 關於self-attention的計算過程

3.3 self-attention爲什麼它能發揮如此大的作用?

self-attention是一種自身和自身相關聯的attention機制,這樣能夠得到一個更好的representation來表達自身,在多數情況下,自然會對下游任務有一定的促進作用。

引入self-attention後會更容易捕獲句子中長距離的相互依賴特徵,因爲如果是LSTM或者RNN,需要依次序序列計算,對於遠距離的相互依賴的特徵,要經過若干時間步步驟的信息累積才能將兩者聯繫起來,而距離越遠,有效捕獲的可能性越小。

self-attention在計算過程中會直接將句子中任意兩個單詞的聯繫通過一個計算步驟直接聯繫起來,所以遠距離依賴特徵之間的距離被極大縮短,有利於有效地利用這些特徵。除此外,self-attention對計算的並行性也有直接幫助。這是爲何self-attention逐漸被廣泛使用的主要原因。

四、 Transformer爲什麼需要進行Multi-head Attention?這樣做有什麼好處?Multi-head Attention的計算過程?

4.1 why Multi-head Attention

原因是將模型分爲多個頭,形成多個字空間,可以讓模型去關注不同方面的信息,最後再將各個方面的信息綜合起來。(也可以類比CNN中同時使用多個卷積核的作用,直觀上講,多頭的注意力有助於網絡捕捉到更豐富的特徵/信息

五、Transformer相比於RNN/LSTM,有什麼優勢?爲什麼?

5.1 RNN系列的模型,並行計算能力很差

RNN系列的模型T時刻隱層狀態的計算,依賴兩個輸入,一個是T時刻的句子輸入單詞Xt,另一個是T-1時刻的隱層狀態的輸出St-1,這是最能體現RNN本質特徵的一點,RNN的歷史信息是通過這個信息傳輸渠道往後傳輸的。而RNN的並行問題就出在這裏,因爲t時刻的計算依賴t-1時刻的隱層計算結果,而t-1時刻的計算依賴t-2時刻的隱層計算結果,如此下去就形成了所謂的序列依賴關係。

5.2 Transformer的特徵抽取能力比RNN系列的模型更好

六、Transformer是如何訓練的?測試階段如何進行測試呢?

6.1 訓練

Transformer訓練過程與seq2seq類似,首先Encoder端得到輸入的encoding表示,並將其輸入到Decoder端做交互式attention,之後在Decoder端接收其相應的輸入,經過多頭self-attention模塊之後,結合Encoder端的輸出,再經過FFN,得到Decoder端的輸出之後,最後經過一個線性全連接層,就可以通過softmax來預測下一個單詞(token),然後根據softmax多分類的損失函數,將loss反向傳播即可,所以從整體上來說,Transformer訓練過程就相當於一個有監督的多分類問題。

需要注意的是,Encoder端可以並行計算,一次性將輸入序列全部encoding出來,但Decoder端不是一次性把所有單詞(token)預測出來的,而是像seq2seq一樣一個接着一個預測出來的。

6.2 測試

測試階段與訓練階段唯一不同的是Decoder端最底層的輸入。

七、Transformer中的Add&Norm模塊,具體是怎麼做的?

八、爲什麼說Transformer可以代替seq2seq?

seq2seq最大的問題在於將Encoder端的所有信息壓縮到一個固定長度的向量中,並將其作爲Decoder端首個隱藏狀態的輸入,來預測Decoder端第一個單詞(token)的隱藏狀態。在輸入序列比較長的時候,這樣做顯然會損失Encoder端的更多信息,而且這樣一股腦的把改固定向量送入Decoder端,Decoder端不能夠關注到其想要關注的信息。

Transformer不但對seq2seq模型這兩點缺點有了實質性的改進(多頭交互attention模塊),而且還引入了self-attention模塊,讓源序列和目標序列首先“自關聯”起來,這樣的話,源序列和目標序列自身的embedding表示所蘊含的信息更加豐富,而且後續的FFN層也增強了模型的表達能力,並且transformer並行計算能力遠遠超過seq2seq系統的模型。

九、Transformer中句子的encoder表示是什麼?如何加入詞序信息的?

Transformer Encoder端得到的是整個輸入序列的encoding表示,其中最重要的是經過了self-attention模塊,讓輸入序列的表達更加豐富,而加入詞序信息是使用不同頻率的正弦和餘弦函數。

十、self-attention公式中的歸一化有什麼作用?

首先說明做歸一化的原因,隨着dk的增大,q*k點積後的結果也隨之增大,這樣會將softmax函數推入梯度非常小的區域,使得收斂困難(可能出現梯度消失的情況),爲了抵消這種影響,我們將點積縮放1/dk

transformer中的attention爲什麼scaled?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章