一文详解Google最新NLP模型XLNet
本文介紹 XLNet 的基本原理,讀者閱讀前需要了解 BERT 等相關模型,不熟悉的讀者建議學習 BERT 課程 [1]。
語言模型和BERT各自的優缺點
排列(Permutation)語言模型
Two-Stream Self-Attention for Target-Aware Representations
沒有目標(target)位置信息的問題
Two-Stream Self-Attention
部分預測
融入Transformer-XL的優點
Transformer-XL思想簡介
Segment基本的狀態重用
Transformer-XL的相對位置編碼
在XLNet里融入Transformer-XL的思想
建模多個segment
相對Segment編碼
XLNet與BERT的對比
XLNet與語言模型的對比
實驗
Pretraining和實現
RACE數據集
SQuAD數據集
文本分類
GLUE數據集
ClueWeb09-B
Ablation對比
實驗代碼
語言模型和BERT各自的優缺點
?
在論文里作者使用了一些術語,比如自回歸(Autoregressive, AR)語言模型和自編碼(autoencoding)模型等,這可能讓不熟悉的讀者感到困惑,因此我們先簡單的解釋一下。
自回歸是時間序列分析或者信號處理領域喜歡用的一個術語,我們這里理解成語言模型就好了:一個句子的生成過程如下:首先根據概率分布生成第一個詞,然后根據第一個詞生成第二個詞,然后根據前兩個詞生成第三個詞,……,直到生成整個句子。
而所謂的自編碼器是一種無監督學習輸入的特征的方法:我們用一個神經網絡把輸入(輸入通常還會增加一些噪聲)變成一個低維的特征,這就是編碼部分,然后再用一個 Decoder 嘗試把特征恢復成原始的信號。我們可以把 BERT 看成一種 AutoEncoder,它通過 Mask 改變了部分 Token,然后試圖通過其上下文的其它 Token 來恢復這些被 Mask 的 Token。如果讀者不太理解或者喜歡這兩個 jargon,忽略就行了。?
給定文本序列,語言模型的目標是調整參數使得訓練數據上的似然函數最大:
記號 ?<? 表示 t 時刻之前的所有 x,也就是 ?1:??1。??(?1:??1) 是 RNN 或者 Transformer(注:Transformer 也可以用于語言模型,比如在 OpenAI GPT)編碼的 t 時刻之前的隱狀態。?(?) 是詞 x 的 embedding。?
而 BERT 是去噪(denoising)自編碼的方法。對于序列 ?,BERT 會隨機挑選 15% 的 Token 變成 [MASK] 得到帶噪聲版本的。假設被 Mask 的原始值為,那么 BERT 希望盡量根據上下文恢復(猜測)出原始值了,也就是:
上式中 ??=1 表示 t 時刻是一個 Mask,需要恢復。?? 是一個 Transformer,它把長度為 ? 的序列 ? 映射為隱狀態的序列。
注意:前面的語言模型的 RNN 在 t 時刻只能看到之前的時刻,因此記號是 ??(?1:??1);而 BERT 的 Transformer(不同與用于語言模型的 Transformer)可以同時看到整個句子的所有 Token,因此記號是 ??(?)。
這兩個模型的優缺點分別為:
獨立假設:注意等式 (2) 的約等號 ≈,它的意思是假設在給定的條件下被 Mask 的詞是獨立的(沒有關系的),這個顯然并不成立,比如”New York is a city”,假設我們 Mask 住”New”和”York”兩個詞,那么給定”is a city”的條件下”New”和”York”并不獨立,因為”New York”是一個實體,看到”New”則后面出現”York”的概率要比看到”Old”后面出現”York”概率要大得多。而公式 (1) 沒有這樣的獨立性假設,它是嚴格的等號。?
輸入噪聲:BERT 的在預訓練時會出現特殊的 [MASK],但是它在下游的 fine-tuning 中不會出現,這就是出現了不匹配。而語言模型不會有這個問題。?
雙向上下文:語言模型只能參考一個方向的上下文,而 BERT 可以參考雙向整個句子的上下文,因此這一點 BERT 更好一些。關于為什么 RNN 只能是單向的上下文而 BERT 可以參考整個句子的上線,讀者可以參考 ELMo 和 OpenAI GPT 的問題 [2]。
排列(Permutation)語言模型
根據上面的討論,語言模型和 BERT 各有優缺點,有什么辦法能構建一個模型使得同時有它們的優點并且沒有它們缺點呢?
借鑒 NADE(不了解的讀者可以忽略,這是一種生成模型)的思路,XLNet 使用了排列語言模型,它同時有它們的優點。
給定長度為 T 的序列 ?,總共有 ?! 種排列方法,也就對應 ?! 種鏈式分解方法。比如假設 ?=?1?2?3,那么總共用 3!=6 種分解方法:
注意 ?(?2|?1?3) 指的是第一個詞是 ?1 并且第三個詞是 ?3 的條件下第二個詞是 ?2 的概率,也就是說原來詞的順序是保持的。如果理解為第一個詞是 ?1 并且第二個詞是 ?3 的條件下第三個詞是 ?2,那么就不對了。
如果我們的語言模型遍歷 ?! 種分解方法,并且這個模型的參數是共享的,那么這個模型應該就能(必須)學習到各種上下文。普通的從左到右或者從右往左的語言模型只能學習一種方向的依賴關系,比如先”猜”一個詞,然后根據第一個詞”猜”第二個詞,根據前兩個詞”猜”第三個詞,……。
而排列語言模型會學習各種順序的猜測方法,比如上面的最后一個式子對應的順序 3→1→2,它是先”猜”第三個詞,然后根據第三個詞猜測第一個詞,最后根據第一個和第三個詞猜測第二個詞。
因此我們可以遍歷 ?! 種路徑,然后學習語言模型的參數,但是這個計算量非常大(10!=3628800,10 個詞的句子就有這么多種組合)。因此實際我們只能隨機的采樣?!里的部分排列,為了用數學語言描述,我們引入幾個記號。表示長度為 T 的序列的所有排列組成的集合,則是一種排列方法。我們用 ?? 表示排列的第 t 個元素,而 ?<? 表示 z 的第 1 到第 t-1 個元素。
舉個例子,假設 T=3,那么共有 6 個元素,我們假設其中之一 ?=[1,3,2],則 ?3=2,而 ?<3=[1,3]。
有了上面的記號,則排列語言模型的目標是調整模型參數使得下面的似然概率最大:
上面的公式看起來有點復雜,細讀起來其實很簡單:從所有的排列中采樣一種,然后根據這個排列來分解聯合概率成條件概率的乘積,然后加起來。?
注意:上面的模型只會遍歷概率的分解順序,并不會改變原始詞的順序。實現是通過 Attention 的 Mask 來對應不同的分解方法。比如 ?(?1|?3)?(?2|?1?3)?(?3),我們可以在用 Transformer 編碼 ?1 時候讓它可以 Attend to ?3,而把 ?2Mask 掉;編碼 ?3 的時候把 ?1,?2 都 Mask 掉。
▲?圖.?排列語言模型在預測?3時不同排列的情況
比如圖的左上,對應的分解方式是 3→2→4→1,因此預測 ?3 是不能 attend to 任何其它詞,只能根據之前的隱狀態 ??? 來預測。而對于左下,?3 可以 attend to 其它 3 個詞。
Two-Stream Self-Attention for Target-Aware Representations
沒有目標(target)位置信息的問題?
上面的思想很簡單,但是如果我們使用標準的 Transformer 來實現時會有問題。我們來看一個例子。假設輸入的句子是”I like New York”,并且一種排列為 z=[1, 3, 4, 2],假設我們需要預測 ?3=4,那么根據公式:
注意,我們通常用大寫的 X 表示隨機變量,比如 ?4,而小寫的 x 表示某一個具體取值,比如 x,我們假設 x 是”York”,則 ??(?4=?) 表示第 4 個詞是 York 的概率。用自然語言描述:上面的概率是第一個詞是 I,第 3 個詞是 New 的條件下第 4 個詞是 York 的概率。
另外我們再假設一種排列為 z’=[1,3,2,4],我們需要預測 ?3=2,那么:
則上面是表示是第一個詞是 I,第 3 個詞是 New 的條件下第 2 個詞是 York 的概率。我們仔細對比一下公式會發現這兩個概率是相等的。但是根據經驗,顯然這兩個概率是不同的,而且上面的那個概率大一些,因為 York 跟在 New 之后是一個城市,而”York New”是什么呢??
上面的問題的關鍵是模型并不知道要預測的那個詞在原始序列中的位置。了解 Transformer 的讀者可能會問:輸入的位置編碼在哪里呢?位置編碼的信息不能起作用嗎?
注意:位置編碼是和輸入的 Embedding 加到一起作為輸入的,因此 ??(?4=?|?1?3) 里的 ?1 和 ?3 是帶了位置信息的,模型(可能)知道(根據輸入的向量猜測)I 是第一個詞,而 New 是第三個詞,但是第四個詞的向量顯然這個是還不知道(知道了還要就不用預測了),因此就不可能知道它要預測的詞到底是哪個位置的詞,因此我們必須”顯式”的告訴模型我要預測哪個位置的詞。?
為了后面的描述,我們再把上面的兩個公式寫出更加一般的形式。給定排列 z,我們需要計算,如果我們使用普通的 Transformer,那么計算公式為:
根據前面的討論,我們知道問題的關鍵是模型并不知道要預測的到底是哪個位置的詞,為了解決這個問題,我們把預測的位置 ?? 放到模型里:
上式中表示這是一個新的模型 g,并且它的參數除了之前的詞,還有要預測的詞的位置 ??。
Two-Stream Self-Attention
接下來的問題是用什么模型來表示。當然有很多種可選的函數(模型),我們這里通過位置 ?? 來從 context ??<? 里通過 Attention 機制提取需要的信息來預測這個位置的詞。那么它需要滿足如下兩點要求:?
1. 為了預測,只能使用位置信息 ?? 而不能使用。這是顯然的:你預測一個詞當然不能知道要預測的是什么詞。?
2. 為了預測 ?? 之后的詞,必須編碼了的信息(語義)。?
但是上面兩點要求對于普通的 Transformer 來說是矛盾的無法滿足的。因為上面是理解為什么要搞出兩個 Stream 的關鍵,所以我這里再啰嗦一點舉一個例子。?
假設輸入的句子還是”I like New York”,并且一種排列為 z=[1, 3, 4, 2],假設 t=2,我們現在是在計算,也就是給定第一個位置的詞為 I 預測第三個位置為 New 的概率,顯然我們不能使用 New 本身的而只能根據第一個位置的 I 來預測。
假設我們非常幸運的找到了一很好的函數 g,它可以能夠比較好的預測這個概率 ??(?1,?2)。現在我們又需要計算 t=3,也就是根據 ??(?1,?2) 和 ?? 來預測 York,顯然知道第三個位置是 New 對于預測第四個位置是 York 會非常有幫助,但是 ??(?1,?2) 并沒有 New 這個詞的信息。
讀者可能會問:你不是說 g 可以比較好的根據第一個詞 I 預測第三個詞 New 的概率嗎?這里有兩點:I 后面出現 New 的概率并不高;在預測 York 時我們是知道第三個位置是 New 的,只不過模型的限制我們沒有重復利用這信息。?
為了解決這個問題,論文引入了兩個 Stream,也就是兩個隱狀態:
1. 內容隱狀態,簡寫為,它就會標準的 Transformer 一樣,既編碼上下文(context)也編碼的內容。?
2. 查詢隱狀態,簡寫為,它只編碼上下文和要預測的位置 ??,但是不包含。?
下面我們介紹一下計算過程。我們首先把查詢隱狀態初始化為一個變量 w,把內容隱狀態初始化為詞的 Embedding ?(??)。這里的上標 0 表示第 0 層(不存在的層,用于計算第一層)。因為內容隱狀態可以編碼當前詞,因此初始化為詞的 Embedding 是比較合適的。?
接著從 m=1 一直到第 M 層,我們逐層計算:
上面兩個流分別使用自己的 Query 向量和;但是 Key 和 Value 向量都是用的 h,因為 h 是內容。但是注意 Query 流不能訪問 ?? 的內容,因此 KV 是,這里用的是小于號 (<) 表示不包括 t 時刻的 content。而 Content 流的 KV 是,它包含。
上面的梯度更新和標準的 self-attention 是一樣的。在 fine-tuning 的時候,我們可以丟棄掉 Query 流而只用 Content 流。最后在計算公式的時候我們可以用最上面一層的 Query 向量。
下面我們通過下圖來直觀的了解計算過程。
▲?圖.?Two Stream排列模型的計算過程
圖的左上是 Content 流 Attention 的計算,假設排列為 3→2→4→1,并且我們現在預測第 1 個位置的詞的概率。根據排列,我們可以參考所有 4 個詞的信息,因此,而。?
左下是Query流的計算,因為不能參考自己的內容,因此,而。?
而圖的右邊是完整的計算過程,我們從下往上看,首先 h 和 g 分別被初始化為 ?(??) 和 W,然后 Content Mask 和 Query Mask 計算第一層的輸出?(1)和?(1),然后計算第二層……。注意最右邊的 Content Mask 和 Query Mask,我們先看 Content Mask。它的第一行全是紅點,表示第一個詞可以 attend to 所有的詞(根據 3→2→4→1),第二個詞可以 attend to 它自己和第三個詞,……。而 Query Mask 和 Content Mask 的區別就是不能 attend to 自己,因此對角線都是白點。
部分預測
雖然排列語言模型有很多有點,但是它的計算量很大(排列很多),很難優化。因此我們只預測一個句子后面的一些詞,為什么不預測前面的詞呢?因為前面的詞的上下文比較少,上下文信息相對較少。比如句子”I like New York”。預測 I 的時候沒有任何上下文,因此可能的選擇很多。而到最后一個詞 York 的時候,如果 New 已經知道了,那么 York 的概率就非常大了。?
因此我們把一個排列 ? 分成兩個子序列 ?≤? 和 ?>?,分別叫做 non-target 序列和 target 序列,其中 c 是切分點。我們會使用一個超參數 K,表示 1/K 的 Token 會被預測,因此根據公式:
可以計算出,約等于的原因是因為 K 是整數。前面 c 個不用預測的 Token,我們不需要計算其 Query 流,從而可以節省計算時間。
融入Transformer-XL的優點
到此為止,XLNet 的核心思想已經比較清楚了:還是使用語言模型,但是為了解決雙向上下文的問題,引入了排列語言模型。排列語言模型在預測時需要 target 的位置信息,因此通過引入 Two-Stream,Content 流編碼到當前時刻的所有內容,而 Query 流只能參考之前的歷史以及當前要預測的位置。最后為了解決計算量過大的問題,對于一個句子,我們只預測后面的 1/K 的詞。?
接下來 XLNet 借鑒了 Transformer-XL 的優點,它對于很長的上下文的處理是要由于傳統的 Transformer 的。我們這里只是簡單的介紹 Transformer-XL,有興趣的讀者可以參考 Transformer-XL 論文 [3]。?
Transformer-XL思想簡介?
首先 Transformer-XL 是一個語言模型,也就是改進 Transformer 來根據歷史的詞預測下一個詞。它不同于 BERT 的 Mask 語言模型問題,也不同于 XLNet 使用的排列語言模型。我們知道 OpenAI GPT 就是使用 Transformer 來進行語言模型的建模。因為 Transformer 要求輸入是定長的詞序列(不像 RNN 可以處理變成的輸入序列),太長的截斷,不足的 padding,這樣我們把一個語料庫的字符串序列切分成固定長度的 segments。它有下面一些問題:?
由于定長的要求,我們不可能讓輸入太長。因此雖然 Self-Attention 機制雖然不太受長度的約束,但是 Transformer 的語言模型實際能夠考慮的上下文就是輸入的長度。?
因為我們在序列語言模型的時候通常很難準確的分句(或者有時候一個句子比最大長度還長),所以一個 Segment 很可能不是一個完整的句子(甚至它是從某個句子的中間部分開始的),這樣前面的幾個詞就很難預測(給人一個沒頭沒腦的句子也很難預測),因為語言模型是自回歸的,一步錯步步錯。這就是所謂的 context fragmentation 的問題。?
預測的性能問題,假設我們要使用 Transformer 語言模型來計算一個句子的概率(而不是用于下游的任務),那么我們首先要計算 ?(?1),然后計算 ?(?2|?1),……,一直計算到 ?(??|?1,…,???1)。每個時刻都需要用 Transformer 計算一次,而不能像 RNN 那樣之前的把歷史都編碼到一個 context 向量里。
▲?圖.?普通的Transformer語言模型的訓練和預測
上圖做是普通的 Transformer 語言模型的訓練過程。假設 Segment 的長度為 4,如圖中我標示的:根據紅色的路徑,雖然 ?8 的最上層是受 ?1 影響的,但是由于固定的 segment,?8 無法利用 ?1 的信息。
而預測的時候的上下文也是固定的 4,比如預測 ?6 時我們需要根據 [?2,?3,?4,?5] 來計算,接著把預測的結果作為下一個時刻的輸入。接著預測 ?7 的時候需要根據 [?3,?4,?5,?6] 完全進行重新的計算。之前的計算結果一點也用不上。
而 Transformer-XL 如下圖所示:
▲?圖.?Transformer-XL的訓練和預測
我們會把之前一個固定長度的詞序列每一層的輸出都放到一個 cache 里,比如把 ?1,…,?4 的計算結果都存起來,那么在訓練第二個 Segment[?5,…,?8] 的時候就可以讓 Self-Attention 機制參考 [?1,…,?4] 的信息了。當然在反向計算梯度的時候,cache 里的內容是不會參與梯度的計算的。
而在預測的時候,比如右圖我們在計算 ?12 作為輸入的時候,之前那些 [?11,?10,…] 都不需要重新計算。而普通的 Transformer 是需要的,為什么呢?
我們仔細看一下上圖,在 t=12 的時候,?11 可以 attend to [?11,…,?9](而 ?8 被截掉了),而在 t=11 的時候可以 attend to [?11,…,?8],因此這兩個計算結果是不同的,需要重新計算。
Segment基本的狀態重用?
根據之前的思路,我們用 cache 緩存部分歷史的狀態。雖然計算梯度的時候只使用本 segment 的信息,但是在 forward 的時候其實是用到了之前的 segment(甚至很久以前的 segment,只有 cache 的空間足夠大)的信息,因此它又有點類似于 RNN。
下面我們形式化的用數學語言來描述狀態重用的過程。假設兩個相鄰的 segment 為和。
假設 segment????的第 n 層的隱狀態序列為,那么計算 segment ??+1的隱狀態的過程如下:
上式中函數代表不參與梯度的計算。我們看到,計算 Query 的時候只是用本 segment 的信息,而計算 Key 和 Value 的時候同時使用了和(實際用的是)。
Transformer-XL的相對位置編碼?
Transformer-XL 不能像 BERT 那樣使用絕對位置編碼,下面我們來分析一些為什么不行。?
和前面一樣,假設兩個相鄰的segment為和。
假設 segment ?? 的第 n 層的隱狀態序列為,那么計算公式如下:
上式中 ??? 是 segment 的每一個詞的 Embedding 的序列。我們發現 ??? 和 ???+1 都是加了 ?1:?,因此模型無法通過向量判斷它到底是當前 segment 的第 i 個位置還是前一個 Segment 的第 i 個位置。
注:不熟悉位置編碼的讀者需要參考 Transformer 圖解 [4]。它的基本思想就是給每一個絕對位置一個Embedding,因此模型可以通過這個 Embedding 猜測它在編碼哪個位置的信息,也可以學到某個位置用什么向量來表示更好。
因此 Transformer-XL 必須使用相對位置編碼,它使用了和原始的 Transformer 使用正弦函數不同的方法。原始的 Transformer 是把位置信息 embedding 進去直接加到輸入里,而 Transformer-XL 是在 Attention 計算的時候利用當前 Query 和 Key 的相對位置。因為 XLNet 使用的是正弦函數的位置編碼,所以這里就不介紹 Transformer-XL 的位置編碼方法了,感興趣的讀者可以參考 Transformer-XL 論文 [3]。
在XLNet里融入Transformer-XL的思想?
首先 XLNet 借鑒了 Transoformer-XL 的相對位置編碼的思想,這個和它基本一樣,因此這里不再介紹。另外一點就是 cache 前一個 segment 的隱狀態。
我們假設有兩個從原始序列 ? 里抽取的兩個連續 Segment,和 ?=??+1:2?。同時假設??和 ? 分別是 [1,…,T] 和 [T+1,…,2T] 的一個排列。然后根據排列 ?? 的概率分解我們首先計算第一個 segment,并且把 Content 流的隱狀態?cache 下來,這里是第 m 層的 Content 流的隱狀態。那么計算第二個 Segment 的 Content 流的方法如下:
上式用自然語言描述就是:為了計算 ?? 第 m 層的隱狀態,我們使用 Attention 機制,其中 Query 是上一次的隱狀態,而 Key 和 Value 除了 ?1,…,?? 第 m-1 層的隱狀態,也需要 attend to cached 上一個 segment 的所有第 m-1 層的隱狀態。?
在計算第二個 segment 時,我們只需要知道隱狀態就可以了,而并不需要知道它是通過哪個排列 ?? 計算出來的。這樣我們在 cache 前一個 segment 時不用考慮它的排列。
建模多個segment
許多下游的任務會有多余一個輸入序列,比如問答的輸入是問題和包含答案的段落。下面我們討論怎么在自回歸框架下怎么預訓練兩個 segment。和 BERT 一樣,我們選擇兩個句子,它們有 50% 的概率是連續的句子(前后語義相關),有 50% 的概率是不連續(無關)的句子。
我們把這兩個句子拼接后當成一個句子來學習排列語言模型。輸入和 BERT 是類似的:[A, SEP, B, SEP, CLS],這里 SEP 和 CLS 是特殊的兩個 Token,而 A 和 B 代表兩個 Segment。而 BERT 稍微不同,這里把 CLS 放到了最后。
原因是因為對于 BERT 來說,Self-Attention 唯一能夠感知位置是因為我們把位置信息編碼到輸入向量了,Self-Attention 的計算本身不考慮位置信息。而前面我們討論過,為了減少計算量,這里的排列語言模型通常只預測最后 1/K 個 Token。我們希望 CLS 編碼所有兩個 Segment 的語義,因此希望它是被預測的對象,因此放到最后肯定是會被預測的。?
但是和 BERT 不同,我們并沒有增加一個預測下一個句子的 Task,原因是通過實驗分析這個 Task 加進去后并不是總有幫助。
注:其實很多做法都是某些作者的經驗,后面很多作者一看某個模型好,那么所有的 Follow,其實也不見得就一定好。有的時候可能只是對某個數據集有效果,或者效果好是其它因素帶來的,一篇文章修改了 5 個因素,其實可能只是某一兩個因素是真正帶來提高的地方,其它 3 個因素可能并不有用甚至還是有少量副作用。
相對Segment編碼?
BERT 使用的是絕對的 Segment 編碼,也就是第一個句子對于的 Segment id 是 0,而第二個句子是 1。這樣如果把兩個句子換一下順序,那么輸出是不一樣的。
XLNet 使用的是相對的 Segment 編碼,它是在計算 Attention 的時候判斷兩個詞是否屬于同一個 Segment,如果位置 i 和 j 的詞屬于同一個 segment,那么使用一個可以學習的 Embedding ???=?+,否則 ???=??。也就是說,我們只關心它們是屬于同一個 Segment 還是屬于不同的 Segment 的。
當我們從位置 i attend to j 的時候,我們會這樣計算一個新的 attention score:。這里的 ?? 是第 i 位置的 Query 向量,b 是一個可以學習的 bias。最后我們會把這個 attention score 加到原來計算的 Attention score 里,這樣它就能學到當 i 和 j 都屬于某個 segment 的特征和i和就屬于不同 segment 的特征。
XLNet與BERT的對比
XLNet 和 BERT 都是預測一個句子的部分詞,但是背后的原因是不同的。BERT 使用的是 Mask 語言模型,因此只能預測部分詞(總不能把所有詞都 Mask 了然后預測?)。而 XLNet 預測部分詞是出于性能考慮,而 BERT 是隨機的選擇一些詞來預測。?
除此之外,它們最大的區別其實就是 BERT 是約等號,也就是條件獨立的假設——那些被 MASK 的詞在給定非 MASK 的詞的條件下是獨立的。但是我們前面分析過,這個假設并不(總是)成立。下面我們通過一個例子來說明(其實前面已經說過了,理解的讀者跳過本節即可)。?
假設輸入是 [New, York, is, a, city],并且假設恰巧 XLNet 和 BERT 都選擇使用 [is, a, city] 來預測 New 和 York。同時我們假設 XLNet 的排列順序為 [is, a, city, New, York]。那么它們優化的目標函數分別為:
從上面可以發現,XLNet 可以在預測 York 的使用利用 New 的信息,因此它能學到”New York”經常出現在一起而且它們出現在一起的語義和單獨出現是完全不同的。
XLNet與語言模型的對比
和語言模型相比,XLNet 最大的優勢就是通過輸入序列的各種排列,同時學習到上下文的信息。
實驗
Pretraining和實現?
和 BERT 一樣,XLNet 使用了 BooksCorpus 和英文的維基百科作為訓練數據,這兩者總共 13GB 的文本。此外,XLNet 還增加了 Giga5(16GB)、ClueWeb 2012-B 和 Common Crawl 的數據來進行 Pretraining。
對于 ClueWeb 2012-B 和 Common Crawl 的內容使用了啟發式的規則進行了預處理,最終各自保留了 19GB 和 78GB 的文本。使用 SentencePiece 工具 [5] 后分別得到 2.78B, 1.09B, 4.75B, 4.30B 和 19.97B Token (subword unit),總計 32.89B。?
最大的模型 XLNet-Large 采樣了和 BERT-large 一樣的超參數,從而得到類似大小的模型。序列長度和 cache 分別設置為 512 和 384。訓練 XLNet-Large 是在 512 核心(不是 512 個)的 TPU v3 芯片上進行,使用 Adam 優化器迭代了 500K 次。使用了線性的 Learning rate decay,batch 大小是 2048,最終訓練了 2.5 天。
我們發現模型仍然是欠擬合(underfitting)的,如果繼續訓練的話在訓練數據上的 loss 還能下降。但是對于下游的任務并沒有太大幫助。因此我們判斷是因為數據太大了,默認沒有能力完全擬合數據。為了與 BERT 對比,我們也訓練了 XLNet-Base 模型,它只使用了 BooksCorpus 和維基百科的數據。?
因為引入了遞歸(recurrence)的機制,我們使用雙向的輸入 pipeline,也就是把一個 batch 的一半樣本正常順序輸入而另一半反向輸入。對于 XLNet-Large,我們設置 K 為 6,也就是預測 1/6 的 Token。Fine-tuning 過程基本是 follow BERT。
此外我們采樣了 span-based 預測,也就是我們首先采樣一個長度 L,?∈[1,…,5],也就是最少一個 Token (1-gram),最多連續 5 個 Token (5-gram)。然后使用長度為 KL 的上下文來預測這個 n-gram。后面的代碼分析我們會看到這一點。
RACE數據集
RACE 數據集 [6],它包含大概 100K 個問題。它是中國 12 歲到 18 歲的學生在初中和高中的英語閱讀理解問題。下圖是其中一個樣例,我們在中學經常做的閱讀理解題。
▲?圖.?RACE閱讀理解題示例
下圖是實驗結果,我們可以看到 XLNet 比最好的 BERT 模型要提升很多。
▲?圖.?RACE數據集的結果對比
SQuAD數據集
SQuAD [7] 是一個大規模的閱讀理解任務的數據集。和前面的選擇題不同,SQuAD 可以看成問答題,也就是需要從閱讀的文章找答案。如下圖所示:
▲?圖.?SQuAD數據示例
SQuAD1.1 假設答案是原文的一個連續的一個或者多個詞,并且答案是一定存在的。而 SQuAD2.0 可能會問沒有答案的問題。因此為了 fine-tuning SQuAD2.0,我們使用了 Multi-Task Learning:其中一個損失函數是一個二分類的 logistic regression 損失函數,它判斷有沒有答案;而另一個就是標準的 span 抽取的損失函數(感興趣的讀者可以參考 BERT 的論文)。
因為 v1.1 的問題是包含在 v2.0 里的,因此在打榜的時候我們直接使用 v2.0 的模型去做 v1.1 的題目,只是把判斷有沒有答案的部分去掉(因為 v1.1 肯定有答案)。另外因為很多參賽者會使用額外的數據,我們也增加了 NewsQA 的數據作為訓練數據。如下表所示,我們的單一的模型(很多好成績都是好的模型的 Ensembling)取得了 SOTA 的成績。
▲?圖.?SQuAD數據集結果對比
文本分類
我們在 IMDB,Yelp-2,Yelp-5,DBpedia,AG,Amazon-2 和 Amazon-5 等文本分類數據集上做了對比實驗,結果如下:?
▲?圖.?常見文本分類數據集結果對比
GLUE數據集
GLUE 數據集上的實驗如下:
▲?圖.?GLUE數據集結果對比
ClueWeb09-B
ClueWeb09-B 是一個文檔排序的數據集。它主要用于搜索引擎:給定一個 Query,然后給相關的網頁排序。下面是實驗結果:
▲?圖.?ClueWeb09-B數據集結果對比
Ablation對比實驗
因為 XLNet 引入了很多改進點,包括實驗排列語言模型,使用 Transformer-XL 里的改進,而且還使用了不同的 Pretraining 數據,為了發現哪些改進是有效的,下面做了 Ablation 實驗,對比的主要是 BERT-base 和 XLNet-base,因為它們的訓練數據都是 BooksCorpus 和 Wiki。
▲?圖.?Ablation對比實驗
從上面的對比實驗發現:加上預測下一個句子這個 Multi-Task 任務在 XLNet 里并無作用。而去掉 memory、span-based 的預測和雙向的數據時效果都是有所下降的,因此它們都是有用的。
相關鏈接
[1] https://fancyerii.github.io/2019/03/05/bert-prerequisites/
[2] https://fancyerii.github.io/2019/03/09/bert-theory/#elmo和openai-gpt的問題
[3] https://arxiv.org/abs/1901.02860
[4]?https://fancyerii.github.io/2019/03/09/transformer-illustrated/#位置編碼positional-encoding?
[5]?https://github.com/google/sentencepiece
[6]?https://www.cs.cmu.edu/~glai1/data/race/
[7]?https://rajpurkar.github.io/SQuAD-explorer/
點擊以下標題查看更多往期內容:?
基于DGCNN和概率圖的輕量級信息抽取模型
圖神經網絡綜述:模型與應用
自然語言處理中的語言模型預訓練方法
一大批中文(BERT等)預訓練模型等你認領!
ACL 2019 | 基于上下文感知的向量優化
NAACL 2019最佳論文:量子概率驅動的神經網絡
基于小樣本學習的意圖識別冷啟動
#投 稿 通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢??答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
??來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
??投稿郵箱:
??投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
?
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點擊 |?閱讀原文?| 獲取最新論文推薦
總結
以上是生活随笔為你收集整理的一文详解Google最新NLP模型XLNet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞桨PaddlePaddle送算力 |
- 下一篇: 第三届“达观杯”文本智能算法大赛参赛指南