BERT 訓練時將部分單詞 mask 起來,使模型能夠利用句子雙向的信息,在很多 NLU 任務(wù)上取得很好的效果。但是 BERT 忽略了 mask 單詞之間的關(guān)系,且微調(diào)過程與預(yù)訓練過程不一致 (微調(diào)時沒有 mask 的單詞)。XLNet 采用了 PLM (Permutation Language Model) ,將句子隨機排列,然后用自回歸的方法訓練,從而獲得雙向信息并且可以學習 token 之間的依賴關(guān)系。另外 XLNet 使用了 Transformer-XL,使用了更廣闊的上下文信息。
1.前言
XLNet 論文中首先提出了一種比較有意思的觀點,將當前預(yù)訓練模型分為了兩類 AR (Auto Regression,自回歸) 和 AE (Auto Encoder,自編碼器)。
GPT 就是一種 AR 方法,不斷地使用當前得到的信息預(yù)測下一個輸出 (自回歸)。而 BERT 是一種 AE 方法,將輸入句子的某些單詞 mask 掉,然后再通過 BERT 還原數(shù)據(jù),這一過程類似去噪自編碼器 (Denoising AutoEncoder,DAE)。不熟悉 GPT 和 BERT 的童鞋可以參考前面的文章,《OpenAI GPT 和 GPT2 模型詳解》和《徹底理解 Google BERT 模型》。
AR 的方法可以更好地學習 token 之間的依賴關(guān)系,而 AE 的方法可以更好地利用深層的雙向信息。因此 XLNet 希望將 AR 和 AE 兩種方法的優(yōu)點結(jié)合起來,XLNet 使用了 Permutation Language Model (PLM) 實現(xiàn)這一目的。
Permutation 指排列組合的意思,XLNet 將句子中的 token 隨機排列,然后采用 AR 的方式預(yù)測末尾的幾個 token。這樣一來,在預(yù)測 token 的時候就可以同時利用該 token 雙向的信息,并且能學到 token 間的依賴,如下圖所示。

接下來介紹 XLNet 中的實現(xiàn)細節(jié),其中 XLNet 為了實現(xiàn) PLM,提出了 Two-Stream Self-Attention 和 Partial Prediction。另外 XLNet 還使用了 Transformer-XL 中的 Segment Recurrence Mechanism 和 Relative Positional Encoding,不熟悉 Transformer-XL 的童鞋可以參考前面的文章,《Transformer-XL 語言模型》。
2.Permutation Language Model
PLM (Permutation Language Model) 是 XLNet 的核心思想,首先將句子的 token 隨機排列,然后采用 AR 的方式預(yù)測句子末尾的單詞,這樣 XLNet 即可同時擁有 AE 和 AR 的優(yōu)勢。
2.1 PLM 介紹
XLNet 中通過 Attention Mask 實現(xiàn) PLM,而無需真正修改句子 token 的順序。例如原來的句子是 [1,2,3,4],如果隨機生成的序列時 [3,2,4,1],則輸入到 XLNet 的句子仍然是 [1,2,3,4],但是掩碼需要修改成下圖。

圖中的掩碼矩陣,紅色表示不遮掩,白色表示遮掩。第 1 行表示 token 1 的掩碼,可以看到,1 是句子的最后一個 token,因此可以看到之前的所有 token (3,2,4)。3 是句子的第一個 token,看不到句子的任何信息,因此第 3 行都是白色的 (表示遮掩)。
2.2 Two-Stream Self-Attention
Two-Stream 概念
XLNet 打亂了句子的順序,這時在預(yù)測的時候 token 的位置信息會非常重要,同時在預(yù)測的時候也必須將 token 的內(nèi)容信息遮掩起來 (否則輸入包含了要預(yù)測的內(nèi)容信息,模型就無法學到知識)。也就是說 XLNet 需要看到 token 的位置信息,但是又不能看到 token 的內(nèi)容信息,因此 XLNet 采用了兩個 Stream 實現(xiàn)這一目的:
- Query Stream,對于每一個 token,其對應(yīng)的 Query Stream 只包含了該 token 的位置信息,注意是 token 在原始句子的位置信息,不是重新排列的位置信息。
- Content Stream,對于每一個 token,其對應(yīng)的 Content Stream 包含了該 token 的內(nèi)容信息。
Query Stream 計算
Query Stream 用 g 表示,Content Stream 用 h 表示,使用 Query Stream 對要預(yù)測的位置進行預(yù)測的時候,Q (Query) 向量是用 g 計算得到的,包含該位置的位置信息,而 K (Key) 和 V (Value) 是用 h 計算的,包含其他 token 的內(nèi)容信息。下圖展示了如何通過當前層的 g 計算下一層 g 的過程,圖中的排列是 [3,2,4,1],計算的 token 是 1。

可以看到在計算 token 1 的 Q 向量時,只使用了 token 1 的 Query Stream g,即模型只得到 token 1 的位置信息。而向量 K,V 使用 token 3, 2, 4 進行計算,所以模型可以得到 token 3, 2, 4 的內(nèi)容信息。因為 token 1 是排列 [3,2,4,1] 的最后一位。這一個過程的掩碼矩陣和上一節(jié)的是一樣的 ,對角線上都為白色,即遮掩當前預(yù)測位置的內(nèi)容信息 h。

Content Stream 計算
Content Stream 包含了 token 的內(nèi)容信息,因為 XLNet 的層數(shù)很多,需要將 token 的內(nèi)容傳遞到下一層。這一層的 Q, K, V 都是利用 h 計算的。Content Stream 的計算如下圖所示。

可以看到,在計算下一層的 h1 時,也會利用 token 1 當前的內(nèi)容信息,這樣就可以將 token 的內(nèi)容傳遞到下一層,但是注意 XLNet 在預(yù)測時只是用 g (Query Stream)。計算 Content Stream 時候的掩碼矩陣如下圖所示。

和 Query Stream 的掩碼矩陣區(qū)別在于對角線,Content Stream 不遮掩對角線,使得當前 token 的信息可以傳遞到下一層。
Query Stream 和 Content Stream 組合
XLNet 將 Query Stream 和 Content Stream 組合在一起,如下圖所示。

圖中最下面的一層是輸入層,其中 e(x) 是單詞的詞向量,表示輸入的 Content Stream,而 w 表示輸入的位置信息,即 Query Stream。
2.3 Partial Prediction
XLNet 將句子重新排列,然后根據(jù)排列后的順序使用 AR 方式預(yù)測,但是由于句子是隨機排列的,會導(dǎo)致優(yōu)化比較困難且收斂速度慢。因此 XLNet 采用了 Partial Prediction (部分預(yù)測) 的方式進行訓練,對于排列后的句子,只預(yù)測句子末尾的 1/K 個 token。
例如 K=4,就是只預(yù)測最后 1/4 的 token。給定句子 [1,2,3,4,5,6,7,8] 和一種隨機排列 [2,8,3,4,5,1,7,6],則只預(yù)測 7 和 6。論文中訓練 XLNet-Large 時使用的 K 為 6,大約是預(yù)測末尾 14.3% 的 token。
3.XLNet 優(yōu)化技巧
3.1 Transformer-XL
XLNet 使用了 Transformer-XL 中的 Segment Recurrence Mechanism (段循環(huán)) 和 Relative Positional Encoding (相對位置編碼) 進行優(yōu)化。
Segment Recurrence Mechanism 段循環(huán)的機制會將上一段文本輸出的信息保存下來,用于當前文本的計算,使模型可以擁有更廣闊的上下文信息。
在引入上一段信息后,可能會有兩個 token 擁有相同的位置信息,例如上一段的第一個單詞和當前段的第一個單詞位置信息都是一樣的。因此 Transformer-XL 采用了 Relative Positional Encoding (相對位置編碼) ,不使用固定的位置,而是采用單詞之間的相對位置進行編碼。在之前的文章《Transformer-XL 語言模型》中有比較詳細的介紹,感興趣的童鞋可以參考一下。
XLNet 使用了 Transformer-XL 后如下圖所示。mem 表示的就是前一個 XLNet 段的內(nèi)容信息,而 XLNet 中輸入的 Query Stream 為 w,保存位置信息,采用的是 Relative Positional Encoding。

3.2 Relative Segment Encodings
XLNet 希望像 BERT 一樣采用 [A, SEP, B, SEP, CLS] 的形式處理句子任務(wù),在 BERT 中有兩個表征向量 EA 和 EB 分別表示句子 A 和 B。但是 XLNet 采用 Transformer-XL 的段循環(huán)機制后會出現(xiàn)問題,兩個段都有句子 A 和 B,則兩個句子 A 屬于不同的段,但是卻會有相同的 Segment 向量。
XLNet 提出了 Relative Segment Encodings,對于每一個 attention head 都添加 3 個可訓練的向量 s+, s-, b,然后利用以下公式計算 attention score。

其中 q 就是 Query 向量,這個計算得到的 attention score 會加到原來的 attention score 上,再計算 softmax。Relative Segment Encodings 加上了一個偏置向量 b,同時 Relative Segment Encodings 也可以用于一些超過兩段輸入句子的任務(wù)上。
4.總結(jié)
XLNet 的核心思想是 PLM,排列原來的句子,然后預(yù)測末尾的單詞。這樣可以學習到單詞之間的依賴關(guān)系,而且可以利用 token 前后向的信息。
XLNet PLM 的實現(xiàn)需要用到 Two-Stream Self-Attention,包含兩個 Stream,Query Stream 用于預(yù)測,只包含當前位置的位置信息。而 Content Stream 保存了 token 的內(nèi)容。
XLNet 還使用了 Transformer-XL 的優(yōu)化方式。
5.參考文獻
XLNet: Generalized Autoregressive Pretraining for Language Understanding