Transformer學習筆記

0-背景

機構:Google 大腦
作者:Ashish Vaswani等
發表會議:NIPS2017
面向任務:機器翻譯
論文地址:https://arxiv.org/abs/1706.03762
論文代碼:https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/models/transformer.py

本文主要介紹Transformer(注:近期出現了Transformer-XL)的原理及其具體應用。

動機:機器翻譯任務使用Encoder—Decoder模型過程中拋棄RNN或者CNN模型,只使用attention機制。採用Attention機制的原因是考慮到RNN(或者LSTM,GRU等)的計算限制爲是順序的,也就是說RNN相關算法只能從左向右依次計算或者從右向左依次計算,這種機制帶來了兩個問題:

  • 時間片 t 的計算依賴 t-1 時刻的計算結果,這樣限制了模型的並行能力;
  • 順序計算的過程中信息會丟失,儘管LSTM等門機制的結構一定程度上緩解了長期依賴的問題,但是對於特別長期的依賴現象,LSTM依舊無能爲力。而如果採用CNN,雖然具備良好的並行條件,但是通過加深層深的方式獲得更大的感受野,捕獲長距離特徵方向仍然很受限。或許後期CNN還有其他方式可以解決這個問題。

Transformer的提出解決了上面兩個問題,首先它使用了Attention機制,將序列中的任意兩個位置之間的距離是縮小爲一個常量;其次它不是類似RNN的順序結構,因此具有更好的並行性,符合現有的GPU框架。

效果:

WMT 2014 英-德數據集中獲得28.4 BLEU(state-of-the-art)
WMT 2014 英-法數據集中獲得41.8 BLEU(state-of-the-art)

另外,Transformer模型具有良好的泛化能力。後續還繼續發展了Universal Transformers通用Transformer和BERT。BERT是第一個深度雙向、無監督的語言表示,僅使用純文本語料庫進行預訓練,然後可以使用遷移學習對各種自然語言任務進行微調的框架。

1-模型介紹

Transformer的結構由EncoderDecoder組成:

在這裏插入圖片描述

1-1 Encoder和Decoder:

Encoder結構

Encoder由N=6個相同的layer(也稱一個layer爲Block)組成,layer指的就是上圖左側的單元,最左邊有個“Nx”,這裏是66個。每個Layer由兩個sub-layer組成:

  • muti-head self-attention (自注意力機制)
  • fully connected feed forward (全連接層)

其中每個sub-layer都加了residual connection(殘差連接)和normalisation,因此可以將sub-layer的輸出表示爲:LayerNorm(x+Sublayer(x))LayerNorm(x + Sublayer(x))

具體每個sub-layer的含義在後續章節進行詳解,這裏僅僅是繪製輪廓的方式展示整個框架。

Decoder結構

Decoder和Encoder的結構差不多,但是多了一個Multi-head self-attention的sub-layer。Decoder也是由6個Transformer Block組成。每個Block組成:

  • masked multi-head self-attention:發生在 Decoder 層內,上一個 Decoder 的output 作爲當前Decoder 的input(即爲了預測當前i位置的輸出,利用了i-1位置Decoder的輸出作爲輸入的一部分)。另外爲確保位置i的輸出僅依靠位置小於i的input(即確保預測第i個位置時不會接觸到未來的信息),所以加入了一個mask。
  • muti-head attention:Encoder 層的output作爲該子層的input。所以,這一sub-layer的attention不是self-attention。
  • fully connected feed forward (全連接層)

我們再從Decoder的輸入、輸出簡述下Decode過程:
輸入: Encoder的輸出、i-1(上一個字符)位置Decoder的輸出
輸出: ii位置輸出詞的概率分佈
解碼: Encoder可以並行計算,一次性全部encoding出來,但Decoder不是一次把所有序列解出來的,而是如RNN一個一個解出來的,因爲要用上一個位置的輸入當作attention的query。

過程介紹

Encoder:
Encoder通過處理輸入序列開啓工作。頂端Encoder的輸出之後會變轉化爲一個包含向量K(鍵向量)和V(值向量)的注意力向量集。這些向量將被每個Decoder用於自身的“Encoder-Decoder注意力層”,而這些層可以幫助Decoder關注輸入序列哪些位置合適:

Decoder:
Decoder階段的每個步驟都會輸出一個輸出序列(在這個例子裏,是翻譯出的句子)的元素。接下來的步驟重複了這個過程,直到到達一個特殊的終止符號,它表示transformer的解碼器已經完成了它的輸出。每個步驟的輸出在下一個時間步被提供給底端Decoder,這些Decoder會輸出它們的解碼結果。另外,與Encoder的輸入類似,對Decoder的輸入進行嵌入並添加位置編碼。

另外Decoder中的自注意力層表現的模式與Encoder不同:在Decoder中,自注意力層只被允許處理輸出序列中更靠前的那些位置。在softmax步驟前,它會把後面的位置給隱去(通過mask將它們設爲-inf)。

Decoder中的“Encoder-Decoder注意力層”工作方式基本就像muti-head attention一樣,只不過它是通過在它下面的層來創造query matrix(查詢矩陣), 並且從Encoder的輸出中取得key/value matrix。
從Encoder 層到Decoder 層的途中,因爲有文字序列的問題需要進行編碼,例如輸入序列是「I am fine」,以英文翻譯成中文爲例:
在這裏插入圖片描述

線性變換和Softmax層:
Decoder組件最後會輸出一個實數向量。通過線性變換層把浮點數變成一個單詞。線性變換層是一個簡單的全連接神經網絡,它可以把Decoder組件產生的向量投射到一個比它大得多的、被稱作對數機率(logits)的向量裏。不妨假設模型從訓練集中學習一萬個不同的英語單詞(模型的“輸出詞表”)。因此對數機率向量爲一萬個單元格長度的向量——每個單元格對應某一個單詞的分數。接下來的Softmax 層便會把那些分數變成概率(都爲正數、上限1.0)。概率最高的單元格被選中, 並且它對應的單詞被作爲這個時間步的輸出。


這張圖片從底部以Decoder組件產生的輸出向量開始。之後它會轉化出一個輸出單詞。

1-2 Attention介紹

Attention機制其實就是一系列權重參數用以區別對待句子中的不同word。沒有Attention的Encoder-Decoder如下:
在這裏插入圖片描述

比如,‘I like deep learning’被編碼(語義編碼)成C,然後在經過非線性函數gg來Decoder得到目標Target中的每一個單詞y1y1,y2y2,y3y3。計算如下:

C=f(x1,x2,x3)y1=g(C)y2=g(C,y1)y3=g(C,y1,y2)C = f(x1,x2,x3)\\\\y1 = g(C)\\y2 = g(C,y1)\\y3 = g(C,y1,y2)

可以看出編碼結果對輸出的貢獻是相同的,可實際上,"I"這個word對target中的"我"的結果是影響最大的,其他word的影響幾乎可以忽略。但是在上述模型中,這個重要程度沒有被體現出來。Attention機制就是要從序列中學習到每一個word的重要程度。這就表明了序列元素在Encoder的時候,所對應的語義編碼C是不一樣的。所以CC就不單單是x1,x2,x3x1,x2,x3簡單的Encoder,而是成爲了各個元素按其重要度加權求和得到的。也即:

Ci=j=0Lxaijf(xj)C_i = \sum_{j=0}^{L_x}a_{ij}f(x_j)

其中ii表示時刻,jj表示序列中第jj個元素,LxL_x表示序列的長度,f()f()表示word(如果不特指NLP領域的話,用元素來作爲指代)xjx_j的編碼。
在這裏插入圖片描述
以下以seq2seq + attention爲例詳細說明Attention機制在Encoder-Decoder中是如何引入的。

Attention流程:

1-隱狀態準備階段
假設已有第一個decoder的隱狀態 (圖中紅色部分)和全部encoder的隱狀態(圖中綠色部分)。下圖示例中有1個當前decoder的隱狀態和4個encoder的隱狀態。

2-對每個encoder的隱狀態計算一個score


這裏我們的score function採用dot product,即直接計算decoder隱狀態和encoder隱狀態的點乘。當然也可以選擇其他的score functions。

decoder_hidden = [10, 5, 10]
encoder_hidden  score
---------------------
     [0, 1, 1]     15 (= 10×0 + 5×1 + 10×1, the dot product)
     [5, 0, 1]     60
     [1, 1, 0]     15
     [0, 5, 1]     35

3-將所有的score輸入到softmax

此時其實是將score進行歸一化,結果記爲score^。其結果是將注意力集中到[5, 0, 1]身上。

encoder_hidden  score  score^
-----------------------------
     [0, 1, 1]     15       0
     [5, 0, 1]     60       1
     [1, 1, 0]     15       0
     [0, 5, 1]     35       0

4-將softmax結果與每個Encoder的隱狀態相乘


softmax與Encoder的隱狀態乘積結果爲alignment vector(也稱爲annotation vector)。

encoder_hidden  score  score^  alignment
----------------------------------------
     [0, 1, 1]     15       0  [0, 0, 0]
     [5, 0, 1]     60       1  [5, 0, 1]
     [1, 1, 0]     15       0  [0, 0, 0]
     [0, 5, 1]     35       0  [0, 0, 0]

從aligment vector可以看出抑制無關元素,抽取相關元素。一般情況下的softmax結果是浮點數,不會如這裏例子中一個1,其餘都是0這種完美情況。

5-將alignment vectors進行求和
將alignment vectors進行求和得到context vector:


context vector是alignment vectors的信息集成。

encoder_hidden  score  score^  alignment
----------------------------------------
     [0, 1, 1]     15       0  [0, 0, 0]
     [5, 0, 1]     60       1  [5, 0, 1]
     [1, 1, 0]     15       0  [0, 0, 0]
     [0, 5, 1]     35       0  [0, 0, 0]
context = [0+5+0+0, 0+0+0+0, 0+1+0+0] = [5, 0, 1]

6-將context vector輸入到decoder
這部分取決於具體的框架設計:


Attention整個流程:

PS:主要參考資料3

Attention函數:

爲了獲得Attention的一組注意力分配係數,引入Attention函數,它是用來得到attention value的。 Attention函數的本質可以被描述爲一個查詢(query)與一系列(鍵key-值value)對一起映射成一個output(輸出)。其中query, keys, values和output都是vector。output是value的加權求和,而每個value權重是將query及其對應的key輸入到compatibility function所得到的結果。

在這裏插入圖片描述

Attention value的獲得分爲以下3步:

  • 相似度計算:將query和每個key進行相似度計算得到權重。常用的相似度函數有點積,拼接,感知機等
  • 歸一化:使用一個softmax(因爲是一系列的k/v,所以類似多分類,要用softmax)函數對這些權重進行歸一化
  • 將歸一化的權重和相應的鍵值value進行加權求和得到最後的Attention Value,即爲注意力值。

attention(Q,K,V)=softmax(QKTdk)V attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt {d_k}})V

機器翻譯裏的語言的Encoder輸出hjh_j就是VV
機器翻譯裏的語言的Encoder輸出hjh_j同樣是KK
機器翻譯裏的目標語言的隱層狀態ziz_i就是QQ
機器翻譯裏的目標語言和語言的匹配程度eije_{ij}就是QKTdk\frac{QK^T}{\sqrt {d_k}}
機器翻譯裏的歸一化後的目標語言和語言的匹配程度aija_{ij}就是softmax(QKTdk)softmax(\frac{QK^T}{\sqrt {d_k}})
機器翻譯裏的cic_i就是最終的attention(Q,K,V)attention(Q,K,V)
所以說,機器翻譯的attention,本質就是想給語言Encoder輸出的每一個元素hjh_j (即V) 搞一個權重,然後加權求和。而這個權重是通hjh_j 它自己 (即K=V) 與目標語言的隱層狀態ziz_i (即Q) 進行變換得到的。
即k=v=源語言的encoder輸出,q=目標語言的隱層狀態。

Self-Attention即K=V=Q。例如輸入一個句子,那麼裏面的每個詞都要和該句子中的所有詞進行Attention計算。目的是學習句子內部的詞依賴關係,捕獲句子的內部結構。Self-Attention也正是Transformer中使用的Attention。

Self-Attention

下面介紹Self-Attention的計算實例以進一步說明。假設輸入句子是"Thinking Machines"。Self-Attention的計算:

第一步
從每個Encoder的輸入向量(每個單詞的詞向量)中生成三個向量。也就是說對於每個單詞,創造一個查詢向量(Query vector)、一個鍵向量(Key vector)和一個值向量(Value vector)。這三個向量是通過詞嵌入與三個權重矩陣後相乘創建的。這三個權重矩陣也是在訓練過程中學習到的參數。

可以發現這些新向量在維度上比詞嵌入向量更低。他們的維度是64,而詞嵌入和編碼器的輸入/輸出向量的維度是512. 但實際上不強求維度更小,這只是一種基於架構上的選擇,它可以使multi-headed attention的大部分計算保持不變。
在這裏插入圖片描述
X1X_1WQW^Q權重矩陣相乘得到q1q_1,就是與這個單詞相關的查詢向量。最終使得輸入序列的每個單詞的創建一個查詢向量、一個鍵向量和一個值向量

第二步:
計算得分。假設爲這個例子中的第一個詞“Thinking”計算自注意力向量,需要拿輸入句子中的每個單詞對“Thinking”打分。這些分數決定了在Encode單詞“Thinking”的過程中有多重視句子的其它部分。這些分數是通過打分單詞(所有輸入句子的單詞)的Key Vector(鍵向量)與“Thinking”的Query vector(查詢向量)的dot product(點積)來計算的。所以如果處理位置最靠前的詞,即第1個單詞的自注意力的話,第一個分數是q1k1q_1和k_1的點積,第二個分數是q1k2q_1和k_2的點積。
在這裏插入圖片描述

第三步和第四步:
將分數除以8(8是論文中使用的Key Vector的維數64的平方根,這會讓梯度更穩定。這裏也可以使用其它值,8只是默認值),然後輸入到softmax。softmax的作用是使所有單詞的分數歸一化,得到的分數都是正值且和爲1。注意,self-attention一般是沒有除以這個根號dkd_k,這裏是論文作者修正的版本。
在這裏插入圖片描述

這個softmax分數決定了每個單詞對Encode當下位置(“Thinking”)的貢獻。顯然,已經在這個位置上的單詞將獲得最高的softmax分數,但有時關注另一個與當前單詞相關的單詞也會有幫助。

第五步:
將每個Value Vector乘以softmax分數(這是爲了準備之後將它們求和)。這裏的直覺是希望關注語義上相關的單詞,並弱化不相關的單詞(例如,讓它們乘以0.001這樣的小數)。

第六步:
對加權的value vectors求和(注:自注意力的另一種解釋就是在Encode某個單詞時,就是將所有單詞的表示(value vector)進行加權求和,而權重是通過該詞的表示(key vector)與被編碼詞表示(query vector)的點積並通過softmax得到)。然後即得到自注意力層在該位置的輸出(本文例子中是對於第一個單詞)。
在這裏插入圖片描述
如此自注意力的計算就完成了。得到的向量就可以傳給前饋神經網絡。然而實際中,這些計算是以矩陣形式完成的,以便算得更快。那接下來就看看如何用矩陣實現的。

通過矩陣運算實現自注意力機制

第一步:
計算 Query matrice, Key matrice和Value matrice。爲此,將輸入句子的詞嵌入裝進矩陣XX中, 將其乘以訓練的權重矩陣(WQWKWV)(W^Q,W^K,W^V)

在這裏插入圖片描述

XX矩陣中的每一行對應於輸入句子中的一個單詞。我們再次看到詞嵌入向量 (512,或圖中的4個格子)和q/k/v向量(64,或圖中的3個格子)的大小差異。
最後,由於處理的是矩陣,我們可以將步驟2到步驟6合併爲一個公式來計算自注意力層的輸出。自注意力的矩陣運算形式:
在這裏插入圖片描述

目前在NLP研究中,key和value常常都是同一個,即 key=value。這時計算出的attention value是一個向量, 代表序列元素xjx_j的編碼向量。 此向量中包含了元素xjx_j上下文關係,即包含全局聯繫也擁有局部聯繫。全局聯繫是因爲在求相似度的時候,序列中元素與其他所有元素的相似度計算,然後加權得到了編碼向量。局部聯繫,因爲它所計算出的attention value是屬於當前輸入的xjx_j的。這也就是attention的強大優勢之一,它可以靈活的捕捉長程和局部依賴,而且是一步到位的。

Multi-head self-attention

按照論文中的做法其實是對於多個Scaled Dot-Product Attention進行堆疊分開處理,再拼接就形成了Multi-head self-attention。論文中原圖如下:

在這裏插入圖片描述

Scaled Dot-Product Attention和Multi-Head Attention

Scaled Dot-Product Attention實際上就是上文介紹self-attention。前文也介紹過了,與其他self-attention不同之處就是除以dk\sqrt{d_k}。這個尺度變換操作是爲了防止dot products量綱過大,導致softmax的梯度極小,進而導致訓練不穩定。這個dk\sqrt{d_k}就是所謂的scaled,本質上還是dot product。

Attention(Q,K,V)=softmax(QKTdk)V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt {d_k}})V

multi-head attention則是通過h個不同的線性變換對Q,K,V進行投影,最後將不同的attention結果拼接起來:
MultiHead(Q,K,V)=Concat(head1,...,headh)Woheadi=Attention(QWiQ,KWiK,VWiV) MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^o\\ 其中head_i=Attention(QW_i^{Q},KW_i^{K},VW_i^V)

這種通過增加“multi-headed” attention(“多頭”注意力)的機制,進一步完善了自注意力層,並在兩方面提高了注意力層的性能:

  • 它擴展了模型專注於不同位置的能力。在上面的例子中,雖然每個編碼都在z1z_1中有或多或少的體現,但是它可能被實際的單詞本身所支配。如果翻譯一個句子,比如“The animal didn’t cross the street because it was too tired”,我們會想知道“it”指的是哪個詞,這時模型的“多頭”注意機制會起到作用。
  • 它給出了注意力層的多個“表示子空間”(representation subspaces)。 對於“多頭”注意機制,我們有多個查詢/鍵/值權重矩陣集(Transformer使用8個注意力頭,因此對於每個Encoder/Decoder有8個矩陣集合)。這些集合中的每一個都是隨機初始化的,在訓練之後,每個集合都被用來將輸入詞嵌入(或來自較低編碼器/解碼器的向量)投影到不同的表示子空間中。
    在這裏插入圖片描述

在“多頭”注意機制下,爲每個head保持獨立的query/key/value權重矩陣,從而產生不同的query/key/value矩陣。和之前一樣,拿XX乘以WQ/WK/WVW^Q/W^K/W^V矩陣來產生查query/key/value 矩陣。
如果按照此前介紹的自注意力計算方式,運行8次,根據8個不同的權重矩陣運算,就會得到8個不同的ZZ矩陣。

在這裏插入圖片描述

但是問題來了,前饋層不需要8個矩陣,它只需要一個矩陣(由每一個單詞的表示向量組成)。所以我們需要一種方法把這8個矩陣壓縮成一個矩陣。那該怎麼做?其實可以直接把這些矩陣拼接在一起,然後用一個附加的權重矩陣WOW^O與它們相乘。
在這裏插入圖片描述
這幾乎就是Multi-head self-attention(多頭自注意力)的全部。這確實有好多矩陣,把它們集中在一個圖片中,這樣可以一眼看清。
在這裏插入圖片描述

小結

整個框架有3處的Attention。

1、Encoder自身的self-attention,Q K V均來自於前面一層輸出,當前層的每個position可以attend到前面一層的所有位置。
2、Deocder自身的self-attention,同理,不同之處在於爲了避免信息向左流動,在decoder內的scaled dot-attention加了一個mask-out層(Encoder沒有),將所有在softmax的全連接層的非法連接屏蔽掉(置爲-∞)
3、Encoder-Decoder attention,Query來自上一位置Decoder的輸出,K、V均來自於Encoder的輸出。這一步操作模擬了傳統機器翻譯中的attention過程(信息的交互)。

1-3 Position-wise feed-forward networks

第二個sub-layer是個全連接層。在Encoder和Decoder中都有一個全連接層。這個全連接有兩層,第一層的激活函數是ReLUReLU,relu的數學表達式就是f(x)=max(0,x),第二層是一個線性激活函數(Wx+b),可以表示爲:
在這裏插入圖片描述
之所以是position-wise(輸入和輸出的維度是一樣的)是因爲處理的attention輸出是某一個位置ii的attention輸出。hidden_size變化爲:768->3072->768(或者512->2048->512)。

1-4 Positional Encoding

Transformer拋棄了RNN,而RNN最大的一大優點是在時間序列上的先後順序信息。Transformer綜合attention 模型在做的事情,頂多是一個非常精妙的『詞袋模型』而已。爲了利用序列的位置信息,在模型中引入位置編碼以記錄序列中token之間的相對或者絕對位置信息。Transformer 爲每個輸入的詞嵌入添加了一個向量。這些向量遵循模型學習到的特定模式,這有助於確定每個單詞的位置,或序列中不同單詞之間的距離。這裏的直覺是,將位置向量添加到詞嵌入中使得它們在接下來的運算中,能夠更好地表達的詞與詞之間的距離。
在這裏插入圖片描述
爲了讓模型理解單詞的順序而添加的位置編碼向量遵循特定的模式。

如果我們假設詞嵌入的維數爲4,則實際的位置編碼如下:
在這裏插入圖片描述
尺寸爲4的詞嵌入位置編碼實例,positional encoding的維度與embedding維度是相同的,才能夠相加。

文章提到了兩種Positional Encoding的方法:

  • 用不同頻率的sine和cosine函數直接計算(公式法)
  • 學習出一份positional embedding(常規法)

經過實驗發現兩者的結果一樣,所以最後選擇了第一種方法,公式如下:
在這裏插入圖片描述
其中pospos是位置,ii是維度(第i個維度),這意味着positional encoding的每一個維度都對應了一個正弦曲線,波長區間爲2π 10000×2π2π~10000×2π,作者認爲這種方法可以使模型更容易去學得attend相對位置。比如固定一個偏移量kkPEpos+kPE_{pos+k}的結果可以用PEposPE_{pos}通過一個線性函數來獲得。
根據公式
sin(α+β)=sinαcosβ+cosαsinβsin(\alpha+\beta) = sin \alpha cos \beta + cos \alpha sin\beta
以及
cos(α+β)=cosαcosβsinαsinβcos(\alpha + \beta) = cos \alpha cos \beta - sin \alpha sin\beta

表明位置k+pk+p的位置向量可以表示爲位置kk的特徵向量的線性變化,這爲模型捕捉單詞之間的相對位置關係提供了非常大的便利。

1-5 Residuals

此外,Encoder和Decoder中都存在殘差連接:在每個Encoder(或者Decoder)中的每個子層(自注意力、前饋網絡)的周圍都有一個殘差連接,隨後再緊跟一個"layer-normalization"步驟。
在這裏插入圖片描述
如果可視化這些向量以及這個和自注意力相關聯的layer-normalization操作,那麼看起來就像下面這張圖描述一樣:
在這裏插入圖片描述

解碼器的子層也是這樣樣的。如果我們想象一個2 層編碼-解碼結構的transformer,它看起來會像下面這張圖一樣:
在這裏插入圖片描述

1-6 訓練部分總結

在訓練過程中,訓練集通過未經訓練的模型進行前向傳播,再用它的輸出去與真實的輸出做比較。爲了把這個流程可視化,不妨假設輸出詞彙僅僅包含六個單詞:“a”, “am”, “i”, “thanks”, “student”以及 “”(end of sentence的縮寫形式)。
在這裏插入圖片描述
模型的輸出詞表在訓練之前的預處理流程中就被設定好。一旦定義了輸出詞表,我們可以使用一個相同寬度的向量來表示詞彙表中的每一個單詞。這也被認爲是一個one-hot 編碼。所以,可以用下面這個向量來表示單詞“am”:
在這裏插入圖片描述

2-模型效果

跟過去RNN、CNN相比,在效率上可以並行化訓練,減少訓練時間,在訓練成本最小的情況下達到了最佳性能。
英-德機器翻譯BLEU值28.4 (當時最好)
英-法機器翻譯BLEU值41.0 (當時最好,後來被微軟的**推敲網絡(Deliberation Networks)**超越達到41.5)

3-模型評價

優點:
(1)相對於CNN有卷積核size限制,提取dependency的範圍有限,本文的attention機制則抓取了全局的內部關聯信息,獲取到long-range dependencies。
(2)相比於CNN、RNN,降低了計算複雜度,並且訓練可以實現並行,速度快。
(3)不會出現RNN內部可能存在的信息重疊的問題、沒有過多的信息堆積、冗餘、丟失

缺點:
(1)實踐上:有些rnn輕易可以解決的問題transformer沒做到,比如複製string或則簡單的邏輯推理,尤其是碰到比訓練時的sequence更長的時。
(2)理論上:Transformers非computationally universal(圖靈完備),這限制了其理論表達能力,比如無法實現“while”循環
(3)粗暴的拋棄RNN和CNN也使模型喪失了捕捉局部特徵的能力,RNN + CNN + Transformer的結合可能會帶來更好的效果。
(4)Transformer 失去的位置信息其實在NLP中非常重要,而論文中在特徵向量中加入Position Embedding也只是一個權宜之計,並沒有改變Transformer結構上的固有缺陷。

4-參考資料:

  1. https://arxiv.org/abs/1706.03762
  2. http://jalammar.github.io/illustrated-transformer/
  3. https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3
  4. https://daiwk.github.io/posts/nlp-self-attention-models.html
  5. https://github.com/tensorflow/models/tree/master/official/transformer
  6. https://medium.com/@cyeninesky3/attention-is-all-you-need-基於注意力機制的機器翻譯模型-dcc12d251449
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章