Funnel-Transformer:让Transformer更高效地处理长序列
論文標題:
Funnel-Transformer: Filtering out Sequential Redundancy for Efficient Language Processing
論文作者:
Zihang Dai (CMU, Google), Guokun Lai (CMU), Yiming Yang (CMU), Quoc V. Le (Google)
論文鏈接:
https://arxiv.org/abs/2006.03236
代碼鏈接:
https://github.com/laiguokun/Funnel-Transformer
Transformer的空間復雜度是序列長度的平方級,當序列很長的時候,Transformer會消耗大量空間,從而降低運算效率。
本文提出漏斗型(Funnel)Transformer,隨著層數增加,模型在序列方向變窄,從而節約空間開銷。
此外,該模型還可以像BERT一樣用于預訓練,不用改變訓練方法。在句子級任務上的實驗表明,Funnel-Transformer在相同的FLOPs和模型大小下能實現更好的效果。
老生常談:Transformer的效率問題
眾所周知,Transformer的一大問題就是它的效率問題。
由于Transformer的空間復雜度和時間復雜度是序列長度的平方級,所以,當序列很長的時候,模型的大小或FLOPs (Floating Point OPerations, 浮點運算量)就會變大,這不但會限制Transformer在一些任務上的應用(比如文檔級別的任務),還會降低訓練、微調的效率。
當前已經有很多工作嘗試緩解這個問題,大致可以分為兩類:模型后處理與非后處理。
模型后處理指的是訓練好一個普通的Transformer后,試圖得到一個更加輕便的Transformer,其方法包括蒸餾、剪枝、量化等等。
非后處理就是直接修改Transformer的結構,比如修改自注意力機制、使用CNN等。
本文提出另一種簡單但有效的提高Transformer處理長序列效率的方法:隨著模型加深,使用池化操作壓縮在序列方向上的長度,讓模型變窄,從而節約高層的參數量,直到最后得到單個向量(或幾個,取決于任務)。于是,這單個向量就可以直接用于句子級別的任務,如文本分類。
但是,這樣的模型就不能用于token級別的任務了,比如問答等。為此,本文又在最后加上一個Decoder,將最后得到的單個向量上采樣,從而恢復到原來的序列長度。
這樣一來,將相當于壓縮了整個模型的中間部分,而保持開始和結束層的長度不變,也就可以像原始Transformer一樣用于各類任務了。
總的來說,本文的貢獻如下:
提出Funnel-Transformer,在序列長度方面“壓縮”模型,使之具有更好的處理長序列的效率;
同時,引入Decoder,保持模型最后的輸出可以和原序列長度一致,從而保持Transformer處理各類任務的能力;
在句子級別的任務上取得很好的效果,同時也可以擴展到其他任何任務。
Funnel-Transformer
首先回顧一下Transformer。Transformer由多個相同的Block組成,每個Block都可以表示為:
這里是句子長度。總的來說,每個Block是由自注意力和前饋層兩個部分組成,我們重點關注自注意力部分。
在上述的自注意力中,Q,K,V都是本Block的輸入H,假設序列長度為T,則H的形狀就是T*D,這里D是隱層的維度。
當序列很長,即T很大的時候,H也就相應的變得很大,從而在計算自注意力的時候,計算量也就呈現平方級的增長.
|?Encoder
為了緩解這個問題,Funnel-Transformer提出在序列長度這一維度進行“壓縮”,具體方法就是使用池化(Pooling)操作,如下圖所示(Encoder部分):
對第一個Block,我們還是像普通Transformer那樣計算,但是到第二個Block的時候,就可以先把第一層得到的特征向量池化一下:
這樣子,新的特征矩陣的形狀就是T'*D,這里T'< T。然后在池化后的特征上進行自注意力:
特別注意這里的Q和KV的差別。Q是新得到的特征,KV還是池化前的特征。這是因為對原來的特征進行自注意力有利于減少池化帶來的信息損失。
現在,經過自注意力的特征矩陣的形狀還是T'*D,于是第二層Block輸出的特征矩陣的形狀就是T'*D。之后,不斷地進行這個操作,特征矩陣在長度維上就越來越小,從而節約計算的空間和時間。
本文使用stride=2,window=2的最大池化,于是就有T'=T/2,即下一層Block的特征的序列長度縮小一半。
另外,由于Transformer有特殊的[CLS]標記,所以在進行池化的時候,需要先把這個特殊的標記除外,在剩下的位置進行池化,池化之后再把這個標記加進來。到最后一層,[CLS]就可以用于各種句子級別的任務,比如文本分類。
| Decoder
但是,上述池化操作會導致一個問題:模型最后輸出的特征矩陣大小和輸入的大小不匹配。這會使得所有基于Transformer的字級別任務的模型失效,其中最典型的就是類似BERT的預訓練模型。
BERT的預訓練依賴于掩碼預測(MLM),隨機掩碼一部分token,然后在最后一層在被掩碼的位置預測這個token是什么,所以,模型輸出的序列長度是要和輸入的序列長度保持一致的,顯然Funnel-Transformer沒有做到。
為了解決這個問題,Funnel-Transformer引入了一個Decoder(只用于預訓練和字級別的任務),將Encoder最后一層的特征上采樣,恢復到原來輸入序列的長度。
但是,單純的上采樣效果不好,所以,還需要額外加入Encoder第一層的輸出特征,這樣就可以最大化信息保留。在相加之后,再經過兩層Block讓二者充分融合,就得到最后的輸出特征。
實驗
本文主要在句子級別的任務上進行實驗,基線模型有Bert、XLNet和Electra,F-TFM都是在這兩個模型之上進行的修改。任務有GLUE benchmark和文本分類。詳細的實驗設置見原文。
下表是和BERT相比在GLUE(上半部分)和文本分類(下半部分)上的結果。以B開頭的模型是F-TFM,后面的數字代表的是每個Block中含有多少層,同一個Block內序列長度沒有減少。
比如,B8-8-8表示的是一共有三個Block,每個Block有8層,假設輸入序列長度為256,那么最后得到的長度就是256/2^3=32。
從這個表中不難得出三個結論:在相似大小的模型規模(FLOPs)下,F-TFM表現得更好,這可能是因為在相同的FLOPs下,F-TFM有更深的層次,從而更好地利用“深”這一優勢。
下表是和ELECTRA比較的結果,我們不難得到相同的結論。
除了GLUE和文本分類任務之外,本文還在閱讀理解任務上進行了實驗,具體包括RACE和SQuAD兩個數據集。
RACE是一個單項選擇任務,文本長度要更長,因此要求模型能夠理解長文本語義。
而SQuAD是一個字級別任務,它要選擇答案的起始位置和結束位置,這是為了測試F-TFM在字級別任務上的能力。二者實驗結果如下表所示:
總的來說,F-TFM都能取得很好的結果,尤其在Base模型上更加明顯。
最后來看看F-TFM中哪些部分比較重要,本文對池化方法、自注意力方法、[CLS]的必要性、Block設計和相對位置編碼進行了實驗,結果如下表所示:
可以看到,最大池化和平均池化效果差別不大,F-TFM中的自注意力和[CLS]的作用比較顯著,相對位置編碼非常關鍵,不同的Block設計也會有所影響。
小結
本文提出了Funnel-Transformer (F-TFM),可以有效地針對長序列“壓縮”模型大小,其關鍵在于如何合理使用池化操作并將其與自注意力機制結合,從而在相同模型規模的條件下加深模型,提高效果。
利用上采樣,F-TFM可以“還原”本來的序列長度,從而可以和Transformer一樣用于預訓練和各類任務,這在實驗中得到了證明。T-TFM方法簡單,觀點新穎,具有較大的發展空間。
最后我們給讀者留下一個思考題:F-TFM中使用上采樣作為Decoder的方法似乎不夠優雅,是否有其他更好的方法恢復序列的長度?
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的Funnel-Transformer:让Transformer更高效地处理长序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平安自动扣款能不能退
- 下一篇: 《战神》迎 20 周年:多款游戏被曝重制