在Transformer-XL中,因爲設計了segments,若是仍採用transformer模型中的絕對位置編碼的話,將不能區分處不一樣segments內一樣相對位置的詞的前後順序。html
好比對於$segment_i$的第k個token,和$segment_j$的第k個token的絕對位置編碼是徹底相同的。算法
鑑於這樣的問題,transformer-XL中採用了相對位置編碼。ide
paper中,由對絕對位置編碼變換推導出新的相對位置編碼方式。函數
它對每一個index的token都經過sin/cos變換,爲其惟一指定了一個位置編碼。該位置編碼將與input的embedding求sum以後做爲transformer的input。學習
那麼若是將該位置編碼應用在transformer-xl會怎樣呢?優化
其中$\tau$表示第$\tau$個segment, 是當前segment的序列$s_{\tau}$的word embedding sequence, $L$是序列長,$d$是每一個word embedding的維度。$U_{1:L}$表示該segment中每一個token的絕對位置編碼組成的序列。編碼
能夠看到對於$h_{\tau + 1}$和$h_{\tau}$,其在位置編碼表示是徹底相同的,都是$U_{1:L}$,這樣就會形成motivation中所述的沒法區分在不一樣segments中相對位置相同的tokens.spa
transformer-xl中沒有采用vanilla transformer中的將位置編碼靜態地與embedding結合的方式;而是沿用了shaw et al.2018的相對位置編碼中經過將位置信息注入到求Attention score的過程當中,即將相對位置信息編碼入hidden state中。設計
爲何要這麼作呢?paper中給出的解釋是:code
1) 位置編碼在概念上講,是爲模型提供了時間線索或者說是關於如何收集信息的"bias"。出於一樣的目的,除了能夠在初始的embedding中加入這樣的統計上的bias, 也能夠在計算每層的Attention score時加入一樣的信息。
2) 以相對而非絕對的方式定義時間誤差更爲直觀和通用。好比對於一個query vector $q_{\tau,i}$ 與 key vectors $k_{\tau, \leq i}$作attention時,這個query 並不須要知道每個key vector在序列中的絕對的位置來決定segment的時序。它只須要知道每一對$k_{\tau,j}$ 和其自己$q_{\tau,i}$的相對距離(好比,i - j)就足夠。
所以,在實際中能夠建立一個相對位置編碼的encodings矩陣 $R \in \mathbb{R} ^ {L_{max} \times d}$,其中第i行 $R_i$表示兩個pos(好比位置pos_q, pos_k)之間的相對距離爲i. (能夠參考我在參考連接3中的介紹,如下圖示即是一個簡單的說明例子.
可是圖示中的i表示query的位置pos, 與$R_i$ 中的i不一樣。若是以該圖示爲例,當pos_q = i, pos_k = i - 4時, 相對位置爲 0, 兩者的相對位置編碼是 $R_0$。
--------------------------------------------------------------------------------------------------
Transformer-XL的相對位置編碼方式是對Shaw et al.,2018 和 Huang et al.2018提出模型的改進。它由採用絕對編碼計算Attention score的表達式出發,進行了改進3項改變。
若採用絕對位置編碼,hidden state的表達式爲:
,
那麼對應的query,key的attention score表達式爲:
(應用乘法分配率, query的embedding 分別與 key的embedding, positional encoding相乘相加;以後 query的positional encoding分別與 key的embedding, positional encoding相乘相加)
(其中i是query的位置index,j是key的位置index) (WE, WU是對embedding進行linear projection的表示,細節內容能夠參看attention is all you need 中對multi-head attention的介紹)
,
Transformer-XL 對上式進行了改進:
首先將 $A_{i, j} ^ {abs}$ 中的key vector的絕對位置編碼 $U_j$ 替換爲了相對位置編碼 $R_{i - j}$ 其中 $R$是一個沒有須要學習的參數的sinusoid encoding matrix,如同Vaswani et al., 2017提出的同樣。
該改進既能夠避免不一樣segments之間因爲tokens在各自segment的index相同而產生的時序衝突的問題。
在改進1中將key的絕對位置編碼轉換爲相對位置編碼,在改進2中則對query的絕對位置編碼進行了替換。由於不管query在序列中的絕對位置如何,其相對於自身的相對位置都是同樣的。這說明attention bias的計算與query在序列中的絕對位置無關,應當保持不變. 因此這裏將$A_{i, j} ^ {abs}$ 中的c,d項中的$U_i^{T} W_q ^ {T}$分別用一個可學習參數$u \in \mathbb{R}^d$,$v \in \mathbb{R}^d$替換。
在vanilla transformer模型中,對query, key分別進行線性映射時,query 對應$W_q$矩陣,key對應$W_k$矩陣,因爲input 是 embedding 與 positional encoding的相加,也就至關於
$query_{embedding} W_q + query_{pos encoding} W_q$獲得query的線性映射後的表徵;
$key_{embedding} W_q + key_{pos encoding} W_q$ 獲得key的線性映射後的表徵。
能夠看出,在vanilla transformer中對於embedding和positional encoding都是採用的一樣的線性變換。
在改進3中,則將key的embedding和positional encoding 分別採用了不一樣的線性變換。其中$W_{k,E}$對應於key的embedding線性映射矩陣,$W_{k,R}$對應與key的positional encoding的線性映射矩陣。
在這樣的參數化定義後,每一項都有了一個直觀上的表徵含義,(a)表示基於內容content的表徵,(b)表示基於content的位置偏置,(c)表示全局的content的偏置,(d)表示全局的位置偏置。
shaw的RPR能夠參考我在參考連接3中的介紹。這裏給出論文中的表達式:其中$a_{i,j}$是query i, key j的相對位置編碼矩陣$A$中的對應編碼。
attention score: (在key的表徵中加入相對位置信息)
softmax計算權值係數:
attention score * (value + 的output:(在value的表徵中加入相對位置信息)
1) 對於$e_{ij}$能夠用乘法分配率拆解來看,那麼其至關於transforerm-xl中的(a)(b)兩項。也就是在shaw的模型中未考慮加入(c)(d)項的全局內容偏置和全局位置偏置。
2) 仍是拆解$e_{ij}$來看,涉及到一項爲$x_iW^Q(a_{ij}^K)^T$,是直接用 query的線性映射後的表徵 與 相對位置編碼相乘;而在transformer-xl中,則是與query的線性映射後的表徵 與 相對位置編碼也進行線性映射後的表徵 相乘。
paper中指出,shaw et al用單一的相對位置編碼矩陣 與 transformer-xl中的$W_kR$相比,丟失掉了在原始的 sinusoid positional encoding (Vaswani et al., 2017)中的概括偏置。而XL中的這種表徵方式則能夠更好地利用sinusoid 的inductive bias。
----------------------------爲何XL中的這種表徵方式則能夠更好地利用sinusoid 的inductive bias?--------------------------------------------------------------------
有幾個問題:原始的 sinusoid positional encoding (Vaswani et al., 2017)中的概括偏置是什麼呢?爲何shaw et al 把它丟失了呢?爲何transformer-xl能夠適用呢?
這裏須要搞清楚:
1. 爲何在vanilla transformer中使用sinusoid?
2. shaw et al.2018中的相對位置編碼Tensor是什麼?
3. transformer-xl的相對位置編碼矩陣是什麼?
對於1,sinusoid函數具備並不受限於序列長度仍能夠較好表示位置信息的特色。
We chose the sinusoidal version because it may allow the model to extrapolate to sequence lengths longer than the ones encountered during training. ~Attention is all you need.
爲何不用學得參數而採用sinusoid函數呢?sinusoidal函數並不受限於序列長度,其能夠在遇到訓練集中未出現過的序列長度時仍能很好的「extrapolate.」 (外推),這體現了其具備一些inductive bias。
對於2,shaw et al.2018中的相對位置編碼Tensor是兩個須要參數學習的tensor.
相對位置編碼矩陣是設定長度爲 2K + 1的(K是窗口大小) ,維度爲$d_a$的2個tensor(分別對應與key的RPR和value的RPR),其第i行表示相對距離爲i的query,key(或是query, value)的相對位置編碼。這兩個tensor的參數都是須要訓練學習的。那麼顯然其是受限於最大長度的。在RPR中規定了截斷的窗口大小,在遇到超出窗口大小的狀況時,因爲直接被截斷而可能丟失信息。
對於3,transformer-xl的相對位置編碼矩陣是一個sinusoid矩陣,不須要參數學習。
在transformer-xl中雖然也是引入了相對位置編碼矩陣,可是這個矩陣不一樣於shaw et al.2018。該矩陣$R_{i,j}$是一個sinusoid encoding 的矩陣(sinusoid 是借鑑的vanilla transformer中的),不涉及參數的學習。
具體實現能夠參看代碼,這裏展現了pytorch版本的位置編碼的代碼:
1 class PositionalEmbedding(nn.Module): 2 def __init__(self, demb): 3 super(PositionalEmbedding, self).__init__() 4 5 self.demb = demb 6 7 inv_freq = 1 / (10000 ** (torch.arange(0.0, demb, 2.0) / demb)) 8 self.register_buffer('inv_freq', inv_freq) 9 10 def forward(self, pos_seq, bsz=None): 11 sinusoid_inp = torch.ger(pos_seq, self.inv_freq) 12 pos_emb = torch.cat([sinusoid_inp.sin(), sinusoid_inp.cos()], dim=-1) 13 14 if bsz is not None: 15 return pos_emb[:,None,:].expand(-1, bsz, -1) 16 else: 17 return pos_emb[:,None,:]
其中$demb$是embedding的維度。
sinusoid的shape:[batch_size, seq_length × (d_emb / 2)]
sin,cos concat以後,pos_emb的shape:[batch_size, seq_length × d_emb]
pos_emb[:,None,:]以後的shape:[batch_size, 1, seq_length × d_emb]
那麼綜合起來看,transformer-xl的模型的hidden states表達式爲:
在該表達式中,在計算$W_{k,R}R_{i-j}$時,須要對每一對(i,j)進行計算,時間複雜度是$O(n^2)$。paper中提出了高效的計算方法,使其降爲$O(n).$
核心算法:發現(b)項組成的矩陣的行列之間的關係,構建一個矩陣,將其按行左移,剛好是(b)項矩陣$B$,而所構建的矩陣只須要$O(n)$時間。
因爲相對距離(i-j)的變化範圍是[0, M + L - 1] (其中M是memory的長度,L是當前segment的長度)
那麼令:
那麼將(b)項應用與全部的(i,j)可得一個$L \times (M + L)$的矩陣 $B$: (其中q是對E通過$W_q$映射變換後的表示)
看這些帶紅線的部分,是否是隻有q的下標不同!
若是咱們定義$\widetilde{B}$:
對比$B$與$\widetilde{B}$發現,將$\widetilde{B}$的第i行左移 $L - 1 - i$個單位即爲$B$。而$\widetilde{B}$的計算僅涉及到兩個矩陣的相乘,所以$B$的計算也僅須要求$qQ^T$以後按行左移便可獲得,時間複雜度降爲$O(n)$!
同理,能夠求(d)項的矩陣D。
這樣將B,D本來須要$O(n^2)$的複雜度,降爲了$O(n)$.
Transformer-XL針對其須要對segment中相對位置的token加入位置信息的特色,將vanilla transformer中的絕對位置編碼方式,改進爲相對位置編碼。改進中涉及到位置編碼矩陣的替換、query全局向量替換、以及爲key的相對位置編碼和embedding分別採用了不一樣的線性映射矩陣W。
transformer-xl與shaw et al.2018的相對編碼方式亦有區別。1. shaw et al.2018的相對編碼矩陣是一個須要學習參數的tensor,受限於相對距離的窗口長度設置;而transformer-xl的相對編碼矩陣是一個無需參數學習的使用sinusoid表示的矩陣,能夠更好的generalize到訓練集中未出現長度的長序列中;2. 相比與shaw et al.2018,transformer-xl的attention score中引入了基於content的bias,和基於位置的bias。
另外在計算優化上,transformer-xl提出了一種高效計算(b)(d)矩陣運算的方法。經過構造能夠在$O(n)$時間內計算的新矩陣,並將其項左移構建出目標矩陣B,D的計算方式,將時間複雜度由$O(n^2)$降爲$O(n)$。
參考:
1. Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context: https://arxiv.org/pdf/1901.02860.pdf
2. Self-Attention with Relative Position Representations (shaw et al.2018): https://arxiv.org/pdf/1803.02155.pdf
3. [NLP] 相對位置編碼(一) Relative Position Representatitons (RPR) - Transformer http://www.javashuo.com/article/p-xxjunqlz-ee.html
[支付寶] 感謝您的捐贈!
That's been one of my mantras - focus and simplicity. Simple can be harder than complex: you have to work hard to get your thinking clean to make it simple. But it's worth it in the end beacuse once you get there, you can move mountains. ~ Steve Jobs