前面介紹過Transformer作為一種特征抽取器的強大之處痹籍。那么,它有沒有弱點呢晦鞋?能不能改進呢蹲缠?
本文介紹Transformer的改進版,TransformerXL悠垛∠叨ǎ看看它用了什么方法,改進了Transformer的哪些弱點确买。
作者 | 小Dream哥
編輯 | 言有三
1 原始Transformer哪里不好渔肩?
在上一篇“理解NLP中網(wǎng)紅特征抽取器Transformer”中,筆者介紹了Transformer的強大之處拇惋。那么周偎,Transformer就已經(jīng)強大到無懈可擊了嗎?其實不然撑帖,Transformer還有它的弱點蓉坎。
細想一下,BERT在應用Transformer時胡嘿,有一個參數(shù)sequence length蛉艾,也就是BERT在訓練和預測時,每次接受的輸入是固定長度的衷敌。那么勿侯,怎么輸入語料進行訓練時最理想的呢?當然是將一個完整的段落一次性輸入缴罗,進行特征提取了助琐。但是現(xiàn)實是殘酷的,這么大的Transformer面氓,內存是消耗不起的兵钮。所以現(xiàn)有的做法是蛆橡,對段落按照segment進行分隔。在訓練時掘譬,當輸入segment序列比sequence length短時泰演,就做padding;當輸入segment序列比sequence length長時就做切割葱轩。
這種做法顯然是一種權宜之計睦焕,它有這么兩個缺點:
1)長句子切割必然會造成語義的殘破,不利于模型的訓練靴拱。
2)segment的切割沒有考慮語義垃喊,也就是模型在訓練當前segment時拿不到前面時刻segment的信息,造成了語義的分隔缭嫡。
那么缔御,該如何解決上述問題呢抬闷?看看TransformerXL吧妇蛀。
2 TransformerXL的引入
我們先想一下,如果要我們自己來解決Transformer上面的問題笤成,會怎么處理呢评架?
熟悉NLP的同學,可能會想到RNN炕泳。在RNN中纵诞,為了獲取序列中的歷史記憶,采用了Recurrence機制培遵,在計算該時刻的狀態(tài)時浙芙,引入前一時刻的狀態(tài)作為輸入。那對Transformer來說籽腕,在計算當前序列的隱藏狀態(tài)時嗡呼,引入前一個序列的隱藏狀態(tài)信息不就可以解決上面的問題了嗎?
事情真的有這么簡單嗎皇耗?其實南窗,基本上也就是這么簡單,不過TransformerXL在引入時做了一些巧妙的設計郎楼。下面我們看看万伤,TransformerXL是如何引入這種Recurrence機制來解決上述問題的。
如圖所示呜袁,是傳統(tǒng)的Transformer在訓練和評估階段采用的語料輸入策略敌买。在訓練時,將整個語料庫分割成可管理的大小的更短的片段阶界,在每個片段中訓練模型放妈,忽略來自前一段的所有上下文信息北救;在評估階段,傳統(tǒng)的Transformer模型在每個步驟都消耗與訓練期間相同長度的一個segment芜抒。然后珍策,在下一步中,這個segment向右移動一個位置宅倒,并從頭開始處理攘宙,只在最后一個位置進行一次預測。
如上圖所示拐迁,在TransformerXL采用了不同的策略蹭劈,在訓練過程中,對上一個segment計算的隱藏狀態(tài)序列進行固定和緩存线召,并在模型處理下一個新的segment時對其進行利用铺韧。在評估階段,可以重用前面部分的表示缓淹,而不是像傳統(tǒng)模型那樣從頭開始計算哈打,這樣可以提高速度。
3 TransformerXL Recurrence機制
那么讯壶,上述的機制細節(jié)如何實現(xiàn)的呢料仗?下面我們來做一個詳細的介紹。
事實上伏蚊,問題的關鍵在于立轧,在計算當前序列當前層的隱藏狀態(tài)時,如何引入前一個序列上一層的隱藏狀態(tài)躏吊。TransformerXL的做法很簡單氛改,就是按照序列長度的維度將他們concate起來。如下的公式所示:
h_n_t是一個L*d的矩陣比伏,表示的是第t個輸入序列的第n層的隱藏層的狀態(tài)胜卤。L表示序列長度,d表示嵌入維度凳怨。
SG表示的Stop Gradient瑰艘,這非常重要,避免了RNN會出現(xiàn)的一系列問題肤舞。
從上述公式可以看出紫新,TransformerXL與傳統(tǒng)的Transformer的差異主要在于隱藏層輸入K和V的差異。TransformerXL中引入了上一個序列前一個隱藏層的值李剖,將他們concatenate起來芒率,計算新的K和V。
4 Relative Positional Encodings
我們再想一想篙顺,引入上述機制偶芍,還有什么問題沒有充择。我們回想一下,在傳統(tǒng)的Transformer中匪蟀,輸入序列中的位置信息是怎么表示的椎麦?通過POS函數(shù)生成,它是位置i和維度d的函數(shù)材彪,也就是不同輸入segment在相同絕對位置中的位置表示是相同的观挎。在傳統(tǒng)的Transformer中,每個segment之間的表示是沒有關聯(lián)的段化,這當然就沒有問題嘁捷。但是在TransformerXL中,因為引入了前一時刻segment的信息显熏,就需要對不同時刻雄嚣,同樣是第i個的詞進行區(qū)分。
TransformerXL引入了一種Relative Positional Encodings機制喘蟆,會根據(jù)詞之間的相對距離而非像傳統(tǒng)的Transformer中的絕對位置進行編碼缓升。
在傳統(tǒng)的Transformer中,計算q_i和鍵k_j之間的attention分數(shù)的方式為
展開就是:
Exi是詞i的embedding履肃,Exj是詞j的embedding仔沿,Ui 和Uj 是位置向量坐桩。
在Transformer-XL中尺棋,對上述的attention計算方式進行了變換,轉為相對位置的計算绵跷,而且不僅僅在第一層這么計算膘螟,在每一層都是這樣計算。
對比來看碾局,主要有三點變化:
1)在b和d這兩項中荆残,將所有絕對位置向量Ui,Uj都轉為相對位置向量Ri?j净当,與Transformer一樣内斯,這是一個固定的編碼向量,不需要學習像啼。
2)在c這一項中俘闯,將查詢的U_i^T*W_q^T向量轉為一個需要學習的參數(shù)向量u,因為在考慮相對位置的時候忽冻,不需要查詢絕對位置i真朗,因此對于任意的i,都可以采用同樣的向量僧诚。同理遮婶,在d這一項中蝗碎,也將查詢的U_i^T*W_q^T向量轉為另一個需要學習的參數(shù)向量v。
3)將K的權重變換矩陣Wk轉為Wk_E?和Wk_R旗扑,分別作為content-based key vectors和location-based key vectors蹦骑。
總的來說,Relative Positional Encodings就是在計算attention分數(shù)時臀防,用相對位置R_i_j編碼來代替原來的絕對位置編碼Ui和Uj脊串。并且學習了相對位置v和u用來調整不同距離和不同嵌入的得分。
5 總結
總的來說TransformerXL對Transformer進行了一些調整清钥,試圖解決一些問題琼锋。按照論文的描述,TransformerXL學習的依賴關系比RNN長80%祟昭,比傳統(tǒng)Transformer長450%缕坎,在短序列和長序列上都獲得了更好的性能,并且在評估階段比傳統(tǒng)Transformer快1800+倍篡悟。
在XLnet中引入了Transformer-XL谜叹,獲得了不錯的效果。
TransformerXL是Transformer一種非常重要的改進搬葬,思想值得我們好好學習和研究荷腊,希望對你有所幫助。