# XLNET
###### tags: `paper`
https://medium.com/ai-academy-taiwan/2019-nlp%E6%9C%80%E5%BC%B7%E6%A8%A1%E5%9E%8B-xlnet-ac728b400de3
https://zhuanlan.zhihu.com/p/70257427
https://www.mdeditor.tw/pl/pkxA/zh-tw
https://carlos9310.github.io/2019/11/11/transformer-xl-and-xlnet/#xlnet
## AutoRegressive(AR):
-------------------
又稱自迴歸,即給定一段Sequence {x1,x2,…,xt}, 在Pre-train時使用{x1}預測x2,接著使用{x1,x2}預測x3,直到最後使用{x1,…,xt-1}預測xt,這種性質的模型往往都認為下一個字的出現依賴於上文
EX:GPT,elmo
也就是找出一個參數θ最大化{x1,x2,…,xt}的log-likelihood (Eq.1)。
## AutoEncoding(AE):
-----------------
又稱自編碼,這種模型的早期的提出是為了降維
而常見的降噪例如說音訊雜質或是圖片的污點等等,而在Pre-train模型中首次有使用到DAE的模型就是BERT的**MLM**(Masked Language Model)
然後再還原的作法可以視為一種DAE
但是作者認為Mask只有在Pre-train時會用到,在Finetune時就完全不會用到,這會造成Pre-train和Finetune之間資訊不對稱的問題(Input noise),而這也是XLNet想要解決的方向
另外BERT隨機將15%的token使用**<Mask>**,若當一個Sequence要預測的**<Mask>**有兩個以上時,以BERT的訓練方式是同時輸出**<Mask>**的位置,這會造成**<Mask>**之間相互獨立的現象
但是在BERT的訓練方式則是用{x1,x2,x5}來一起預測{x3,x4}
所以說為了解決這個情況,必須套用AR的想法,先預測x3再預測x4。(動機)
## related work
之前採用permutation-based AR 都目標是要提升density estimation(藉由orderness)(?)
## Permutation Language Modeling
=============================
XLNet的想法就是要使用AR的方式來預測單詞,又要能在不使用Mask token的前提下學習到上下文的資訊,所以XLNet提出的Permutation Language Modeling(PLM),即使用permutation實現上下文對於單詞的預測,其實訓練方式還是transfomer的self-attention,只是對輸入與attention matrix進行一點修飾。
即先做一次隨機排列 Ex:x1,x2,x3,x4 -> x2,x4,x3,x1
然後隨機選一個target作為預測目標
注意:並不會每當你排列一次,都要記錄當前的排列前後的對照,然後在預測完後依照dictionary排回來,所以作者選擇在不更動原始Sequence順序的前提下,使用mask實現AR+permutation。

## Two-Stream Self-Attention
=========================
筆者前面介紹了PLM如何捕捉上下文,但是還沒解決如何取代<Mask>這個token,在BERT中,**<Mask>**告訴了模型要預測的**單詞位置**還有**前後文關係**,而在XLNet則是用Two-Stream Self-Attention來實現這兩種目的,分別是Conten stream以及Query stream:
只拿position而不是content是因為如果拿content就會變成Non-trivial
Non-trivial就是具有一定复杂度
only predict the last tokens in a factorization order
整個XLNet在Pre-train時分為兩個stream,Content stream負責學習上下文,而Query stream這個角色就是用來代替**<Mask>**token,其負責把Content stream產生的representation拿來做預測,如同BERT的**<Mask>**一樣,Query stream只有在Pre-train時預測單詞會用到,到了Finetune時就不會用到了,以下介紹這兩個stream的作法:
### Content Stream
--------------
Content Stream是一個標準的self-attention


### Query Stream
--------------
Query Stream負責在Pre-train擔任預測單詞的作用
因為在預測單詞時不允許模型看到當前的token是什麼,所以作者在這邊另外設置一個representation g來去attend其他位置
Query stream會把當前t位置的attention weight mask掉。

差別:query時會把自己mask掉
query時就是跟content時一樣只是去掉自己
各位會發現Query Stream為了防止模型看到當前的token,會把對角線的attention weight mask掉
針對Query stream有一個需要注意的地方,也就是PLM會造成預測一對多的情形
計算時會告知模型預測(答案)位置(ZT)
(為one-hot vector)即只有該位置為1 其餘項目都為0
## Long Text Understanding
=======================
為了讓模型有大型文本的學習能力,借鑑[Transformer-XL](https://arxiv.org/abs/1901.02860)的Segment recurrence mechanism和Relative positional encoding的方法,
## Segment recurrence mechanism
- 引入memory模組(cache之前一個或多個segment的隱狀態資訊),迴圈建模片段間的聯絡
- 使超長距離依賴關係的編碼成為可能
- 使得片段之間產生互動,解決了上下文碎片化問題
當模型處理下一個新段(segment)時,前一段序列中的隱狀態資訊被固定並快取,作為擴充套件上下文重用
除了獲得超長的上下文並解決了碎片問題,遞迴方案的另一個好處是評估速度明顯加快,其可重複使用先前segment的表示,不必像圖1中那樣從頭開始計算
### Relative Positional Encodings
recurrent機制使得先前的絕對位置編碼方案不再適用,因為在多個segment中會出現多個同樣的位置資訊。 為此,作者們提出一種新的相對位置編碼形式。其不僅與絕對位置一一對應,而且具有更好的泛化性。
有2個位置變數i,j 如果 i,j是在同個segment 則sij=s+ or s- 其中 s+,s-為要學的參數
代表只在乎這2個位置(i,j)是否在同個segment 而不是在segment中的哪個位置 此為relative encoding的 core idea: modeling the relationships between positions
優點:
1. improves generalization
2.可以finetune 當有2個以上的input segment時
## partial prediction
因為不像MLM只用預測部分token,還需要計算permutation,XLNet的計算量更大了,因此作者提出了partial prediction進行簡化,即只預測後面1/K個token。

## ablation study
所以为了验证A、B两个模块是不是真的都有用,你需要做ablation study。方法也很简单:
1. 在baseline的基础上加上模块A,看效果。
2. 在baseline的基础上加上模块B,看效果。
3. 在baseline的基础上同时加上模块AB,看效果。
## conclusion
XLNet最主要的貢獻在於使用PLM讓AR和learning bidirectional contexts共存,並另外使用一個Query stream來代替BERT的<Mask>
接著借鑑Transformer-XL實現大型文本學習
最令筆者驚嘆和在意的還是PLM與AR之間的衝突
因為PLM會隨機把單詞順序打亂而AR的預測方式是有順序性的
單詞順序在XLNet眼前感覺根本沒必要,只需要Attention搭配預測Target
就能夠無視單詞順序之間的關係
### 問題
XLNET缺點為何 為何現在不用了
感覺只是因為更好的出現了 BART AutoRegressive decoder
並且bart的noising也有permulaltion這個參考xlnet的
為何需要加位置 bert attention機制
把參數量跟甚麼同步 : and same data
SPANBASAE PRED
BIDERCTIONAL DATA :where each of the forward and backward directions takes half of the batch size