本篇帶來XL-Net和它的基礎結構Transformer-XL。在講解XL-Net以前須要先了解Transformer-XL,Transformer-XL不屬於預訓練模型範疇,而是Transformer的擴展版,旨在解決Transformer的捕獲長距離依賴信息的上限問題。接下來咱們詳細的介紹Transformer-XL和XL-Net。git
一,Transformer-XLgithub
論文:TRANSFORMER-XL: LANGUAGE MODELING WITH LONGER-TERM DEPENDENCY 緩存
GitHub:https://github.com/kimiyoung/transformer-xl架構
Transformer模型在輸入時採用的是固定長度序列輸入,且Transformer模型的時間複雜度和序列長度的平方成正比,所以通常序列長度都限制在最大512,由於太大的長度,模型訓練的時間消耗太大。此外Transformer模型又不像RNN這種結構,能夠將最後時間輸出的隱層向量做爲整個序列的表示,而後做爲下一序列的初始化輸入。因此用Transformer訓練語言模型時,不一樣的序列之間是沒有聯繫的,所以這樣的Transformer在長距離依賴的捕獲能力是不夠的,此外在處理長文本的時候,如果將文本分爲多個固定長度的片斷,對於連續的文本,這無異於將文本的總體性破壞了致使了文本的碎片化,這也是Transformer-XL被提出的緣由。性能
Transformer-XL作了兩個改變,一是引入了循環機制來提高模型的長距離依賴捕獲能力,二是引入上述循環機制以後,以前的絕對位置就不work了,須要新的方法引入位置信息,所以有提出了相對位置的作法。咱們來詳細得看看這兩個改變是怎麼實現的。學習
1)SEGMENT-LEVEL RECURRENCE WITH STATE REUSE編碼
Transformer模型在訓練和評估時的圖示化表示以下:spa
能夠看到在訓練階段,序列之間是相互孤立的,在評估階段,在預測下一個詞的時候也只能利用前面的固定爲n個詞的序列。這樣在訓練時模型捕獲信息的長度不夠,且在評估時利用的信息也不夠。再來看看Transformer-XL。orm
Transformer-XL在訓練的時候將上一片斷的結果引入到下一片斷中,在評估時一樣,所以能捕獲的長距離信息較Transformer有很大的提高。從公式上來看就更加直觀了blog
在上面式子中$\tau$表示上一片斷,$\tau + 1$表示下一片斷。將上一片斷的輸出緩存起來,而後直接和下一片斷的隱層拼接在一塊兒,在這裏$SG()$的含義是stop-gradient。另外這個引入了上一片斷的隱層表示只會用在key和value上,對於query仍是保持原來的樣子。這樣作也好理解,query只是表示查詢的詞,而key,value表示的是表示這個查詢的詞的相關信息,咱們要改變的是隻是信息,所以只要在key,value中引入上一片斷的信息就能夠了,剩下的就和Transformer一致。
2)RELATIVE POSITIONAL ENCODINGS
引入了上述機制以後,絕對位置就用不了了,以下面所示:
用絕對位置表示時,對於上一片斷和當前片斷的位置向量是一致的,這樣看顯然是不合理的,因此做者又引入了相對位置的概念。具體作法以下:
Transformer中的attention權重計算公式以下:
${(E_{x_i} + U_i)}^T W_q^T W_k (E_{x_j} + U_j)$
將其展開能夠分解成下面四個部分:
這四個部分能夠理解爲:
a)基於內容的「尋址」,即沒有添加位置向量,詞對詞的分數。
b)基於內容的位置偏置,至關於當前內容的位置誤差。
c)全局的內容偏置,用於衡量key的重要性。
d)全局的位置偏置,根據key和query調整位置的重要性。
拆分紅這四部分以後,咱們就能夠對其進行改寫,引入相對位置向量。具體作法以下:
a)部分基本不變,只是對於key的位置向量的權重矩陣和詞向量的權重矩陣再也不共享;b)部分引入了相對位置向量$R_{i-j}$,是一個不能夠學習的預先給定好的正弦編碼矩陣;c)對於query的位置向量採用能夠學習的初始化向量來表示,$u^T$表示對key中詞的位置向量,d)同上,$v^T$表示對key中位置的位置向量。
將上面的式子合併後,能夠獲得:
${(W_q E_{x_i} + u)}^T W_{k, E} E_{x_j} + {(W_q E_{x_i} + v)}^T W_{k, R} R_{i-j}$
上面整個即便Transformer-XL的兩個改變。
二,XL-Net
論文:XLNet: Generalized Autoregressive Pretraining for Language Understanding
GitHub:https://github.com/zihangdai/xlnet
XL-Net的提出是很是具備意義的,展現了自迴歸模型也是能夠實現雙向的,而且解決了bert中一些已有的缺陷。在XL-Net論文中提出bert主要有兩個缺陷:
1)bert中的mask後的詞相互獨立,所以在預測mask的詞的時候,忽略了mask詞與詞之間的關係,舉個簡單的例子,New York這兩個詞同時被mask,此時你在預測New的時候是沒法使用York的信息的,由於它被mask了,但實際上你要準確的預測New,York提供的信息是很是大的。
2)訓練時和預測時存在不一致,訓練模型時會對詞作mask,可是在預測的時候是沒有mask的,或者說在下游任務上也是沒有mask的,這也就致使了在訓練時模型看到的和預測時模型看到的信息是有差別的。
上面兩個問題對於bert這種去噪自編碼模型(對輸入進行破壞,而後經過自編碼模型來重構未破壞的輸入)來講,是沒法避免的。所以XL-Net拋棄了這種自編碼模型的思想,從新使用自迴歸(語言模型,如ELMO,GPT都是自迴歸模型)的模式,可是傳統的自迴歸模式是沒法使用上下文的信息的,所以在使用自迴歸語言模型的同時,如何引入雙向的上下文信息是本文主要的貢獻。做者採用了Permutation Language Modeling 的方法來引入雙向上下文信息。
Objective: Permutation Language Modeling
具體的作法如上圖所示,保持序列的輸入順序不變,可是維護一個Factorization order的隨機排序的位置表,如上面所示,保持x1,x2,x3,x4的原始輸入不表,而後隨機排序給出4個Factorization order,當你在預測x3的時候,經過mask的方式,使得只能看大Factorization order中3的前面的位置詞,也就是第一個序列中3的前面什麼都沒有,第二條序列中3的前面有2和4,所以經過mask的方式使得在預測x3時只能看到x2,x4,一樣在第三個序列中能夠看到x1,x2,x4。在第四條序列中能夠看到x4。如今假定咱們採樣的序列足夠多,從指望的角度上來看,這種方式能夠保證在預測x3時,x1,x2,x4被看到的次數基本一致。做者也就是經過這種方式引入了雙向信息。
Architecture: Two-Stream Self-Attention for Target-Aware Representations
可是上面的方式在實現上有一些問題,例如給定一個a1,b2,c3,d4的序列,此時採樣兩條序列爲:a1,c3,b2,d4和a1,c3,d4,b2。在預測序列1中的b2和預測序列2中的d4時,看到的都是a1和c3,所以預測機率都是同樣的,可是直觀上來講這個機率應該是不同的,畢竟目標不同,爲了解決這樣的問題,做者在預測當前詞的時候引入了當前詞的位置信息,例如在預測b2時除了用到a1和c3還會把它的位置信息一塊兒傳進來,可是你在預測下一個詞的時候,你不只要用到上一個詞的位置信息,還須要將上一個詞的詞信息也加進來,這句話看上去有點難理解,咱們來看看公式,就很明確了:
在這裏$g_{z_t}^{(m)}$表示的是引入了以前的時刻的全部信息和當前時刻的位置信息的隱層向量,就如前面的a1,c3和位置2的信息,用來預測b2。可是這個公式中含有一個$h_{z_{<t}}^{(m-1)}$,這是以前全部時刻的隱藏信息,爲了保證在$g_{z_{t+1}}^{(m)}$時能使用$h_{z_{<t+1}}^{(m-1)}$,咱們要另外去計算這樣一個h,由於這個h是對t時刻及以前全部的信息編碼獲得的,也就是說這裏的h是包括t時刻的位置和詞的信息,如在上面序列1中,此時你要預測d4,你是須要對a1,c3,b2編碼的,但咱們在計算$g_{z_t}^{(m)}$沒用到b2的詞信息。也就是這樣的不一致,做者提出了雙流attention機制,具體的圖示以下:
如上圖最右邊的圖中所示,實現起來就是mask不太同樣,一上面的爲例由於序列爲3,2,4,1。所以在計算詞1時,g(query stream)只能看到3,2,4;而h(content stream)能看到3,2,4,1。在計算詞2時,g能看到3;h能看到2,3。
另外g的提出主要是爲了訓練預訓練模型,由於你在預測當前詞時,是要mask當前詞(這個mask是不可避免的,這是語言模型的特性,利用上文預測當前詞),可是在下游任務的時候,咱們是不會mask任何詞的,所以在下游任務時咱們只須要使用content stream的值就好了。
總的來講,XL-Net這種方法很優雅的引入雙向上下文信息,可是在實現上計算量很大,由於你要計算不少排序的序列才能使得指望上每一個詞出現的次數基本一致,爲了下降計算量,做者在這裏只對排序後的句子的後半段的詞作預測,由於後半段的詞的前面的詞比較多,這樣看到的詞會多一些,可能很快的達到指望一致。
Incorporating Ideas from Transformer-XL
和上面講到的Transformer-XL基本一致,能夠說是直接引入了Transformer-XL的架構。
Modeling Multiple Segments
由於不少的下游任務是兩個片斷,甚至多個片斷輸入,所以XL-Net也引入了片斷對的輸入方式。不過輸入的方式和bert稍有不一樣,其輸入順序爲:[A, SEP, B, SEP, CLS],在這裏將CLS放在最後,主要是由於XL-Net是從前日後預測,所以CLS放在最後能夠看到全部的詞,所涵蓋的信息就更多充分。另外就是這裏的segment編碼也是採用的相對位置編碼,理解起來很簡單,再也不贅述。
XL-Net在不少數據集上都取得了當前最佳的性能,如在SQuAD數據集上
在GLUE數據集上:
XL-Net仍是很是具備創新價值的,較以前在bert的基礎上作一些調整的模型來講,它的意義是不同的。