目錄
寫在前面
1. Transformer
1.1 從哪里來?
1.2 有什么不同?
1.2.1 Scaled Dot-Product Attention
1.2.2 Multi-Head Attention
1.2.3 Masked Multi-Head Attention
2. Transformer-XL
2.1 XL是指什么?
2.2 它做了什么?
3. 小結
寫在前面
前兩天我正在微信上刷着消息,猛然間關注的幾個學習號刷屏,又一個超強預訓練語言模型問世——XLNet,它由卡耐基梅隆大學與谷歌大腦的研究者提出,在 SQuAD、GLUE、RACE 等 20 個任務上全面超越 BERT。我想不少人和我一樣,還沒來得及完全消化BERT,如今大腦里的NLP知識就又要被XLNet刷新。寫這篇博客主要是為了總結一些Transformer和Transformer-XL的特點。如有不正確的地方,歡迎大家指正,我將及時修改。
- 1. Transformer
2018年,谷歌BERT在朋友圈刷屏,各大公眾號爭相發布BERT的最新消息。這個號稱“最強NLP預訓練模型”刷新了NLP領域中11個任務。而Transformer,正是BERT中最核心的部分。同時我也認為,這是將是一種取替RNN或LSTM的模型。
1.1 從哪里來?
2017年,谷歌大腦(是的沒錯,還是他們)發表了文章《Attention Is All You Need》。正是在這篇文章里,谷歌團隊提出了全新的模型Transformer。該模型可被應用於閱讀理解、機器翻譯等各項Seq2Seq任務中(Seq2Seq,即從序列到序列,通俗來說,就是輸入一段文本,再輸出一段文本)。文中提到,Transformer是第一個完全依靠自注意力機制來計算其輸入和輸出表示的轉換模型,而不使用序列對齊的RNN或卷積。
To the best of our knowledge, however, the Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequence aligned RNNs or convolution.
這句話似乎信息量很大,我們該如何理解?首先,我們可以從中總結出:以往都是用別的方法解決問題的。結合上文可知,這個任務正是如機器翻譯這樣的Seq2Seq任務,而Transformer的表現更為出色。因此,Transformer針對的任務或者說應用場景已經清晰。其次,這句話提到,Transformer方法完全依靠自注意力機制就能計算序列的表示。換句話說,以前的表示學習離不開RNN和CNN,而現在只需要Transformer就能得到很好的表示計算結果。
有了上面的總體認知后,現在,我們談談注意力機制。實際上,注意力機制很早就在圖像領域中提出,直到Bahdanau等人所發表的《Neural Machine Translation by Jointly Learning to Align and Translate》的出現才將注意力機制正式帶入了NLP的視野中。而原文中提到的“sequence aligned RNNs”,在這篇文章中可以體現。提到注意力機制,必定要提到和它如影隨形的Encoder-Decoder框架,該框架也是Transformer的基礎框架。至於自注意力機制,其實這個“自”就是表面意思,即我們關注的是單個序列中的內聯關系。考慮到這樣不斷地鋪墊會越發偏離主題,因此我就不贅述了。以上,就是一個簡單的關於Transformer身世背景的介紹。
1.2 有什么不同?
在開頭我提到,我認為Transformer會逐步代替RNN(包括LSTM)。淺層的原因就是,目前以Transformer為基礎框架的方法所產生的效果確實更勝一籌,因為我個人還是比較推崇研究朝着應用落地的方向走。而更深層的原因就藏在Transformer與RNN的不同之中。盡管RNN在NLP處理任務中很受歡迎,但其也有不容忽視的問題:1)循環網絡結構導致並行計算受限,計算效率低;2)長距離依賴仍不能得到很好地解決。盡管LSTM一定程度上解決了RNN所具有的長距離依賴和梯度爆炸問題,但仍遺留了序列化的計算問題。為了減少這種計算帶來的困擾, Extended Neural GPU ,ByteNet和ConvS2S等方法被提出。但這些方法無一例外都使用了CNN作為基礎,用於並行計算所有輸入輸出位置的隱藏表示。然而,這樣的計算次數將隨着輸入輸出位置的距離而增長(線性或非線性都有)。因此,長距離位置的依賴關系仍不能得到很好的學習。
而Transformer最突出的特點正是其優秀的並行計算能力,同時也將上述的計算次數控制在了一個常量的水平(盡管以一定的解決效率作為代價)。接下來讓我們具體看看,Transformer到底長什么樣:
在上圖中,左邊是encoder部分,右邊是decoder部分。而這個結構僅僅是Transformer中每一層的樣子,實際上,encoder和decoder都各有6層,每一層與圖中結構相同。乍一看圖中要素過多,接下來我們談談這其中值得關注的部分。
1.2.1 Scaled Dot-Product Attention
在提到圖中Multi-Head Attention之前,我們需要知道,“單頭”是什么樣子的?文中介紹到,Transformer使用的是自注意力機制,並且為使用的自注意力機制取了了個名字,如本節標題所示。那么,這個名字怎么來的?看完下面的介紹,你應該就懂了。
文章中提到,所有的注意力機制都可以一個三元組去描述,這個三元組是(Query,Key,Value)。假設我們有Q,K,V三個向量,每個輸入單位(比如一個詞)都具有對應的三元組的值,具體做法是將embedding后的詞表示分別與Q,K,V相乘,得到最終的Q,K,V表示。在自注意力機制中,我們關注的是內部所有輸入(包括自己)之間的聯系,考慮句子“I love natural language processing.”,當encoder對“love”進行編碼時,此時的Query是“love”的Query表示,它將與其他所有詞的Key表示做點積。然后,按照通常地做法,我們將點積結果進行歸一化處理,使用softmax函數,但Transformer的開發者多做了一步除法。他們將點積結果縮小了,原因是為了防止當點積結果太大時,總是落在softmax的飽和區(即對應梯度很小的區域),這樣會導致模型優化效果差(所以說,在優化計算方面,Transformer真的十分周到)。softmax之后的結果已經可以解釋對於“love”,當前每一個輸入的貢獻度為多少。將該值與“love”的Value表示做乘法,即可得到最終的表示結果。這個過程的計算方法如下圖所示:
總結一下,這種方法就是將Q與K作點積,然后將結果進行歸一化,最后將權重賦予Value。那么,這和“Scaled Dot-Product Attention”有什么關系?實際上,計算中的“點積”步驟,正是Dot-Product的特點。而“Scaled”則體現在添加的放縮操作中(即增加一個分母)。
1.2.2 Multi-Head Attention
那么,“多頭”的含義到底是什么呢?其實看起來非常簡單,但是這種思路確實很有意思。“多頭”實際上是指在初始化Q,K,V時,使用多組初始化值。Transformer使用了8組,每組都是隨機初始化的,在經過訓練后,我們就將得到8個獲取了不同權重的結果表示。從Transformer的結構圖中我們可以看出,Multi-Head Attention的結果會被輸入到前饋網絡層中,而同時輸入8個結果顯然是不合理的。為了解決這個問題,我們只需要再初始化一個矩陣W,和8個連接起來的attention結果做乘法,最終變換成前饋網絡層可以接收的大小。
1.2.3 Masked Multi-Head Attention
“Masked”表明有什么信息被掩蓋了,那么到底掩蓋了什么信息呢?我們可以注意到只有在decoder中才多了這樣一個結構。其實原因很好理解,因為對於decoder而言,它在作輸出序列的預測時,不需要知道來自未來的信息。因此,我們對當前時刻以后的信息進行掩蓋。實際操作中,我們將對應位置的值置為負無窮,這樣在softmax之后得到的值接近於0。
- 2. Transformer-XL
2019年年初,一篇名為《Transformer-XL: Attentive Language Models
Beyond a Fixed-Length Context》 的文章發布了,但是顯然,當時沒有太多人關注到這篇文章。誰能想到這么快它就以XLNet的身份,又出現在了所有人面前呢?關於這部分,我目前僅作簡單介紹,因為文中多涉及公式(實際上是我太懶……),因此我只做原理的介紹。
2.1 XL是指什么?
XL實際上是“extra-long”的意思,這意味着Transformer-XL在模型設計上做了長度方面的延申工作。其實在Transformer被提出之時,它的問題就已經暴露了出來。Transformer規定輸入大小為512,這意味着我們需要對原始的輸入文本進行裁剪或填充。不難想到,這種文本的割裂存在着文章跨片段依賴不能學習到的問題。同時,定長本身也限制了更長距離依賴的學習。為了解決這一問題,Transformer-XL被提出。
2.2 它做了什么?
Transformer-XL做了兩件事:
1) 句段層級的循環復用
我們之前提到,Transformer每次處理的是定長片段。那么在XL版本中,上一次處理的片段信息將會被存儲起來,在當前片段的處理中會把這部分信息添加進來,這便是“延長”的含義。這樣做便完成了上下文之間的遷移。
2)使用相對位置編碼
在Transformer中,原本的位置embedding是一種絕對位置編碼,因此,當我們采用上面提到的遷移方法時,絕對編碼會讓網絡“產生困惑”,例如片段大小為4,那么每個片段的絕對位置編碼都為(0,1,2,3),這變失去了位置順序的信息。因此在XL中,使用相對位置編碼。
3. 小結
通過我簡單的描述,Transformer已經不再那么神秘。但這篇博客並沒有對Transformer的所有細節進行描述,例如結構中“Add&Norm”的操作,又例如位置編碼,殘差連接的前饋神經網絡等等。我只介紹了我認為Transformer中有特色的部分,而剛剛提到的內容涉及到一些常規操作和基礎知識,因此我省去了過多的解釋與介紹。包括注意力機制的相關內容,我也並沒有過多描述。也許后面我會找個時間再作總結,總之,不定期更新(也可能不更hhh)~