XLnet論文研讀

1. 論文研讀筆記

寫在前面

最近事情實在太多,這真不是藉口,而是確實擠佔我幾乎所有的工作外的時間,一度讓我苦惱的想離職。。。 xlnet這篇文章看了很久,這個總結是我自己回憶了一下,自己寫了一點,然後來不及貼了點我認爲特別好的博客,拼湊而成,後面有空一定會重新再好好重寫這個系列 Transformer - elmo- bert- transformerxl - xlnet-- bert的各種變種

1.1 研究動機

Xlnet 這篇論文從出來的時候,就引發熱議,畢竟直接對標當時nlp在學術界和產業界最爲矚目的成果bert。從文章的動機來說,主要其實就是探討自迴歸(Autoregressive, AR)語言模型和自編碼(autoencoding)模型的差別。

自迴歸是時間序列分析或者信號處理領域喜歡用的一個術語,基本等價於我們通常理解的語言模型。自編碼器是一種無監督學習輸入的特徵的方法,即用一個神經網絡把輸入變成一個特徵表達,即編碼,然後再用一個Decoder把編碼後的特徵恢復成原始的信號。BERT就可以看成一種AutoEncoder,它通過Mask改變了部分Token,然後試圖通過其上下文的其它Token來恢復這些被Mask的Token。

給定文本序列x=[x1,…,xT],語言模型的目標是調整參數使得訓練數據上的似然函數最大:

xlnet_target
而BERT是去噪(denoising)自編碼的方法。對於序列x,BERT會隨機挑選15%的Token變成[MASK]得,它的目標函數可以表達成:
bert_target
這兩個模型的優缺點分別爲:

  1. 獨立假設
    注意等式(2)的約等號≈,它的意思是假設在給定x^\hat{x}的條件下被Mask的詞是獨立的,這個顯然並不成立,比如”New York is a city”,假設我們Mask住”New”和”York”兩個詞,那麼給定”is a city”的條件下”New”和”York”並不獨立,因爲”New York”是一個實體,看到”New”則後面出現”York”的概率要比看到”Old”後面出現”York”概率要大得多。而公式(1)沒有這樣的獨立性假設,它是嚴格的等號。
  2. 輸入噪聲
    BERT的在預訓練時會出現特殊的[MASK],但是它在下游的fine-tuning中不會出現,這就是出現了不匹配。而語言模型不會有這個問題。
  3. 雙向上下文
    語言模型只能參考一個方向的上下文,而BERT可以參考雙向整個句子的上下文,因此這一點BERT更好一些。xlnent提出的排序語言模型,正是用來解決這個問題。

1.2 研究方法

1.2.1 排序語言模型

給定長度爲T的序列x,總共有T!種排列方法,也就對應T!種鏈式分解方法。比如假設x=x1x2x3,那麼總共用3!=6種分解方法:

如果我們的語言模型遍歷T!種分解方法,並且這個模型的參數是共享的,那麼這個模型應該就能(必須)學習到各種上下文。普通的從左到右或者從右往左的語言模型只能學習一種方向的依賴關係,比如先”猜”一個詞,然後根據第一個詞”猜”第二個詞,根據前兩個詞”猜”第三個詞,……。而排列語言模型會學習各種順序的猜測方法,比如上面的最後一個式子對應的順序3→1→2,它是先”猜”第三個詞,然後根據第三個詞猜測第一個詞,最後根據第一個和第三個詞猜測第二個詞。

因此我們可以遍歷T!種路徑,然後學習語言模型的參數,但是這個計算量非常大(10!=3628800,10個詞的句子就有這麼多種組合)。因此實際我們只能隨機的採樣T!裏的部分排列,爲了用數學語言描述,我們引入幾個記號。ZTZ_T表示長度爲T的序列的所有排列組成的集合,則zZTz∈Z_T是一種排列方法。我們用ztz_t表示排列的第t個元素,而z<tz_{<t}表示z的第1到第t-1個元素。舉個例子,假設T=3,那麼ZTZ_T共有6個元素,我們假設其中之一z=[1,3,2],則z3=2z_3=2,而z<3=[1,3]z_{<3}=[1,3]

有了上面的記號,則排列語言模型的目標是調整模型參數使得下面的似然概率最大:
排序語言模型

在這裏插入圖片描述

1.2.2 雙流selft-attention

首先,需要強調一點,儘管上面講的是把句子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比,只是實現方式不同而已。

雙流
上面講的Permutation Language Model是XLNet的主要理論創新,所以介紹的比較多,從模型角度講,這個創新還是挺有意思的,因爲它開啓了自迴歸語言模型如何引入下文的一個思路,相信對於後續工作會有啓發。當然,XLNet不僅僅做了這些,它還引入了其它的因素,也算是一個當前有效技術的集成體。感覺XLNet就是Bert、GPT 2.0和Transformer XL的綜合體變身:

首先,它通過PLM(Permutation Language Model)預訓練目標,吸收了Bert的雙向語言模型;
然後,GPT2.0的核心其實是更多更高質量的預訓練數據,這個明顯也被XLNet吸收進來了;
再然後,Transformer XL的主要思想也被吸收進來,它的主要目標是解決Transformer對於長文檔NLP應用不夠友好的問題。

1.2.3 transformer-XL(待續)

1.3 實驗結果

實驗1

實驗2

1.4 個人點評(待續)

參考文獻:
【1】xlnet原理,李理的博客,http://fancyerii.github.io/2019/06/30/xlnet-theory/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章