時間老人的背上負著一個龐大的布袋,那裡面裝滿著被寡恩負義的世人所遺忘的豐功偉績;那些已成過去的偉績,一轉眼間就會在人們的記憶裡消失。 —— 莎士比亞
概述
Transformer這篇論文很經典, 本文是這篇論文及相關參考論文的讀書筆記。主要涉及到:
- 對序列建模: 從CNN, RNN(LSTM) 到transformer, 解決了速度和依賴長度的問題
- 模型架構: layer normalization和殘差網絡,使得深度學習在序列建模上成為可能
- 對幾種attention進行了分析及可視化
- 最後對position encoding進行了說明,本質上這個模塊無需訓練,是人為通過正弦的引入了相對、絕對位置的信息特徵,有點FFT(傅立葉變換)的味道。
序列建模
自然語言處理中的文本,可以看成是詞的序列,是天生的序列數據。而對序列建模,通常都需要考慮上下文信息,比如RNN, LSTM, GRU等,核心思想:
- 即當前的狀態不僅取決於當前的輸入值 x[t] ,也取決於歷史前一時刻的狀態值h[t-1] (如果是反向RNN, 是未來狀態)。
- 按此迭代: h[t-1] = f(h[t-2], x[t-1]),依此下去
- 可以得出結論,當前的狀態 h(t) 和 h(t-1), h(t-2)等歷史狀態都有關係,再進一步講,h(t)和歷史的輸入序列、當前的輸入都有關係。
- 相比RNN網絡而言,實際上LSTM和GRU更能容易刻畫距離更遠的歷史信息。如果用雙向LSTM的話,就能考慮上(歷史)下(未來)文信息了。但這種基於 RNN的網絡,有一個局限,就是要step-by-step逐步計算,阻止了並行化,計算起來,比CNN要慢很多。
- 注意力機制(Attention)是目前機器翻譯的標配,翻譯每個目標詞的時候 (@Decoder),可以按不同的重要程度關注源序列各個詞(@Encoder),通常和RNN結合在一起應用。
- Transformer的提出,拋棄了RNN的逐步計算的思路,但保留了考慮上 下文信息可捕捉任意長度的依賴關係的特點,且能實現Attention的功能,更易並行化 、 複雜度低, 目前應用廣泛。
- Encoder完全並行,Decoder是step-by-step。
模型架構
encoder: 本質上是將一個序列表徵的過程(特徵工程),將(B, T)大小的離散輸入詞序列通過embedding表示成(B, T, d_model)大小 ,再通過transformer表示成(B, T, d_model)
decoder: 考慮背景信息的languge model
- 本質上一個language model, 一個詞一個詞的將詞蹦出來。
- 通過attention, 將encoder的輸出(上下文信息)綁定到language model上
殘差網絡(residual Net)
- ResNet(1512.03385)論文中,指出對於深層的網絡, 當層次足夠深時,訓練集的誤差會大,反而不如淺層的網絡。得出結論: identity mapping不容易學習,故設計了ResNet, 使得 深度 學習成為可能。
- NLP中, ResNet中的直連,也有另外一種含義: 能保證當前輸入Q不會被attention(Q, K, V) 淹沒
- ResNet的直連設計,需要 d_embedding=d_k=d_v=d_model, 否則,無法直連
- y = x + F(x)
- F(x) 需要包含非線性, 否則,y = x+Wx = (W+I)x, 實驗也證明, 這種方式沒有作用
- F(x) = W_2 Relu(W_1x)
- x, y 的維度要相同,才能用Residual Network
Layer Normalization(1607.06450)
- batch normalization (BN): 對所有樣本上進行平均: (B, d) ~ 沿著B求均值和標準差
- 實際實現中,對同一batch中的樣本進行統計, 嚴重依賴batch size, 如batch size小, 統計不準
- layer normalization(LN): 對某一層神經元上不同位置進行統計: (B, T, d) ~ 沿著(d)求均值和方差
- 與Batch Size無關,與樣本綁定

BN VS LN
Attention
- self-attention: 將一個序列表徵出來
- encode-decoder attention: 解碼(預測下一個詞)時,考慮Encoder的信息
- multi-head attention: 將輸入映射到子空間,分別做attention, 然後拼起來,在映射回目標空間
scaled dot-product attention
輸出是V中行向量的加權平均,加權係數矩陣 (T_y, T_x) 通過訓練得出:
attention(Q, K, V) = softmax(QK^T/d_k) V
注意:如果一個序列所有的詞都相同, 如果沒有Position Encoding,attention模塊認為所有位置的詞都相同。而加了position encoding, 即使每個位置上的詞相同,但由於位置不同,生成的embedding也不同。
multi-head attention:
將Q, K, V 映射成不同的子空間,分別應用attention, 然後 拼 起來,再映射到目標空間。
幾種attention
self-attention初衷: 複雜度低,且能捕捉長期依賴關係
- 根據attention公式,可得到: self-attention的複雜度為O(T^2d_model), 其中 T 為序列的長度
- 不用循環機制,所以可捕捉任意位置的依賴關係
在self-attention中, Q==K==V

encode self-attention
在encoder-decoder attention中, Q!=K==V

decoder self-attention

encoder-decoder attentions
Position Encoding
初衷: transformer中沒有RNN機制, 如何利用序列的位置信息(相對、絕對)?
- 一種是position embedding, 只能對訓練語料中的長度做Embedding, 需要訓練
- 和詞embedding類似,有OOV的問題
- 如果預測數據超出範圍(OOV),會報錯。處理方式是用一個<unk>表示所有OOV的"位置(position)",但信息會損耗
- 一種是transformer中提出的sin/cos position encoding, 不需訓練
- 泛化能力理論上來說更好
- 利用了sin/cos的周期性,外插explorate效果會好,理論上只要內存足夠大,可以外插任意位置

position encoding: d(t)
從position embedding角度,將每個位置t映射成embedding
- 表示position的t, 與正弦波、餘弦波上的t對應
- 0 <= d <= d_model$ 對應的是正弦波、餘弦波的周期(或頻率), d 越大,周期越大
- position encoding 模塊,本質上內部是一個矩陣 Tmax x d_model , 無需訓練,其中 T_max 是支持的最大序列長度,理論上來說可以無窮大,直到OOM。

position encodong: t(d)
主要參考文獻
- transfomer, https://arxiv.org/abs/1706.03762
- ResNet, https://arxiv.org/abs/1512.03385
- Layer Norm: https://arxiv.org/abs/1607.06450