Transformer模型深度解读
“?本文對Transoformer模型進行了深度解讀,包括整體架構(gòu),Attention結(jié)構(gòu)的背景和細節(jié),QKV的含義,Multi-head Attention的本質(zhì),FFN,Positional Embedding以及Layer Normalization等一切你想知道的內(nèi)容!?
”
作者:潘小小,字節(jié)跳動AI-Lab算法工程師,專注機器翻譯,會講法語,喜歡音樂,寫文,記錄,無人機航拍(剛?cè)肟?#xff09;。文末有內(nèi)推鏈接,歡迎勾搭投遞!!
?
「Transformer」?是2017年的一篇論文《Attention is All You Need》提出的一種模型架構(gòu),這篇論文里只針對機器翻譯這一種場景做了實驗,全面擊敗了當時的SOTA,并且由于encoder端是并行計算的,訓(xùn)練的時間被大大縮短了。
它開創(chuàng)性的思想,顛覆了以往序列建模和RNN劃等號的思路,現(xiàn)在被廣泛應(yīng)用于NLP的各個領(lǐng)域。目前在NLP各業(yè)務(wù)全面開花的語言模型如GPT, BERT等,都是基于Transformer模型。因此弄清楚Transformer模型內(nèi)部的每一個細節(jié)就顯得尤為重要。
鑒于寫Transformer的中英文各類文章非常之多,一些重復(fù)的、淺顯的東西在本文里都不再贅述。在本文中,我會盡可能地去找一些很核心也很細節(jié)的點去剖析,并且將細節(jié)和整體的作用聯(lián)系起來解釋。
本文盡量做到深入淺出,力求覆蓋我自己學(xué)習(xí)時的每一個困惑,做到“知其然,且知其所以然”。我相信通過我抽絲剝繭的分析,大家會對Transformer每個部分的作用有一個更加深入的認識,從而對這個模型架構(gòu)整體的認知上升到一個新的臺階,并且能夠深刻理解Transformer及其延伸工作的動機。
本文將按照下面的思路展開
0. Transformer整體架構(gòu)
Attention的背景溯源(為什么要有attention?)
Attention的細節(jié)(attention是什么?)
Query, Key, Value
Multi-head Attention的本質(zhì)
Transformer模型架構(gòu)中的其他部分
Feed Forward Network
Positional Embedding
Layer Normalization
Transformer和RNN的對比
參考
0. Transformer架構(gòu)
Transformer模型的架構(gòu)
這里就不啰嗦encoder, decoder各自的含義以及模塊了,直戳細節(jié)。「以下將會重點解答的問題有:」
-
Attention是如何發(fā)揮作用的,其中的參數(shù)的含義和作用是什么,反向傳播算法如何更新其中參數(shù),又是如何影響其他參數(shù)的更新的?
-
為什么要用scaled attention?
-
Multi-head attention相比single head attention為什么更加work,其本質(zhì)上做了一件什么事?從反向傳播算法的角度分析?
-
Positional encoding是如何發(fā)揮作用的,應(yīng)用反向傳播算法時是如何影響到其他參數(shù)的更新的?同樣的理論可以延伸到其他additional embedding,比如多語言模型中的language embedding
-
每個encoder/decoder layer中feed-forward部分的作用,并且從反向傳播算法角度分析?
-
decoder中mask后反向傳播算法過程細節(jié),如何保證training和inference的一致性?
-
如果不一致(decoder不用mask)會怎么樣?
-
1. Attention的背景溯源
想要深度理解Attention機制,就需要了解一下它產(chǎn)生的背景、在哪類問題下產(chǎn)生,以及最初是為了解決什么問題而產(chǎn)生。
首先回顧一下機器翻譯領(lǐng)域的模型演進歷史:
機器翻譯是從RNN開始跨入神經(jīng)網(wǎng)絡(luò)機器翻譯時代的,幾個比較重要的階段分別是: Simple RNN, Contextualize RNN, Contextualized RNN with attention, Transformer(2017),下面來一一介紹。
-
「Simple RNN」?:這個encoder-decoder模型結(jié)構(gòu)中,encoder將整個源端序列(不論長度)壓縮成一個向量(encoder output),源端信息和decoder之間唯一的聯(lián)系只是: encoder output會作為decoder的initial states的輸入。這樣帶來一個顯而易見的問題就是,隨著decoder長度的增加,encoder output的信息會衰減。
?
?
Simple RNN (without context)
這種模型有2個主要的問題:
源端序列不論長短,都被統(tǒng)一壓縮成一個固定維度的向量,并且顯而易見的是這個向量中包含的信息中,關(guān)于源端序列末尾的token的信息更多,而如果序列很長,最終可能基本上“遺忘”了序列開頭的token的信息。
第二個問題同樣由RNN的特性造成: 隨著decoder timestep的信息的增加,initial hidden states中包含的encoder output相關(guān)信息也會衰減,decoder會逐漸“遺忘”源端序列的信息,而更多地關(guān)注目標序列中在該timestep之前的token的信息。
-
「Contextualized RNN」?:為了解決上述第二個問題,即encoder output隨著decoder timestep增加而信息衰減的問題,有人提出了一種加了context的RNN sequence to sequence模型:decoder在每個timestep的input上都會加上一個context。為了方便理解,我們可以把這看作是encoded source sentence。這樣就可以在decoder的每一步,都把源端的整個句子的信息和target端當前的token一起輸入到RNN中,防止源端的context信息隨著timestep的增長而衰減。
Contextualized RNN
但是這樣依然有一個問題: context對于每個timestep都是靜態(tài)的(encoder端的final hidden states,或者是所有timestep的output的平均值)。但是每個decoder端的token在解碼時用到的context真的應(yīng)該是一樣的嗎?在這樣的背景下,Attention就應(yīng)運而生了:
-
「Contextualized RNN with soft align (Attention)」?: Attention在機器翻譯領(lǐng)域的應(yīng)用最早的提出來自于2014年的一篇論文 ?Neural Machine Translation by Jointly Learning to Align and Translate
Contextualized RNN with Attention
在每個timestep輸入到decoder RNN結(jié)構(gòu)中之前,會用當前的輸入token的vector與encoder output中的每一個position的vector作一個"attention"操作,這個"attention"操作的目的就是計算當前token與每個position之間的"相關(guān)度",從而決定每個position的vector在最終該timestep的context中占的比重有多少。最終的context即encoder output每個位置vector表達的?「加權(quán)平均」?。
context的計算公式
2. Attention的細節(jié)
2.1. 點積attention
我們來介紹一下attention的具體計算方式。attention可以有很多種計算方式: 加性attention、點積attention,還有帶參數(shù)的計算方式。著重介紹一下點積attention的公式:
?
?
Attention中(Q^T)*K矩陣計算,query和key的維度要保持一致
如上圖所示, ???, ?分別是query和key,其中,query可以看作M個維度為d的向量(長度為M的sequence的向量表達)拼接而成,key可以看作N個維度為d的向量(長度為N的sequence的向量表達)拼接而成。
-
【一個小問題】為什么有縮放因子 ????
-
先一句話回答這個問題: 縮放因子的作用是?「歸一化」?。
-
假設(shè) ???, ???里的元素的均值為0,方差為1,那么 ???中元素的均值為0,方差為d. 當d變得很大時, ???中的元素的方差也會變得很大,如果 ???中的元素方差很大,那么 ???的分布會趨于陡峭(分布的方差大,分布集中在絕對值大的區(qū)域)。總結(jié)一下就是 ???的分布會和d有關(guān)。因此 ???中每一個元素乘上 ???后,方差又變?yōu)?。這使得 ???的分布“陡峭”程度與d解耦,從而使得訓(xùn)練過程中梯度值保持穩(wěn)定。
-
2.2. Attention機制涉及到的參數(shù)
一個完整的attention層涉及到的參數(shù)有:
-
把 ???, ???, ???分別映射到 ???, ???, ???的線性變換矩陣 ???( ???), ???( ???), ???( ???)
-
把輸出的表達 ???映射為最終輸出 ???的線性變換矩陣 ???( ???)
2.3. Query, Key, Value
Query和Key作用得到的attention權(quán)值作用到Value上。因此它們之間的關(guān)系是:
Query ???和Key ???的維度必須一致,Value ???和Query/Key的維度可以不一致。
Key ???和Value ???的長度必須一致。Key和Value本質(zhì)上對應(yīng)了同一個Sequence在不同空間的表達。
Attention得到的Output ???的維度和Value的維度一致,長度和Query一致。
Output每個位置 i 是由value的所有位置的vector加權(quán)平均之后的向量;而其權(quán)值是由位置為i 的query和key的所有位置經(jīng)過attention計算得到的 ,權(quán)值的個數(shù)等于key/value的長度。
?
?
Attention示意圖
在經(jīng)典的Transformer結(jié)構(gòu)中,我們記線性映射之前的Query, Key, Value為q, k, v,映射之后為Q, K, V。那么:
self-attention的q, k, v都是同一個輸入, 即當前序列由上一層輸出的高維表達。
cross-attention的q代表當前序列,k,v是同一個輸入,對應(yīng)的是encoder最后一層的輸出結(jié)果(對decoder端的每一層來說,保持不變)
而每一層線性映射參數(shù)矩陣都是獨立的,所以經(jīng)過映射后的Q, K, V各不相同,模型參數(shù)優(yōu)化的目標在于將q, k, v被映射到新的高維空間,使得每層的Q, K, V在不同抽象層面上捕獲到q, k, v之間的關(guān)系。一般來說,底層layer捕獲到的更多是lexical- level的關(guān)系,而高層layer捕獲到的更多是semantic-level的關(guān)系。
2.4. Attention的作用
下面這段我會以機器翻譯為例,用通俗的語言闡釋一下attention的作用,以及query, key, value的含義。
Transformer模型Encoder, Decoder的細節(jié)圖(省去了FFN部分)
query對應(yīng)的是需要?「被表達」?的序列(稱為序列A),key和value對應(yīng)的是?「用來表達」A的序列(稱為序列B)。其中key和query是在同一高維空間中的(否則無法用來計算相似程度),value不必在同一高維空間中,最終生成的output和value在同一高維空間中。上面這段巨繞的話用一句更繞的話來描述一下就是:
?序列A和序列B在高維空間 ???中的高維表達 ?的每個位置 _「分別」?_ 和 ???計算相似度,產(chǎn)生的權(quán)重作用于序列B在高維空間??中的高維表達 ???,獲得序列A在高維空間??中的高維表達 ?
?Encoder部分中只存在self-attention,而Decoder部分中存在self-attention和cross-attention
【self-attention】encoder中的self-attention的query, key, value都對應(yīng)了源端序列(即A和B是同一序列),decoder中的self-attention的query, key, value都對應(yīng)了目標端序列。
【cross-attention】decoder中的cross-attention的query對應(yīng)了目標端序列,key, value對應(yīng)了源端序列(每一層中的cross-attention用的都是encoder的最終輸出)
2.5. Decoder端的Mask
Transformer模型屬于自回歸模型(p.s. 非自回歸的翻譯模型我會專門寫一篇文章來介紹),也就是說后面的token的推斷是基于前面的token的。Decoder端的Mask的功能是為了保證訓(xùn)練階段和推理階段的一致性。
論文原文中關(guān)于這一點的段落如下:
?We also modify the self-attention sub-layer in the decoder stack to prevent from attending to subsequent positions. This masking, combined with the fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.
?在推理階段,token是按照從左往右的順序推理的。也就是說,在推理timestep=T的token時,decoder只能“看到”timestep < T的 T-1 個Token, 不能和timestep大于它自身的token做attention(因為根本還不知道后面的token是什么)。為了保證訓(xùn)練時和推理時的一致性,所以,訓(xùn)練時要同樣防止token與它之后的token去做attention。
2.6. 多頭Attention (Multi-head Attention)
Attention是將query和key映射到同一高維空間中去計算相似度,而對應(yīng)的multi-head attention把query和key映射到高維空間??的不同子空間 ?
中去計算相似度。
?
為什么要做multi-head attention?論文原文里是這么說的:
?Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.
?也就是說,這樣可以在不改變參數(shù)量的情況下增強每一層attention的表現(xiàn)力。?? ? ? ? ? ? ? ? ? ? ? ? ??Multi-head Attention示意圖
Multi-head Attention的本質(zhì)是,在?「參數(shù)總量保持不變」?的情況下,將同樣的query, key, value映射到原來的高維空間的「不同子空間」中進行attention的計算,在最后一步再合并不同子空間中的attention信息。這樣降低了計算每個head的attention時每個向量的維度,在某種意義上防止了過擬合;由于Attention在不同子空間中有不同的分布,Multi- head Attention實際上是尋找了序列之間不同角度的關(guān)聯(lián)關(guān)系,并在最后concat這一步驟中,將不同子空間中捕獲到的關(guān)聯(lián)關(guān)系再綜合起來。
從上圖可以看出, ???和 ???之間的attention score從1個變成了h個,這就對應(yīng)了h個子空間中它們的關(guān)聯(lián)度。
3. Transformer模型架構(gòu)中的其他部分
3.1. Feed Forward Network
每一層經(jīng)過attention之后,還會有一個FFN,這個FFN的作用就是空間變換。FFN包含了2層linear transformation層,中間的激活函數(shù)是ReLu。
曾經(jīng)我在這里有一個百思不得其解的問題:attention層的output最后會和 ?相乘,為什么這里又要增加一個2層的FFN網(wǎng)絡(luò)?
其實,FFN的加入引入了非線性(ReLu激活函數(shù)),變換了attention output的空間, 從而增加了模型的表現(xiàn)能力。把FFN去掉模型也是可以用的,但是效果差了很多。
3.2. Positional Encoding
位置編碼層只在encoder端和decoder端的embedding之后,第一個block之前出現(xiàn),它非常重要,沒有這部分,Transformer模型就無法用。位置編碼是Transformer框架中特有的組成部分,補充了Attention機制本身不能捕捉位置信息的缺陷。
??
position encoding
Positional Embedding的成分直接疊加于Embedding之上,使得每個token的位置信息和它的語義信息(embedding)充分融合,并被傳遞到后續(xù)所有經(jīng)過復(fù)雜變換的序列表達中去。
論文中使用的Positional Encoding(PE)是正余弦函數(shù),位置(pos)越小,波長越長,每一個位置對應(yīng)的PE都是唯一的。同時作者也提到,之所以選用正余弦函數(shù)作為PE,是因為這可以使得模型學(xué)習(xí)到token之間的相對位置關(guān)系:因為對于任意的偏移量k,??可以由 ???的線性表示:
?
?
上面兩個公式可以由 ???和 ?
的線性組合得到。也就是 ?乘上某個線性變換矩陣就得到了 ?
?
p.s. 后續(xù)有一個工作在attention中使用了“相對位置表示” ( ?Self-Attention with Relative Position Representations) ,有興趣可以看看。
3.3. Layer Normalization
在每個block中,最后出現(xiàn)的是Layer Normalization。Layer Normalization是一個通用的技術(shù),其本質(zhì)是規(guī)范優(yōu)化空間,加速收斂。
當我們使用梯度下降法做優(yōu)化時,隨著網(wǎng)絡(luò)深度的增加,數(shù)據(jù)的分布會不斷發(fā)生變化,假設(shè)feature只有二維,那么用示意圖來表示一下就是:
??數(shù)據(jù)的分布發(fā)生變化,左圖比較規(guī)范,右圖變得不規(guī)范
為了保證數(shù)據(jù)特征分布的穩(wěn)定性(如左圖),我們加入Layer Normalization,這樣可以加速模型的優(yōu)化速度。
p.s. 后期我也會專門出一篇文章講各種Normalization的技術(shù),敬請期待~
4. Transformer結(jié)構(gòu)和RNN結(jié)構(gòu)的對比
emmm這部分過幾天再加吧……
5. 參考
How Much Attention Do You Need? A Granular Analysis of Neural Machine Translation Architectures Attention is all you need; Attentional Neural Network Models | ?ukasz Kaiser | Masterclass[ The Illustrated Transformer ](https://link.zhihu.com/?target=https%3A//jalammar.github.io/illustrated- transformer/) ?Juliuszh:詳解深度學(xué)習(xí)中的Normalization,BN/LN/WN
總結(jié)
以上是生活随笔為你收集整理的Transformer模型深度解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis开发规范
- 下一篇: 微信“看一看“个性化推荐:排序篇