NewBeeNLP 永遠有料,永遠有趣 194篇原創內容 公眾號 最近又重新讀了Transformer-XL和XLNet的論文和代碼,又有很多新的感悟。其中,要想搞懂XLNet的同學一定要首先明白Transofrmer-XL,因為XLNet是基于Transformer-XL進行改進的。
Transformer-XL論文全稱及連接:《Transformer-xl: Attentive language models beyond a fixed-length context[1]》 項目地址:https://github.com/kimiyoung/transformer-xl Vanilla Transformer語言模型Transformer結構第一次提出來是用于機器翻譯任務,提出后自然有個想法:「Transformer結構能不能用于訓練語言模型?」 答案是肯定的。RNN、LSTM等網絡結構訓練語言模型的最大缺點在于容易梯度消失,難以學習長期依賴,但是Transformer沒有合格缺點,因為它沒有沿時間線進行橫向傳播的過程,這樣來說,Transformer很適合訓練語言模型。 怎么訓練?很簡單,舉個例子,假如現在我們有一句話包含100個token,在預測第一個token的時候,我們把其它的99個token進行attention mask掉,只輸入一個開始標記,讓模型預測第一個token;在預測第二個token的時候,把剩下的98個token attention mask掉,只讓模型看見開始標記和第一個token;在預測第三個token的時候,把剩下的97個token attention mask掉,只讓模型看見開始標記和前兩個token。。。損失函數為真實token和預測token的交叉熵,這樣模型不斷學習,不斷更新參數,就訓練得到一個語言模型了。 想想這樣有個什么問題?問題就是真實的文本可沒有只包含100個token這么少。舉個例子,假設我現在手頭有個文章是包含4000個token的,那我就要把這4000個token都作為輸入,原理上可以這么做,但實際上,輸入的token很多的情況下,中間層attention的計算資源會爆炸。 Vanilla Transformer的做法是「切片」,如把4000個token切成8段,每段包含500個token,再對每段進行獨立的訓練,也即在第二段訓練的時候,是看不到第一段的信息的,這樣導致的問題就是「上下文碎片問題(context fragmentation problem)」,由于切片長度限制,模型并不能學習到足夠常的依賴信息,這樣會大大損害學習出來的語言模型的性能。 在評估時,為了能利用訓練時的最長上下文信息,是每個時間步向右移動一個token,導致的結構是評估耗費的計算資源很大。 改進點「改進點一:循環機制」 在計算每個segment的時候,通過緩存上一個segment的信息,把前面segment的信息也考慮進正向傳播過程中(上一個segment的信息雖然參與正向傳播,但上一個segment是不會參與反向傳播的)。具體的看,下面的式子, 這里的 指的是Transformer第n-1層的第 個segmetn的Encoder的輸出,把它與Transformer第n層的第 的encoder的輸出沿著時間軸拼接在一起,SG表示stop-gradient,即前一個segmetn的信息只參與正向傳播,并不會用到反向傳。另外,在計算查詢矩陣q時,只會用當前segmetn來計算得到;只有在計算鍵值向量時,才會用到拼接的segmetn向量。 這樣的做法,能大大緩解上下文碎片的問題,舉個例子,假設Transformer的encoder一共有4層,每個segment為500個token。根據循環機制的原理,第4層的第 個segmetn的輸出不僅考慮了第三層encoder的第 個encoder的輸出,也考慮了第 個encdoer的輸出,而第 個encdoer的輸出,不僅考慮了第二層encoder的第 個encdoer的輸出,也考慮了第 個encdoer的輸出,也即,上下文的最大依賴長度是線性增加的,如O(N*L),如這里所說的例子,雖然,一個segmetn是500個token,但其實在最后輸出時,足足考慮了4 * 500 = 2000個token這么多!上下文碎片的問題也就自然得到了大大的緩解了。 另外,在評估時,由于采用了循環機制,我們就不必每次只向右移動一步了,而且可以采用同訓練時候差不多的片段機制,從而大大提高了評估效率。 「改進點二:相對位置編碼」 上面所說的循環機制還有個問題待解決,就是位置編碼,我們知道,原生的Transformer使用的是絕對位置編碼,但絕對位置編碼跟循環機制結合會導致一個問題,舉個例子,我們在計算第 的輸出時,不僅考慮了第 個片段的輸入,還考慮了第 個片段的輸入,假設我們采用絕對位置編碼,那第 個片段和 個片段的第1個token的位置編碼是一樣的,但這是明顯的不合理的。因此,作者提出了一種相對位置編碼的思想。 具體的,原生的絕對位置編碼在計算attention時,如下式所示, 采用相對位置編碼,
通常這樣的變換,上面的每一項都有其相應的意義
把循環機制和相對位置編碼的信息合并后,Transformer-XL的最終形態 Transformer-XL不足及與BERT的對比Transformer-XL這篇論文為什么沒有被ICLR接受,我認為主要是因為并沒有與當前一些基于Transformer的模型,如BERT等對比,并沒有在具體的NLP任務如分類、QA等應用進行實踐。論文里只是簡單提了Transformer-XL在文本生成(由于Transformer-XL是語言模型,所以用于文本生成很自然)、無監督特征學習等都有前景,并沒有給出在某些具體的GLUE等的表現,所以略顯單薄。 不少人都說Transformer-XL能有效解決BERT的長度限制問題,確實,Transformer-XL是不限制文本長度的,它的預訓練模式是語言模型的訓練目標,通過循環機制和相對編碼,可以接受無限長的輸入文本。應用到下游任務也很簡單,如文本分類可以用最后一個token的輸出再接一些前連接層來做分類,序列標注任務也可以用每個token的輸出再接一些網絡。 為什么BERT是有長度限制?因為在預訓練的時候,就把輸入長度限制在512,BERT會把1~512位置映射到一個position embedding,沒有512以上的position embedding。我們當然也可以重頭預訓練一個最大長度為1000的BERT,但會很耗資源。 Transformer-XL輸入是沒有position embedding的,相對位置信息是加在每個層encoder的attention計算中。除此之外,Transformer-XL預訓練是只利用了單項信息,BERT是利用了雙向的上下文編碼,所以可以期待對于短文本,Transformer-XL是打不過BERT的,長文本的話還有一點可能。 XLNet論文全稱及連接:《XLNet: Generalized Autoregressive Pretraining for Language Understanding[2]》 項目地址:https://github.com/huggingface/transformers/blob/master/src/transformers/models/xlnet/modeling_xlnet.py XLNet的源碼我沒有看作者發的tensorflow版本,而是看的huggingface的pytorch版本。 AR & AE「自回歸語言模型(Autoregressive LM)」
「自編碼語言模型(Autoencoder LM)」
Permutation Language ModelingXLNET的終極目的就是結合自回歸語言模型和自編碼語言模型的優點,提出了排列語言模型。具體的,看下圖 假設我們現在要預測第3個token。正常的語言模型的序列是1 -> 2 -> 3 -> 4,我們對其做「排列組合」,排列方式應該有4!=24種,上圖舉例了其中的4種,如第一種3 -> 2 -> 4 -> 1,這樣排列的話,3是看不到2和4和1的,只能看到上一個segment的輸入(這里可以先不不用理,下面會說,XLNet利用了Transformer-XL的思想,所以會有上一個segment作為mem的概念),通過排列,在預測token3的時候,總會有一些排列能考慮到1、2、4,窮舉排列,一起訓練,這樣的話,模型能將3上下文的信息都能學到。 注意的是,實際在預訓練時,并非真的排列,如2 -> 4 -> 3 -> 1,并不是排成這個序列,而是利用attention mask的思想來近似作用這種排列,就是把token1 mask掉,因為按照這個排列,token3應該是看不到token1的,利用這種attention mask的思想來近似實現排列。 雙流自注意力根據上面的思想,又引出了一個問題,舉個例子I love New York這四個token,現在有兩個序列1-> 2 -> 3 ->4和1-> 2 -> 4 ->3,現在假設已經知道前面兩個token是I love,要預測下一個token,很明顯,在兩個序列中,下一個token為New的概率都是一樣的,這是非常不合理的,因為下一個token的位置是不一樣的,并沒有把位置信息考慮進去。因此,作者提出了一種雙流自注意力。
借此,提出兩種自注意流
加入位置作為預測信息后,預測下一個token的概率變成 初始化第一層 ,其中 為一個可訓練的向量, 為相應的詞嵌入。兩種Attention在接下來每層的構造 在fine tuning應用于下游任務時,把 挪走,只保留 。 與Transformer-XL的結合這里就是把Transformer-XL的循環機制和相對位置編碼引進XLNet中,值得注意的是,Permutation只爭對當前的segment,上一個segment的排序是原文本的順序排列。 多個Segments的輸入像BERT之類的模型,輸入是可以是一對文本,這樣的預訓練方式可以適應輸入為不止一個句子的下游任務。XLNet采用了一個相對Segment編碼的方式來解決輸入多個句子的問題。分別用兩個segment編碼 和 ,其中 和 是每層endoer可以學習的參數,把他們也加進去attention的計算中,,這里 為查詢向量, 為可學習的編制,當兩個token不是來源于同一句時,=,當來自同一句時,。 想想這樣做的好處?好處就是XLNet不再限制輸入的為一對句子對,而是可以超過兩個以上句子作為輸入,因為XLNet不像BERT一樣,輸入時的segment embedding只能為0或1再映射到一個向量加入到input中,XLNet不是在輸入層映射到0和1,而是在每一層encoder通過引入segmetn編碼,來處理多個句子輸入的問題。 實驗結果值得注意的是,XLNet相對于BERT使用了更多的訓練預料,由于是晚于BERT出來的模型,自然效果是比BERT要好的,與BERT 的比較 與RoBERTa的比較 一起交流 |
|