# Attention Is All You Need 作者:Ashish Vaswani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、Aidan N. Gomez、Łukasz Kaiser、Illia Polosukhin 整理:Pocky ## 前言 ### Abstract 在Sequence轉換任務中,Based on 複雜的循環 or CNN的序列轉換模型,都包含一個encoder和decoder。 擁有Attention機制的最佳模型也包含encoder和decoder Propose 一種新的簡單網路架構 - Transformer。 僅依靠attention,完全不使用循環和卷積 在WMT 2014 English-to-German翻譯任務中,達到28.4 BLEU 在 WMT 2014 English-to-French 翻譯任務中,達到41.8 BLEU,在8個GPU上train了3.5天,比SOTA快得多 架構優點:更高的並行性和更短的訓練時間,在訓練過程中能夠同時處理數據的多個部分。 補充:Bilingual Evaluation Understudy(BLEU),評測翻譯品質的方法是和一組經過挑選的人類翻譯結果進行比對,量測機器翻譯結果命中人類翻譯結果集合的精準度。 無論在大規模還是有限的training data都表現出色。 ### Intro 在過去,RNN、LSTM、GRU被認為是序列建模、轉導問題的最先進的解決方法,例如語言model和機器翻譯。人們付出了許多努力,不斷的突破循環語言模型和encoder-decoder架構的界限。 Recurrent Language model:使用RNN來預測序列中下一個單詞或符號的機率分布模型。 根據先前的資訊(或上下文)做出預測,它能夠捕捉到時間序列數據的動態特性。 循環模型通常按照輸入與輸出序列的符號位置來分解計算,將位置對應到計算時間的步驟中, 這種固有的序列性質阻礙了訓練的並行處理。雖然透過分解技巧和條件計算在計算效率上獲得了改善,但序列計算的基本限制仍然存在。 Attention mechanisms(注意力機制) 成為序列建模和轉換模型不可或缺的一部份,不須考慮輸入與輸出序列中的距離,In some few cases,注意力機制與循環網路一起使用。 此論文提出了Transformer,放棄了循環性,而完全依賴於注意力機制來繪製輸入與輸出之間的全局依賴關係。 ### Background 減少序列計算的目標也構成了擴展神經GPU、ByteNet和ConvS2S的基礎,這些模型都使用卷積神經網絡作為基本構建塊,並行計算所有輸入和輸出位置的隱藏表示。 任意兩個輸入或輸出位置的信號起來所需的操作數量隨著位置之間距離的增加而增加。 在Transformer中,被減少到一個常數的操作數量。 由於平均注意力加權位置而導致有效解析度降低,3.2節會講解如何對抗這效應 會介紹Multi head attention Self attention:also called intra-attention,將單一序列中不同位置做關聯,以計算序列的representation。 [Self Attention](https://www.notion.so/Self-Attention-a15cdf3fae6e4c1a9833551ae5eeee0f?pvs=21) End to End memory network:based on 循環注意力機制,在簡單的語言問答和語言建模上表現良好。 - - - - - ## Model Architecture ### 3.2.1 Scaled Dot-Product Attention Attention(Q,K,V) = $softmax(\frac {QK^T} {\sqrt{dk}})V$ #### 流程: 1. Dot Product:首先對Query和key進行點積操作,計算出它們之間的匹配相似度,確定每個Key跟Query之間的相關性大小。 2. Normalization:將點積的結果除以$\sqrt{dk}$,$dk$指的是Key的維度,做正規化是為了防止當維度很高時,點積的結果過大,導致梯度在反向傳播的過程中不穩定。 3. Attention Score:計算出的結果即維Attention Score,反映了每個Key對Query的重要性。 4. SoftMax:將Attention Score通過SoftMax轉換成權重的機率分布,SoftMax的作用在於將原始的Score轉換成一組和為1的機率值,這些機率值代表了不同鍵對於查詢的相對重要性。 5. Weighted Sum:最後,使用SoftMax的輸出作為權重,對Value進行Weighted Sum。加權後的輸出結合了所有Value的訊息,並且這些信息是根據與查詢的相關性加權的。 - - - - - ### 3.2.2 Multi-Head Attention ![image](https://hackmd.io/_uploads/ByUw0YbgA.png) 將Query、Key、Value通過不同的、學習過的線性映射,分別映射到$dk$、$dk$和$dv$ $h$次,再平行進行Dot-Product Attention,產生$dv$維的輸出值,最後將其concat、linear得到輸出。 直觀的理解就是把一個向量拆分成h個,然後對每一個拆分後的向量都執行self attention,最後再將h個self attention的結果拼接成一個完整的向量。 $MultiHead(Q,K,V) = Concat(head_1,....,head_h)W^O,$ $head_i = Attention(QW^Q_i, KW^K_i, VW^V_i)$ 這樣做的好處是不同head所關注的重點可能不一樣,允許模型在不同位置可以注意來自不同head的訊息。 作者採用$h$為8的Parallel Attention Layers,為了避免計算量級過大,使$dk$ = $dv$ = $\frac{d_{model}}{h}$ = 64,每一層的維度都降低了,總計算成本與全維度的單一Attention相似。 補充:$W^O$指的是一個維度為$hdv$ x $d_{model}$的矩陣,用於將MultiHead Attention的輸出重新映射到所需維度的參數矩陣。 #### Three different ways to use Multi-Head Attention 1. 在Encoder-Decoder Layer中,Query來自前一個Decoder Layer,Key跟Value則來自Encoder的輸出(Cross Attention),這讓Decoder中的每個位置都能考慮Input Sequence中的所有位置。 2. Encoder包含Self Attention Layer。所有的Q、K、V都來自前一層Encoder的輸出,Encoder中每個位置都可以考慮到前一層中的所有位置。 3. Decoder中也有Self Attention Layer,每個位置只能注意自己以前的所有位置,為了保持auto-regressive的特性,用Masking過濾掉所有未知輸出 - - - - - ### 3.3 Position-wise Feed-Forward Networks Encoder和Decoder中的每一層都包含一個FFN,FFN會用在每個位置。 對序列中的每個位置獨立進行相同的處理,包括兩次線性變換,這兩次變換之間使用ReLU函數進行非線性轉換。可以幫助模型學習在每個位置的複雜轉換。 FFN由兩個線性變換和ReLU組合,如下圖 ![image](https://hackmd.io/_uploads/S1nB9T7eA.png) 雖然用在不同位置的線性變換是一樣的,但是Layer和Layer之間是用不同的參數輸入到FFN中。可以將FFN當做是Kernel size=1的兩次Conv。 - - - - - ### 3.4 Embedding and Softmax 用Learned Embedding將Input和Output token轉換為維度是$d_{model}$的向量。Embedding是模型訓練過程中學到的。然後再使用和[此篇論文](https://arxiv.org/abs/1608.05859)在兩個Embedding之間和softmax之前的線性轉換一樣。將weight乘上$\sqrt{d_{model}}$。 從而得到下一個token的機率分布。 - - - - - ### 3.5 Positionl Encoding [相關論文](/PtZttJEKTxuO6ZSffV4QrQ) 為了讓模型能夠理解序列的順序,就必須要將Input Embedding中的Token的相對與絕對位置注入。 所以Input Embedding進到Encoder和Decoder之前,將位置編碼加上去,位置編碼的維度與Embedding一樣,所以是可以直接相加的。 附圖為作者所使用的,不同頻率的sin和cos函數, 其中pos是位置,i是維度。 ![image](https://hackmd.io/_uploads/BJV1gCml0.png) 10000指的是最大不重複字句的數量。 still have to understand more... - - - - - ### Model visiaulize ![image](https://hackmd.io/_uploads/SyaJQAQg0.png) #### Encoder: - 輸入前會先跟Positionl Encoding相加,目的是讓模型考慮輸入之間的位置訊息。 - N=6,由六個相同的Layer堆疊組成,每一層包含兩個子層,Multi-head self-attention和FFN。 - 子層間做殘差連接和Layer Normalization。 - Layer Normalization:計算輸入向量的mead和std,對同一個feature、同一個example,不同的維度去計算。 - 每個子層的輸出可看作是:$LayerNorm(x+Sublayer(x))$ #### Decoder: - 和Encoder一樣,輸入前會先跟Positionl Encoding相加,目的是讓模型考慮輸入之間的位置訊息。 - N=6,由六個相同的Layer堆疊組成 - 除了Encoder中的兩個子層,這裡增加了第三個子層,Masked Multi-head Attention,這個子層對Decoder的輸出執行Multi-head attention。目的是為了防止模型看到未來的資訊,因此只要超過當前時刻 的輸出會加上一個 mask,確保模型的預測只依賴小於當前時刻的輸出。 - Decoder中的Multi-head Attention 的輸入 Q 來自於本身前一層的輸出,而k, v 則是來自於 Encoder的輸出。 - - - - - ### 4 Why Self-Attention 這段是在各個方面比較self-attention與Recurrent和Convolutional Layer的性能。 到底為何要使用self-attention? 從三個挑戰下去考慮 1. 每層計算的總複雜度 2. 可以平行計算的總量,以Sequence所需最小的操作數量為基準 3. 長程依賴關係的最大路徑長度 下表比較了上述三個因素在不同方法中的時間複雜度,n是Sequence長度、D是維度,k是Kernel size。 ![image](https://hackmd.io/_uploads/rkpzzXNeR.png) 最主要的是第三個挑戰,計算長程依賴關係一直都是序列轉換任務中的關鍵,其中一個關鍵因素就是路徑長度。 而Self-Attention本來就是全域Query操作,所以可以在O(1)的時間內完成所有位置間訊息的傳遞。遠勝於Recurrent和Convolutional。 - - - - -