0%

Transformer的過去,現在以及未來

主要內容

  • 回顧RNN的一系列模型
  • 介紹Transformer出現的經歷
  • 理解attention的QKV
  • 介紹Transformer近期的發展

過去

NLP Task一直以來在解的可以分為兩大問題:

  • 將文本變成數字(數字化文本),同時保留語義
  • 利用數字化的文本,設計不同的架構去處理各種nlp task

而其中,只要數字化文本做得好,後面的架構可以用最簡單的設計就好,不需要針對nlp的任務去客製化複雜架構,可以減輕不少的工作量。

一個好的數字化文本,應該可以蘊含語義在數字中,比如表達傷心的句子,跟表達開心的句子在數學的相似度計算上,應該要差很多。但語義這一個特性是籠統而又複雜的,我們難以設定一個目標來學到語義。
轉而可以用一些委婉的方式去達成目標:學習一句話是如何產生的,要產生一句流暢的話,需要注意詞與詞的搭配和關係,建立對文字的理解使之不會偏離原意。也就是說,這個過程可以讓電腦學到語義。
我們要將這個過程變成一個數學公式,才可以達到文本數字化的目標。

建立一個模型,從前文去預測後文的下一個字,透過不斷往後預測下一個字,來將句子預測出來。這個方法會叫做語言模型(language model):

這種不斷有新的輸入去得到新的輸出,同時也要保留之前的輸入的過程,跟RNN這個架構剛好完美契合~
RNN的架構圖,輸入會是上一個的output state跟新的輸入:

因此,我們用RNN建立語言模型,拿到文本的數字化表示,去完成各種任務。
但是,事情並沒有那麼簡單,RNN會遇到兩個很嚴重的問題:

  • 在長文本中難以訓練
  • 無法處理輸出長度不固定的問題

在長文本中難以訓練

關於這個問題,直觀的一個看法是,新的輸入 跟 上一個狀態的輸出 對於模型來說是同等重要的,但上一個狀態包含的其實是歷史的訊息。這就意味著上一個狀態會被新的輸入漸漸稀釋掉。
因此,為了減緩這個過程,我們需要分配下輸入的比例。比如上一個狀態的比例/新輸入跟上一個輸入合起來的比例/輸出狀態的比例 之類的。

LSTM和GRU就是這個方法的兩個有名的例子,這兩個模型看似十分複雜,但其實他們的重點在於比例的分配上,這一點我們可以順著sigmoid看下去。

這張圖裡面有RNN,LSTM跟GRU,我們可以首先看其中的sigma符號。

sigma其實是指sigmoid function,作用是將輸入變成0到1之間的值,也就可以看作是分配的百分比。
GRU會簡化掉LSTM的其中一個sigmoid,仔細看看,應該可以猜到是為什麼~

也可以想像,這種方法屬於緩兵之計,並不能從根本上解決問題。之後的研究中,這個問題還造成了很大的困擾,促使transformer的提出。不過這部分暫且不表,先看看下一個更需要解決的問題。

無法處理輸出長度不固定的問題

另外一個問題,是關於RNN的輸出。RNN的模型在每一個狀態都有一個輸出,那麼作為結果的話,應該取哪一個狀態呢。一般的問題很好解決,比如句子分類的話可以取最後一個輸入狀體作為輸出,Tagging的話,每一個狀態都可以輸出。大概會有下圖的幾種形式。

當輸出長度跟輸入長度是完全不固定的時候,問題就來了。
比如做中英文翻譯,輸入是how old are you,輸出是 你幾歲。這種輸出長度不確定的情況下,該取哪一個狀態輸出就成了一個很大的問題。
提出的解法是先壓縮輸入,把輸出看成是解壓輸入的過程。我們將輸入壓縮成一個matrix,再從這個matrix裡面解壓出我們想要的結果。這種架構就是seq2seq。壓縮輸入的部分會叫做encoder,解壓縮的部分會叫decoder。

模型會一直解壓出輸入,再將輸出丟進模型,解壓下一個輸出,往復直到輸出結束符號。

有人在用seq2seq的時候,輸入輸出都會是一樣的,看似是沒有意義的事情。但換個角度想,模型能將文本壓縮成一個向量,這個向量還可以將文本還原回去,說明這個向量有學到一句話是怎麼講的,這也是學到語義的一個表現。因此,seq2seq的架構也適合作文本的向量化。這種形式也叫auto-encoder。

未能徹底解決的長文本問題

雖然LSTM跟GRU已經可以緩解長文本輸入導致遺忘的問題,但是在應用seq2seq的時候,卻發現LSTM和GRU做的還不夠。而在做翻譯的時候,這個問題十分明顯。

以這個法文翻譯英文的為例,輸出的第一個字常常跟輸入的第一個字最大關聯。
如les pauvres對應the poor,但是encoder壓縮向量的是lstm的最後一個hidden state,前面的訊息,特別是第一個輸入,很大可能已經被慢慢遺忘掉,導致翻譯的結果出包。這種情況在長文本的翻譯會越發明顯,而開頭就已經翻譯不好,也很容易將後面的結果帶歪。

attention出來,解決遺忘問題

因此,我們需要保留輸入,免得被遺忘,很潮的attention機制就因此而生。
我們首先將encoder的每一個輸出都保留下來,在decoder要輸出的時候,就可以選擇參考前面encoder的所有資訊。但是encoder的輸入有很多個字,decoder的每一次輸入只有一個字,兩者對不起來啊。

所以,encoder的每一個輸出的state要合成一個state,怎麼做呢?將每一個state加起來然後取平均好像是一個做法,但是這樣就不能強調重要的信息,比如翻譯對應的文本。因此也應該要按比例分配這些加起來的state。這個分配不同部分權重的機制,就叫做attention。

上圖展示了attention機制怎麼把encoder資訊變成一個attention vector,輸出的state會跟encoder的每一個state計算相關度,相關度高的部分給更高的權重,反之就給更低的權重。

現在

所以,Transformer就出現啦

seq2seq+attention的架構已經很成熟,但總有人想再進一步。其實這個架構的成功很仰賴attention。對比之下,RNN可以保留歷史資訊的特性就顯得用處不大,而且RNN架構需要等待輸出之後再輸入,效率也不夠高。在Attention Is All You Need裡面,就直接將RNN砍掉,看看只用attention的效果如何。結果讓人十分驚喜,這個只有attention的架構效果跟效率都很好,也就有了名字:Transformer。


從上圖可以看到,Transformer基本上就是去掉RNN的seq2seq+attention network,主要的部分就是multi-head attention而已。
要解析這一個架構,到底為什麼會這樣做出來,可以從 如何保留RNN的時序特性 以及 加強attention的效果和複雜度,使得其足夠應付複雜的task 這兩個方面開始。

如何保留RNN的時序特性

RNN的輸入是一個接一個,有先後次序的,這使得模型可以辨別上下文的輸入。但Transformer把RNN拿掉了,使用的時候,也不會一個個輸入丟到模型,而是將所有文本會同時輸入到模型,這樣模型其實看不出詞序對調的差異。所以第一步就需要把輸入到先後順序這個資訊加入到模型中。
Positional Encoding就是在做這一件事情,將文本的先後順序加入到input embedding中,使得input就可以帶有位置的資訊。
原版Transformer的方法一點都不data science,hand-craft個sinusoid(正弦波) function來表示文本的先後和位置的變化。人為設計的做法,不一定會適合不同的task,總會有一些情況下有更好的做法,一直修改就很沒完沒了。所以接下來的BERT,就回歸到就都交給神經網路去學這一招。跟input embedding一樣,position encoding會隨著模型的更新一直調整。

加強attention的效果和複雜度,使得其足夠應付複雜的task

Transformer只留下attention,模型會變得過於簡單使其效果下降。只能用attention,還要讓模型變複雜,最直接的做法就是做更多的attention。

在將attention疊上去之前,還需要先解決一個問題:之前seq2seq的那一套attention其實不太適用在所有情況,比如單純只有encoder的時候,我們就沒有decoder的state來算attention的比例。
大家提出各種attention方式的時候,可謂是群魔亂舞。為統一大家的理解,讓不同的做法都有同一套表達方式去解釋,google也提出了attention可以分為Query,Key跟Value三個部分,簡稱QKV。

Attention形式上則可以看成是QKV的組合,最終的目的是透過Query去跟每一個Key算分數,最終給Value分配權重。如果QKV都是在用在同一個sequence,比如只有encoder的時候。QKV的做法就是每一個字跟其他字算attention分數,最終得出這一串sequence每一個字在整個sequence中的重要程度。這種做法就是self-attention。

論文的公式還會有一個scaling factor,這個東西類似於temperature,可以讓Softmax的分佈不那麼極端。

我們找到了encoder也可以用的self-attention之後,就可以回到剛剛那個增加複雜度的問題。解決起來果然又是簡單直接 - 疊更多層attention,以及在同一層裡面,做多次的attention。
為了讓多次attention得出不一樣且有意義的結果,我們會先讓QKV做linear transformation,論文將這個機制叫做multi-head attention。
這樣就疊出了一個大型的網路。由於沒有順序相依,就可以同步處理,提高效率。

PS: 推薦大家從這裡去了解linear transformation~

組合起來,transformer的一個block會是這樣的:

而在decoder的部分,也有一些值得注意的地方:

decoder多了一個masked multi-head attention。

這是為了可以平行化decode,同時不會讓前面的文本可以預先看到後面的輸出,所以要把之後的輸出遮起來的機制。

而encoder跟decoder接起來的部分,到底傳過去的會是QKV的哪兩個呢?

先回顧下QKV所代表的意思,Query會跟sequence也就是key一一算權重,找出對query來說,sequence中哪一個部分是重要的,作為分配給value的比例。
因此,在decoder的輸入應該是query,它需要從encoder的Key找到重要的部分,分配到value中,讓decoder的結果可以參考到encoder的輸入。

未來

經過Attention is all you need的牛刀小試,Google用Transformer訓練個大的模型,也就有了之後的Bert。

Bert的成功的因素之一來自於transformer架構,因此在之後的研究,有不少聚焦在transformer的調整和修改上。

position encoding

第一個就是position encoding了,position encoding雖然有用,但直接將input embedding跟position embedding加在一起丟到模型中。在 RETHINKING POSITIONAL ENCODING IN LANGUAGE PRE-TRAINING 發現,詞的意思跟其位置其實是沒有什麼關係的:

而DeBERTa: Decoding-enhanced BERT with Disentangled Attention 則發現相對位置反而跟詞會有一些關係。總而言之,不能簡單地將position跟input的兩個embedding不是最好的做法,應該要分別看 token to token / token to position / position to token 跟 position to position的關係。架構上會變成這個樣子:

長度限制

Bert使用起來卻有一個最大的限制,輸入的長度不能超過512個token,使得Bert處理長文本很麻煩。這其實是因為transformer的效能限制所導致的。transformer雖然解決了RNN不能平行化運算的問題,但它所需要的運算量在模型越疊越深的時候,是十分龐大的。因此為了減少transformer的運算量,就設置了512個token的長度限制。
Transformer的長度限制主要是因為attention裡面的 QK 的dot-product 跟 multi-head 使得運算量增加。 如果Q的size是n的話,K跟Q也一樣是n,單單一層的一個head的複雜度就是$n^2$,加上一層有8個head,疊上6-7層,就十分可怕了。

Multi-Head Attention: Collaborate Instead of Concatenate 就先從multi-head入手,發現不同的head其實都是學到一樣的東西。在論文的統計中,12 head,每個head 64維,總共$12*64=768$維的bert-base模型,其Cumulative captured variance在256維的時候已經十分接近1了,意味著在256維度的時候已經幾乎得到所有的energy,剩下的都是冗員。因此,multi-head的機制需要改善到更有效率。

簡化的方式,會是這樣的

主要是將head的維度減少,並且讓head之間可以共享參數,就得到了圖中(d)的matrix$D_k$,這個$D_k$的attention也叫做collaborative attention!
更加厲害的是,作者還可以將目前的standard attention layer直接轉成collaborative attention!(看到這邊的公式,我已經陣亡了,之後再看看…)
這篇論文有放code,而且這個方法還可以直接用在目前的transformer模型,可以說是十分佛心!
https://github.com/epfml/collaborative-attention

除了從multi-head入手,更加根本的其實是QK的dot-product算太久了。這部分的改善就變成兵家必爭之地,有著成千上百多做法。

SliceOut: Training Transformers and CNNs faster while using less memory
嘗試用dropout去減少參數量

Reformer: The efficient transformer.
ReForme嘗試用LSH去將相似度高的K先歸類,找到attention score最大的前x個結果,由於後面的結果都接近0,所以也可以忽略不看。

Transformers are RNNs:
Fast Autoregressive Transformers with Linear Attention
分析QK會效率差的原因,是因為softmax!

對QK做softmax之後才能得到給value的weight,所以如果不經過softmax就直接得到value的weight,是不是就可以減低複雜度到linear了!

SYNTHESIZER:
Rethinking Self-Attention in Transformer Models
而這些還沒有到極致,將這個想法更進一步,我們直接不經過attention,直接用模型學出那個QKV的matrix呢?!
這個結果直接讓我們對目前所知的attention和transformer產生懷疑!
這個Synthesizer的Random就是一個亂數產生的matrix,我們直接通過這個matrix,或經過模型的tuning或直接用,得到attention的weight。

然後它的結果跟一般的transformer不相上下,我們並沒有看出一般transformer特別大的優勢!!!

在pre-train/fine-tune階段,mix random跟Vanilla會更加通用,有最好的效果!?

這到底是怎麼回事呢

我們嘗試分析一下怎麼回事
回到SuperGlue的實驗結果,我們可以發現WSC這個task,transformer模型表現最好!

至於這個WSC是什麼類似的task呢,我們直接拉資料來看:

看來是一個判斷文中的兩個代詞/名詞是否同一個人的task,這種task就很需要去學token與token的關係,因此可以讓transformer的結果特別明顯~

而翻譯這種task很常會在差不多的位置上token對token翻譯,比如前文對前文之類,有很強的bias,所以只要是全連接的網路都可以做很好。

Transformer主要是為了取代RNN而逐漸出來的結果,而attention是因為RNN的缺陷而來的產物。其實從拔掉RNN的時候,attention就不是一個必要的東西了。這樣看來transformer這個架構並沒有特別大的優勢,說不定當年把MLP做multi-head疊很深說不定跟現在結果差不多XD

Google的big bird可能就是順著這個思路,簡化attention的redundancy
Big Bird: Transformers for Longer Sequences
將attention拆成random/window跟global三個層級,三個層級的結果相加就是big-bird。只要每一層都是O(n)的話,最終複雜度也可以降到剩下O(n)。

所以說,attention is not all we need,transformer有過度設計的嫌疑啊!
而未來的發展很可能在減少attention的量同時,更換到不同設計的架構上,看看會不會有進一步提昇。

參考

DeBERTa: Decoding-enhanced BERT with Disentangled Attention
https://arxiv.org/pdf/2006.03654.pdf
RETHINKING POSITIONAL ENCODING IN LANGUAGE PRE-TRAINING
https://arxiv.org/pdf/2006.15595.pdf
SliceOut: Training Transformers and CNNs faster while using less memory
https://arxiv.org/pdf/2007.10909.pdf
Reformer: The efficient transformer.
https://arxiv.org/pdf/2001.04451.pdf
Big Bird: Transformers for Longer Sequences
https://arxiv.org/pdf/2007.14062.pdf
Transformers are RNNs:
Fast Autoregressive Transformers with Linear Attention
https://arxiv.org/pdf/2006.16236.pdfa
SYNTHESIZER: Rethinking Self-Attention in Transformer Models
https://arxiv.org/pdf/2005.00743.pdf
Attention Is All You Need
https://arxiv.org/pdf/1706.03762.pdf
Untangling tradeoffs between recurrence and self-attention in neural networks
https://arxiv.org/pdf/2006.09471.pdf