天天看點

預訓練模型(3)---- XLNet

預訓練模型(3)

    • 為什麼提出XLNet?
      • AR模型
      • AE模型
    • XLNet 是如何工作的?
    • 基于目标感覺表征的雙流自注意力
    • 部分預測
    • 內建Transformer-XL
    • 預訓練
    • XLNet深度剖析
    • 參考文獻

論文連結:

XLNet: Generalized Autoregressive Pretraining for Language Understanding

代碼連結:

tensorflow版

為什麼提出XLNet?

首先我們要了解什麼是AR(autoregressive)、AE(autoencoding)模型。

AR模型

AR模型就是自回歸模型,AR語言模型是一種使用上下文詞來預測下一個詞的模型。但是在這裡,上下文單詞被限制在兩個方向,前向或後向。

預訓練模型(3)---- XLNet
預訓練模型(3)---- XLNet

GPT 和 GPT-2 都 AR 語言模型。

AR 語言模型的優勢是擅長生成式自然語言處理任務。 因為在生成上下文時,通常是前向的。AR 語言模型很自然地适用于此類 NLP 任務。

但AR語言模型有一些缺點,它隻能使用前向上下文或後向上下文,這意味着它不能同時使用前向和後向上下文。

AE模型剛好可以彌補這一缺點。

AE模型

與 AR 語言模型不同,BERT 被歸類為自動編碼器(AE)語言模型。

AE 語言模型旨在從損壞的輸入重建原始資料。

預訓練模型(3)---- XLNet

損壞的輸入意味着我們在預訓練階段用 [MASK] 替換原始詞 into。目标是預測 into 得到原始句子。

AE 語言模型的優勢是,它可以從向前和向後的方向看到上下文。

但 AE 語言模型也有其缺點。它在預訓練中使用 [MASK],但這種人為的符号在調優時在真實資料中并不存在,會導緻預訓練-調優的差異。[MASK] 的另一個缺點是它假設預測(掩蔽的)詞 在給定未屏蔽的 詞 的情況下彼此獨立。例如,我們有一句話“它表明住房危機已經變成銀行業危機”。我們掩蔽“銀行業”和“危機”。在這裡注意,我們知道掩蔽的“銀行業”和“危機”包含彼此的隐含關系。但 AE 模型試圖預測“銀行業”給予未掩蔽的 詞,并預測“危機”分别給出未掩蔽的 詞。它忽略了“銀行業”與“危機”之間的關系。換句話說,它假設預測(掩蔽)的标記彼此獨立。但是我們知道模型應該學習預測(掩蔽)詞之間的這種相關性來預測其中一個詞。

上面兩種語言模型都有各自的缺點,于是XLNet就像救世主一樣誕生了。XLNet 提出了一種讓 AR 語言模型從雙向上下文中學習的新方法,以避免 MASK 方法在 AE 語言模型中帶來的缺點。XLNet 的提出很好的解決了兩種模型中存在的問題。那麼大家肯定好奇XLNet是怎麼做到的?下面會詳細介紹。

XLNet 是如何工作的?

AR 語言模型隻能向前或向後使用上下文,那麼如何讓它從雙向上下文中學習呢?

語言模型包括兩個階段,即預訓練階段和調優階段。XLNet 專注于預訓練階段。在預訓練階段,它提出了一個名為排列語言模組化的新目标。我們可以從這個名稱知道基本思想,它使用排列。

作者提出了排列語言模型,該模型不再對傳統的AR模型的序列的值按順序進行模組化,而是最大化所有可能的序列的因式分解順序的期望對數似然,這句話可能有點不好了解,我們以一個例子來詳細說明,假如我們有一個序列[1,2,3,4],如果我們的預測目标是3,對于傳統的AR模型來說,結果是

預訓練模型(3)---- XLNet

如果采用本文的方法,先對該序列進行因式分解,最終會有24種排列方式,下圖是其中可能的四種情況,對于第一種情況因為3的左邊沒有其他的值,是以該情況無需做對應的計算,第二種情況3的左邊還包括了2與4,是以得到的結果是p(3)=p(3∣2)∗p(3∣4) ,這個時候預測3的時候就能看到上文2和下文4的資訊了。後續的情況類似,這就是XLNet的基本思路。就是通過排列組合的方式将一部分下文單詞放到上文單詞的位置,但實際形式還是一個從左到右預測的自回歸語言模型。聰明的你一定發現了,這樣處理過後不但保留了序列的上下文資訊,也避免了采用mask标記位,巧妙的改進了bert與傳統AR模型的缺點。

預訓練模型(3)---- XLNet

但是我們在Fine-tune的時候總不能也随機組合輸入的句子吧,那這和加了[mask]有啥差別呢?别急,繼續往下看。XLNet在輸入階段并沒有改變輸入順序,随機打亂輸入句子的順序這個過程是在Transformer中通過Attention mask實作的,就是随機掩蓋掉序列中的一些單詞,并将未掩蓋掉的單詞作為預測單詞的上文。拿原文中的一個圖舉例:

預訓練模型(3)---- XLNet

右圖的紅色矩陣就是Attention Mask矩陣,1->2->3->4的輸入序列在Attention Mask的作用下變成了3->2->4->1,Attention Mask也分為兩種,一種是能看見自身的Content stream,另一種是看不到自身的Query stream。對于1來說3,2,4就是1的上文,是以2、3、4是紅色;對于2來說上文就隻有3,是以3位置為紅色;對于3來說沒有上文,是以全為白色…以此類推。那這樣就實作了在輸入側不改變單詞順序,在Transformer内部實作了輸入的随機排列了。

基于目标感覺表征的雙流自注意力

為了實作 Permutation 加上 AR 預測過程,首先我們會發現,打亂順序後位置資訊非常重要,同時對每個位置來說,需要預測的是内容資訊(對應位置的詞),于是輸入就不能包含内容資訊,不然模型學不到東西,隻需要直接從輸入 copy 到輸出就好了。

于是這裡就造成了位置資訊與内容資訊的割裂,是以在 BERT 這樣的位置資訊+内容資訊輸入 Self-Attention (自注意力) 的流(Stream)之外,作者們還增加了另一個隻有位置資訊作為 Self-Attention 中 query 輸入的流。文中将前者稱為 Content Stream,而後者稱為 Query Stream。

這樣子就能利用 Query Stream 在對需要預測位置進行預測的同時,又不會洩露目前位置的内容資訊。具體操作就是用兩組隐狀态(hidden states),g 和 h,其中 g 隻有位置資訊,作為 Self-Attention 裡的 Q,h 包含内容資訊,則作為 K 和 V。

預訓練模型(3)---- XLNet

假如說,模型隻有一層的話,其實這樣隻有 Query Stream 就已經夠了。但如果将層數加上去的話,為了取得更高層的 h,于是就需要 Content Stream 了。h 同時作為 Q K V。

預訓練模型(3)---- XLNet

于是組合起來就是這樣,h和g分别被初始化為e(Xi)和W。

預訓練模型(3)---- XLNet

部分預測

因為當我們按上面提到的實作,在 Permutation 後對每個位置進行預測的話,會導緻優化過難,訓練難以收斂,于是作者們就做了和 BERT 中類似的操作。訓練時,隻對每句話部分位置進行預測。

這些預測位置如何選取呢,選目前排列的最後幾個位置。舉個例子,假如有 1234567,先随機挑一個排列,5427163,那麼假設對最後兩個位置預測,于是就需要依此對6和3進行預測。通過挑結尾的位置,在 AR 中,就能在預測時用到盡可能多的可知資訊。

這裡再談一個有意思的點,挑選最後幾個,那麼到底該挑選幾個呢,總得給個标準吧。于是作者這裡設了一個超參數 K,K 等于總長度除以需要預測的個數。拿上面的例子,總長為 7 而需要預測為 2,于是 K = 7/2.

而論文中實驗得出的最佳 K 值介于 6 和 7 (更好)之間,其實如果我們取 K 的倒數,然後轉為百分比,就會發現最佳的比值介于 14.3% 到 16.7% 之間,還記得 BERT 論文的同學肯定就會開始覺得眼熟了。因為 BERT 裡将 Token 遮掩成 “[MASK]” 的百分比就是 15%,正好介于它們之間,我想這并不隻是偶然,肯定有更深層的聯系。

還有一點需要格外指出,被預測之前的其實取不取 Permutation 都沒關系,因為本身位置資訊也都在裡面,permutation 反而有些更難了解。

內建Transformer-XL

除了上文提到的優化點,作者還将transformer-xl的兩個最重要的技術點應用了進來,即相對位置編碼與片段循環機制。這兩種技術在前面已經介紹過了,這裡就不詳細介紹了。

預訓練模型(3)---- XLNet

預訓練

預訓練階段和bert差不多,不過去除了Next Sentence Prediction,作者發現該任務對結果的提升并沒有太大的影響。輸入的值還是 [A, SEP, B, SEP, CLS]的模式,A與B代表的是兩個不同的片段。

XLNet深度剖析

這部分仍然是張俊林大神的深度剖析文章,建議大家看一下:

XLNet:運作機制及和Bert的異同比較

這兩天,XLNet貌似也引起了NLP圈的極大關注,從實驗資料看,在某些場景下,确實XLNet相對Bert有很大幅度的提升。就像我們之前說的,感覺Bert打開兩階段模式的魔法盒開關後,在這條路上,會有越來越多的同行者,而XLNet就是其中比較引人注目的一位。當然,我估計很快我們會看到更多的這個模式下的新工作。未來兩年,在兩階段新模式(預訓練+Finetuning)下,應該會有更多的好工作湧現出來。根本原因在于:這個模式的潛力還沒有被充分挖掘,貌似還有很大的提升空間。當然,這也意味着NLP在未來兩年會有各種技術或者應用的突破,現在其實是進入NLP領域非常好的時機。原因有兩個,一個是NLP正面臨一個技術棧大的改朝換代的時刻,有很多空白等着你去填補,容易出成績;另外一點,貌似Bert+Transformer有統一NLP各個應用領域的趨向,這意味着此時進入NLP領域,具備學習成本非常低的好處,和之前相比,投入産出比非常合算。這是兩個原因。當然,即使如此,想要學好NLP,持續的精力投入是必不可少的。有句老話說得好:“永恒的愛大約持續三個月”,這句話其實對于很多對NLP感興趣的同學也成立:“對NLP的永恒的熱情大約能夠持續3到5天”,希望真的有興趣的同學能堅持一下,起碼持續7到8天,湊夠一個星期……

那麼XLNet和Bert比,有什麼異同?有什麼模型方面的改進?在哪些場景下特别有效?原因又是什麼?本文通過論文思想解讀及實驗結果分析,試圖回答上述問題。

首先,XLNet引入了自回歸語言模型以及自編碼語言模型的提法,這個思維架構我覺得挺好的,可以先簡單說明下。

自回歸語言模型(Autoregressive LM)

在ELMO/BERT出來之前,大家通常講的語言模型其實是根據上文内容預測下一個可能跟随的單詞,就是常說的自左向右的語言模型任務,或者反過來也行,就是根據下文預測前面的單詞,這種類型的LM被稱為自回歸語言模型。GPT 就是典型的自回歸語言模型。ELMO盡管看上去利用了上文,也利用了下文,但是本質上仍然是自回歸LM,這個跟模型具體怎麼實作有關系。ELMO是做了兩個方向(從左到右以及從右到左兩個方向的語言模型),但是是分别有兩個方向的自回歸LM,然後把LSTM的兩個方向的隐節點狀态拼接到一起,來展現雙向語言模型這個事情的。是以其實是兩個自回歸語言模型的拼接,本質上仍然是自回歸語言模型。

自回歸語言模型有優點有缺點,缺點是隻能利用上文或者下文的資訊,不能同時利用上文和下文的資訊,當然,貌似ELMO這種雙向都做,然後拼接看上去能夠解決這個問題,因為融合模式過于簡單,是以效果其實并不是太好。它的優點,其實跟下遊NLP任務有關,比如生成類NLP任務,比如文本摘要,機器翻譯等,在實際生成内容的時候,就是從左向右的,自回歸語言模型天然比對這個過程。而Bert這種DAE模式,在生成類NLP任務中,就面臨訓練過程和應用過程不一緻的問題,導緻生成類的NLP任務到目前為止都做不太好。

自編碼語言模型(Autoencoder LM)

自回歸語言模型隻能根據上文預測下一個單詞,或者反過來,隻能根據下文預測前面一個單詞。相比而言,Bert通過在輸入X中随機Mask掉一部分單詞,然後預訓練過程的主要任務之一是根據上下文單詞來預測這些被Mask掉的單詞,如果你對Denoising Autoencoder比較熟悉的話,會看出,這确實是典型的DAE的思路。那些被Mask掉的單詞就是在輸入側加入的所謂噪音。類似Bert這種預訓練模式,被稱為DAE LM。

這種DAE LM的優缺點正好和自回歸LM反過來,它能比較自然地融入雙向語言模型,同時看到被預測單詞的上文和下文,這是好處。缺點是啥呢?主要在輸入側引入[Mask]标記,導緻預訓練階段和Fine-tuning階段不一緻的問題,因為Fine-tuning階段是看不到[Mask]标記的。DAE嗎,就要引入噪音,[Mask] 标記就是引入噪音的手段,這個正常。

XLNet的出發點就是:能否融合自回歸LM和DAE LM兩者的優點。就是說如果站在自回歸LM的角度,如何引入和雙向語言模型等價的效果;如果站在DAE LM的角度看,它本身是融入雙向語言模型的,如何抛掉表面的那個[Mask]标記,讓預訓練和Fine-tuning保持一緻。當然,XLNet還講到了一個Bert被Mask單詞之間互相獨立的問題,我相信這個不太重要,原因後面會說。當然,我認為這點不重要的事情,純粹是個人觀點,出錯難免,看看就完了,不用較真。

XLNet做了些什麼

上文說過,Bert這種自編碼語言模型的好處是:能夠同時利用上文和下文,是以資訊利用充分。對于很多NLP任務而言,典型的比如閱讀了解,在解決問題的時候,是能夠同時看到上文和下文的,是以當然應該把下文利用起來。在Bert原始論文中,與GPT1.0的實驗對比分析也可以看出來,BERT相對GPT 1.0的性能提升,主要來自于雙向語言模型與單向語言模型的差異。這是Bert的好處,很明顯,Bert之後的改進模型,如果不能把雙向語言模型用起來,那明顯是很吃虧的。當然,GPT 2.0的作者不信這個邪,堅持沿用GPT 1.0 單向語言模型的舊瓶,裝進去了更高品質更大規模預訓練資料的新酒,而它的實驗結果也說明了,如果想改善預訓練語言模型,走這條擴充預序列模型訓練資料的路子,是個多快好但是不省錢的方向。這也進一步說明了,預訓練LM這條路,還遠遠沒有走完,還有很大的提升空間,比如最簡單的提升方法就是加大資料規模,提升資料品質。

但是Bert的自編碼語言模型也有對應的缺點,就是XLNet在文中指出的,第一個預訓練階段因為采取引入[Mask]标記來Mask掉部分單詞的訓練模式,而Fine-tuning階段是看不到這種被強行加入的Mask标記的,是以兩個階段存在使用模式不一緻的情形,這可能會帶來一定的性能損失;另外一個是,Bert在第一個預訓練階段,假設句子中多個單詞被Mask掉,這些被Mask掉的單詞之間沒有任何關系,是條件獨立的,而有時候這些單詞之間是有關系的,XLNet則考慮了這種關系(關于這點原因是否可靠,後面會專門分析)。

上面兩點是XLNet在第一個預訓練階段,相對Bert來說要解決的兩個問題。

其實從另外一個角度更好了解XLNet的初衷和做法,我覺得這個估計是XLNet作者真正的思考出發點,是啥呢?就是說自回歸語言模型有個缺點,要麼從左到右,要麼從右到左,盡管可以類似ELMO兩個都做,然後再拼接的方式。但是跟Bert比,效果明顯不足夠好(這裡面有RNN弱于Transformer的因素,也有雙向語言模型怎麼做的因素)。那麼,能不能類似Bert那樣,比較充分地在自回歸語言模型中,引入雙向語言模型呢?因為Bert已經證明了這是非常關鍵的一點。這一點,想法簡單,但是看上去貌似不太好做,因為從左向右的語言模型,如果我們目前根據上文,要預測某個單詞Ti,那麼看上去它沒法看到下文的内容。具體怎麼做才能讓這個模型:看上去仍然是從左向右的輸入和預測模式,但是其實内部已經引入了目前單詞的下文資訊呢?XLNet在模型方面的主要貢獻其實是在這裡。

那麼XLNet是怎麼做到這一點的呢?其實思路也比較簡潔,可以這麼思考:XLNet仍然遵循兩階段的過程,第一個階段是語言模型預訓練階段;第二階段是任務資料Fine-tuning階段。它主要希望改動第一個階段,就是說不像Bert那種帶Mask符号的Denoising-autoencoder的模式,而是采用自回歸LM的模式。就是說,看上去輸入句子X仍然是自左向右的輸入,看到Ti單詞的上文Context_before,來預測Ti這個單詞。但是又希望在Context_before裡,不僅僅看到上文單詞,也能看到Ti單詞後面的下文Context_after裡的下文單詞,這樣的話,Bert裡面預訓練階段引入的Mask符号就不需要了,于是在預訓練階段,看上去是個标準的從左向右過程,Fine-tuning當然也是這個過程,于是兩個環節就統一起來。當然,這是目标。剩下是怎麼做到這一點的問題。

預訓練模型(3)---- XLNet

那麼,怎麼能夠在單詞Ti的上文中Contenxt_before中揉入下文Context_after的内容呢?你可以想想。XLNet是這麼做的,在預訓練階段,引入Permutation Language Model的訓練目标。什麼意思呢?就是說,比如包含單詞Ti的目前輸入的句子X,由順序的幾個單詞構成,比如x1,x2,x3,x4四個單詞順序構成。我們假設,其中,要預測的單詞Ti是x3,位置在Position 3,要想讓它能夠在上文Context_before中,也就是Position 1或者Position 2的位置看到Position 4的單詞x4。可以這麼做:假設我們固定住x3所在位置,就是它仍然在Position 3,之後随機排列組合句子中的4個單詞,在随機排列組合後的各種可能裡,再選擇一部分作為模型預訓練的輸入X。比如随機排列組合後,抽取出x4,x2,x3,x1這一個排列組合作為模型的輸入X。于是,x3就能同時看到上文x2,以及下文x4的内容了。這就是XLNet的基本思想,是以說,看了這個就可以了解上面講的它的初衷了吧:看上去仍然是個自回歸的從左到右的語言模型,但是其實通過對句子中單詞排列組合,把一部分Ti下文的單詞排到Ti的上文位置中,于是,就看到了上文和下文,但是形式上看上去仍然是從左到右在預測後一個單詞。

預訓練模型(3)---- XLNet

當然,上面講的仍然是基本思想。難點其實在于具體怎麼做才能實作上述思想。首先,需要強調一點,盡管上面講的是把句子X的單詞排列組合後,再随機抽取例子作為輸入,但是,實際上你是不能這麼做的,因為Fine-tuning階段你不可能也去排列組合原始輸入。是以,就必須讓預訓練階段的輸入部分,看上去仍然是x1,x2,x3,x4這個輸入順序,但是可以在Transformer部分做些工作,來達成我們希望的目标。具體而言,XLNet采取了Attention掩碼的機制,你可以了解為,目前的輸入句子是X,要預測的單詞Ti是第i個單詞,前面1到i-1個單詞,在輸入部分觀察,并沒發生變化,該是誰還是誰。但是在Transformer内部,通過Attention掩碼,從X的輸入單詞裡面,也就是Ti的上文和下文單詞中,随機選擇i-1個,放到Ti的上文位置中,把其它單詞的輸入通過Attention掩碼隐藏掉,于是就能夠達成我們期望的目标(當然這個所謂放到Ti的上文位置,隻是一種形象的說法,其實在内部,就是通過Attention Mask,把其它沒有被選到的單詞Mask掉,不讓它們在預測單詞Ti的時候發生作用,如此而已。看着就類似于把這些被選中的單詞放到了上文Context_before的位置了)。具體實作的時候,XLNet是用“雙流自注意力模型”實作的,細節可以參考論文,但是基本思想就如上所述,雙流自注意力機制隻是實作這個思想的具體方式,理論上,你可以想出其它具體實作方式來實作這個基本思想,也能達成讓Ti看到下文單詞的目标。

這裡簡單說下“雙流自注意力機制”,一個是内容流自注意力,其實就是标準的Transformer的計算過程;主要是引入了Query流自注意力,這個是幹嘛的呢?其實就是用來代替Bert的那個[Mask]标記的,因為XLNet希望抛掉[Mask]标記符号,但是比如知道上文單詞x1,x2,要預測單詞x3,此時在x3對應位置的Transformer最高層去預測這個單詞,但是輸入側不能看到要預測的單詞x3,Bert其實是直接引入[Mask]标記來覆寫掉單詞x3的内容的,等于說[Mask]是個通用的占位符号。而XLNet因為要抛掉[Mask]标記,但是又不能看到x3的輸入,于是Query流,就直接忽略掉x3輸入了,隻保留這個位置資訊,用參數w來代表位置的embedding編碼。其實XLNet隻是扔了表面的[Mask]占位符号,内部還是引入Query流來忽略掉被Mask的這個單詞。和Bert比,隻是實作方式不同而已。

預訓練模型(3)---- XLNet

上面說的Attention掩碼,我估計你還是沒了解它的意思,我再用例子解釋一下。Attention Mask的機制,核心就是說,盡管目前輸入看上去仍然是x1->x2->x3->x4,但是我們已經改成随機排列組合的另外一個順序x3->x2->x4->x1了,如果用這個例子用來從左到右訓練LM,意味着當預測x2的時候,它隻能看到上文x3;當預測x4的時候,隻能看到上文x3和x2,以此類推……這樣,比如對于x2來說,就看到了下文x3了。這種在輸入側維持表面的X句子單詞順序,但是其實在Transformer内部,看到的已經是被重新排列組合後的順序,是通過Attention掩碼來實作的。如上圖所示,輸入看上去仍然是x1,x2,x3,x4,可以通過不同的掩碼矩陣,讓目前單詞Xi隻能看到被排列組合後的順序x3->x2->x4->x1中自己前面的單詞。這樣就在内部改成了被預測單詞同時看到上下文單詞,但是輸入側看上去仍然維持原先的單詞順序了。關鍵要看明白上圖右側那個掩碼矩陣,我相信很多人剛開始沒看明白,因為我剛開始也沒看明白,因為沒有标出掩碼矩陣的單詞坐标,它的坐标是1-2-3-4,就是表面那個X的單詞順序,通過掩碼矩陣,就能改成你想要的排列組合,并讓目前單詞看到它該看到的所謂上文,其實是摻雜了上文和下文的内容。這是attention mask來實作排列組合的背後的意思。

上面講的Permutation Language Model是XLNet的主要理論創新,是以介紹的比較多,從模型角度講,這個創新還是挺有意思的,因為它開啟了自回歸語言模型如何引入下文的一個思路,相信對于後續工作會有啟發。當然,XLNet不僅僅做了這些,它還引入了其它的因素,也算是一個目前有效技術的內建體。感覺XLNet就是Bert、GPT 2.0和Transformer XL的綜合體變身,首先,它通過PLM預訓練目标,吸收了Bert的雙向語言模型;然後,GPT2.0的核心其實是更多更高品質的預訓練資料,這個明顯也被XLNet吸收進來了;再然後,Transformer XL的主要思想也被吸收進來,它的主要目标是解決Transformer對于長文檔NLP應用不夠友好的問題。

以上是XLNet的幾個主要改進點,有模型創新方面的,有其它模型引入方面的,也有資料擴充方面的。那麼,這些因素各自起到了什麼作用呢?在後面我們會談。在談不同因素各自作用之前,我們先分析下XLNet和Bert的異同問題。

與Bert的預訓練過程的異同問題

盡管看上去,XLNet在預訓練機制引入的Permutation Language Model這種新的預訓練目标,和Bert采用Mask标記這種方式,有很大不同。其實你深入思考一下,會發現,兩者本質是類似的。差別主要在于:Bert是直接在輸入端顯示地通過引入Mask标記,在輸入側隐藏掉一部分單詞,讓這些單詞在預測的時候不發揮作用,要求利用上下文中其它單詞去預測某個被Mask掉的單詞;而XLNet則抛棄掉輸入側的Mask标記,通過Attention Mask機制,在Transformer内部随機Mask掉一部分單詞(這個被Mask掉的單詞比例跟目前單詞在句子中的位置有關系,位置越靠前,被Mask掉的比例越高,位置越靠後,被Mask掉的比例越低),讓這些被Mask掉的單詞在預測某個單詞的時候不發生作用。是以,本質上兩者并沒什麼太大的不同,隻是Mask的位置,Bert更表面化一些,XLNet則把這個過程隐藏在了Transformer内部而已。這樣,就可以抛掉表面的[Mask]标記,解決它所說的預訓練裡帶有[Mask]标記導緻的和Fine-tuning過程不一緻的問題。至于說XLNet說的,Bert裡面被Mask掉單詞的互相獨立問題,也就是說,在預測某個被Mask單詞的時候,其它被Mask單詞不起作用,這個問題,你深入思考一下,其實是不重要的,因為XLNet在内部Attention Mask的時候,也會Mask掉一定比例的上下文單詞,隻要有一部分被Mask掉的單詞,其實就面臨這個問題。而如果訓練資料足夠大,其實不靠目前這個例子,靠其它例子,也能彌補被Mask單詞直接的互相關系問題,因為總有其它例子能夠學會這些單詞的互相依賴關系。

我相信,通過改造Bert的預訓練過程,其實是可以模拟XLNet的Permutation Language Model過程的:Bert目前的做法是,給定輸入句子X,随機Mask掉15%的單詞,然後要求利用剩下的85%的單詞去預測任意一個被Mask掉的單詞,被Mask掉的單詞在這個過程中互相之間沒有發揮作用。如果我們把Bert的預訓練過程改造成:對于輸入句子,随機選擇其中任意一個單詞Ti,隻把這個單詞改成Mask标記,假設Ti在句子中是第i個單詞,那麼此時随機選擇X中的任意i個單詞,隻用這i個單詞去預測被Mask掉的單詞。當然,這個過程理論上也可以在Transformer内采用attention mask來實作。如果是這樣,其實Bert的預訓練模式就和XLNet是基本等價的了。

或者換個角度思考,假設仍然利用Bert目前的Mask機制,但是把Mask掉15%這個條件極端化,改成,每次一個句子隻Mask掉一個單詞,利用剩下的單詞來預測被Mask掉的單詞。那麼,這個過程其實跟XLNet的PLM也是比較相像的,差別主要在于每次預測被Mask掉的單詞的時候,利用的上下文更多一些(XLNet在實作的時候,為了提升效率,其實也是選擇每個句子最後末尾的1/K單詞被預測,假設K=7,意味着一個句子X,隻有末尾的1/7的單詞會被預測,這意味着什麼呢?意味着至少保留了6/7的Context單詞去預測某個單詞,對于最末尾的單詞,意味着保留了所有的句子中X的其它單詞,這其實和上面提到的Bert隻保留一個被Mask單詞是一樣的)。或者我們站在Bert預訓練的角度來考慮XLNet,如果XLNet改成對于句子X,隻需要預測句子中最後一個單詞,而不是最後的1/K(就是假設K特别大的情況),那麼其實和Bert每個輸入句子隻Mask掉一個單詞,兩者基本是等價的。

當然,XLNet這種改造,維持了表面看上去的自回歸語言模型的從左向右的模式,這個Bert做不到,這個有明顯的好處,就是對于生成類的任務,能夠在維持表面從左向右的生成過程前提下,模型裡隐含了上下文的資訊。是以看上去,XLNet貌似應該對于生成類型的NLP任務,會比Bert有明顯優勢。另外,因為XLNet還引入了Transformer XL的機制,是以對于長文檔輸入類型的NLP任務,也會比Bert有明顯優勢。

哪些因素在起作用?

如上分析,XLNet有個好處,但是感覺同時也是個問題,那就是:XLNet其實同時引入了很多因素在模型裡。說是好處,因為實驗證明了這樣效果确實好,即使是跟Bert_Large這種非常強的基準模型比也是,尤其是長文檔任務,這個效果提升比較明顯;說是問題,是因為其實應該在實驗部分充分說明,如果模型起了作用,這些因素各自發揮了多大作用,尤其是在跟Bert進行對比的時候,感覺應該把資料規模這個變量磨平進行比較,因為這才是單純的模型差異導緻的性能差異,而不是訓練資料量引發的差異。當然,XLNet最後一組實驗是把這個預訓練資料規模差異磨平後,和Bert比較的,是以資訊含量更大些。而前面的幾組實驗,因為天然存在預訓練資料量的差異,是以模型導緻的差異到底有多大,看得不太明顯。

我們上文提到過,XLNet起作用的,如果宏觀歸納一下,共有三個因素;

  1. 與Bert采取De-noising Autoencoder方式不同的新的預訓練目标:Permutation Language Model(簡稱PLM);這個可以了解為在自回歸LM模式下,如何采取具體手段,來融入雙向語言模型。這個是XLNet在模型角度比較大的貢獻,确實也打開了NLP中兩階段模式潮流的一個新思路。
  2. 引入了Transformer-XL的主要思路:相對位置編碼以及分段RNN機制。實踐已經證明這兩點對于長文檔任務是很有幫助的;
  3. 加大增加了預訓練階段使用的資料規模;Bert使用的預訓練資料是BooksCorpus和英文Wiki資料,大小13G。XLNet除了使用這些資料外,另外引入了Giga5,ClueWeb以及Common Crawl資料,并排掉了其中的一些低品質資料,大小分别是16G,19G和78G。可以看出,在預訓練階段極大擴充了資料規模,并對品質進行了篩選過濾。這個明顯走的是GPT2.0的路線。

是以實驗部分需要仔細分析,提升到底是上述哪個因素或者是哪幾個因素導緻的性能提升?

我們把實驗分成幾個部分來分析。

首先,給人最大的印象是:XLNet對于閱讀了解類任務,相對Bert,性能有極大幅度地提升。下面是論文報道的實驗結果:

預訓練模型(3)---- XLNet
預訓練模型(3)---- XLNet

其中,RACE和SQuAD 2.0是文檔長度較長的閱讀了解任務,任務難度也相對高。可以看出,在這兩個任務中,XLNet相對 Bert_Large,确實有大幅性能提升(Race提升13.5%,SQuAD 2.0 F1名額提升8.6)。在Squad1.1上提升盡管稍微小些,F1提升3.9%,但是因為基準高,是以提升也比較明顯。

說XLNet在閱讀了解,尤其是長文檔的閱讀了解中,性能大幅超過Bert,這個是沒疑問的。但是,因為XLNet融入了上文說的三個因素,是以不确定每個因素在其中起的作用有多大,而對于長文檔,Transformer XL的引入肯定起了比較大的作用,Bert天然在這種類型任務中有缺點,其它兩類因素的作用不清楚。感覺這裡應該增加一個基準,就是Bert用與XLNet相同大小的預訓練資料做,這樣抹平資料量差異,更好比較模型差異帶來的效果差異。當然,我覺得即使是這樣,XLNet應該仍然是比Bert效果好的,隻是可能不會差距這麼大,因為XLNet的長文檔優勢肯定會起作用。

下面我們看下其它類型的NLP任務。

預訓練模型(3)---- XLNet

GLUE是個綜合的NLP任務集合,包含各種類型的任務,因為ensemble模式裡面包含了各種花式的trick,是以重點看上面一組實驗,這裡比較單純。從實驗資料看,XLNet相對Bert也有性能提升,當然不像閱讀了解提升那麼大,而且性能提升比較大的集中在RTE,MNLI和COLA資料集合,其它任務提升效果還好。而我一直覺得,RTE在GLUE裡,是個神奇的存在,如果沒有它,很多論文的效果可能沒法看,這個是閑話,先不講了,後面我會單說。

當然,仍然不确定這種性能提升主要來自于XLNet的哪個因素,或者哪幾個因素各自的貢獻,尤其是如果Bert加大預訓練資料規模後,兩者性能差異有多大。感覺這裡Transformer XL的因素可能發揮的作用不會太大,其它兩個因素在起作用,但是作用未知,這裡感覺應該補充其它實驗。

預訓練模型(3)---- XLNet
預訓練模型(3)---- XLNet

上面是文本分類任務和資訊檢索任務,可以看出,相對Bert,XLNet效果有提升,但是幅度不算大。仍然是上面的考慮,起作用的三個因素,到底哪個發揮多大作用,從資料方面看不太出來。

下面一組實驗可以仔細分析一下,這組實驗是排除掉上述第三個資料規模因素的實驗的對比,就是說XLNet用的是和Bert相同規模的預訓練資料,是以與Bert對比更具備模型方面的可比較性,而沒有資料規模的影響。實驗結果如下:

預訓練模型(3)---- XLNet

如果仔細分析實驗資料,實驗結果說明:

因為和Bert比較,XLNet使用相同的預訓練資料。是以兩者的性能差異來自于:Permutation Language Model預訓練目标以及Transformer XL的長文檔因素。而從中可以看出,DAE+Transformer XL展現的是長文檔因素的差異,和Bert比,Race提升1個點,SQuAD F1提升3個點,MNLI提升0.5個點,SST-2性能稍微下降。這是Transformer XL因素解決長文檔因素帶來的收益,很明顯,長文檔閱讀了解任務提升比較明顯,其它任務提升不太明顯。

而通過XLNet進一步和DAE+Transformer XL及Bert比,這一點應該拆解出Permutation Language Model和Mask的方式差異。可以看出:XLNet相對DAE+Transformer XL來說,Race進一步提升1個點左右;SQuAD進一步提升1.8個點左右,NMLI提升1個點左右,SST-B提升不到1個點。雖然不精準,但是大緻是能說明問題的,這個應該大緻是PLM帶來的模型收益。可以看出,PLM還是普遍有效的,但是提升幅度并非特别巨大。

如果我們結合前面Race和SQuAD的實驗結果看(上面兩組實驗是三個因素的作用,後面是排除掉資料量差異的結果,是以兩者的差距,很可能就是第三個因素:資料規模導緻的差異,當然,因為一個是Bert_base,一個是Bert_Large,是以不具備完全可比性,但是大緻估計不會偏離真實結論太遠),Race資料集合三因素同時具備的XLNet,超過Bert絕對值大約9個多百分點,Transformer因素+PLM因素估計貢獻大約在2到4個點之間,那麼意味着預訓練資料量導緻的差異大概在4到5個點左右;類似的,可以看出,SQuAD 2.0中,預訓練資料量導緻的差異大約在2到3個點左右,也就是說,估計訓練資料量帶來的提升,在閱讀了解任務中大約占比30%到40%左右。

如果從實驗結果歸納一下的話,可以看出:XLNet綜合而言,效果是優于Bert的,尤其是在長文檔類型任務,效果提升明顯。如果進一步拆解的話,因為對比實驗不足,隻能做個粗略的結論:預訓練資料量的提升,大概帶來30%左右的性能提升,其它兩個模型因素帶來剩餘的大約70%的性能提升。當然,這個主要指的是XLNet性能提升比較明顯的閱讀了解類任務而言。對于其它類型任務,感覺Transformer XL的因素貢獻估計不會太大,主要應該是其它兩個因素在起作用。

對NLP應用任務的影響

XLNet其實本質上還是ELMO/GPT/Bert這一系列兩階段模型的進一步延伸。在将自回歸LM方向引入雙向語言模型方面,感覺打開了一個新思路,這點還是非常對人有啟發的。當然,如果深入思考,其實和Bert并沒有太大的不同。

如果讓我推論下XLNet的出現,對後續NLP工作的影響,我覺得跟Bert比,最直接的影響應該有兩個,一個是對于Bert長文檔的應用,因為Transformer天然對長文檔任務處理有弱點,是以XLNet對于長文檔NLP任務相比Bert應該有直接且比較明顯的性能提升作用,它在論文中也證明了這點。是以,以後長文檔類型的NLP應用,XLNet明顯跟Bert比占優勢。當然,你說我把Transformer XL的因素引入Bert,然後繼續在Bert上做改進,明顯這也是可以的。

第二點,對于生成類的NLP任務,到目前為止,盡管出了一些改進模型,但是從效果看,Bert仍然不能很好地處理。而因為XLNet的預訓練模式天然符合下遊任務序列生成結果,是以按理說能夠直接通過引入XLNet來改進生成類NLP任務的效果。是以,這點估計是XLNet會明顯占優勢的一個領域。

可以預計的是,很快我們就會看到XLNet在文本摘要,機器翻譯,資訊檢索……等符合上述XLNet應用領域特點和優勢領域的應用結果,以及在這些任務上的進一步改進模型。當然,這個有點比手速的意思,有意者請盡快動手把結果扔出來。

又給你了一個拼手速的機會,加油吧,少年!

參考文獻

飛躍芝麻街:XLNet 詳解

繼續閱讀