廣告行業(yè)中那些趣事系列4:詳解從配角到C位出道的Transformer

摘要:上一篇廣告行業(yè)中那些趣事系列3:NLP中的巨星BERT,從理論的角度講了下NLP中有里程碑意義的BERT模型。BERT具有效果好和通用性強(qiáng)兩大優(yōu)點(diǎn),其中效果好最主要的原因就是使用了Transformer作為特征抽取器。本篇主要詳解下這個(gè)從配角到C位出道的Transformer,主要從宏觀和微觀的角度分析Transformer,講下它的核心注意力機(jī)制Attention,然后以翻譯任務(wù)舉例講下Transformer是如何進(jìn)行工作的。
對充滿挑戰(zhàn)的高薪行業(yè)NLP感興趣的小伙伴可以多多關(guān)注。不僅僅是技術(shù),大家也可以了解到身邊的翻譯任務(wù)、對話機(jī)器人是怎么做出來的。
目錄
01 BERT和Transformer的關(guān)系
02 為什么要用Transformer
03 從宏觀視角看Transformer
04 從微觀視角看Transformer
01 BERT和Transformer的關(guān)系

圖1 回顧Word Embedding的演化歷史
這里作為引言回顧下NLP中預(yù)訓(xùn)練技術(shù)Word Embedding的演化歷史:
Word2vec將文本映射到向量空間,從而實(shí)現(xiàn)了在低維向量空間表示文本。通過向量空間中距離的長短可以表示文本語義的相似度。但是因?yàn)橐粋€(gè)詞在向量空間中位置是唯一的,所以無法解決多義詞的問題。比如”legend”既可以代表傳奇,還可以代表圖例。歸根結(jié)底是靜態(tài)的Word Embedding。
ELMO采用聯(lián)系上下文的三層embedding來表示詞,不僅包括詞向量,還包括了句法特征向量和語義特征向量,很好的解決了多義詞問題。
而目前項(xiàng)目中使用的BERT模型相比于ELMO,因?yàn)槭褂昧薚ransformer作為特征抽取器,所以模型效果很好。
總結(jié)下,google推出的BERT模型在11項(xiàng)NLP任務(wù)中效果有很大提升。最重要的一個(gè)原因是使用Transformer作為特征抽取器。
02 為什么要用Transformer

圖2 傳統(tǒng)的特征抽取器RNN和CNN
NLP中傳統(tǒng)的特征器主要是RNN和CNN。
RNN(或者變種LSTM、GRU等)由于本身的機(jī)制只能按順序依次計(jì)算,這種機(jī)制存在兩個(gè)問題:
時(shí)間片t的計(jì)算依賴上一時(shí)間片t-1的計(jì)算結(jié)果,這樣限制了模型的并行能力
信息計(jì)算的過程中信息會(huì)丟失,雖然LSTM等通過門機(jī)制會(huì)一定程度緩解長期依賴的問題,但是對于特別長的依賴現(xiàn)象LSTM還是無能為力
CNN雖然可以并行化計(jì)算,但是不適合捕捉長距離特征。
因?yàn)镽NN和CNN各自存在的問題,所以google團(tuán)隊(duì)在論文《Attention is All You Need》中提出了Transformer模型。中文的意思是變形金剛,聽著就很霸氣。

Transformer拋棄了傳統(tǒng)的CNN和RNN,整個(gè)網(wǎng)絡(luò)完全由Attention機(jī)制組成,同時(shí)具有可并行化計(jì)算和捕捉長距離特征的優(yōu)點(diǎn)。
03 從宏觀視角看Transformer
1. Transformer的組成

圖3 從宏觀視角看Transformer
拿翻譯系統(tǒng)舉例,我們輸入一種語言,通過Transformer模型,輸出是另外一種語言。
進(jìn)一步剖析Transformer模型,主要有編碼組件和解碼組件組成。編碼組件中包含很多個(gè)編碼器,解碼組件也包含很多個(gè)解碼器。
2. 編碼器和解碼器結(jié)構(gòu)

圖4 編碼器和解碼器結(jié)構(gòu)
編碼器主要包含自注意力層(Self-Attention)和前饋神經(jīng)網(wǎng)絡(luò)層(Feed Forward Neural Network)。
解碼器和編碼器很相似,也包含自注意力層和前饋神經(jīng)網(wǎng)絡(luò)層,另外還有一層編碼解碼層(Encoder-Decoder Attention)。
小結(jié)下,我們從宏觀視角了解了Transformer的結(jié)構(gòu)。Transformer主要包含編碼組件和解碼組件,編碼組件中又包含很多編碼器,解碼組件同理。編碼器中主要有自注意力層和前向神經(jīng)網(wǎng)絡(luò)層,解碼器相比于編碼器多了編碼解碼層??傮w來說還是比較容易理解。
04 從微觀視角看Transformer
1. 從張量計(jì)算查看Transformer內(nèi)部轉(zhuǎn)化流程
大部分NLP任務(wù)首先需要將語料轉(zhuǎn)化成詞向量的表征形式x。
對于編碼組件來說,底層的編碼器作為整個(gè)Transformer的入口,接收詞向量作為模型輸入。
這里咱們通過具體輸入輸出的維度表示來方便小伙伴們更好的理解Transformer中的各個(gè)環(huán)節(jié)。我們假設(shè)詞向量的維度為512維。這里的512是可以設(shè)置的參數(shù),一般是訓(xùn)練集中最長句子的長度。
因?yàn)榫幋a組件中所有編碼器的輸入維度是相同的,初始的詞向量是1X512維,那么底層的編碼器的輸入是1X512維,所以其他的編碼器的輸入也是1X512維。編碼器內(nèi)部會(huì)依次經(jīng)過自注意力層和前饋神經(jīng)網(wǎng)絡(luò)層。
低層編碼器的輸出會(huì)作為上一層編碼器的輸入,不斷進(jìn)行,直到穿過整個(gè)編碼組件。比如圖5中編碼器1的輸入是詞向量,編碼器2的輸入是編碼器1的輸出。編碼器內(nèi)部轉(zhuǎn)化流程和編碼器之間的轉(zhuǎn)化流程如下圖所示:

圖5 編碼器內(nèi)部以及之間的轉(zhuǎn)化流程
2. 查看自注意力層的計(jì)算流程
Transformer中最重要的就是這個(gè)自注意力機(jī)制Self-Attention。Self-Attention主要用于計(jì)算當(dāng)前詞對所有詞的注意力得分,整個(gè)流程如下:

圖6 計(jì)算注意力得分整個(gè)流程
這里通過計(jì)算詞"thinking"的注意力得分舉例,詳細(xì)分析步驟如下:
(1) 將編碼器的輸入x轉(zhuǎn)化成三個(gè)向量
通過詞向量x(1X512)和三個(gè)不同的權(quán)值矩陣????、????、????相乘得到查詢向量Q(1X64)、鍵向量K(1X64)和值向量V(1X64)。
小伙伴們可能有疑問了,這三個(gè)權(quán)值矩陣怎么得到的?
模型剛開始訓(xùn)練的時(shí)候,這三個(gè)權(quán)值矩陣參數(shù)可能是隨機(jī)的。等模型訓(xùn)練完成之后,就得到訓(xùn)練好的權(quán)值矩陣的參數(shù)了。這三個(gè)權(quán)重矩陣的維度都是512X64維。
其中512是因?yàn)橐婚_始我們設(shè)置詞向量的維度是1X512,那64怎么來的?這里涉及到Transformer的多頭注意力機(jī)制,先埋個(gè)坑,后面填
。
(2) 計(jì)算當(dāng)前詞對所有詞的注意力得分
比如我們計(jì)算"thinking"的注意力得分。將"thinking"的查詢向量q1分別和所有詞的ki點(diǎn)積相乘得到一個(gè)得分score。這個(gè)得分代表當(dāng)前詞對其他詞的注意力。
(3) score歸一化和softmax函數(shù)映射
使用score歸一化的目的是為了梯度穩(wěn)定,分別將score除以鍵向量維度的算術(shù)平方根(論文中默認(rèn)為8)。然后通過一個(gè)softmax函數(shù)將得分映射為0-1之間的實(shí)數(shù),并且歸一化保證和為1。
(4) 計(jì)算最終的注意力得分
計(jì)算softmax值和值向量v1相乘得到加權(quán)向量,然后求和得到z1為最終的自注意力向量值。目的是保持相關(guān)詞的完整性,同時(shí)可以將數(shù)值極小的不相關(guān)的詞刪除。
上述整個(gè)流程就是通過張量計(jì)算展示自注意力層是如何計(jì)算注意力得分的。整體公式如下所示:

3. 多頭注意力機(jī)制
多頭注意力機(jī)制相當(dāng)于多個(gè)不同的注意力的集成(ensemble)。更通俗的理解是將上面Attention層“重復(fù)多次“,但是這里不僅僅是簡單的重復(fù)多次。
多頭注意力機(jī)制主要從以下兩個(gè)方面進(jìn)一步完善注意力層:
提升了模型對不同位置的注意力。通過多頭注意力機(jī)制,不同的頭關(guān)注的點(diǎn)是不同的。比如有的頭關(guān)注的是近距離的詞,而有些頭則是關(guān)注的更遠(yuǎn)的距離的詞
給注意力層多個(gè)表示子空間。使用多頭注意力機(jī)制我們就能得到多個(gè)查詢/鍵/值的權(quán)重向量矩陣。
Transformer默認(rèn)使用8個(gè)注意力頭。這樣每個(gè)編碼器就能得到8個(gè)矩陣。論文默認(rèn)使用的是8個(gè)頭,可調(diào)。
因?yàn)槊總€(gè)初始的權(quán)重矩陣都是隨機(jī)初始化的,所以經(jīng)過模型訓(xùn)練之后將被投影到不同的表示子空間中。多頭注意力機(jī)制如下圖所示:

圖8 多頭注意力機(jī)制
下面通過可視化的方式查看多頭注意力機(jī)制:

圖9 多頭注意力機(jī)制可視化
圖9中分別有兩個(gè)頭head1和head2,通過是否有連線以及顏色深淺我們可以查看當(dāng)前詞對所有詞的注意力得分。head1得到的注意力矩陣更多的關(guān)注距離較遠(yuǎn)的詞,head2則關(guān)注的是距離較近的詞。可以看出不同的頭關(guān)注的點(diǎn)是不同的。
現(xiàn)在出現(xiàn)一個(gè)新的問題:編碼器中從自注意力層到前饋神經(jīng)網(wǎng)絡(luò)層過程中,前饋神經(jīng)網(wǎng)絡(luò)僅需要一個(gè)矩陣?,F(xiàn)在因?yàn)槎囝^注意力機(jī)制,出現(xiàn)了八個(gè)頭。如何將這八個(gè)頭壓縮成一個(gè)頭?
Transformer的解決策略是先將8個(gè)矩陣拼接起來,然后再和一個(gè)附加的權(quán)重矩陣W0相乘。這里可以簡單的理解成通過一個(gè)全連接層來轉(zhuǎn)化輸出維度。其中權(quán)重矩陣W0和前面講的權(quán)值矩陣Q、K、V都是通過模型訓(xùn)練得到的。

圖10 多頭注意力機(jī)制合并多頭策略
查看維度,比如z1是1X64,那么8個(gè)矩陣拼接起來就是1X(64*8)變成了1X512維。
這個(gè)額外的權(quán)值矩陣W0的維度是512X512,這樣通過多頭機(jī)制的自注意力層最終得到的矩陣維度就是1X512了。通過前饋神經(jīng)網(wǎng)絡(luò)之后還是1X512維,那么編碼器的輸入和輸出則都是1X512維。
到這里為止,我們可以把前面的坑埋上了。為什么我們的Q、K、V權(quán)重矩陣的維度是512X64。512是因?yàn)樵~向量的維度是512維,而64就是因?yàn)檎撐闹心J(rèn)使用的是八頭注意力機(jī)制。將8個(gè)頭的注意力矩陣壓縮成一個(gè),所以這里是64維。
總結(jié)下多頭注意力機(jī)制的整個(gè)流程:首先輸入原始的語句;然后轉(zhuǎn)化為詞向量的矩陣形式;接著通過多頭注意力得到多個(gè)查詢/鍵/值向量;然后按照上面計(jì)算注意力的過程分別計(jì)算注意力矩陣;最后將多頭注意力矩陣壓縮為一個(gè)矩陣。大功告成!多頭注意力機(jī)制整個(gè)流程如下圖所示:

圖11 多頭注意力機(jī)制整個(gè)流程
4. 位置編碼
上述流程中缺少詞位置的信息,導(dǎo)致的結(jié)果就是無論句子結(jié)構(gòu)怎么打亂,Transformer得到的結(jié)果類似。也就是說,Transformer并沒有捕捉順序序列的能力,僅僅是一個(gè)功能強(qiáng)大的“詞袋”模型。
為了解決這個(gè)問題,Transformer為每個(gè)詞向量增加了一個(gè)表征詞位置以及詞之間距離的向量。這樣計(jì)算自注意力的時(shí)候模型就會(huì)加入有用的位置信息了。

圖12 位置編碼
下面是論文中關(guān)于計(jì)算位置編碼的公式:

其中pos代表單詞的位置,i表示詞的維度。
生成位置編碼的代碼在google開源的算法get_timing_signal_1d()函數(shù)中
作者這么設(shè)計(jì)的原因是,在NLP任務(wù)中詞的絕對位置很重要(比如通常一篇文章中首尾段落可能包含更多的信息),詞的相對位置也很重要。通過上述公式可以體現(xiàn)Transformer更加關(guān)注相對位置。
5. 殘差模塊
編碼器內(nèi)部子層還采用殘差網(wǎng)絡(luò),主要是為了解決深度學(xué)習(xí)中的退化問題。每個(gè)子層之后都連接一個(gè)殘差網(wǎng)絡(luò),進(jìn)行求和歸一化步驟。比如自注意力層后的殘差網(wǎng)絡(luò)會(huì)將自注意力層的輸入x和輸出z相加,然后進(jìn)行normalize歸一化。
編碼器內(nèi)部的殘差網(wǎng)絡(luò)和可視化如下圖:

圖13 殘差模塊
6. Attention可視化

圖14 Attention可視化
圖14通過一個(gè)簡單的例子看下Attention機(jī)制有多強(qiáng)大?,F(xiàn)在我們想翻譯一句話:"The animaldidn’t cross the street, because it was toot tired"。
我們想知道"it"到底是啥意思?對于人類而言,我們很容易知道"it"代表上面的"animal"(在一些復(fù)雜的段落中可能對于我們?nèi)祟愐彩呛茈y的任務(wù),類比小時(shí)候英語試題中某些完形填空題)。對于機(jī)器來說,完全就是下面這個(gè)黑人小哥的表情了。

Attention機(jī)制可以很好的理解"it"并找到最可能代表"it"的這個(gè)詞"animal"。圖中有兩個(gè)表示注意力矩陣的可視化圖,每個(gè)可視化圖表示的是上面一行的每個(gè)詞對下面一行所有詞的注意力,有連線則表示當(dāng)前詞對其他詞有關(guān)注,線的顏色越深則代表關(guān)注度越高??梢钥闯霎?dāng)前詞"it"同時(shí)對"the"、"
animal"、"
street"、"it"和句號(hào)都有關(guān)注度,但是對"animal"的關(guān)注度是最高的,所以"it"詞最終就代表"animal"。
有意思的是,如果我們修改語句,將其中的"tired"改成"wide",奇跡出了,Attention能很好的識(shí)別到"it"代表的是"street"。
下圖展示一個(gè)完整的雙層編碼-解碼器的Transformer結(jié)構(gòu):

圖15 一個(gè)完整的雙層編碼-解碼器的Transformer結(jié)構(gòu)
解碼器和編碼器大致相同,區(qū)別在于解碼器中多了一層編碼解碼層(encoder-decoderAttention)。編碼組件的輸入是詞向量,輸出是最頂層的編碼器輸出的K、V注意力向量集。這些K、V注意力向量集會(huì)分別進(jìn)入解碼組件中各個(gè)解碼器的編碼解碼層。解碼器中其他的自注意力層和前向神經(jīng)網(wǎng)絡(luò)層和編碼器是一樣的。
編碼器和解碼器工作流程動(dòng)圖如下所示:
圖16 編碼器和解碼器整個(gè)流程動(dòng)圖
這里需要注意的是解碼器第一輪的輸入是一個(gè)特殊的開始標(biāo)志符號(hào),使用編碼組件輸出的K、V注意力向量集,輸出是需要翻譯的第一個(gè)詞。
整個(gè)德語翻譯成英語流程動(dòng)圖如下所示:

圖17 整個(gè)德語翻譯成英語流程動(dòng)圖
咱們詳細(xì)講解下德語翻譯成英語的流程:編碼流程上面講的很詳細(xì),不再贅述。編碼組件完成編碼后,會(huì)將得到的K、V注意力向量集合分別傳遞給解碼組件中各個(gè)解碼器的編碼解碼層。
解碼階段開始,第一輪輸入是一個(gè)特殊的開始符號(hào),使用編碼組件輸出的K和V注意力向量集合,輸出是翻譯的第一個(gè)單詞。第二輪的輸入是第一輪輸出的單詞,輸出翻譯的第二個(gè)單詞。第三輪的輸入是前兩輪輸出的單詞,輸出翻譯的第三個(gè)單詞。依次類推,每次輸入都是之前輸出的所有單詞,輸出是翻譯的一個(gè)單詞。直到出現(xiàn)一個(gè)特殊的結(jié)束符號(hào)告訴Transformer解碼器已經(jīng)完成輸出。
當(dāng)時(shí)分享的時(shí)候有個(gè)小伙伴問了一個(gè)問題,Transformer如何做到神奇的完成翻譯流程并且知道何時(shí)停止?這里我理解翻譯任務(wù)應(yīng)該是一個(gè)多詞對多詞的流程,和通常的輸入輸出長度相同的S2S可能不同。這里的輸入和輸出長度是不同的,翻譯流程應(yīng)該是分成兩步,先找到目標(biāo)語言需要的所有詞,然后選擇最符合人類表達(dá)方式的順序輸出。因?yàn)闆]有做過翻譯系統(tǒng),所以這里僅是猜測。
有點(diǎn)小遺憾,本來圖16和圖17是動(dòng)圖,但是不管咋弄到上面就成靜態(tài)的。求助小伙伴如何在微信公眾號(hào)插入動(dòng)圖的。
總結(jié)
本篇從宏觀和微觀視角講了下Transformer,重頭戲在Attention機(jī)制。因?yàn)門ransformer具備并行性好和適合捕捉長距離特征的優(yōu)點(diǎn),所以成為NLP中主流的特征抽取器,從配角慢慢C位出道。BERT模型大火的背后則是Transformer的高調(diào)付出??梢哉f想學(xué)好BERT,必須要搞懂Transformer。
參考資料
[1] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need [C],Advancesin Neural Information ProcessingSystems. 2017: 5998-6008.
[2] http://jalammar.github.io/illustrated-Transformer/
[3] https://www.youtube.com/watch?v=ugWDIIOHtPA,臺(tái)大李宏毅,Transformer
[4] https://ai.googleblog.com/2017/08/Transformer-novel-neural-network.html
[5] https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/
master/tensor2tensor/notebooks/hello_t2t.ipynb#scrollTo=EB4MP7_y_SuQ
特別說明:本次分享主要參考的是《Attention is all you need》論文。因?yàn)檎撐谋容^高深難懂,所以僅通過論文不能很好的理解其中的精華。幸好國外有篇jalammar大神分享的可視化Transformer文章。深度好文,點(diǎn)贊!喜歡的朋友也可以直接通過參考資料[2]欣賞大作。這里也參考了臺(tái)大李宏毅關(guān)于Transformer的講解。有興趣的小伙伴可以通過B站查看。
回顧下廣告系列
廣告行業(yè)中那些趣事系列2:BERT實(shí)戰(zhàn)NLP文本分類任務(wù)(附github源碼)
喜歡本類型文章的小伙伴可以關(guān)注我的微信公眾號(hào):數(shù)據(jù)拾光者。有任何干貨我會(huì)首先發(fā)布在微信公眾號(hào),還會(huì)同步在知乎、頭條、簡書、csdn等平臺(tái)。也歡迎小伙伴多交流。如果有問題,可以在微信公眾號(hào)隨時(shí)Q我哈。
