用放大鏡看Transformer——總體和各個模組的結構

摘要:

Transformer是一種經典的基於神經網路的機器翻譯模型,催生了BERT、GPT等大幅推進NLP領域發展的重要模型。本文首先對Transformer的發展史進行了簡單回顧,然後概括地展示其總體結構,接著對transformer全身上下的結構進行了細緻的介紹,最後回過頭來分析了transformer的特色。

1。 引言

從上世紀中葉開始,人類開始嘗試讓機器學習自己的語言,並希望有一天機器能與人類進行自然的對話。之後的70年時間裡,人們用各種各樣的語言模型,包括規則、統計、神經網路等,來完成翻譯、問答等等任務。

最近幾年,一些喜歡看動畫片的人,提出了一個用於做機器翻譯的深度學習模型結構,即transformer,將機器翻譯提升到了一個新的境界。在transformer的基礎上,另外一些人提出了BERT、GPT2。0這樣的語言模型,使機器對自然文字的理解能力達到了前所未有的高度,也使機器翻譯、問答、命名實體識別等等下游任務的效果有了較大提升。可以說,transformer是最近幾年基於深度學習的自然語言處理方法的重要基礎。

Transformer是什麼,結構如何,為什麼效果好呢?

2。 Transformer簡介

“transformer”的本意是“變形金剛”,如圖2-1。Ashish Vaswani等人(2017)在《Attention Is All You Need》中提出了一個嶄新的機器翻譯模型結構,名字叫“Transformer”。”Transformer”這個名字強調翻譯是將一種語言文字變換為另一種語言文字的活動,也會讓人聯想到變形金剛、蹭了一波流量。

用放大鏡看Transformer——總體和各個模組的結構

圖2‑1 transformers的代表性形象——擎天柱

2。1。 Transformer出現的背景

Transformer是憑空出現的嗎?不是。它是在一些列條件成熟的情況下,才出現的。

注意力機制的發展,及其在自然語言處理領域的廣泛應用。注意力機制的基本原理可以參考https://zhuanlan。zhihu。com/p/105335191。

訓練語料,尤其是生語料規模的急速擴大,要求語言模型的訓練速度有所提升。

語言模型需要提升推理速度,以滿足日益增加的使用者需求。

2。2。 Transformer的總體結構

如圖2-2,是Vaswani的《Attention is all you need》中給出的,Transformer的結構示意圖。Vaswani等人的讀者都是機器學習領域的從業者,因此他們在論文中對Transformer的介紹相對比較概括,就像這幅圖一樣。對我來說,在比較充分地瞭解了各個子模組的結構之後,才逐漸看明白了transformer的總體結構。

用放大鏡看Transformer——總體和各個模組的結構

圖2‑2 Transformer結構示意圖

Transformer的結構比較複雜,很難一下子理解,因此我採用了迂迴戰術,從各個側面、各個模組出發瞭解這個模型。

3。 從思想出發理解transformer

Transformer的關鍵結構有3個方面:(1)總的來說,transformer是一種encoder-decoder結構;(2)其中的encoder和decoder都採用了類似RNN的時間迴圈結構;(3)為了讓模型可以刻畫序列資料的時空關係,配置了位置編碼機制。為了本節分別對時間迴圈結構和encoder-decoder結構進行介紹,然後引出transformer的基本框架,最終展示transformer的結構細節。

3。1。 基於遞迴結構實現序列建模

RNN在時間維度上的遞迴結構,模仿了人類在處理文字等序列資料時“綜合考慮”的策略,處理每一個元素時,會考慮關於序列的已有資訊。Transformer也吸收了這個思想,如圖3-1和圖3-2。

用放大鏡看Transformer——總體和各個模組的結構

圖 3‑1 Transformer的時間遞迴結構

用放大鏡看Transformer——總體和各個模組的結構

圖 3‑2 Transformer遞迴結構的簡單表示

3。2。 基於encoder-decoder結構實現特徵提取

我們可以把原始資料喂到模型1,得到的輸出記為feature1;然後把feature1喂到模型2,得到的輸出記為feature2。從直覺的角度看,模型1對資料進行了一定程度的抽象,而模型2進行了更高程度的抽象。多層神經網路就是這種結構的具體實現,實踐中的表現還不錯。

一些人設計了這樣一種2層模型:(1)各層可以是任意結構的模型;(2)原始資料、feature1、feature2的結構和含義根據場景定義。這種結構的模型被稱為”encoder-decoder模型”,模型1叫做encoder,模型2叫做decoder。一般來說,encoder和decoder可以採用全連線神經網路、RNN等模型。

用放大鏡看Transformer——總體和各個模組的結構

圖 3-3 encoder-decoder模型的基本結構

在機器翻譯場景裡,機器學習模型的輸入和輸出都是序列,因此可以用RNN作為encoder和decoder,如圖3-4。得益於RNN對序列資料中時空關係的刻畫能力,這種模型可以非常好的對語言進行建模。

而在Transformer中, encoder和decoder採用的是一種基於注意力機制的模型,沒有天然的序列資料建模能力——Ashish Vaswani等人借鑑RNN的做法,對模型進行了一定的改造,為transformer添加了這種能力。

用放大鏡看Transformer——總體和各個模組的結構

3。3。 transformer如何讓模型知道序列元素的順序——位置編碼機制

後面會提到,transformer所依賴的多頭注意力模組沒有時間迴圈機制,因此無法對序列中元素的“順序”進行刻畫。“順序”是序列資料中非常重要的一種資訊,是元素之間依賴關係的主要表現。比如“我是中國人”這句話,如果修改為“中國人是我”,就不符合事實、成為一個不合法的句子。

transformer設定了一種機制,用來向序列資料新增位置資訊,進而讓transformer學到“順序”。這種機制被稱為“位置編碼”(position encoding),做法也非常簡單:用正弦、餘弦函式生成沿時間軸變化的波形,然後把這種波形疊加到transformer的輸入中。正餘弦波在不同的位置取值大小不同,可以用來表示序列中兩個元素的相對位置。“疊加”的具體操作比較直白,就是把序列資料和與之同形狀的位置編碼資料,加起來。

本文作者對位置編碼機制演化的過程不太瞭解,這裡直接展示機器翻譯場景裡,transformer的位置編碼資料計算方案。記某個漢字在源文字中的位置(序號)是pos。

字向量偶數維度上,要疊加的位置編碼取值為:

用放大鏡看Transformer——總體和各個模組的結構

式中,d_model是字向量的維度大小;

10000的含義本文作者還沒有確定。

字向量技術維度上,要疊加的位置編碼取值為:

用放大鏡看Transformer——總體和各個模組的結構

由於這種位置編碼機制沒有引數,計算速度非常快。另外,效果也是不錯的。

3。4。 Transformer的時間迴圈是如何實現的

Transformer的時間迴圈機制被部署在了decoder中,如圖3-5。解碼器把上一時刻的輸出引入到當前輸出的計算中,進而實現對歷史資訊的刻畫。看起來很簡單的結構,就可以用來實現序列資料建模。

用放大鏡看Transformer——總體和各個模組的結構

圖 3-5 Transformer的解碼器具有時間迴圈結構

3。5。 Transformer的encoder結構長什麼樣

Transformer的編碼器不是特別複雜,如圖3-6。編碼器的結構主要有3個元素:(1)多頭注意力;(2)殘差連線;(3)全連線層。當然,虛線內的部分可以搞多層堆疊,以獲得更強的學習能力。

用放大鏡看Transformer——總體和各個模組的結構

圖 3-6 編碼器的微觀結構

3。5。1。 多頭注意力

“多頭注意力”(multi-head)指的是“多個注意力模組構成的大模組”,相當於卷積神經網路中採用多個卷積核構成一層。多頭注意力是在scaled dot-product attetion的基礎上發展而來的,因此這裡首先介紹祖先,然後介紹多頭注意力。

3。5。1。1。 scaled dot-product attetion

多頭(自)注意力是注意力機制的一種實現形式,是對scaled dot-product attetion的一種擴充套件。如圖3-7,是scaled dot-product attetion的結構。由於Transformer是用來做機器翻譯的,採這裡用了自注意力形式,即K=V。在encoder中,K和V是(經過位置編碼的)字向量,而Q是本模組上一時間步的輸出。scaled dot-product attetion的符號形式為:

用放大鏡看Transformer——總體和各個模組的結構

式中,是縮放因子,可以硬編碼,也可以基於特定的規則計算得到。

用放大鏡看Transformer——總體和各個模組的結構

圖 3-7 Scaled Dot-Product Attention的結構

3。5。1。2。 多頭注意力的結構

為了讓注意力模組具有更強的學習能力,Vaswani對Scaled Dot-Product Attention進行了擴充套件,推出了多頭注意力結構,如圖3-8。多頭注意力模組裡包含了多個Scaled Dot-Product Attention(不共享引數);每個Scaled Dot-Product Attention的輸入,都是經過線性變換的QKV;各個Scaled Dot-Product Attention的輸出經過拼接和線性變換,就成為多頭注意力的輸出。Transformer中,

用放大鏡看Transformer——總體和各個模組的結構

用放大鏡看Transformer——總體和各個模組的結構

圖 3-8 多頭注意力的結構

3。5。2。 全連線層

輸入資料在經過多頭注意力模組的加工後,會形成一個向量序列。這個序列中的每一個向量,會透過同一個全連線層——線性變換和relu啟用函式。

需要注意的是,多頭注意力模組輸出的是全部輸入序列的編碼——對全連線層來說,這個序列的元素是獨立的,因此這裡可以用平行計算的方式提升模型的執行速度。

3。5。3。 多層堆疊與殘差連線

多頭注意力層和全連線層可以合起來看做一種新型的神經網路結構(類似CNN、RNN),我們可以透過堆疊多層來實現深度神經網路,進而得到非常強的學習器。Transformer比較深,堆疊了6層。

當然,由於多層迭代結構會帶來梯度消失或爆炸,深層網路的訓練是比較困難的。為此,Transformer採用了殘差連線。

3。6。 Transformer的decoder結構長什麼樣

Transformer的decoder可以被看做是encoder的升級版。如圖3-9,是decoder的結構。Transformer的encoder在處理序列資料時,主要依靠注意力機制來捕捉資料中的時空關聯資訊。Decoder則在encoder的基礎上增加了時間迴圈機制,獲得了更強的序列資料建模能力。

用放大鏡看Transformer——總體和各個模組的結構

圖 3-9 解碼器的結構

圖3-9的綠色部分和棕色部分結構基本相同——區別是,負責處理歷史輸出的綠色部分,為了避免模型在訓練階段把“未知”資訊作為輸入,添加了一個遮蔽模組。可以把綠色部分叫做歷史資訊處理模組;棕色部分叫做語義向量處理模組。當解碼器執行到第i時間步時,第i個輸出以及之後的輸出還沒有計算出來,因此不能作為歷史資訊處理模組的輸入(否則會發生資料洩露)。在訓練階段,我們會將i時間步及以後的輸出全部置零——看起來像“蓋住”了這部分資訊一樣,因此這個操作被稱為“maksed”。換句話說,當編碼器執行到第i個時間步時,歷史資訊處理模組的輸入是時間步i之前的輸出序列。

接下來,把編碼器的輸出和歷史資訊處理模組的輸出拼接起來,喂到與編碼器同結構的下游模組中;最後,結果線性變換和softmax的就是英文單詞的機率分佈。

編碼器也可以搞多層堆疊,以獲得更強的學習能力。

3。7。 回頭看

Tansformer可以被看做是基於RNN的encoder-decoder的升級版:它把RNN的神經元替換為帶有更多先驗知識的注意力機制模組。另外,transformer還有幾個特殊的地方:(1)Vaswani設計了位置編碼機制,以讓注意力機制具有快速刻畫“順序”的能力;(2)為了避免訓練過程中發生資料洩露,transformer為decoder配置了mask,以遮蔽“未來的資料”;(3)transformer採用了殘差連線,可以支撐深度模型的有效訓練,進而提升了模型能力的上限;(4)多頭注意力等部分可以平行計算,速度較快。

4。 結語

我在之前兩年的學習中,經常會有“急躁”的情況,即一看資料裡一堆堆的預備知識就頭疼、認為作者太囉嗦了。實際上,如果事先了解一些“形而上”的東西,比如簡單的思想或方法,我們在學習和研究一些比較複雜的東西時會受到很多幫助。舉例來說,如果在不理解BP神經網路的情況下,直接開幹BERT,我很快會感受到強烈的挫敗——看啥啥不會,就像個SB。

據我所知,任何領域裡比較深入的知識,都是在一定的理論方法或技術的基礎上發展而來的。一個知識點實際上需要若干其他知識點作為輔助,才能自證其合理性、發揮作用。對學習者來說,理解該知識點的任務,也需要在理解輔助知識點的基礎上才能完成。比如我在學習transformer的時候,必須有神經網路、注意力機制、機器翻譯、最最佳化等等方面的積累,才能比較順利地理解其結構和內涵。

而大家在介紹transformer的時候,一般不會特意提到它的輔助知識點,導致初學者感覺沒有方向。這時候,我們可以想辦法往前追溯,先找到輔助知識點,搞明白,然後再看transformer。這樣做的學習曲線會緩和很多——這是一種很有用的學習思想,適合大部分人使用。

注意:

本文為李鵬宇(知乎個人主頁https://www。zhihu。com/people/py-li-34)原創作品,受到著作權相關法規的保護。如需引用、轉載,請註明來源資訊:(1)作者名,即“李鵬宇”;(2)原始網頁連結,即https://zhuanlan。zhihu。com/p/122977440。如有疑問,可發郵件至我的郵箱:lipengyuer@126。com。