學(xué)習(xí)路線參考:
https://blog.51cto.com/u_15298598/3121189
https://github.com/Ailln/nlp-roadmap
https://juejin.cn/post/7113066539053482021
https://zhuanlan.zhihu.com/p/100567371
https://cloud.tencent.com/developer/article/1884740
本節(jié)學(xué)習(xí)使用工具&閱讀文章:
https://arxiv.org/pdf/1706.03762.pdf
http://jalammar.github.io/illustrated-transformer/
https://zhuanlan.zhihu.com/p/46990010
https://www.cnblogs.com/baobaotql/p/11662720.html
https://zhuanlan.zhihu.com/p/80377698
https://zhuanlan.zhihu.com/p/372279569
https://blog.csdn.net/guofei_fly/article/details/105601979
-
Transformer概述
2017 年,Google 機(jī)器翻譯團(tuán)隊(duì)發(fā)表的《Attention is All You Need》中提出了Transformer模型,完全拋棄了RNN和CNN等網(wǎng)絡(luò)結(jié)構(gòu),僅僅采用Attention機(jī)制來進(jìn)行機(jī)器翻譯任務(wù),取得了很好的效果。
-
模型結(jié)構(gòu)總覽
Transformer結(jié)構(gòu)
模型分為兩大部分:Encoder與Decoder。
-
自編碼器
這個(gè)結(jié)構(gòu)最早在自編碼器中出現(xiàn)。自編碼器的原理很簡(jiǎn)單,可以理解為一個(gè)試圖去還原其原始輸入的系統(tǒng)。在深度學(xué)習(xí)中,自動(dòng)編碼器是一種無監(jiān)督的神經(jīng)網(wǎng)絡(luò)模型,它可以學(xué)習(xí)到輸入數(shù)據(jù)的隱含特征,這稱為編碼(coding),同時(shí)用學(xué)習(xí)到的新特征可以重構(gòu)出原始輸入數(shù)據(jù),稱之為解碼(decoding)。
從直觀上來看,自動(dòng)編碼器可以用于特征降維,類似主成分分析PCA,但是其相比PCA其性能更強(qiáng),這是由于神經(jīng)網(wǎng)絡(luò)模型可以提取更有效的新特征。除了進(jìn)行特征降維,自動(dòng)編碼器學(xué)習(xí)到的新特征可以送入有監(jiān)督學(xué)習(xí)模型中,所以自動(dòng)編碼器可以起到特征提取器的作用。
自動(dòng)編碼器原理如圖所示,將手寫數(shù)字圖片進(jìn)行編碼,編碼后生成的
較完整的保留了原始圖像的典型特征,因此可較容易地通過解碼恢復(fù)出原始圖像。
自編碼器三大特點(diǎn):
- 自動(dòng)編碼器是數(shù)據(jù)相關(guān)的(data-specific 或 data-dependent),這意味著自動(dòng)編碼器只能壓縮那些與訓(xùn)練數(shù)據(jù)類似的數(shù)據(jù)。比如,使用人臉訓(xùn)練出來的自動(dòng)編碼器在壓縮別的圖片,比如樹木時(shí)性能很差,因?yàn)樗鼘W(xué)習(xí)到的特征是與人臉相關(guān)的。
- 自動(dòng)編碼器是有損的,意思是解壓縮的輸出與原來的輸入相比是退化的,MP3,JPEG等壓縮算法也是如此。這與無損壓縮算法不同。
- 自動(dòng)編碼器是從數(shù)據(jù)樣本中自動(dòng)學(xué)習(xí)的,這意味著很容易對(duì)指定類的輸入訓(xùn)練出一種特定的編碼器,而不需要完成任何新工作。
-
Transformer的編碼器-解碼器結(jié)構(gòu)
在Transformer中,Encoder將輸入讀進(jìn)去,Decoder進(jìn)行輸出。二者的結(jié)合方式如下:
編碼器和解碼器的結(jié)合方式在論文中,編碼組件由六個(gè)Encoder組成,解碼組件由六個(gè)Decoder組成。Encoder的輸出會(huì)和每一層的Decoder進(jìn)行結(jié)合。
-
輸入前的處理
-
Input Embedding
隨機(jī)初始化詞向量,
-
位置編碼
經(jīng)過 word embedding,我們獲得了詞與詞之間關(guān)系的表達(dá)形式,但是詞在句子中的位置關(guān)系還無法體現(xiàn)。由于 Transformer 是并行地處理句子中的所有詞,因此需要加入詞在句子中的位置信息。
Transformer使用了位置編碼,利用一定的公式計(jì)算詞的位置信息,隨后與詞向量相加就得到了輸入。位置編碼計(jì)算方法如下:
位置編碼計(jì)算方法
-
-
Transformer的編碼器
Transformer的編碼器-
Self-Attention
Self-attention是一種attention機(jī)制,用來計(jì)算一個(gè)句子(中的token)的represetation,其包含了這個(gè)句子中token不同位置的關(guān)系。
第一步:從每個(gè)編碼器的輸入向量(在本例中是每個(gè)詞的嵌入)創(chuàng)建三個(gè)向量。因此,對(duì)于每個(gè)單詞,我們創(chuàng)建一個(gè)Q向量、一個(gè)K向量和一個(gè)V向量。這些向量是通過將嵌入向量乘以我們?cè)?img class="math-inline" src="https://math.jianshu.com/math?formula=W%5EQ%2C%20W%5EK%2CW%5EV" alt="W^Q, W^K,W^V" mathimg="1">三個(gè)矩陣而創(chuàng)建的。這三個(gè)矩陣是可學(xué)習(xí)的。
計(jì)算Q、K、V向量第二步:計(jì)算一個(gè)score。假設(shè)我們正在計(jì)算本例中第一個(gè)詞“Thinking”的自注意力。我們需要根據(jù)這個(gè)詞對(duì)輸入句子的每個(gè)詞進(jìn)行評(píng)分。當(dāng)我們?cè)谔囟ㄎ恢脤?duì)單詞進(jìn)行編碼時(shí),分?jǐn)?shù)決定了將多少注意力放在輸入句子的其他部分。分?jǐn)?shù)是通過Q與我們正在評(píng)分的相應(yīng)單詞的K的點(diǎn)積計(jì)算得出的。如圖所示:
計(jì)算得分第三步:將分?jǐn)?shù)除以 8(目的是讓梯度更穩(wěn)定),然后通過 softmax 操作傳遞結(jié)果。Softmax 對(duì)分?jǐn)?shù)進(jìn)行歸一化處理,使它們都為正且加起來為 1。
self-attention中的Softmax.png第四步:每個(gè)V乘以 softmax 分?jǐn)?shù)(準(zhǔn)備將它們相加)。這里的想法是保持我們想要關(guān)注的單詞的值不變,并忽略不相關(guān)的單詞。隨后對(duì)加權(quán)值向量求和,產(chǎn)生自注意層的輸出。
完整流程自注意力計(jì)算到此結(jié)束,生成的向量是我們可以發(fā)送到前饋神經(jīng)網(wǎng)絡(luò)的向量。
-
多頭自注意力
一組attention的權(quán)重參數(shù)只能夠表達(dá)一種詞與詞之間的關(guān)系,在nlp任務(wù)中,一種關(guān)系可能不足以表達(dá)。所以通過配置多組attention權(quán)重矩陣,最后通過線性組合,來綜合表達(dá)。
多頭自注意力對(duì)于多頭注意力,我們?yōu)槊總€(gè)頭維護(hù)單獨(dú)的
權(quán)重矩陣,從而產(chǎn)生不同的
矩陣。我們最終會(huì)得到八個(gè)不同的 Z 矩陣,隨后連接這些矩陣,然后將它們乘以一個(gè)額外的權(quán)重矩陣
,得到最終的Z矩陣。
整個(gè)Multi headed Self-Attention層可以描述為下圖:
Multi headed Self-Attention -
-
Feed Forward Neural Network
在進(jìn)行了Attention操作之后,對(duì)向量先使用一個(gè)線性變換,再針對(duì)該線性變換的輸出使用RELU函數(shù),最后再針對(duì)RELU函數(shù)的輸出使用一個(gè)線性變換。其效果與加上一層卷積核大小為1*1的CNN是一樣的。
-
-
Add&Normalize
每個(gè)編碼器中的每個(gè)子層周圍都有一個(gè)殘差連接,然后是LayerNormalize步驟。
Add&Normalize
Layer Normalization是作用于每個(gè)時(shí)序樣本的歸一化方法,其作用主要體現(xiàn)在:
- 作用于非線性激活函數(shù)前,能夠?qū)⑤斎肜x激活函數(shù)非飽(防止梯度消失)和非線性區(qū)域(保證非線性);
- 保證樣本輸入的同分布。
在CNN類模型中,常用的歸一化方法是Batch Normalization,即統(tǒng)計(jì)和學(xué)習(xí)跨樣本各通道內(nèi)的歸一化方法;RNN類模型中,或者更一般的講,在序列問題中,由于序列的天然時(shí)序性以及序列長(zhǎng)度的不一致性,采用Layer Normalization更為合理。
Transformer在各層的MultiHead-Attention和FFN中均采用了Layer Normalization的技術(shù),同時(shí)配以skip-connection,以提高信息的流通通道,提高模型的可訓(xùn)練性。
-
Transformer的解碼器
編碼器與解碼器解碼器的組件與編碼器基本完全相同,但有一定的區(qū)別:
- Self-Attention:也是計(jì)算輸入的Self-Attention,但是因?yàn)槭巧蛇^程,因此在時(shí)刻 i 的時(shí)候,大于 i 的時(shí)刻都沒有結(jié)果,只有小于 i 的時(shí)刻有結(jié)果,因此需要做Mask。因此這里實(shí)際上是Masked multi-head Self-Attention。
- 增加了一個(gè)Encoder-Decoder Attention。該層同樣因?yàn)橹荒塬@取到當(dāng)前時(shí)刻之前的輸入,因此只對(duì)時(shí)刻 t 之前的時(shí)刻輸入進(jìn)行Attention計(jì)算,需要做Mask。同時(shí)該層的K和V是由Encoder提供的,而非點(diǎn)積得來的。
Transformer工作流程1Transformer工作流程2
-
Linear + Softmax
線性變換層是一個(gè)簡(jiǎn)單的全連接神經(jīng)網(wǎng)絡(luò),它可以把解碼組件產(chǎn)生的向量投射到一個(gè)比它大得多的、被稱作對(duì)數(shù)幾率(logits)的向量里。不妨假設(shè)我們的模型從訓(xùn)練集中學(xué)習(xí)一萬個(gè)不同的英語(yǔ)單詞(我們模型的“輸出詞表”)。因此對(duì)數(shù)幾率向量為一萬個(gè)單元格長(zhǎng)度的向量——每個(gè)單元格對(duì)應(yīng)某一個(gè)單詞的分?jǐn)?shù)。
接下來的Softmax 層便會(huì)把那些分?jǐn)?shù)變成概率(都為正數(shù)、上限1.0)。概率最高的單元格被選中,并且它對(duì)應(yīng)的單詞被作為這個(gè)時(shí)間步的輸出,同時(shí)將Decoder的堆棧輸出作為輸入,從底部開始,最終進(jìn)行單詞預(yù)測(cè)。
-
Transformer的優(yōu)勢(shì)
- 長(zhǎng)距離的信息捕捉。雖然RNN通過gate的引入,能在一定上改善長(zhǎng)距離依賴,但自回歸模型的梯度消失/爆炸仍限制了RNN模型的使用。而CNN模型的專場(chǎng)在于捕捉local特征,雖然可以通過空洞卷積和層次化的結(jié)構(gòu)擴(kuò)大感受野,但對(duì)于長(zhǎng)距離的信息捕捉仍然較弱。而self-attention直接擺脫了距離的限制,能夠很好的捕捉遠(yuǎn)距離的文本信息關(guān)系。
- 計(jì)算上的優(yōu)勢(shì)。RNN的另外一大缺點(diǎn)在于自回歸模型無法實(shí)現(xiàn)并行計(jì)算,而self-attention的自交互式計(jì)算則沒有這個(gè)問題,可以非常方便的進(jìn)行并行計(jì)算。此外,一般embedding的維度是大于文本長(zhǎng)度的,所以transformre的計(jì)算量更小。
- 性能上的優(yōu)勢(shì)。由于Transformer的self-attention對(duì)每?jī)蓚€(gè)token間的信息進(jìn)行了交互,同時(shí)multi-head的方式也能夠從各sub-space捕獲更多的特征細(xì)節(jié),所以用Transformer作為特征抽取器的模型在各種下游任務(wù)上的表現(xiàn)均明顯優(yōu)于傳統(tǒng)的CNN和RNN模型。所以,Transformer在后續(xù)GPT、Bert、XLNet等預(yù)訓(xùn)練模型上的大火也就不難理解了。














