【關(guān)于Transformer】 那些的你不知道的事(中)
?作者:楊夕
?項(xiàng)目地址:https://github.com/km1994/nlp_paper_study
論文鏈接:https://arxiv.org/pdf/1706.03762.pdf
【注:手機(jī)閱讀可能圖片打不開?。?!】
個(gè)人介紹:大佬們好,我叫楊夕,該項(xiàng)目主要是本人在研讀頂會(huì)論文和復(fù)現(xiàn)經(jīng)典論文過程中,所見、所思、所想、所聞,可能存在一些理解錯(cuò)誤,希望大佬們多多指正。
##?引言
本博客?主要?是本人在學(xué)習(xí)?Transformer?時(shí)的**所遇、所思、所解**,通過以?**十六連彈**?的方式幫助大家更好的理解?該問題。
##?十六連彈
1.?為什么要有?Transformer?
2.?Transformer 作用是什么?
3.?Transformer 整體結(jié)構(gòu)怎么樣?
4.?Transformer-encoder 結(jié)構(gòu)怎么樣?
5.?Transformer-decoder?結(jié)構(gòu)怎么樣?
6.?傳統(tǒng)?attention?是什么?
7.?self-attention?長怎么樣?
8.?self-attention 如何解決長距離依賴問題?
9.?self-attention 如何并行化?
10.?multi-head?attention?怎么解?
11.?為什么要?加入 position embedding ?
12.?為什么要?加入?殘差模塊?
13.?Layer normalization。Normalization 是什么?
14.?什么是 Mask?
15.?Transformer 存在問題?
16.?Transformer?怎么?Coding?
##?問題解答
###?六、傳統(tǒng)?attention?是什么?

-?注意力機(jī)制是什么呢?
??-?就是將精力集中于某一個(gè)點(diǎn)上
??-?舉個(gè)例子:
????-?你在超市買東西,突然一個(gè)美女從你身邊走過,這個(gè)時(shí)候你會(huì)做什么呢?
????-?沒錯(cuò),就是將視線【也就是注意力】集中于這個(gè)美女身上,而周圍環(huán)境怎么樣,你都不關(guān)注。
-?思路
??-?輸入?給定 Target 中某個(gè) query;
??-?計(jì)算權(quán)值 Score:
????-?計(jì)算 query 和?各個(gè) Key 的相似度或相關(guān)性,得到每個(gè) Key 對應(yīng) value 的權(quán)值系數(shù);
??-?對?權(quán)值?Score?和?value?進(jìn)行加權(quán)求和
-?核心:
??-?Attention?機(jī)制?是對?source?中各個(gè)元素?的?value?進(jìn)行加權(quán)求和,而?query?和?key?用于計(jì)算?對應(yīng)?value?的權(quán)值系數(shù)

>?$L_x=||Source||$代表Source的長度
-?概念:
??-?attention 的核心?就是從?大量信息中?篩選出少量的?重要信息;
??-?具體操作:每個(gè) value 的?權(quán)值系數(shù),代表?其?重要度;?
??

-?具體流程介紹
??-?step 1:計(jì)算權(quán)值系數(shù)
????-?采用?不同的函數(shù)或計(jì)算方式,對?query?和?key?進(jìn)行計(jì)算,求出相似度或相關(guān)性
????-?采用的計(jì)算方法:
??????-?向量點(diǎn)積:

??????-?Cosine 相似度計(jì)算:

??????-?MLP 網(wǎng)絡(luò):

??-?step?2:?softmax?歸一化
????-?原因:
??????1.?score 值分布過散,將原始計(jì)算分值整理成所有元素權(quán)重之和為1 的概率分布;
??????2.?可以通過SoftMax的內(nèi)在機(jī)制更加突出重要元素的權(quán)重;
????-?公式介紹

??-?step?3:?加權(quán)求和
????-?公式介紹:
??????-?計(jì)算結(jié)果?$a_i$?即為?$value_i$?對應(yīng)的權(quán)重系數(shù),然后進(jìn)行加權(quán)求和即可得到Attention數(shù)值

-?存在問題
??-?忽略了?源端或目標(biāo)端?詞與詞間?的依賴關(guān)系【以上面栗子為例,就是把注意力集中于美女身上,而沒看自己周圍環(huán)境,結(jié)果可能就撲街了!】
###?七、self-attention?長怎么樣?
-?動(dòng)機(jī)
??-? CNN 所存在的長距離依賴問題;
??-? RNN 所存在的無法并行化問題【雖然能夠在一定長度上緩解?長距離依賴問題】;
-?傳統(tǒng)?Attention
??-?方法:基于源端和目標(biāo)端的隱向量計(jì)算Attention,
??-?結(jié)果:源端每個(gè)詞與目標(biāo)端每個(gè)詞間的依賴關(guān)系?【源端->目標(biāo)端】
??-?問題:忽略了?遠(yuǎn)端或目標(biāo)端?詞與詞間?的依賴關(guān)系
-?核心思想:self-attention的結(jié)構(gòu)在計(jì)算每個(gè)token時(shí),總是會(huì)考慮整個(gè)序列其他token的表達(dá);
??-?舉例:“我愛中國”這個(gè)序列,在計(jì)算"我"這個(gè)詞的時(shí)候,不但會(huì)考慮詞本身的embedding,也同時(shí)會(huì)考慮其他詞對這個(gè)詞的影響
-?目的:學(xué)習(xí)句子內(nèi)部的詞依賴關(guān)系,捕獲句子的內(nèi)部結(jié)構(gòu)。


-?步驟
??-?embedding層:
????-?目的:將詞轉(zhuǎn)化成embedding向量;
??-?Q,K,V 向量計(jì)算:
????-?根據(jù) embedding 和權(quán)重矩陣,得到Q,K,V;
??????-?Q:查詢向量,目標(biāo)字作為 Query;
??????-?K:鍵向量,其上下文的各個(gè)字作為 Key;
??????-?V:值向量,上下文各個(gè)字的 Value;
??-?權(quán)重 score 計(jì)算:
????-?查詢向量?query?點(diǎn)乘?key;
????-?目的:計(jì)算其他詞對這個(gè)詞的重要性,也就是權(quán)值;
??-?scale 操作:
????-?乘以?
;
????-?目的:起到調(diào)節(jié)作用,使得內(nèi)積不至于太大。實(shí)際上是Q,K,V的最后一個(gè)維度,當(dāng)?$d_k$?越大,?
就越大,可能會(huì)將 Softmax 函數(shù)推入梯度極小的區(qū)域;
??-?Softmax 歸一化:
????-?經(jīng)過 Softmax 歸一化;
??-?Attention 的輸出計(jì)算:
????-?權(quán)值?score?和各個(gè)上下文字的?V?向量?的加權(quán)求和
????-?目的:把上下文各個(gè)字的 V 融入目標(biāo)字的原始 V 中
-?舉例
??-?答案就是文章中的Q,K,V,這三個(gè)向量都可以表示"我"這個(gè)詞,但每個(gè)向量的作用并不一樣,Q?代表?query,當(dāng)計(jì)算"我"這個(gè)詞時(shí),它就能代表"我"去和其他詞的?K?進(jìn)行點(diǎn)乘計(jì)算其他詞對這個(gè)詞的重要性,所以此時(shí)其他詞(包括自己)使用?K?也就是?key?代表自己,當(dāng)計(jì)算完點(diǎn)乘后,我們只是得到了每個(gè)詞對“我”這個(gè)詞的權(quán)重,需要再乘以一個(gè)其他詞(包括自己)的向量,也就是V(value),才完成"我"這個(gè)詞的計(jì)算,同時(shí)也是完成了用其他詞來表征"我"的一個(gè)過程
-?優(yōu)點(diǎn)
??-?捕獲源端和目標(biāo)端詞與詞間的依賴關(guān)系
??-?捕獲源端或目標(biāo)端自身詞與詞間的依賴關(guān)系
###?八、self-attention 如何解決長距離依賴問題?
-?引言:
??-?在上一個(gè)問題中,我們提到 CNN 和 RNN 在處理長序列時(shí),都存在?長距離依賴問題,那么你是否會(huì)有這樣?幾個(gè)問題:
????-?長距離依賴問題?是什么呢?
????-?為什么 CNN 和 RNN 無法解決長距離依賴問題?
????-?之前提出過哪些解決方法?
????-?self-attention?是如何?解決?長距離依賴問題的呢?
下面,我們將會(huì)圍繞著幾個(gè)問題,進(jìn)行一一解答。
-?長距離依賴問題?是什么呢?
??-?介紹:對于序列問題,第 t 時(shí)刻?的?輸出?$y_t$?依賴于?t 之前的輸入,也就是?說?依賴于?
,當(dāng)間隔?k?逐漸增大時(shí),$x_{t-k}$?的信息將難以被?$y_t$?所學(xué)習(xí)到,也就是說,很難建立?這種?長距離依賴關(guān)系,這個(gè)也就是?長距離依賴問題(Long-Term Dependencies Problem)。
-?為什么 CNN 和 RNN 無法解決長距離依賴問題?
??-?CNN:
????-?捕獲信息的方式:
??????-?CNN?主要采用?卷積核?的?方式捕獲?句子內(nèi)的局部信息,你可以把他理解為?**基于?n-gram?的局部編碼方式**捕獲局部信息
????-?問題:
??????-?因?yàn)槭?n-gram?的局部編碼方式,那么當(dāng)?$k$?距離?大于?$n$?時(shí),那么?$y_t$?將難以學(xué)習(xí)?$x_{t-k}$?信息;
????-?舉例:
??????-?其實(shí) n-gram 類似于?人的?視覺范圍,人的視覺范圍?在每一時(shí)刻?只能?捕獲?一定?范圍內(nèi)?的信息,比如,你在看前面的時(shí)候,你是不可能注意到背后發(fā)生了什么,除非你轉(zhuǎn)過身往后看。
??-?RNN:
????-?捕獲信息的方式:
??????-?RNN?主要?通過?循環(huán)?的方式學(xué)習(xí)(記憶)?之前的信息$x_{t}$;
????-?問題:
??????-?但是隨著時(shí)間?$t$?的推移,你會(huì)出現(xiàn)**梯度消失或梯度爆炸**問題,這種問題使你只能建立短距離依賴信息。
????-?舉例:
??????-?RNN 的學(xué)習(xí)模式好比于?人類?的記憶力,人類可能會(huì)對?短距離內(nèi)發(fā)生的?事情特別清楚,但是隨著時(shí)間的推移,人類開始?會(huì)對?好久之前所發(fā)生的事情變得印象模糊,比如,你對小時(shí)候發(fā)生的事情,印象模糊一樣。
????-?解決方法:
??????-?針對該問題,后期也提出了很多 RNN 變體,比如 LSTM、 GRU,這些變體?通過引入?門控的機(jī)制?來?有選擇性?的記憶?一些?重要的信息,但是這種方法?也只能在?一定程度上緩解?長距離依賴問題,但是并不能?從根本上解決問題。

-?之前提出過哪些解決方法?
??-?引言:
????-?那么?之前?主要采用?什么方法?解決問題呢?
??-?解決方法:
????-?增加網(wǎng)絡(luò)的層數(shù)
??????-?通過一個(gè)深層網(wǎng)絡(luò)來獲取遠(yuǎn)距離的信息交互
????-?使用全連接網(wǎng)絡(luò)
??????-?通過全連接的方法對?長距離?建模;
??????-?問題:
????????-?無法處理變長的輸入序列;
????????-?不同的輸入長度,其連接權(quán)重的大小也是不同的;

-?self-attention?是如何?解決?長距離依賴問題的呢?
??-?解決方式:
????-?利用注意力機(jī)制來“動(dòng)態(tài)”地生成不同連接的權(quán)重,從而處理變長的信息序列
??-?具體介紹:
????-?對于?當(dāng)前query,你需要?與?句子中?所有?key?進(jìn)行點(diǎn)乘后再?Softmax?,以獲得?句子中?所有?key?對于?當(dāng)前query?的?score(可以理解為?貢獻(xiàn)度),然后與?所有詞?的?value?向量進(jìn)行加權(quán)融合之后,就能使?當(dāng)前?$y_t$?學(xué)習(xí)到句子中?其他詞$x_{t-k}$的信息;
###?九、self-attention 如何并行化?
-?引言:
??-?在上一個(gè)問題中,我們主要討論了 CNN 和 RNN 在處理長序列時(shí),都存在?長距離依賴問題,以及 Transformer 是?如何解決?長距離依賴問題,但是對于 RNN ,還存在另外一個(gè)問題:
????-?無法并行化問題
??-?那么,Transformer 是如何進(jìn)行并行化的呢?
-?Transformer 如何進(jìn)行并行化?
??-?核心:self-attention
??-?為什么 RNN 不能并行化:
????-?原因:RNN 在?計(jì)算?$x_i$?的時(shí)候,需要考慮到?$x_1?~?x_{i-1}$?的?信息,使得?RNN?只能?從?$x_1$?計(jì)算到?$x_i$;
??-?思路:
????-?在 self-attention 能夠?并行的?計(jì)算?句子中不同?的 query,因?yàn)槊總€(gè) query 之間并不存在?先后依賴關(guān)系,也使得 transformer 能夠并行化;
###?十、multi-head?attention?怎么解?
-?思路:
??-?相當(dāng)于?$h$?個(gè)?不同的?self-attention?的集成
??-?就是把self-attention做 n 次,取決于 head 的個(gè)數(shù);論文里面是做了8次。
-?步驟:
??-?step?1?:?初始化?N?組?$Q,K,V$矩陣(論文為 8組);
??

??-?step?2?:?每組?分別?進(jìn)行?self-attention;
??-?step 3:
????-?問題:多個(gè) self-attention 會(huì)得到?多個(gè)?矩陣,但是前饋神經(jīng)網(wǎng)絡(luò)沒法輸入8個(gè)矩陣;
????-?目標(biāo):把8個(gè)矩陣降為1個(gè)
????-?步驟:
??????-?每次self-attention都會(huì)得到一個(gè)?Z?矩陣,把每個(gè)?Z?矩陣拼接起來,
??????-?再乘以一個(gè)Wo矩陣,
??????-?得到一個(gè)最終的矩陣,即 multi-head Attention 的結(jié)果;

最后,讓我們來看一下完整的流程:

換一種表現(xiàn)方式:

##?參考資料
1.?[Transformer理論源碼細(xì)節(jié)詳解](https://zhuanlan.zhihu.com/p/106867810)
2.?[論文筆記:Attention is all you need(Transformer)](https://zhuanlan.zhihu.com/p/51089880)
3.?[深度學(xué)習(xí)-論文閱讀-Transformer-20191117](https://zhuanlan.zhihu.com/p/92234185)
4.?[Transform詳解(超詳細(xì))?Attention?is?all?you?need論文](https://zhuanlan.zhihu.com/p/63191028)
5.?[目前主流的attention方法都有哪些?](https://www.zhihu.com/question/68482809/answer/597944559)
6.?[transformer三部曲](https://zhuanlan.zhihu.com/p/85612521)
7.?[Character-Level?Language?Modeling?with?Deeper?Self-Attention](https://aaai.org/ojs/index.php/AAAI/article/view/4182)
8.?[Transformer-XL:?Unleashing?the?Potential?of?Attention?Models](https://ai.googleblog.com/2019/01/transformer-xl-unleashing-potential-of.html)
9.?[The?Importance?of?Being?Recurrent?for?Modeling?Hierarchical?Structure](https://arxiv.org/abs/1803.03585)
10.?[Linformer](https://arxiv.org/abs/2006.04768)

