bigbird長文本預訓練模型介紹

2021-12-19 機器學習算法與自然語言處理

MLNLP(機器學習算法與自然語言處理)社區是國內外最大的自然語言處理社區之一,匯聚超過50w訂閱者,受眾覆蓋國內外NLP碩博生、高校老師以及企業研究人員。
社區的願景是促進國內外自然語言處理,機器學習學術界、產業界和廣大愛好者之間的交流和進步。本博客翻譯自huggingface blog(https://huggingface.co/blog/big-bird)。前言基於Transformer的模型已經被證明了在許多NLP任務中的價值,但這類模型的時間複雜度、內存使用複雜度都是 n平方(n為序列長度),因此當序列長度超過常規的512時,模型對算力的要求將會大幅提高。最近的一些文章Longformer, Performer, Reformer, Clustered attention都試圖通過近似全主力機制改善該問題。例如這個帖子(https://huggingface.co/blog/long-range-transformers)就是介紹這些模型的。 BigBird論文是處理這類問題最新模型的其中之一,它使用block sparse attention替換了原類似Bert一樣的全注意力機制,在與BERT一樣的計算力情況下,可以處理的序列長度達到4096。它已經在很多長文本序列的任務上達到SOTA效果,例如長文本摘要、長文本問答。BigBird RoBERTa模型現在已經可以在Transformers倉庫中使用。這篇博客的目的是為了讓讀者深入理解big bird的運行機制,快速使用Transformers倉庫上手BigBird模型。但在開始之前,我們需要知道,BigBird的注意力機制是一個近似BERT的全注意力機制,因此它不是說比BERT的注意力機制效果更好,而是運行效率更高。BERT的注意力機制的存儲與序列長度是二次方關係,在長文本情況下的存儲需求就已經開始令人難以忍受,而BigBird的block sparse attention就是為了解決這個問題。也就是說,在無窮長度序列上,計算無窮次時,我們應該把BERT的全注意力機制換成block sparse attention。如果你想知道,為什麼在計算長序列時,我們需要更多的算力,這篇博客正好適合你。當使用標準BERT一樣的注意力機制時,主要的問題可能有:注意力應該考慮哪些詞?首先我們研究一個注意力工作的例子「BigBird is now available in HuggingFace for extractive question answering」。在全注意力機制中,每個詞都會在注意力中計算其他所有詞。用數學表達式表示即為: 

讓我們思考一下,如果通過掩碼,讓query-token只與最重要的key-token做注意力計算可能是一個更明智的方法,下面我們列舉一下對query-token來說,重要的key-token都有哪些。

# 以下面句子為例
>>> example = ['BigBird', 'is', 'now', 'available', 'in', 'HuggingFace', 'for', 'extractive', 'question', 'answering']

# 現在query_token的例子為available
>>> query_token = 'available'

# 初始化一個空的key_token列表,下面我們逐漸添加
>>> key_tokens = []

相鄰的詞是非常重要的,當前詞的含義非常依賴於它鄰近的前幾個詞和鄰近的後幾個詞,這就是sliding attention

# 舉例窗口為3,即只考慮available詞的前一個詞和後一個詞
# 即左邊的詞」now「;右邊的詞」in「
>>> sliding_tokens = ["now", "available", "in"]

# 更新一下key_tokens集合
>>> key_tokens.append(sliding_tokens)

長程依賴(Long-range dependencies):有的任務,需要捕獲距離較遠的詞之間的關係,例如問答模型需要比較原文中每個詞與整個問題,從而發現原文中哪些詞序列更適合做正確答案。如果大多數原文詞與其他原文詞做注意力計算,而不是與問題做注意力計算,這對模型來說將會更困難的篩出重要的原文詞。

BigBird有兩種長程注意力方式,可以讓計算變的更有效:

# 例如第一個詞和最後一個詞是全局的
>>> global_tokens = ["BigBird", "answering"]

# 將全局詞加入至key_tokens集合中
>>> key_tokens.append(global_tokens)

# 現在用詞」is「做隨機詞
>>> random_tokens = ["is"]

>>> key_tokens.append(random_tokens)

>>> key_tokens
{'now', 'is', 'in', 'answering', 'available', 'BigBird'}

# 現在,詞」available「可以只與這些詞做注意力計算,而不是所有詞

通過這種方法,query token只與部分詞做注意力計算,同時與全注意力機制保持了相近的效果。這些操作會用於其他query_token,但是,所有這些操作都是為了在更節省的算力下,接近BERT的全注意力效果。在當今的硬體如GPU上,像BERT一樣的模型,簡單的將query token與所有的key token計算全注意力機制的方式,因為注意力時計算序列長度的平方矩陣乘法,所以非常消耗計算資源。然而如果通過結合sliding attention、global attention、random attention三種注意力機制,計算方式降為稀疏矩陣乘法,計算起來就更容易。BigBird就是通過block sparse注意力機制,結合了sliding attention、global attention、random attention三種方法。下面我們詳細介紹通過圖結構理解global, sliding, random keys首先,我們通過圖來理解為什麼三種注意力機制結合可以達到接近Bert的全注意力機制效果。

上圖給出了global、sliding、random三種連接,每個節點代表了詞,每條線代表了注意力,如果兩個詞之間沒有連接,意味著兩個詞中間沒有注意力計算。

BigBird block sparse attention結合了sliding、global、random的十條連接。正常注意力機制是有6個節點的所有15條連接。正常注意力與所有詞都為全局注意力是等價的。

Normal attention:模型可以在一層之內,把每個詞的信息都與其他任意詞直接交互。以上圖為例,如果模型需要兩個詞」going「與」now「互相聯繫,就需要在一層內,建立他們的直接連接。

Block sparse attention:由於節點不是全部互相連接的,那麼模型的節點(或詞)需要互相分享信息時,信息不得不通過最短路徑的其他節點。例如,當「going」需要連接至「now」,如果只考慮窗口為左右各一個詞的sliding attention,那麼「going」與「now」之間的信息,必須通過going -> am -> i -> now,才能被「now」接收。因此,我們需要多層「Block sparse」才能有效捕獲序列中所有的組合信息,而全連接的注意力機制只在一層內就可以捕獲序列的所有組合信息。在極端情況下,如兩個詞距離最遠,需要的層數,與輸入的詞數要一樣多。當加入global connection的連接時,信息可以通過going -> i -> now的方式傳遞。如果加入random connections,信息可以通過going -> am -> now的方式傳遞。所以在有global connections、random connections的參與下,信息可以在token之間傳遞更有效。如果當我們有很多global tokens時,就已經有很多足夠短的連接了,那麼就不再需要random connections。通過設置num_random_tokens = 0,就得到這樣變體的BigBird模型,也稱為ETC。BigBird block sparese attention通過以上討論可知,Block sparse attention是一個有效的運行方式。每個詞都是與其他global tokens、 sliding tokens、 random tokens進行計算,而不是與其他所有詞進行計算。作者已經在代碼中分別實現了多種注意力矩陣,因此實現了訓練和預測時間更短的小技巧。圖中可以看到2個向左平移和向右平移的額外句子。這是計算sliding attention時需要執行的。實現block_sparse注意力的代碼(https://github.com/vasudevgupta7/transformers/blob/5f2d6a0c93ca2017961199aa04a344b9b779d454/src/transformers/models/big_bird/modeling_big_bird.py#L513)看起來長,在這裡會逐步解釋。Global Attention對於global attention,注意力的每次query都是與輸入的所有其他詞進行計算。例如第一個詞[Vasudev]和最後一個詞[them]。如下代碼所示

# pseudo code

Q -> Query martix (seq_length, head_dim)
K -> Key matrix (seq_length, head_dim)

# 1st & last token attends all other tokens
Q[0] x [K[0], K[1], K[2], ., K[n-1]]
Q[n-1] x [K[0], K[1], K[2], ., K[n-1]]

# 1st & last token getting attended by all other tokens
K[0] x [Q[0], Q[1], Q[2], ., Q[n-1]]
K[n-1] x [Q[0], Q[1], Q[2], ., Q[n-1]]

Sliding Attention

計算注意力時序列中的key序列複製兩次,一個向左平移一個位置、一個向右平移一個位置,然後用query序列與三個key序列直接向量相乘,就實現了所有sliding tokens的計算。計算複雜度僅為O(3xn) = O(n)。在上圖中,橙色格子為sliding attention。在表格上方的三個句子代表三個key序列,即原key序列,向左平移的key序列、向右平移的key序列

# what we want to do
Q[i] x [K[i-1], K[i], K[i+1]] for i = 1:-1

# efficient implementation in code (assume dot product multiplication )
[Q[0], Q[1], Q[2], ., Q[n-1]] x [K[1], K[2], K[3], ., K[n-1], K[0]]
[Q[0], Q[1], Q[2], ., Q[n-1]] x [K[n-1], K[0], K[1], ., K[n-2]]
[Q[0], Q[1], Q[2], ., Q[n-1]] x [K[0], K[1], K[2], ., K[n-1]]

# Each sequence is getting multiplied by only 3 sequences to keep `window_size = 3`.
# Some computations might be missing; this is just a rough idea.

Random Attention

Random attention可以在計算注意力時,讓query詞與其他隨機的幾個key詞進行計算。在實際運行中,模型會隨機收到幾組注意力得分。

# r1, r2, r are some random indices; Note: r1, r2, r3 are different for each row
Q[1] x [Q[r1], Q[r2], ., Q[r]]
.
.
.
Q[n-2] x [Q[r1], Q[r2], ., Q[r]]

# leaving 0th & (n-1)th token since they are already global

模型推斷

在一般的Bert注意力中,序列為$X=x_1, x_2,...,x_n$,由稠密向量$Q,K,V$計算的注意力為$Z=Softmax(QK^T)$。在BigBird注意力計算中,同樣的算法就僅在個別的query向量和key向量之間計算。

下面我們來展開bigbird的block sparse attention的執行方式。首先我們假設b,r,s,g分別代表block_size, num_random_blocks, num_sliding_blocks, num_global_blocks。當b=4,r=1,g=2,s=3,d=5時:

注意力得分$q_1,q_2,q_3,q_{n-2},q_{n-1},q_n$分別由以下方式計算

注意力得分q_1由a_1表示,第一個詞與序列其他所有詞計算得來 

這裡 q_1 代表第一個塊, g_i 代表第i個塊,因此只是正常的注意力計算可得 q_1&g

在計算第二塊時,需要前三塊、最後一塊、第五塊,計算公式為 

圖中的 g,r,s 代表global,random,sliding。

當計算注意力得分 q_{3:n-2} 時,需要用global, sliding, random三種key,與 q_{3:n-2} 進行注意力計算。這裡的sliding key的計算由上面介紹的平移方法得到。

當計算倒數第二個詞( q_{n-1} )的得分時,需要第一個塊、最後三塊和第三塊。計算公式為 

當計算最後一個詞時,公式為 

 ,這裡的注意力計算為最後一個詞與其他所有詞的計算。

結合以上所有矩陣計算為:


在神經網絡前向傳播時,因為矩陣中白色的塊不會參與到注意力計算,所以計算整體會更輕量。
時間空間複雜度比較

BigBird time complexity = O(w x n + r x n + g x n)
BERT time complexity = O(n^2)

Assumptions:
w = 3 x 64
r = 3 x 64
g = 2 x 64

When seqlen = 512
=> time complexity in BERT = 512^2

When seqlen = 1024
=> time complexity in BERT = (2 x 512)^2
=> time complexity inBERT = 4 x 512^2

=> time complexity in BigBird = (8 x 64) x (2 x 512)
=> time complexity in BigBird = 2 x 512^2

When seqlen = 4096
=> time complexity in BERT = (8 x 512)^2
=> time complexity in BERT = 64 x 512^2

=> compute in BigBird = (8 x 64) x (8 x 512)
=> compute in BigBird = 8 x (512 x 512)
=> time complexity in BigBird = 8 x 512^2

ITC vs ETC

BigBird模型可以由兩種策略訓練:ITC & ETC。ITC(internal transformer construction)即為上面討論的計算方式。ETC(external transformer construction)為指定部分詞為全注意力計算方式。

ITC需要更少計算量,因為只有很少的詞是全局計算的,同時模型通過random attention保持全局信息。而ETC是設置了更多的全局計算詞,面向一些需要一些額外的全局信息任務,例如在閱讀理解任務中,問題需要與所有的答案進行注意力計算。

注意:在原論文中,ETC實驗中,不含random token夾帶私貨現已開源中文bigbird預訓練模型,從tiny至base共5個級別預訓練模型。可以從huggingface hub(https://huggingface.co/models?language=zh&sort=downloads&search=bigbird)直接下載使用,如果對您有用,歡迎star我的Github(https://github.com/LowinLi/chinese-bigbird)。

關於我們
MLNLP(機器學習算法與自然語言處理) 社區是由國內外自然語言處理學者聯合構建的民間學術社區,目前已經發展為國內外最大的自然語言處理社區之一,匯聚超過50w訂閱者,旗下包括萬人頂會交流群、AI臻選匯、AI英才匯以及AI學術匯等知名品牌,旨在促進機器學習,自然語言處理學術界、產業界和廣大愛好者之間的進步。社區可以為相關從業者的深造、就業及研究等方面提供開放交流平臺。歡迎大家關注和加入我們。

相關焦點

  • 南京大學提出CPD:通過視頻-文本對匹配的視頻預訓練模型
    我們主要利用網絡上的視頻以及視頻本身的描述信息 (Instagram中的視頻描述、Youtube中的視頻標題),藉助contrastive learning的思想預測視頻和文本的匹配關係 (Cross-modal Pair Discrimination),對視頻網絡進行預訓練。
  • NLP預訓練模型大集合!
    它們將詞語和句子編碼成稠密的定長向量,從而大大地提升神經網絡處理文本數據的能力。近日,Separius 在 GitHub 上列舉了一系列關於 NLP 預訓練模型的近期論文和文章,力求全面地概述 NLP 各個方面的最新研究成果,包括詞嵌入、池化方法、編碼器、OOV 處理等。
  • Longformer:超越RoBERTa,為長文檔而生的預訓練模型
    作者 | ChrisCao、小軼編輯 | 叢 末傳統Tranformer-based模型在處理長文本時有著天然的劣勢。因為傳統模型採用的是「全連接」型的attention機制,即每一個token都要與其他所有token進行交互。其attention複雜度高達。
  • 從Sentence-BERT談起基於預訓練語言模型的文本表示
    大家好,我是澤軍,最近閱讀了一些 paper,對基於預訓練語言模型 (BERT/RoBERTa) 的句向量生成技術進行了調研,今天給大家介紹一下。本文從 Sentence-BERT(SBERT) 開始,討論基於預訓練語言模型的句向量生成技術,主要介紹了如下方法:Sentence-BERT: 《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》 (https://arxiv.org
  • 預訓練語言模型:還能走多遠?
    預訓練語言模型還有哪些潛在的突破口?預訓練語言模型亟待解決的問題有哪些?在最後的討論環節,眾專家將圍繞這些話題進行討論。 韋福如對現有的語言模型預訓練工作進行總結和比較,然後介紹面向自然語言理解和生成任務的統一預訓練語言模型 UniLM 以及多語言預訓練模型 InfoXLM(演講內容請觀看CNCC回放視頻)。
  • 機器推理文本+視覺,跨模態預訓練新進展
    本文將介紹微軟亞洲研究院在跨模態預訓練領域的研究進展。近年來,自然語言處理(NLP)和計算機視覺(CV)兩大領域不斷碰撞和融合,衍生出很多跨模態研究課題(例如圖片檢索和圖片問答等)。接下來,本文首先簡要介紹 Unicoder-VL 的模型,然後通過其在圖片檢索和圖片推理問答中的應用,說明該模型對跨模態推理任務的作用。
  • PTMs|2020最新NLP預訓練模型綜述
    該綜述系統地介紹了nlp中的預訓練模型。主要的貢獻包括:1.深入盤點了目前主流的預訓練模型,如word2vec,ELMo,BERT等。2.提出了一種預訓練模型的分類體系,通過四種分類維度來劃分目前已有的預訓練模型。
  • 【NLP】Facebook提出的預訓練模型BART
    該模型結合雙向和自回歸 Transformer 進行模型預訓練,在一些自然語言處理任務上取得了SOTA性能表現。近日,Facebook 發表論文,提出一種為預訓練序列到序列模型而設計的去噪自編碼器 BART。BART 通過以下步驟訓練得到:1)使用任意噪聲函數破壞文本;2)學習模型來重建原始文本。
  • 復旦邱錫鵬教授:2020最新NLP預訓練模型綜述
    新智元報導編輯:SF【新智元導讀】本文該綜述系統地介紹了nlp中的預訓練模型,深入盤點了目前主流的預訓練模型,提出了一種預訓練模型的分類體系。本篇文章主要介紹邱錫鵬老師在2020年發表的一篇預訓練模型的綜述:「Pre-trained Models for Natural Language Processing: A survey」。該綜述系統地介紹了nlp中的預訓練模型。主要的貢獻包括:1、深入盤點了目前主流的預訓練模型,如word2vec,ELMo,BERT等。
  • [預訓練語言模型專題] MT-DNN(KD) : 預訓練、多任務、知識蒸餾的結合
    感謝清華大學自然語言處理實驗室對預訓練語言模型架構的梳理,我們將沿此脈絡前行,探索預訓練語言模型的前沿技術,紅框中為已介紹的文章,綠框中為本期介紹的文章,歡迎大家留言討論交流。眾所周知,語言模型預訓練方法和多任務學習策略都是提高模型性能的重要手段,本文就結合了兩者的優點,提出了MT-DNN的方案,並在GLUE上的八個NLU任務上超越了之前的state-of-art模型。首先,MT-DNN考慮了四種類型的NLU任務,分別是單句文本分類(CoLA, SST-2),文本對的分類(RTE,MNLI,QQP,MRPC),文本相似度度量(STS-B),相關度排序(QNLI)。
  • 賽爾原創@Findings|中文預訓練語言模型回顧
    同時,我們創新地提出了一種基於文本糾錯的預訓練語言模型MacBERT,應用糾錯型掩碼語言模型(MLM as correction,Mac)解決了預訓練模型中「預訓練-精調」不一致的問題。為了驗證實驗效果,我們選擇了8個經典的中文自然語言處理任務,包括閱讀理解、單句文本分類、句對文本分類等。大量實驗結果表明所提出的MacBERT能夠在大多數任務上取得顯著性能提升。
  • 26億參數,智源、清華開源中文大規模預訓練模型
    近日,北京智源人工智慧研究院和清華大學研究團隊合作開展了一項名為「清源 CPM (Chinese Pretrained Models)」的大規模預訓練模型開源計劃,旨在構建以中文為核心的大規模預訓練模型。首期開源內容包括預訓練中文語言模型和預訓練知識表示模型,可廣泛應用於中文自然語言理解、生成任務以及知識計算應用,所有模型免費向學術界和產業界開放下載,供研究使用。
  • 賽爾原創@Findings | 中文預訓練語言模型回顧
    同時,我們創新地提出了一種基於文本糾錯的預訓練語言模型MacBERT,應用糾錯型掩碼語言模型(MLM as correction,Mac)解決了預訓練模型中「預訓練-精調」不一致的問題。為了驗證實驗效果,我們選擇了8個經典的中文自然語言處理任務,包括閱讀理解、單句文本分類、句對文本分類等。大量實驗結果表明所提出的MacBERT能夠在大多數任務上取得顯著性能提升。
  • 《預訓練周刊》第14期:World-GAN:Minecraft 世界的生成模型、CMU博士論文探究可控文本生成
    論文地址:https://arxiv.org/pdf/2010.12148 標題:百度|ERNIE-DOC: A Retrospective Long-Document Modeling Transformer(長文本理解模型 ERNIE-Doc)
  • 自然語言處理中的深度遷移學習——文本預訓練
    有了計算機視覺,我們就有了優秀的大型數據集,比如ImageNet,在它之上我們可以獲得一套世界級的、最先進的預訓練模型來利用遷移學習。但是自然語言處理呢?考慮到文本數據是如此的多樣化、充斥著噪音以及非結構化的特點,這是一個嚴峻的挑戰。我們最近在文本嵌入方面取得了一些成功,包括Word2vec、GloVe 和 FastText 等方法,我在關於「文本數據的特徵工程」[1]的文章中介紹了所有這些方法。
  • transformer預訓練模型
    體系架構 名稱模型的細節 BERTbert-base-uncased12個層,768個隱藏節點,12個heads,110M參數量。在小寫英語文本上訓練。bert-large-uncased24個層,1024個隱藏節點,16個heads,340M參數量。在小寫英語文本上訓練。bert-base-cased12個層,768個隱藏節點,12個heads,110M參數量。
  • T5 PEGASUS:開源一個中文生成式預訓練模型
    但直接替換原始版本的中文 BERT 的 Tokenizer 是不夠的,一來是我們之前的工作《提速不掉點:基於詞顆粒度的中文 WoBERT》[3] 已經表明以詞為單位來做生成模型能獲得更好的效果。二來哪怕只看字中文 BERT 的 vocab.txt 也是很不完善的,漏了一些常見的標點符號(如雙引號)和中文字(比如「琊」等)。
  • 中文ELECTRA預訓練模型再升級
    在今年3月,哈工大訊飛聯合實驗室推出了中文ELECTRA預訓練模型,並將相關資源進行開源,目前在GitHub上已獲得580個star。本次更新中,我們將預訓練語料從原有的約20G提升至180G,利用接近9倍大小的數據集。
  • [預訓練語言模型專題] BERT,開啟NLP新時代的王者
    前期回顧:[萌芽時代]、[風起雲湧]、[文本分類通用技巧] 、[GPT家族]感謝清華大學自然語言處理實驗室對預訓練語言模型架構的梳理,我們將沿此脈絡前行,探索預訓練語言模型的前沿技術,紅色框為前期腳印,綠色框為本期介紹,歡迎大家留言討論交流。
  • 預訓練語言模型fine-tuning近期進展概述
    ©作者|AI Box來源|RUC AI Box