前言
今天要與你們分享的是AllenAI今年發表的最新工做,Longformer——一種可高效處理長文本的升級版Transformer。做者團隊提供了開源代碼,你們可快速復現,直接用於本身的任務。git
傳統Tranformer-based模型在處理長文本時有着自然的劣勢。由於傳統模型採用的是「全鏈接」型的attention機制,即每個token都要與其餘全部token進行交互。其attention複雜度高達。此前的解決辦法是將長文切分爲若干個較短的text span,而後逐個處理。這就致使不一樣的text span之間沒法進行交互,於是必然存在大量information loss。固然,咱們也能夠經過添加一些其餘機制來增強這種text span之間的交互。但這種新增機制實現起來一般比較複雜,並且每每是task-specific的,通用性不強。github
本文提出的Longformer,改進了Transformer的傳統attention機制:對於每個token,只對固定窗口大小的附近token計算local attention,並結合具體任務,計算少許的global attention。該方法的優勢包括:ide
原文連接:
https://arxiv.org/pdf/2004.05150.pdf
Github:
https://github.com/allenai/longformer
Arxiv訪問慢的小夥伴也能夠在訂閱號 「夕小瑤的賣萌屋」 後臺回覆關鍵詞 【0716】下載論文PDF~
模型
做者共提出了三種新的attention pattern,來下降傳統self-attention的複雜度,分別是滑窗機制、膨脹滑窗機制、融合全局信息的滑窗機制。下圖展現了傳統attention與這三種attention pattern的示意圖。接下來將爲你們分別講解。
1. 滑窗機制(Sliding window): 對於每個token,只對其附近的w個token計算attention計算複雜度與文本序列長度成線性關係,爲。做者認爲,根據應用任務的不一樣能夠對Transformer每一層施以不一樣的窗口大小,對模型表示能力可能有潛在幫助。性能
讀到這裏的,你們可能和我同樣,誤認爲這個窗口應該比較小,估計在16~64這個量級。但看到實驗部分會發現,做者在具體實現的時候,設置的窗口大小爲512,和Bert的Input限制徹底同樣。因此,你們不要存有「Longformer比Bert還要更輕量」的錯覺。學習
2. 膨脹滑窗機制(Dilated sliding window): 在對每個進行token編碼時,普通滑窗機制只能考慮到長度爲的上下文。做者進一步提出膨脹滑窗機制,在不增長計算負荷的前提下,拓寬模型「視場」。其作法借鑑了空洞卷積的思想[1]。以下圖所示,在滑動窗口中,被attend到的兩個相鄰token之間會存在大小爲d的間隙。當transformer的層數爲l時,則視場範圍可達到。實驗代表,因爲考慮了更加全面的上下文信息,膨脹滑窗機制比普通的滑窗機制表現更佳。
測試
3. 融合全局信息的滑窗機制(Global+sliding window): 咱們知道Bert一類的語言模型在應用於具體任務時,實現方式略有不一樣。好比,對於文本分類任務,咱們會在文本序列前添加[CLS]這一特殊token;而對於QA類任務,則會將問題與文本進行拼接後輸入。在Longformer中,做者也但願可以根據具體任務的不一樣,在local attention的基礎上添加少許的global attention。好比,在分類任務上就會在[CLS]處添加一個global attention,而在QA任務上會對question中的全部token添加global attention。以下圖所示,對於添加了global attention的token,咱們對其編碼時要對整個序列作attention。而且,編碼其餘全部token時,也都要attend到它。
實驗
自定義CUDA內核
因爲現有的深度學習庫中並無能直接實現膨脹滑窗機制的接口,爲此做者直接自定義了CUDA內核操做,用於實現Longformer的attention pattern[2]。以下圖所示,Longformer的內存消耗與文本長度成線性關係(紅線)。用自定義CUDA來實現Longformer,相比於用Naive Pytorch來實現(藍線),運行速度加快了六倍。
片
Longformer在字符級別任務上的表現
做者在text8和enwik8兩個字符級任務上對Longformer進行實驗。實驗中,模型每一層採用了不一樣的窗口大小:底層使用較小的滑窗,以建模局部信息;在高層使用較大的滑窗,以擴大感覺野。訓練時,理想情況下固然是但願使用GPU所能承受的最大的window size和sequence len。但爲了加快訓練速度,做者採用的是一種階段式的訓練方式:在學習更長的上下文以前,先學好局部的上下文。在第一階段,先設置較短的序列長度和窗口大小。在後續階段,window size和sequence length增長一倍,學習率減半 實驗結果以下圖所示,Longformer在這兩個數據集上皆達到了SOTA效果(注:測試指標爲BPC,bits-per-character;BPC越小,性能越優)。編碼
做者經過實驗,對滑窗機制的設置進行了進一步的討論。以下表所示:spa