XLNet概述

這兩天,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當然也是這個過程,於是兩個環節就統一起來。當然,這是目標。剩下是怎麼做到這一點的問題。

 

 

那麼,怎麼能夠在單詞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的上文位置中,於是,就看到了上文和下文,但是形式上看上去仍然是從左到右在預測後一個單詞。

 

 

當然,上面講的仍然是基本思想。難點其實在於具體怎麼做才能實現上述思想。首先,需要強調一點,儘管上面講的是把句子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比,只是實現方式不同而已。

上面說的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,性能有極大幅度地提升。下面是論文報道的實驗結果:

 

其中,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任務。

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

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

 

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

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

 

如果仔細分析實驗數據,實驗結果說明:

因爲和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應用領域特點和優勢領域的應用結果,以及在這些任務上的進一步改進模型。當然,這個有點比手速的意思,有意者請儘快動手把結果扔出來。

 

 

 


 

1、監督信號的提取

BERT 有兩個目標,Masked Language Model 和 Next Sentence Prediction,前者用於提取單詞之間的關係,後者用來提取句子之間的關係。前者帶來的問題在於, 訓練時引入 [MASK] token 使得 train/test 不一致,於是又用了很多亂七八糟的方法來補救(以一定概率保留原詞,一定概率換成別的單詞等等)。

新的目標 Permutation Language Model 就沒這個問題。PLM 的大意是把輸入的句子鏈式分解一下,然後用最大似然來訓練。只不過這裏的分解不是通常語言模型的 left-to-right factorization,而是以任意順序排列進行 factorization,最後求期望。當然,具體實現的時候用採樣代替期望,隨機選取一個具體排列進行計算,例如將 1 -> 2 -> 3 -> 4 調整爲 2 -> 4 -> 3 -> 1,然後優化樣本似然 [公式] 。shuffle 過後(代碼實現中調整 attention mask 即可,不必 shuffle 輸入)預測單詞 3 時可以觀測到單詞 2 和 4 的信息,實現雙向的信息提取。另外,Grover 訓練時也會 shuffle metadata,有一定的相似之處,可能是大勢所趨吧。這種亂序的輸入很適合完形填空的場景(單講完形填空的話其實 BERT 更適合,但對於完整的輸入文本 BERT 就有些貨不對板了)。

BERT 的另一個訓練目標 NSP 對於提取句間關係的任務很有幫助,甚至有後續研究說即便是單句的任務也可以構建出一個輔助句進而獲益(如 "BERT for Aspect-Based Sentiment Analysis via Constructing Auxiliary Sentence");而 XLNet 的實驗發現 PLM 和 NSP 不兼容,加入 NSP 對大多數任務都是有害的。兩個模型的優點不能融合,着實有些遺憾。

題外話,Bert時代的創新:Bert在NLP各領域的應用進展文末對 BERT 的適用場景有很好的總結,推薦一讀。

GPT 等普通語言模型的訓練目標是 Causal Language Model,BERT 的訓練目標是 MLM,在此基礎上通過改進 mask 又有了 Whole Word Masking/N-gram Masking/ERNIE 等目標。把 Transformer 的 encoder 和 decoder 都用上可以得到 MASS,雙語平行語料預訓練可以用 TLM。如今又多了一個 PLM 的目標,很高興看到這樣的進步,期待以後能有更多的手段從語料裏無監督地提取到更多的知識。但不管怎麼說,這都是土豪的遊戲了,一般人玩不起。

PLM 可能帶來的另一個潛在收益是,XLNet 應該具有一定的文本生成能力,從這一點上講它和 UNILM 更像。理解和生成相統一,可能也是未來的趨勢之一。

XLNet 在 GLUE benchmark 的幾乎所有任務上都比先前最優水平得到了提升,但是 CoLA 這一項的表現似乎不盡如人意。CoLA 是判斷一個句子是否在語法上合理的,是不是說明這個任務較爲依賴單詞順序?

XLNet 的提升來源主要有兩部分,一是來源於 Transformer-XL 對更長的上文信息的提取,二是來源於 PLM 訓練目標與下游任務的一致性(沒有 train-test skewness)。Table 6 中的 ablation study 發現,第一點帶來的提升相當明顯(對比 row 2 和 row 1),使得 DAE + Transformer-XL 在 RACE 和 SQUAD 上明顯超過了 BERT-Base(MNLI 和 SST-2 上沒有明顯變化,是因爲這兩個任務沒有長程依賴)。由此可見 BERT 處理長文本其實還是有些力不從心,而 Transformer-XL 則把 stateful RNN 的思想在 Transformer 上覆活了。第二點的提升效果也很明顯,並且所有任務都能從中受益。

XLNet 計算量和激活值比 BERT 更大,有可能接近 BERT 的 2 倍(因爲 XLNet 要給每個位置維護兩套隱狀態,一套是包含當前 token 信息的 content stream h,另一套是不包含當前 token 信息的 query stream g。此外還有前一個 segment 的緩存)。細節詳見論文 2.3 節 Two-Stream Self-Attention 的相關描述,大意如下圖:

於是,即便是對於 left-to-right 這種特殊情形的分解,XLNet 可能也比 GPT 更強:假設要預測單詞 4,GPT 的輸入和輸出是錯位一個時間步的,即讀入 1,2,3,然後在 3 的位置預測 4;而 XLNet 的輸入和輸出時間步數是相同的(這一點類似於 BERT),輸入 1,2,3,4 並在 4 的位置預測 4。當然,XLNet 不會讀取第 4 個時間步的單詞(否則有信息泄露),僅僅利用位置 4 的 position embedding,告訴模型現在想要預測第 4 個位置。XLNet 在第 4 步的輸入向量是一個 query vector(在最底層是一個可學習的參數w,在中間層是 query stream g)來對 1,2,3 各個時間步進行 attend,和 GPT 相比多一個時間步的輸入,多一輪 query & attend 的過程,因此有可能更強。

文章中還說,XLNet-Large 依然是欠擬合訓練數據的,但是再訓練對於 downstream task 已經沒有用了。這一點有些奇怪,可以進一步探究的是,存在於這些數據中、但是對下游任務沒有幫助的到底是什麼信息?也許是跟語言生成(而非判別)有關的?也許我們應該尋找新的、能夠從這些信息中獲益的下游任務——也許是比 GLUE benchmark 更難,但又比長篇文本生成更簡單的任務,例如 DecaNLP?今天 GLUE 已經接近解決,這些任務也許可以作爲更好的 NLP 領域風向標。

2、數據規模

XLNet-Base 和 Bert-Base 數據集是一樣的,效果也有比較明顯的提高,說明 XLNet-Base 確實更好。

但是 XLNet-Large 除了放大模型之外還用了更多的數據,在 BERT 所用的 BooksCorpus & English Wikipedia 的基礎上還增加了 Giga5, ClueWeb 2012-B, and Common Crawl,擴大到了原先的 10 倍。不知道 BERT-Large 在這樣的數據上表現如何?預期應該會變好(@霍華德 在這個回答裏也說了騰訊 AI Lab 用 200G 語料訓出的 BERT-Large 又變強了一大截),但應該不會超過 XLNet。

3、優化方法

XLNet-Large 用 512 TPU v3 chips 訓了 2.5 天,而 BERT-Large 用 64 TPU chips 訓了 4 天。也就是說,訓練 XLNet 所需的浮點運算次數大約是 Bert 5 倍。再考慮到 XLNet 計算量和激活值大約是 BERT 的 2 倍(我真的很好奇他們是怎麼把這個模型塞進 TPU 的。TPU v3 每個 core 也只有 16G HBM 啊,TPU 上的 XLA 優化這麼強的嗎?),語料規模是 BERT-Large 的 10 倍,如果不考慮代碼實現的效率差異的話,可以近似認爲 XLNet 的訓練效率是 BERT 的 4 倍。

訓練效率的提高可能有兩個來源:

  • 其一是對多個預測目標之間的關係的建模。文中有一個例子,假如輸入是 New York is a city,想要預測的目標是 New York,那麼 BERT 在預測 New 和 York 時是互相獨立的,即優化 P(New|is a city)P(York|is a city);而 XLNet 則是優化 P(New|is a city)P(York|New, is a city)。這種單詞間依賴的建模使得 XLNet 的預訓練更有效率。BERT 不建模多個預測之間的相互依賴可能導致重複預測等問題(可以參考百度 ERNIE 給出的一些 bad case,如下圖中的“糖糖內”和“日陽”),於是前段時間谷歌給 BERT 發佈了一個叫 Whole Word Masking 的補丁。不過從原理上講 wwm-MLM 依然不如 PLM,因爲 wwm-MLM 還是沒有真正建模多個目標詞之間的依賴,只是讓模型在這種情況下多訓練來緩解。

BERT 中文模型翻車現場

  • 其二是 XLNet 理論上可以訓練輸入序列所有的 token,而 BERT 只能訓練 15% 被掩掉的 token。雖然實際操作中 XLNet 只訓練了 permutation 最後 1/K(K=6 或 7)的 token,因爲這些 token 的上下文最長,更有利於模型提取上下文信息。不過我覺得可以在訓練初期使用大部分 token,僅當訓練接近結束時切換成只訓練上下文最長的 1/K,以便進一步提高樣本利用率和訓練效率。GPT 可以訓練全部 token,MASS 可以訓練 50% token,XLNet 理論上也能訓練較大比例的 token(雖然實際只訓了 1/K,但如果精心設計 permutation 的形式和訓練過程,把 K 從 6 降到 2 或 3 不算離譜),BERT 這個廢柴怎麼就只能訓 15% 的 token 呢?

4、彩蛋:

GPT-2 是如何看待 XLNet 的

5、吃瓜羣衆可以幹什麼

其實更大規模的模型出現對大家來說可能反而是一件好事,因爲:

  • 模型越大,越多人跑不起,這樣大家審稿時也就不會太苛責 sota,轉而關注研究本身的價值而非實驗結果。這個道理就好比,假如一項研究只有 10% 的人能做得起,他們可能會藉着手裏的資源優勢抓緊灌水;但是如果門檻擡高到了只有 0.1% 的人能做得起的程度,新的 9.9% 被資源門檻篩下來的人就會跟一開始被篩的 90% 的人回到同一陣營中,開始互相理解。
  • 這些工作也帶來了新的機會。對於硬件廠商,怎麼做專用芯片?TPU 現在還是一家獨大,GPU 沒個 V100 好像也要脫離時代了。對於後端框架,如何做內存優化?如果這些巨無霸模型大多數人都跑不起來(暫且認爲大多數人擁有的單卡顯存 <=16G),必然不利於整個行業的發展。對於業界,如何進行模型壓縮?很多文章都指出 BERT 有很多冗餘參數(例如 Are Sixteen Heads Really Better than One? 指出很多層只保留一個 attention head 就夠了),怎麼把這類模型的體積和延遲都減小到適合部署的程度?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章