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

微信公衆號:數據拾光者。願結交更多的小夥伴,一同走人生路。

摘要:上一篇廣告行業中那些趣事系列3:NLP中的巨星BERT從理論的角度講了下NLP中有里程碑意義的BERT模型。BERT具有效果好和通用性強兩大優點,其中效果好最主要的原因就是使用了Transformer作爲特徵抽取器。本篇主要詳解下這個從配角到C位出道的Transformer,主要從宏觀和微觀的角度分析Transformer,講下它的核心注意力機制Attention,然後以翻譯任務舉例講下Transformer是如何進行工作的。

對充滿挑戰的高薪行業NLP感興趣的小夥伴可以多多關注。不僅僅是技術,大家也可以瞭解到身邊的翻譯任務、對話機器人是怎麼做出來的。

 

目錄

01 BERT和Transformer的關係

02 爲什麼要用Transformer

03 從宏觀視角看Transformer

04 從微觀視角看Transformer

01 BERT和Transformer的關係

標圖1 回顧Word Embedding的演化歷史題

 

這裏作爲引言回顧下NLP中預訓練技術Word Embedding的演化歷史:

Word2vec將文本映射到向量空間,從而實現了在低維向量空間表示文本。通過向量空間中距離的長短可以表示文本語義的相似度。但是因爲一個詞在向量空間中位置是唯一的,所以無法解決多義詞的問題。比如”legend”既可以代表傳奇,還可以代表圖例。歸根結底是靜態的Word Embedding。

ELMO採用聯繫上下文的三層embedding來表示詞,不僅包括詞向量,還包括了句法特徵向量和語義特徵向量,很好的解決了多義詞問題。

而目前項目中使用的BERT模型相比於ELMO,因爲使用了Transformer作爲特徵抽取器,所以模型效果很好。

總結下,google推出的BERT模型在11項NLP任務中效果有很大提升。最重要的一個原因是使用Transformer作爲特徵抽取器。

02 爲什麼要用Transformer

圖2 傳統的特徵抽取器RNN和CNN標題

 

NLP中傳統的特徵器主要是RNN和CNN。

RNN(或者變種LSTM、GRU等)由於本身的機制只能按順序依次計算,這種機制存在兩個問題:

  • 時間片t的計算依賴上一時間片t-1的計算結果,這樣限制了模型的並行能力
  • 信息計算的過程中信息會丟失,雖然LSTM等通過門機制會一定程度緩解長期依賴的問題,但是對於特別長的依賴現象LSTM還是無能爲力

CNN雖然可以並行化計算,但是不適合捕捉長距離特徵。

因爲RNN和CNN各自存在的問題,所以google團隊在論文《Attention is All You Need》中提出了Transformer模型。中文的意思是變形金剛,聽着就很霸氣。

Transformer拋棄了傳統的CNN和RNN,整個網絡完全由Attention機制組成,同時具有可並行化計算和捕捉長距離特徵的優點。

03 從宏觀視角看Transformer

1. Transformer的組成

標題圖3 從宏觀視角看Transformer

 

拿翻譯系統舉例,我們輸入一種語言,通過Transformer模型,輸出是另外一種語言。

進一步剖析Transformer模型,主要有編碼組件和解碼組件組成。編碼組件中包含很多個編碼器,解碼組件也包含很多個解碼器。

2. 編碼器和解碼器結構

標題圖4 編碼器和解碼器結構

 

編碼器主要包含自注意力層(Self-Attention)和前饋神經網絡層(Feed Forward Neural Network)。

解碼器和編碼器很相似,也包含自注意力層和前饋神經網絡層,另外還有一層編碼解碼層(Encoder-Decoder Attention)。

小結下,我們從宏觀視角瞭解了Transformer的結構。Transformer主要包含編碼組件和解碼組件,編碼組件中又包含很多編碼器,解碼組件同理。編碼器中主要有自注意力層和前向神經網絡層,解碼器相比於編碼器多了編碼解碼層。總體來說還是比較容易理解。

 

04 從微觀視角看Transformer

1. 從張量計算查看Transformer內部轉化流程

大部分NLP任務首先需要將語料轉化成詞向量的表徵形式x。

對於編碼組件來說,底層的編碼器作爲整個Transformer的入口,接收詞向量作爲模型輸入。

這裏咱們通過具體輸入輸出的維度表示來方便小夥伴們更好的理解Transformer中的各個環節。我們假設詞向量的維度爲512維。這裏的512是可以設置的參數,一般是訓練集中最長句子的長度。

因爲編碼組件中所有編碼器的輸入維度是相同的,初始的詞向量是1X512維,那麼底層的編碼器的輸入是1X512維,所以其他的編碼器的輸入也是1X512維。編碼器內部會依次經過自注意力層和前饋神經網絡層。

低層編碼器的輸出會作爲上一層編碼器的輸入,不斷進行,直到穿過整個編碼組件。比如圖5中編碼器1的輸入是詞向量,編碼器2的輸入是編碼器1的輸出。編碼器內部轉化流程和編碼器之間的轉化流程如下圖所示:

圖5 編碼器內部以及之間的轉化流程標題

 

2. 查看自注意力層的計算流程

Transformer中最重要的就是這個自注意力機制Self-Attention。Self-Attention主要用於計算當前詞對所有詞的注意力得分,整個流程如下:

標題圖6 計算注意力得分整個流程

 

這裏通過計算詞"thinking"的注意力得分舉例,詳細分析步驟如下:

(1) 將編碼器的輸入x轉化成三個向量

通過詞向量x(1X512)和三個不同的權值矩陣𝑊𝑞、𝑊𝑘、𝑊𝑣相乘得到查詢向量Q(1X64)、鍵向量K(1X64)和值向量V(1X64)。

小夥伴們可能有疑問了,這三個權值矩陣怎麼得到的?

模型剛開始訓練的時候,這三個權值矩陣參數可能是隨機的。等模型訓練完成之後,就得到訓練好的權值矩陣的參數了。這三個權重矩陣的維度都是512X64維。

其中512是因爲一開始我們設置詞向量的維度是1X512,那64怎麼來的?這裏涉及到Transformer的多頭注意力機制,先埋個坑,後面填。

(2) 計算當前詞對所有詞的注意力得分

比如我們計算"thinking"的注意力得分。將"thinking"的查詢向量q1分別和所有詞的ki點積相乘得到一個得分score。這個得分代表當前詞對其他詞的注意力。

(3) score歸一化和softmax函數映射

使用score歸一化的目的是爲了梯度穩定,分別將score除以鍵向量維度的算術平方根(論文中默認爲8)。然後通過一個softmax函數將得分映射爲0-1之間的實數,並且歸一化保證和爲1。

(4) 計算最終的注意力得分

計算softmax值和值向量v1相乘得到加權向量,然後求和得到z1爲最終的自注意力向量值。目的是保持相關詞的完整性,同時可以將數值極小的不相關的詞刪除。

上述整個流程就是通過張量計算展示自注意力層是如何計算注意力得分的。整體公式如下所示:

3. 多頭注意力機制

多頭注意力機制相當於多個不同的注意力的集成(ensemble)。更通俗的理解是將上面Attention層“重複多次“,但是這裏不僅僅是簡單的重複多次。

多頭注意力機制主要從以下兩個方面進一步完善注意力層:

  • 提升了模型對不同位置的注意力。通過多頭注意力機制,不同的頭關注的點是不同的。比如有的頭關注的是近距離的詞,而有些頭則是關注的更遠的距離的詞
  • 給注意力層多個表示子空間。使用多頭注意力機制我們就能得到多個查詢/鍵/值的權重向量矩陣。

Transformer默認使用8個注意力頭。這樣每個編碼器就能得到8個矩陣。論文默認使用的是8個頭,可調。

因爲每個初始的權重矩陣都是隨機初始化的,所以經過模型訓練之後將被投影到不同的表示子空間中。多頭注意力機制如下圖所示:

圖8 多頭注意力機制

 

 

下面通過可視化的方式查看多頭注意力機制:

圖9 多頭注意力機制可視化

 

圖9中分別有兩個頭head1和head2,通過是否有連線以及顏色深淺我們可以查看當前詞對所有詞的注意力得分。head1得到的注意力矩陣更多的關注距離較遠的詞,head2則關注的是距離較近的詞。可以看出不同的頭關注的點是不同的。

現在出現一個新的問題:編碼器中從自注意力層到前饋神經網絡層過程中,前饋神經網絡僅需要一個矩陣。現在因爲多頭注意力機制,出現了八個頭。如何將這八個頭壓縮成一個頭?


Transformer的解決策略是先將8個矩陣拼接起來,然後再和一個附加的權重矩陣W0相乘。這裏可以簡單的理解成通過一個全連接層來轉化輸出維度。其中權重矩陣W0和前面講的權值矩陣Q、K、V都是通過模型訓練得到的。

圖10 多頭注意力機制合併多頭策略

 

查看維度,比如z1是1X64,那麼8個矩陣拼接起來就是1X(64*8)變成了1X512維。

這個額外的權值矩陣W0的維度是512X512,這樣通過多頭機制的自注意力層最終得到的矩陣維度就是1X512了。通過前饋神經網絡之後還是1X512維,那麼編碼器的輸入和輸出則都是1X512維。

到這裏爲止,我們可以把前面的坑埋上了。爲什麼我們的Q、K、V權重矩陣的維度是512X64。512是因爲詞向量的維度是512維,而64就是因爲論文中默認使用的是八頭注意力機制。將8個頭的注意力矩陣壓縮成一個,所以這裏是64維。

總結下多頭注意力機制的整個流程:首先輸入原始的語句;然後轉化爲詞向量的矩陣形式;接着通過多頭注意力得到多個查詢/鍵/值向量;然後按照上面計算注意力的過程分別計算注意力矩陣;最後將多頭注意力矩陣壓縮爲一個矩陣。大功告成!多頭注意力機制整個流程如下圖所示:

圖11 多頭注意力機制整個流程

 

 

4. 位置編碼

上述流程中缺少詞位置的信息,導致的結果就是無論句子結構怎麼打亂,Transformer得到的結果類似。也就是說,Transformer並沒有捕捉順序序列的能力,僅僅是一個功能強大的“詞袋”模型。

爲了解決這個問題,Transformer爲每個詞向量增加了一個表徵詞位置以及詞之間距離的向量。這樣計算自注意力的時候模型就會加入有用的位置信息了。

圖12 位置編碼

 

 

下面是論文中關於計算位置編碼的公式:

其中pos代表單詞的位置,i表示詞的維度。

生成位置編碼的代碼在google開源的算法get_timing_signal_1d()函數中

作者這麼設計的原因是,在NLP任務中詞的絕對位置很重要(比如通常一篇文章中首尾段落可能包含更多的信息),詞的相對位置也很重要。通過上述公式可以體現Transformer更加關注相對位置。

5. 殘差模塊

編碼器內部子層還採用殘差網絡,主要是爲了解決深度學習中的退化問題。每個子層之後都連接一個殘差網絡,進行求和歸一化步驟。比如自注意力層後的殘差網絡會將自注意力層的輸入x和輸出z相加,然後進行normalize歸一化。

編碼器內部的殘差網絡和可視化如下圖:

圖13 殘差模塊

 

6. Attention可視化

圖14 Attention可視化

 

 

圖14通過一個簡單的例子看下Attention機制有多強大。現在我們想翻譯一句話:"The animaldidn’t cross the street, because it was toot tired"。

我們想知道"it"到底是啥意思?對於人類而言,我們很容易知道"it"代表上面的"animal"(在一些複雜的段落中可能對於我們人類也是很難的任務,類比小時候英語試題中某些完形填空題)。對於機器來說,完全就是下面這個黑人小哥的表情了。

Attention機制可以很好的理解"it"並找到最可能代表"it"的這個詞"animal"。圖中有兩個表示注意力矩陣的可視化圖,每個可視化圖表示的是上面一行的每個詞對下面一行所有詞的注意力,有連線則表示當前詞對其他詞有關注,線的顏色越深則代表關注度越高。可以看出當前詞"it"同時對"the"、" animal"、" street"、"it"和句號都有關注度,但是對"animal"的關注度是最高的,所以"it"詞最終就代表"animal"。

有意思的是,如果我們修改語句,將其中的"tired"改成"wide",奇蹟出了,Attention能很好的識別到"it"代表的是"street"。

下圖展示一個完整的雙層編碼-解碼器的Transformer結構:

圖15 一個完整的雙層編碼-解碼器的Transformer結構

 

解碼器和編碼器大致相同,區別在於解碼器中多了一層編碼解碼層(encoder-decoderAttention)。編碼組件的輸入是詞向量,輸出是最頂層的編碼器輸出的K、V注意力向量集。這些K、V注意力向量集會分別進入解碼組件中各個解碼器的編碼解碼層。解碼器中其他的自注意力層和前向神經網絡層和編碼器是一樣的。

編碼器和解碼器工作流程動圖如下所示:

標題圖16 編碼器和解碼器整個流程動圖

 

 

這裏需要注意的是解碼器第一輪的輸入是一個特殊的開始標誌符號,使用編碼組件輸出的K、V注意力向量集,輸出是需要翻譯的第一個詞。

整個德語翻譯成英語流程動圖如下所示:

標圖17 整個德語翻譯成英語流程動圖題

 

 

咱們詳細講解下德語翻譯成英語的流程:編碼流程上面講的很詳細,不再贅述。編碼組件完成編碼後,會將得到的K、V注意力向量集合分別傳遞給解碼組件中各個解碼器的編碼解碼層。

解碼階段開始,第一輪輸入是一個特殊的開始符號,使用編碼組件輸出的K和V注意力向量集合,輸出是翻譯的第一個單詞。第二輪的輸入是第一輪輸出的單詞,輸出翻譯的第二個單詞。第三輪的輸入是前兩輪輸出的單詞,輸出翻譯的第三個單詞。依次類推,每次輸入都是之前輸出的所有單詞,輸出是翻譯的一個單詞。直到出現一個特殊的結束符號告訴Transformer解碼器已經完成輸出。

當時分享的時候有個小夥伴問了一個問題,Transformer如何做到神奇的完成翻譯流程並且知道何時停止?這裏我理解翻譯任務應該是一個多詞對多詞的流程,和通常的輸入輸出長度相同的S2S可能不同。這裏的輸入和輸出長度是不同的,翻譯流程應該是分成兩步,先找到目標語言需要的所有詞,然後選擇最符合人類表達方式的順序輸出。因爲沒有做過翻譯系統,所以這裏僅是猜測。

有點小遺憾,本來圖16和圖17是動圖,但是不管咋弄到上面就成靜態的。求助小夥伴如何在公衆號插入動圖的。

 

總結

本篇從宏觀和微觀視角講了下Transformer,重頭戲在Attention機制。因爲Transformer具備並行性好和適合捕捉長距離特徵的優點,所以成爲NLP中主流的特徵抽取器,從配角慢慢C位出道。BERT模型大火的背後則是Transformer的高調付出。可以說想學好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,臺大李宏毅,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》論文。因爲論文比較高深難懂,所以僅通過論文不能很好的理解其中的精華。幸好國外有篇jalammar大神分享的可視化Transformer文章。深度好文,點贊!喜歡的朋友也可以直接通過參考資料[2]欣賞大作。這裏也參考了臺大李宏毅關於Transformer的講解。有興趣的小夥伴可以通過B站查看。

 

回顧下廣告系列

廣告中那些趣事系列1:廣告統一興趣建模流程

廣告行業中那些趣事系列2:BERT實戰NLP文本分類任務(附github源碼)

廣告行業中那些趣事系列3:NLP中的巨星BERT

喜歡本類型文章的小夥伴可以關注我的微信公衆號:數據拾光者。有任何干貨我會首先發布在微信公衆號,還會同步在知乎、頭條、簡書、csdn等平臺。也歡迎小夥伴多交流。如果有問題,可以在微信公衆號隨時Q我哈。

發佈了81 篇原創文章 · 獲贊 27 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章