Transformer及其變種

2021-02-21 機器學習算法與自然語言處理
作者:哈工大SCIR 蔣潤宇簡介

近年來NLP領域最讓人印象深刻的成果,無疑是以谷歌提出的Bert為代表的預訓練模型了。它們不斷地刷新記錄(無論是任務指標上,還是算力需求上),在很多任務上已經能超越人類平均水平,還具有非常良好的可遷移性,以及一定程度的可解釋性。

例如,當我們需要在論文裡解釋為什麼算法或者改動能夠work的時候,一張基於attention的熱力圖顯然更容易說明我們的代碼究竟做到了什麼。

圖1 一種論文中常見的attention熱力圖

而目前主流的預訓練模型,都是以17年穀歌提出的Transformer模型作為基礎進行修改,作為自己的特徵抽取器。可以說,Transformer自從出現以來就徹底改變了深度學習領域,特別是NLP領域。

本文主要介紹了Transformer以及其在近年來的一些優化變種。

Transformer

如果用一句話來介紹Transformer,那就是:「首個完全拋棄RNN的recurrence,CNN的convolution,僅用attention來做特徵抽取的模型。」也就是論文標題所寫的,《Attention Is All You Need》。

Attention機制在NLP領域的應用最早可以追朔到2014年,Bengio團隊將Attention引入NMT(神經機器翻譯)任務。但那時Attention僅僅是作為一項外掛結構,模型的核心構架還是RNN。而到了Transformer則完全地以Attention機製作為模型的基礎構架,拋棄了之前的CNN和RNN的網絡。

Transformer的基本構架如下圖所示,其中,左半邊是Encoder部分,右半邊是Decoder部分。Transformer有6層這樣的結構。

圖2 Transformer詳細構架

以翻譯模型為例給出Transformer的總的結構圖:

圖3 Transformer整體構架

以上是對Transformer的整體介紹,下面將對Transformer各個創新之處進行講解。

Attention

Transformer中一共使用了三次Attention。其中Decoder部分多一層比較特殊的Masked Attention。即在解碼時,模型應當只知道當前中心詞的上文,因此通過masking的方式,屏蔽中心詞下文的內容,保持了自回歸的特性。

Scaled Dot-Product Attention

Self-Attention本質上是通過為當前詞引入其上下文的信息,以增強對當前詞的表示,寫入更多的信息。這點基本類似於2014年,Bengio團隊將Attention引入NMT(神經機器翻譯)。

在Transformer中,這部分是通過Attention(Q, K, V)實現的。其中Q是query,K是key,V是value。通過Q和K的點積的結果來體現上下文詞分別對中心詞的影響程度,再通過softmax進行歸一化。

圖4 Attention計算路徑Multi-Head Attention

Multi-Head Attention基本是完全創新之處。

圖5 Multi-Head Attention計算路徑

其會將原本512維的Q、K、V,通過8次不同的線性投影,得到8組低維的Qi、Ki、Vi,其維度均為64維。公式如下:

這樣做由於每個注意力頭的大小都相應地縮小了,實際上計算量並沒有顯著增加。

關於為什麼使用多頭注意力,而不是單頭注意力,《Attention Is All You Need》作者認為:平均注意力加權降低了有效的解析度,即它不能充分體現來自不同表示子空間的信息。而使用多頭注意力機制有點類似於CNN中同一卷積層內使用多個卷積核的思想。可以增強模型對於文本在不同子空間中體現出的不同的特性,避免了平均池化對這種特性的抑制。 

但是關於多頭注意力機制是不是有用,為什麼有用,目前還沒有一個很好的解釋。

有大量的研究表明,以Transformer為基礎的Bert的特定層是有其獨特的功能的,底層更偏向於關注語法,頂層更偏向於關注語義。既然在同一層Transformer關注的方面是相同的,那麼對該層而言,不同的頭關注點應該也是一樣的。這就和作者的解釋有些矛盾。 

實際上,在《A Multiscale Visualization of Attention in the Transformer Model》這篇文章中,作者分析了前幾層BERT的部分注意力頭,如下圖所示,結果顯示,同一層中,總有那麼一兩個頭關注的點和其他的頭不太一樣,但是剩下的頭也相對趨同【考慮到同一層的注意力頭都是獨立訓練的,這點就很神奇】。 

圖6 Bert的0-3層中,第0-5的head對於同樣的輸入所關注的內容。 

而在《What Does BERT Look At? An Analysis of BERT’s Attention》一文中,作者分析了,同一層中,不同的頭之間的差距,以及這個差距是否會隨層數變化而變化。結果如下圖所示,似乎可以粗略地得出結論,頭之間的差距隨著所在層數變大而減少,即層數越高,頭越趨同。但遺憾的是,這個現象的原因目前沒有比較好的解釋。 

圖7 對於Bert中,每一層的head之間的差異在二維平面上的投影 

就我個人觀點,多頭注意力機制的作用可能是這樣:注意力機制的冗餘性很高(即使是獨立計算的注意力頭,大概率關注的點還是一致的),所以那些僅有很少部分的相對離群的注意力頭,能夠使得模型進一步優化。但是這些離群的頭出現的概率並不高,因此需要通過提高頭的基數,來保證這些離群頭的出現頻率。 

Positional Encoding

由於Attention機制並不會告訴模型,詞與詞之間的位置關係(這點和RNN、CNN不同),需要額外引入位置信息編碼。

使用上述位置編碼的理由很簡單,因為它能夠很好的編碼兩個詞之間的相對位置關係。三角函數有著非常方便的和差化積公式。

作者還提到了可以使用Learned embedding,但是實驗表明兩種方法效果上並沒有差別,但使用公式方法更為簡單,可以處理比訓練時更長的序列。

缺點

Transformer從現在看來也存在著一些缺點和不足:

非圖靈完備:證明略過不表。通俗來說,就是Transformer不能處理所有問題。例如,當我們需要輸出直接複製輸入時,Transformer並不能很好地學習到這個操作。

不適合處理超長序列:當針對文章處理時,序列的長度很容易就超過512。而如果選擇不斷增大模型的維度,訓練時計算資源的需求會平方級增大,難以承受。因此一般選擇將文本直接進行截斷,而不考慮其自然文本的分割(例如標點符號等),使得文本的長距離依賴建模質量下降。

計算資源分配對於不同的單詞都是相同的:在Encoder的過程中,所有的輸入token都具有相同的計算量。但是在句子中,有些單詞相對會更重要一些,而有些單詞並沒有太多意義。為這些單詞都賦予相同的計算資源顯然是一種浪費。

原始版的Transformer雖然並不成熟,層數固定不夠靈活、算力需求過大導致的不適合處理超長序列等缺陷限制了其實際應用前景。但是其優秀的特徵抽取能力吸引了很多學者的關注。很多人提出了不同的變種Transformer來改進或者規避它的缺陷。其中,Universal Transformer、Transformer-XL、Reformer就是典型的代表。 

Universal Transformer

從構架來看,Universal Transformer和Transformer並沒有太大的區別,這裡就不詳細解讀了,主要談談其最大的創新之處。

圖8 Universal Transformer模型架構 

在Transformer中,輸入經過Attention後,會進入全連接層進行運算,而Universal Transformer模型則會進入一個共享權重的transition function繼續循環計算

圖9 Universal Transformer重新啟用了循環機制 

其中,縱向看是文本的序列順序,橫向看是時間步驟。其中每一步的計算公式如下:

這裡Transition function可以和之前一樣是全連接層,也可以是其他函數層。

之前Transformer的位置編碼因為因為層數是固定的,所以不需要將層數編碼進去。大師Universal Transforer模型多了一個時間維度,因此每一次循環都需要進行一輪坐標編碼,公式為:

為了控制循環的次數,模型引入了Adaptive Computation Time(ACT)機制。

ACT可以調整計算步數,加入ACT機制的Universal transformer被稱為Adaptive universal transformer。以下圖為例,可以看出,引入ACT機制後,模型對於文本中更重要的token會進行更多次數的循環,而對於相對不重要的單詞會減少計算資源的投入。

圖10 Universal Transformer模型會對重要的token投入更多的資源 

Universal Transformer對transformer的缺點進行了改進,解決了Transformer非圖靈完備的缺點,和計算資源投入平均的問題。

Transformer-XL

理論上,attention機制可以讓Transformer模型捕獲任意距離之間的token之間的依賴關係,但是受限於算力問題(下一個介紹的模型就是解決這個問題的),Transformer通常會將本文分割成長度小於等於

這也就意味著,segment之間的依賴關係,或者說距離超過512的token之間的依賴關係就完全無法建模抽取。同時,這還會帶來一個context fragmentation的問題,因為segment的劃分並不是根據語義邊界,而是根據長度進行劃分的,可能會將一個完整的句子拆成兩個。那麼在對這樣被拆分的句子進行預測時,可能就會缺少必要的語義信息。

而Transformer-XL提出了Segment-level Recurrence來解決這個問題。

用一句話概括Segment-level Recurrence,那就是,在對當前segment進行處理的時候,緩存並利用上一個segment中所有layer的隱向量,而且上一個segment的所有隱向量只參與前向計算,不再進行反向傳播。

圖11 Transformer-XL中,節點能夠「看到」之前的segment中的內容 

讓我們仔細深入研究一下計算過程,假設每個segment的長度為L,整個模型包含N層Transformer-XL,那麼每組segment就包含有N組長度為L的隱變量數組。將第t組segment的第n層隱變量向量表示為

從圖中可以看出,在當前segment中,第n層的每個隱向量的計算,都是利用下一層中包括當前位置在內的,連續前L個長度的隱向量。這也就意味著,每一個位置的隱向量,除了自己的位置,都跟下一層中前(L-1)個位置的token存在依賴關係,而且每往下走一層,依賴關係長度會增加(L-1)。所以最長的依賴關係長度是N(L-1),N是模型中layer的數量。在對長文本進行計算的時候,可以緩存上一個segment的隱向量的結果,不必重複計算,大幅提高計算效率。

由於考慮了之前的segment,那麼先前的位置編碼就不足以區分不同segment之間的相同位置的token,因此作者提出了使用Relative Positional Encodeing來替代之前的位置編碼。具體來說,就是使用相對位置編碼來替代絕對位置編碼。這種做法在思想上是很容易理解的,因為在處理序列時,一個token在其中的絕對位置並不重要,我們需要的僅僅是在計算attention時兩個token的相對位置。由於這部分工作起到的作用主要是補丁,這裡不再展開說。

總結來看。Transformer-XL在沒有大幅度提高算力需求的情況下,一定程度上解決了長距離依賴問題。

Reformer

之所以Transformer的

為了解決這個問題,作者提出了兩個機制分別解決這兩個問題,它們是locality-sensitve hashing(LSH) attention和Reversible transformer。

原始Transformer計算attention的過程中,需要計算

下圖展示LSH attention的過程,首先用LSH來對每個segment進行分桶,將相似的部分放在同一個桶裡面。然後我們將每一個桶並行化計算其中兩兩之間的點乘。

者還考慮到有一定的概率相似的向量會被分到不同的桶裡,因此採用了多輪hashing來降低這個概率。

圖12 Reformer模型預先使用了hashing篩選,類似桶排序,避免了對QK的計算

LSH解決了計算速度的問題,但仍有一個內存消耗的問題。一個單層網絡通常需要佔用GB級別的內存,但是當我們訓練一個多層模型時,需要保存每一層的激活值和隱變量,以便在反向傳播時使用。這極大地提高了內存的佔用量。

這裡作者借鑑了RevNet的思想,不保留中間殘差連接部分的輸入了,取而代之的,是應用一種「可逆層」的思路,就如同下圖中所示的那樣,(a)為前向傳播,(b)為反向傳播。

圖13 Reformer中的反向傳播時,每一層的輸入可以根據其輸出計算出來 

可逆層對每個層有兩組激活。一個遵循正常的標準過程,並從一個層逐步更新到下一個層,但是另一個只捕獲對第一個層的更改。因此,要反向運行網絡,只需減去應用於每個層的激活。

這意味著不需要緩存任何激活來計算後向傳播。類似於使用梯度檢查點,雖然仍然需要做一些冗餘計算,但由於每一層的輸入都可以很容易地從它的輸出中構造出來,內存使用不再隨網絡中層數的增加而增加。

總結來看,Reformer在減少了attention計算量的情況下,還減少了模型的內存佔用,為未來大型預訓練模型的落地奠定了基礎。

總結

本文主要介紹了Transformer模型以及針對其缺點作出改進的一些變種模型,總結了它們的設計思路和優缺點。未來,以Transformer及其改進版為基礎特徵抽取器的預訓練模型,一定能夠在自然語言處理領域取得更大的突破。

參考文獻

[1] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[C]//Advances in neural information processing systems. 2017: 5998-6008.

[2] Dehghani M, Gouws S, Vinyals O, et al. Universal transformers[J]. arXiv preprint arXiv:1807.03819, 2018.

[3] Dai Z, Yang Z, Yang Y, et al. Transformer-xl: Attentive language models beyond a fixed-length context[J]. arXiv preprint arXiv:1901.02860, 2019.

[4] Kitaev N, Kaiser Ł, Levskaya A. Reformer: The Efficient Transformer[J]. arXiv preprint arXiv:2001.04451, 2020.

[5] Vig J. A multiscale visualization of attention in the transformer model[J]. arXiv preprint arXiv:1906.05714, 2019.

[6] Clark K, Khandelwal U, Levy O, et al. What does bert look at? an analysis of bert's attention[J]. arXiv preprint arXiv:1906.04341, 2019. 


相關焦點

  • 用Transformer實現OCR字符識別!
    在CV領域中,transformer除了分類還能做什麼?本文將採用一個單詞識別任務數據集,講解如何使用transformer實現一個簡單的OCR文字識別任務,並從中體會transformer是如何應用到除分類以外更複雜的CV任務中的。
  • 搞懂 Vision Transformer 原理和代碼,看這篇技術綜述就夠了(十九)
    後續 Vision MLP 的研究發現不用注意力換成 Spatial MLP (MLP-Mixer,ResMLP) 效果也很好,他們把 self-attention 機制換成了簡單的 MLP 模塊來混合不同 tokens 之間的信息。
  • 解析Transformer模型
    代碼這裡參考的是TensorFlow的官方實現notebook transformer.ipynb位置編碼def get_angles(pos, i, d_model):  angle_rates = 1 / np.power(10000, (2 * (i//2)) / np.float32
  • Transformer 在計算機視覺領域瘋狂「內卷」
    用一種新的注意力近似算法進一步解決它對輸入大小的二次依賴問題,大大降低了內存要求,而內存是 transformer 模型的最大瓶頸。由此,在多個基準數據集上獲得新的 SOTA。方案:將跨解析度 homography estimation(單應性估計)視為一個多模態問題,提出一個嵌入多尺度結構的 local transformer 網絡,明確學習多模態輸入之間的對應關係,即不同解析度的輸入圖像。local transformer 專門針對特徵中的每個位置採用了局部注意圖。
  • Python 文本分析(3)Pytorch-transformer實際應用
    這期總算琢磨了點乾貨出來,主要涉及Pytorch-transformer給出的Bert ,XLM ,以及XLNet(三個NLP目前的大哥大)的參數調整和實際應用
  • 十分鐘理解Transformer
    在這裡,transformer首先將詞向量乘上三個矩陣,得到三個新的向量,之所以乘上三個矩陣參數而不是直接用原本的詞向量是因為這樣增加更多的參數,提高模型效果。對於輸入X1(機器),乘上三個矩陣後分別得到Q1,K1,V1,同樣的,對於輸入X2(學習),也乘上三個不同的矩陣得到Q2,K2,V2。
  • 遠控木馬NetWire RAT現新變種,正通過釣魚電子郵件傳播
    分析表明,它正是NetWireRAT的新變種。 正通過釣魚郵件傳播的NetWire RAT新變種 圖1展示的就是網絡釣魚電子郵件中的一個示例,它的底部包含一張帶有超連結的圖片。一旦點擊,就會導致一個惡意文件被下載到計算機上。
  • 只需幾個小操作,就能讓transformer模型推理速度加3.5倍
    你在用 PyTorch 寫 transformer 嗎?請關注下這個項目。
  • Transformer在目標檢測領域的開山之作DETR模型
    詳細介紹DETR的流程,首先把一張3通道圖片輸入backbone為CNN的網絡中,提取圖片特徵,然後結合位置信息,輸入到transformer模型的編碼器和解碼器中,得到transformer的檢測結果,每個結果就是一個box,其中每個box表示一個元組,包含物體的類別和檢測框位置。
  • DETR詳解:NLP裡面的Transformer也能做目標檢測?
    什麼是Transformers啥是transformer?相信如果不是NLP的應該不知道,但是transformer這個結構在NLP中已經十分流行了。其實如果告訴你Attention is All you need你可能更加耳熟能詳,正是這篇論文最開始提出了transformer這個結構。
  • 【實戰乾貨】用Pytorch輕鬆實現28個視覺Transformer(附代碼解讀)
    作者github連結:https://github.com/rwightmantimm庫連結:https://github.com/rwightman/pytorch-image-models所有的PyTorch模型及其對應arxiv連結如下:Big Transfer
  • CVE-2018-9442:Rowhammer攻擊變種RamPage預警
    0x00 事件概述360-CERT近日監測到國際學術研究團隊表示,自2012年以來發布的幾乎所有Android設備都容易受到名為RAMpage的新漏洞的攻擊,漏洞編號CVE-2018-9442,是Rowhammer漏洞的一個變種
  • x戰警變種的天敵,機器人哨兵實力多強大
    劇情介紹;特拉斯克工業」創始人玻利瓦爾·特拉斯克所製造並指揮的新型特種戰鬥機器人「哨兵」,被用於人類消滅變種人
  • Transformer (DETR) 對象檢測實操!
    這留給我們的是C個二維特徵,由於我們將把這些特徵傳遞給一個transformer,每個特徵必須允許編碼器將每個特徵處理為一個序列的方式重新格式化。這是通過將特徵矩陣扁平化為H⋅W向量,然後將每個向量連接起來來實現的。
  • 變種碰瓷隊皮實好使
    馬哥對大魏騎造成了成噸的傷害敵數倍之,也要敢於亮劍小結陸抗變種碰瓷適用於只有馬超陸抗變種碰瓷前期可作為主城3-4隊出,在不浪費戰法經驗的前提下,可以作為低級土地駐守隊伍對敵軍拆遷造成大量傷害,令對方拆遷絕望,推薦人手一隊。陸抗變種碰瓷,進可探路戰主力,退可駐守吃拆遷,賽季前中後期都能作為奇兵使用。
  • 【綜述專欄】十分鐘理解Transformer
    當我輸入一個文本的時候,該文本數據會先經過一個叫Encoders的模塊,對該文本進行編碼,然後將編碼後的數據再傳入一個叫Decoders的模塊進行解碼,解碼後就得到了翻譯後的文本,對應的我們稱Encoders為編碼器,Decoders為解碼器。細心的同學可能已
  • Transformer 模型的 PyTorch 實現
    Transformer架構首先看一下transformer的結構圖:解釋一下這個結構圖。首先,Transformer模型也是使用經典的encoer-decoder架構,由encoder和decoder兩部分組成。上圖的左半邊用Nx框出來的,就是我們的encoder的一層。
  • 熱門的模型跨界,Transformer、GPT做CV任務一文大盤點
    模型將其展平並在將其傳遞到 transformer 編碼器之前進行位置編碼補充。然後,transformer 解碼器將少量固定數量的學得位置嵌入作為輸入,稱為對象查詢,並另外參與編碼器的輸出。將解碼器的每個輸出嵌入傳遞到預測檢測(類和邊界框)或無對象類的共享前饋網絡(FFN)。更為具體的 DETR 架構如下:
  • pytorch編程之使用 nn.Transformer 和 TorchText 進行序列到序列建模
    單擊此處下載完整的示例代碼PyTorch 1.2 發布了一個基於論文《Attention is All You Need》的標準transformer模塊。transformer模型在很多seq2seq問題上效果更好,且更容易實現並行訓練。
  • ByT5:邁向無token的未來,基於T5架構的預訓練字節級Transformer
    與 mT5 相比,研究者在設計 ByT5 時進行了以下關鍵更改:首先,省去了 SentencePiece 詞彙表,將 UTF-8 字節無需任何文本預處理直接輸入模型中;其次,修改預訓練任務;然後,研究者發現當解耦編碼器和解碼器 transformer 堆棧的深度時,ByT5 表現最好;最後,根據 UTF-8 標準並非所有字節序列都是合法的,所以研究者會在模型的輸出中刪除任何非法字節。