Transformer 是 Google 的團隊在 2017 年提出的一種 NLP 經(jīng)典模型归榕,現(xiàn)在比較火熱的 Bert 也是基于 Transformer。Transformer 模型使用了 Self-Attention 機制,不采用 RNN 的順序結(jié)構(gòu)谷异,使得模型可以并行化訓(xùn)練,而且能夠擁有全局信息。
1. Transformer 結(jié)構(gòu)
首先介紹 Transformer 的整體結(jié)構(gòu)向瓷,下圖是 Transformer 用于中英文翻譯的整體結(jié)構(gòu)。
可以看到 Transformer 由 Encoder 和 Decoder 兩個部分組成痕貌,Encoder 和 Decoder 都包含 6 個 block风罩。Transformer 的工作流程大體如下:
第一步:獲取輸入句子的每一個單詞的表示向量 X,X 由單詞的 Embedding 和單詞位置的 Embedding 相加得到舵稠。
第二步:將得到的單詞表示向量矩陣 (如上圖所示超升,每一行是一個單詞的表示 x) 傳入 Encoder 中,經(jīng)過 6 個 Encoder block 后可以得到句子所有單詞的編碼信息矩陣 C哺徊,如下圖室琢。單詞向量矩陣用 X(n×d) 表示, n 是句子中單詞個數(shù)落追,d 是表示向量的維度 (論文中 d=512)盈滴。每一個 Encoder block 輸出的矩陣維度與輸入完全一致。
第三步:將 Encoder 輸出的編碼信息矩陣 C 傳遞到 Decoder 中轿钠,Decoder 依次會根據(jù)當(dāng)前翻譯過的單詞 1~ i 翻譯下一個單詞 i+1巢钓,如下圖所示。在使用的過程中疗垛,翻譯到單詞 i+1 的時候需要通過 Mask (掩蓋) 操作遮蓋住 i+1 之后的單詞症汹。
上圖 Decoder 接收了 Encoder 的編碼矩陣 C,然后首先輸入一個翻譯開始符 "<Begin>"贷腕,預(yù)測第一個單詞 "I"背镇;然后輸入翻譯開始符 "<Begin>" 和單詞 "I"咬展,預(yù)測單詞 "have",以此類推瞒斩。這是 Transformer 使用時候的大致流程破婆,接下來是里面各個部分的細(xì)節(jié)。
2. Transformer 的輸入
Transformer 中單詞的輸入表示 x 由單詞 Embedding 和位置 Embedding 相加得到胸囱。
2.1 單詞 Embedding
單詞的 Embedding 有很多種方式可以獲取祷舀,例如可以采用 Word2Vec、Glove 等算法預(yù)訓(xùn)練得到旺矾,也可以在 Transformer 中訓(xùn)練得到蔑鹦。
2.2 位置 Embedding
Transformer 中除了單詞的 Embedding,還需要使用位置 Embedding 表示單詞出現(xiàn)在句子中的位置箕宙。因為 Transformer 不采用 RNN 的結(jié)構(gòu)嚎朽,而是使用全局信息,不能利用單詞的順序信息柬帕,而這部分信息對于 NLP 來說非常重要哟忍。所以 Transformer 中使用位置 Embedding 保存單詞在序列中的相對或絕對位置。
位置 Embedding 用 PE 表示陷寝,PE 的維度與單詞 Embedding 是一樣的锅很。PE 可以通過訓(xùn)練得到,也可以使用某種公式計算得到凤跑。在 Transformer 中采用了后者爆安,計算公式如下:
其中,pos 表示單詞在句子中的位置仔引,d 表示 PE 的維度 (與詞 Embedding 一樣)扔仓,2i 表示偶數(shù)的維度,2i+1 表示奇數(shù)維度 (即 2i≤d, 2i+1≤d)咖耘。使用這種公式計算 PE 有以下的好處:
- 使 PE 能夠適應(yīng)比訓(xùn)練集里面所有句子更長的句子翘簇,假設(shè)訓(xùn)練集里面最長的句子是有 20 個單詞,突然來了一個長度為 21 的句子儿倒,則使用公式計算的方法可以計算出第 21 位的 Embedding版保。
- 可以讓模型容易地計算出相對位置,對于固定長度的間距 k夫否,PE(pos+k) 可以用 PE(pos) 計算得到彻犁。因為 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。
將單詞的詞 Embedding 和位置 Embedding 相加凰慈,就可以得到單詞的表示向量 x汞幢,x 就是 Transformer 的輸入。
3. Self-Attention
上圖是論文中 Transformer 的內(nèi)部結(jié)構(gòu)圖溉瓶,左側(cè)為 Encoder block急鳄,右側(cè)為 Decoder block。紅色圈中的部分為 Multi-Head Attention堰酿,是由多個 Self-Attention 組成的疾宏,可以看到 Encoder block 包含一個 Multi-Head Attention,而 Decoder block 包含兩個 Multi-Head Attention (其中有一個用到 Masked)触创。Multi-Head Attention 上方還包括一個 Add & Norm 層坎藐,Add 表示殘差連接 (Residual Connection) 用于防止網(wǎng)絡(luò)退化,Norm 表示 Layer Normalization瓷胧,用于對每一層的激活值進(jìn)行歸一化玄渗。
因為 Self-Attention 是 Transformer 的重點翔曲,所以我們重點關(guān)注 Multi-Head Attention 以及 Self-Attention,首先詳細(xì)了解一下 Self-Attention 的內(nèi)部邏輯蛀恩。
3.1 Self-Attention 結(jié)構(gòu)
上圖是 Self-Attention 的結(jié)構(gòu),在計算的時候需要用到矩陣 Q(查詢), K(鍵值), V(值)茂浮。在實際中双谆,Self-Attention 接收的是輸入(單詞的表示向量 x 組成的矩陣 X) 或者上一個 Encoder block 的輸出。而 Q, K, V 正是通過 Self-Attention 的輸入進(jìn)行線性變換得到的席揽。
3.2 Q, K, V 的計算
Self-Attention 的輸入用矩陣 X 進(jìn)行表示顽馋,則可以使用線性變陣矩陣 WQ, WK, WV 計算得到 Q, K, V。計算如下圖所示幌羞,注意 X, Q, K, V 的每一行都表示一個單詞寸谜。
3.3 Self-Attention 的輸出
得到矩陣 Q, K, V 之后就可以計算出 Self-Attention 的輸出了,計算的公式如下属桦。
公式中計算矩陣 Q 和 K 每一行向量的內(nèi)積熊痴,為了防止內(nèi)積過大,因此除以 dk 的平方根地啰。Q 乘以 K 的轉(zhuǎn)置后愁拭,得到的矩陣行列數(shù)都為 n,n 為句子單詞數(shù)亏吝,這個矩陣可以表示單詞之間的 attention 強度岭埠。下圖為 Q 乘以 K 的轉(zhuǎn)置,1234 表示的是句子中的單詞蔚鸥。
得到 QKT 之后惜论,使用 Softmax 計算每一個單詞對于其他單詞的 attention 系數(shù),公式中的 Softmax 是對矩陣的每一行進(jìn)行 Softmax止喷,即每一行的和都變?yōu)?1馆类。
得到 Softmax 矩陣之后可以和 V 相乘,得到最終的輸出 Z弹谁。
上圖中 Softmax 矩陣的第 1 行表示單詞 1 與其他所有單詞的 attention 系數(shù)乾巧,最終單詞 1 的輸出 Z1 等于所有單詞 i 的值 Vi 根據(jù) attention 系數(shù)的比例加在一起得到句喜,如下圖所示:
3.4 Multi-Head Attention
在上一步,我們已經(jīng)知道怎么通過 Self-Attention 計算得到輸出矩陣 Z沟于,而 Multi-Head Attention 是由多個 Self-Attention 組合形成的咳胃,下圖是論文中 Multi-Head Attention 的結(jié)構(gòu)圖。
從上圖可以看到 Multi-Head Attention 包含多個 Self-Attention 層旷太,首先將輸入 X 分別傳遞到 h 個不同的 Self-Attention 中展懈,計算得到 h 個輸出矩陣 Z。下圖是 h=8 時候的情況供璧,此時會得到 8 個輸出矩陣 Z存崖。
得到 8 個輸出矩陣 Z1 到 Z8 之后,Multi-Head Attention 將它們拼接在一起 (Concat)睡毒,然后傳入一個 Linear 層来惧,得到 Multi-Head Attention 最終的輸出 Z。
可以看到 Multi-Head Attention 輸出的矩陣 Z 與其輸入的矩陣 X 的維度是一樣的演顾。
4. Encoder 結(jié)構(gòu)
上圖紅色部分是 Transformer 的 Encoder block 結(jié)構(gòu)违寞,可以看到是由 Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm 組成的。剛剛已經(jīng)了解了 Multi-Head Attention 的計算過程偶房,現(xiàn)在了解一下 Add & Norm 和 Feed Forward 部分趁曼。
4.1 Add & Norm
Add & Norm 層由 Add 和 Norm 兩部分組成,其計算公式如下:
其中 X 表示 Multi-Head Attention 或者 Feed Forward 的輸入棕洋,MultiHeadAttention(X) 和 FeedForward(X) 表示輸出 (輸出與輸入 X 維度是一樣的挡闰,所以可以相加)。
Add 指 X+MultiHeadAttention(X)掰盘,是一種殘差連接摄悯,通常用于解決多層網(wǎng)絡(luò)訓(xùn)練的問題,可以讓網(wǎng)絡(luò)只關(guān)注當(dāng)前差異的部分愧捕,在 ResNet 中經(jīng)常用到奢驯。
Norm 指 Layer Normalization,通常用于 RNN 結(jié)構(gòu)次绘,Layer Normalization 會將每一層神經(jīng)元的輸入都轉(zhuǎn)成均值方差都一樣的瘪阁,這樣可以加快收斂。
4.2 Feed Forward
Feed Forward 層比較簡單邮偎,是一個兩層的全連接層管跺,第一層的激活函數(shù)為 Relu,第二層不使用激活函數(shù)禾进,對應(yīng)的公式如下豁跑。
X 是輸入,F(xiàn)eed Forward 最終得到的輸出矩陣的維度與 X 一致泻云。
4.3 組成 Encoder
通過上面描述的 Multi-Head Attention, Feed Forward, Add & Norm 就可以構(gòu)造出一個 Encoder block艇拍,Encoder block 接收輸入矩陣 X(n×d)狐蜕,并輸出一個矩陣 O(n×d)。通過多個 Encoder block 疊加就可以組成 Encoder卸夕。
第一個 Encoder block 的輸入為句子單詞的表示向量矩陣馏鹤,后續(xù) Encoder block 的輸入是前一個 Encoder block 的輸出,最后一個 Encoder block 輸出的矩陣就是 編碼信息矩陣 C娇哆,這一矩陣后續(xù)會用到 Decoder 中。
5. Decoder 結(jié)構(gòu)
上圖紅色部分為 Transformer 的 Decoder block 結(jié)構(gòu)勃救,與 Encoder block 相似碍讨,但是存在一些區(qū)別:
- 包含兩個 Multi-Head Attention 層。
- 第一個 Multi-Head Attention 層采用了 Masked 操作蒙秒。
- 第二個 Multi-Head Attention 層的 K, V 矩陣使用 Encoder 的編碼信息矩陣 C 進(jìn)行計算勃黍,而 Q 使用上一個 Decoder block 的輸出計算。
- 最后有一個 Softmax 層計算下一個翻譯單詞的概率晕讲。
5.1 第一個 Multi-Head Attention
Decoder block 的第一個 Multi-Head Attention 采用了 Masked 操作覆获,因為在翻譯的過程中是順序翻譯的,即翻譯完第 i 個單詞瓢省,才可以翻譯第 i+1 個單詞弄息。通過 Masked 操作可以防止第 i 個單詞知道 i+1 個單詞之后的信息。下面以 "我有一只貓" 翻譯成 "I have a cat" 為例勤婚,了解一下 Masked 操作摹量。
下面的描述中使用了類似 Teacher Forcing 的概念,不熟悉 Teacher Forcing 的童鞋可以參考以下上一篇文章《Seq2Seq 模型詳解》馒胆。在 Decoder 的時候缨称,是需要根據(jù)之前的翻譯,求解當(dāng)前最有可能的翻譯祝迂,如下圖所示睦尽。首先根據(jù)輸入 "<Begin>" 預(yù)測出第一個單詞為 "I",然后根據(jù)輸入 "<Begin> I" 預(yù)測下一個單詞 "have"型雳。
Decoder 可以在訓(xùn)練的過程中使用 Teacher Forcing 并且并行化訓(xùn)練当凡,即將正確的單詞序列 (<Begin> I have a cat) 和對應(yīng)輸出 (I have a cat <end>) 傳遞到 Decoder。那么在預(yù)測第 i 個輸出時纠俭,就要將第 i+1 之后的單詞掩蓋住宁玫,注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的,下面用 0 1 2 3 4 5 分別表示 "<Begin> I have a cat <end>"柑晒。
第一步: 是 Decoder 的輸入矩陣和 Mask 矩陣欧瘪,輸入矩陣包含 "<Begin> I have a cat" (0, 1, 2, 3, 4) 五個單詞的表示向量,Mask 是一個 5×5 的矩陣匙赞。在 Mask 可以發(fā)現(xiàn)單詞 0 只能使用單詞 0 的信息佛掖,而單詞 1 可以使用單詞 0, 1 的信息妖碉,即只能使用之前的信息。
第二步:接下來的操作和之前的 Self-Attention 一樣芥被,通過輸入矩陣 X 計算得到 Q, K, V 矩陣欧宜。然后計算 Q 和 KT 的乘積 QKT。
第三步:在得到 QKT 之后需要進(jìn)行 Softmax拴魄,計算 attention score冗茸,我們在 Softmax 之前需要使用 Mask 矩陣遮擋住每一個單詞之后的信息,遮擋操作如下:
得到 Mask QKT 之后在 Mask QKT 上進(jìn)行 Softmax匹中,每一行的和都為 1夏漱。但是單詞 0 在單詞 1, 2, 3, 4 上的 attention score 都為 0。
第四步:使用 Mask QKT 與矩陣 V 相乘顶捷,得到輸出 Z挂绰,則單詞 1 的輸出向量 Z1 是只包含單詞 1 信息的。
第五步:通過上述步驟就可以得到一個 Mask Self-Attention 的輸出矩陣 Zi服赎,然后和 Encoder 類似葵蒂,通過 Multi-Head Attention 拼接多個輸出 Zi 然后計算得到第一個 Multi-Head Attention 的輸出 Z,Z 與輸入 X 維度一樣重虑。
5.2 第二個 Multi-Head Attention
Decoder block 第二個 Multi-Head Attention 變化不大践付, 主要的區(qū)別在于其中 Self-Attention 的 K, V 矩陣不是使用 上一個 Decoder block 的輸出計算的,而是使用 Encoder 的編碼信息矩陣 C 計算的缺厉。
根據(jù) Encoder 的輸出 C 計算得到 K, V荔仁,根據(jù)上一個 Decoder block 的輸出 Z 計算 Q (如果是第一個 Decoder block 則使用輸入矩陣 X 進(jìn)行計算),后續(xù)的計算方法與之前描述的一致芽死。
這樣做的好處是在 Decoder 的時候乏梁,每一位單詞都可以利用到 Encoder 所有單詞的信息 (這些信息無需 Mask)。
5.3 Softmax 預(yù)測輸出單詞
Decoder block 最后的部分是利用 Softmax 預(yù)測下一個單詞关贵,在之前的網(wǎng)絡(luò)層我們可以得到一個最終的輸出 Z遇骑,因為 Mask 的存在,使得單詞 0 的輸出 Z0 只包含單詞 0 的信息揖曾,如下落萎。
Softmax 根據(jù)輸出矩陣的每一行預(yù)測下一個單詞
這就是 Decoder block 的定義,與 Encoder 一樣炭剪,Decoder 是由多個 Decoder block 組合而成练链。
6. Transformer 總結(jié)
Transformer 與 RNN 不同,可以比較好地并行訓(xùn)練奴拦。
Transformer 本身是不能利用單詞的順序信息的媒鼓,因此需要在輸入中添加位置 Embedding,否則 Transformer 就是一個詞袋模型了。
Transformer 的重點是 Self-Attention 結(jié)構(gòu)绿鸣,其中用到的 Q, K, V 矩陣通過輸出進(jìn)行線性變換得到疚沐。
Transformer 中 Multi-Head Attention 中有多個 Self-Attention,可以捕獲單詞之間多種維度上的相關(guān)系數(shù) attention score潮模。
參考文獻(xiàn)
論文:Attention Is All You Need
Jay Alammar 博客:The Illustrated Transformer
pytorch transformer 代碼:The Annotated Transformer