小白看得懂的圖解 Transformer

【導讀】大家好,我是泳魚。Transformer 是 GPT 大模型背後的關鍵技術,這篇文章非常簡潔且通俗的語言地解釋了它的原理。

Trasnformer 可以說是完全基於自注意力機制的一個深度學習模型,因爲它適用於並行化計算,和它本身模型的複雜程度導致它在精度和性能上都要高於之前流行的 RNN 循環神經網絡

 

那什麼是 transformer 呢?

你可以簡單理解爲它是一個黑盒子,當我們在做文本翻譯任務是,我輸入進去一箇中文,經過這個黑盒子之後,輸出來翻譯過後的英文。

 

那麼在這個黑盒子裏面都有什麼呢?

裏面主要有兩部分組成:Encoder 和 Decoder

當我輸入一個文本的時候,該文本數據會先經過一個叫 Encoders 的模塊,對該文本進行編碼,然後將編碼後的數據再傳入一個叫 Decoders 的模塊進行解碼,解碼後就得到了翻譯後的文本,對應的我們稱 Encoders 爲編碼器,Decoders 爲解碼器。

 

那麼編碼器和解碼器裏邊又都是些什麼呢?

細心的同學可能已經發現了,上圖中的 Decoders 後邊加了個 s,那就代表有多個編碼器了唄,沒錯,這個編碼模塊裏邊,有很多小的編碼器,一般情況下,Encoders 裏邊有 6 個小編碼器,同樣的,Decoders 裏邊有 6 個小解碼器。

我們看到,在編碼部分,每一個的小編碼器的輸入是前一個小編碼器的輸出,而每一個小解碼器的輸入不光是它的前一個解碼器的輸出,還包括了整個編碼部分的輸出。

 

那麼你可能又該問了,那每一個小編碼器裏邊又是什麼呢?

我們放大一個 encoder,發現裏邊的結構是一個自注意力機制加上一個前饋神經網絡。

 

我們先來看下 self-attention 是什麼樣子的。

我們通過幾個步驟來解釋:

1、首先,self-attention 的輸入就是詞向量,即整個模型的最初的輸入是詞向量的形式。那自注意力機制呢,顧名思義就是自己和自己計算一遍注意力,即對每一個輸入的詞向量,我們需要構建 self-attention 的輸入。在這裏,transformer 首先將詞向量乘上三個矩陣,得到三個新的向量,之所以乘上三個矩陣參數而不是直接用原本的詞向量是因爲這樣增加更多的參數,提高模型效果。對於輸入 X1(機器),乘上三個矩陣後分別得到 Q1,K1,V1,同樣的,對於輸入 X2(學習),也乘上三個不同的矩陣得到 Q2,K2,V2。

2、那接下來就要計算注意力得分了,這個得分是通過計算 Q 與各個單詞的 K 向量的點積得到的。我們以 X1 爲例,分別將 Q1 和 K1、K2 進行點積運算,假設分別得到得分 112 和 96。

3、將得分分別除以一個特定數值 8(K 向量的維度的平方根,通常 K 向量的維度是 64)這能讓梯度更加穩定,則得到結果如下:

4、將上述結果進行 softmax 運算得到,softmax 主要將分數標準化,使他們都是正數並且加起來等於 1。

5、將 V 向量乘上 softmax 的結果,這個思想主要是爲了保持我們想要關注的單詞的值不變,而掩蓋掉那些不相關的單詞(例如將他們乘上很小的數字)

6、將帶權重的各個 V 向量加起來,至此,產生在這個位置上(第一個單詞)的 self-attention 層的輸出,其餘位置的 self-attention 輸出也是同樣的計算方式。

將上述的過程總結爲一個公式就可以用下圖表示:

 

self-attention 層到這裏就結束了嗎?

還沒有,論文爲了進一步細化自注意力機制層,增加了 “多頭注意力機制” 的概念,這從兩個方面提高了自注意力層的性能。

第一個方面,他擴展了模型關注不同位置的能力,這對翻譯一下句子特別有用,因爲我們想知道 “it” 是指代的哪個單詞。

第二個方面,他給了自注意力層多個 “表示子空間”。對於多頭自注意力機制,我們不止有一組 Q/K/V 權重矩陣,而是有多組(論文中使用 8 組),所以每個編碼器 / 解碼器使用 8 個 “頭”(可以理解爲 8 個互不干擾自的注意力機制運算),每一組的 Q/K/V 都不相同。然後,得到 8 個不同的權重矩陣 Z,每個權重矩陣被用來將輸入向量投射到不同的表示子空間。

經過多頭注意力機制後,就會得到多個權重矩陣 Z,我們將多個 Z 進行拼接就得到了 self-attention 層的輸出:

上述我們經過了 self-attention 層,我們得到了 self-attention 的輸出,self-attention 的輸出即是前饋神經網絡層的輸入,然後前饋神經網絡的輸入只需要一個矩陣就可以了,不需要八個矩陣,所以我們需要把這 8 個矩陣壓縮成一個,我們怎麼做呢?只需要把這些矩陣拼接起來然後用一個額外的權重矩陣與之相乘即可。

最終的 Z 就作爲前饋神經網絡的輸入。

接下來就進入了小編碼器裏邊的前饋神經網模塊了,關於前饋神經網絡,網上已經有很多資料,在這裏就不做過多講解了,只需要知道,前饋神經網絡的輸入是 self-attention 的輸出,即上圖的 Z, 是一個矩陣,矩陣的維度是(序列長度 ×D 詞向量),之後前饋神經網絡的輸出也是同樣的維度。

以上就是一個小編碼器的內部構造了,一個大的編碼部分就是將這個過程重複了 6 次,最終得到整個編碼部分的輸出。

然後再 transformer 中使用了 6 個 encoder,爲了解決梯度消失的問題,在 Encoders 和 Decoder 中都是用了殘差神經網絡的結構,即每一個前饋神經網絡的輸入不光包含上述 self-attention 的輸出 Z,還包含最原始的輸入。

上述說到的 encoder 是對輸入(機器學習)進行編碼,使用的是自注意力機制 + 前饋神經網絡的結構,同樣的,在 decoder 中使用的也是同樣的結構。也是首先對輸出(machine learning)計算自注意力得分,不同的地方在於,進行過自注意力機制後,將 self-attention 的輸出再與 Decoders 模塊的輸出計算一遍注意力機制得分,之後,再進入前饋神經網絡模塊。

以上,就講完了 Transformer 編碼和解碼兩大模塊,那麼我們迴歸最初的問題,將 “機器學習” 翻譯成 “machine learing”,解碼器輸出本來是一個浮點型的向量,怎麼轉化成“machine learing” 這兩個詞呢?

是個工作是最後的線性層接上一個 softmax,其中線性層是一個簡單的全連接神經網絡,它將解碼器產生的向量投影到一個更高維度的向量(logits)上,假設我們模型的詞彙表是 10000 個詞,那麼 logits 就有 10000 個維度,每個維度對應一個惟一的詞的得分。之後的 softmax 層將這些分數轉換爲概率。選擇概率最大的維度,並對應地生成與之關聯的單詞作爲此時間步的輸出就是最終的輸出啦!!

 

假設詞彙表維度是 6,那麼輸出最大概率詞彙的過程如下:

以上就是 Transformer 的框架了,但是還有最後一個問題,我們都是到 RNN 中的每個輸入是時序的,是又先後順序的,但是 Transformer 整個框架下來並沒有考慮順序信息,這就需要提到另一個概念了:“位置編碼”。

Transformer 中確實沒有考慮順序信息,那怎麼辦呢,我們可以在輸入中做手腳,把輸入變得有位置信息不就行了,那怎麼把詞向量輸入變成攜帶位置信息的輸入呢?

我們可以給每個詞向量加上一個有順序特徵的向量,發現 sin 和 cos 函數能夠很好的表達這種特徵,所以通常位置向量用以下公式來表示:

最後祭出這張經典的圖,最初看這張圖的時候可能難以理解,希望大家在深入理解 Transformer 後再看這張圖能夠有更深刻的認識。

Transformer 就介紹到這裏了,後來的很多經典的模型比如 BERT、GPT-2 都是基於 Transformer 的思想。我們有機會再詳細介紹這兩個刷新很多記錄的經典模型。擴展閱讀:Transformer 代碼解讀圖解 Transformer

原文鏈接|https://zhuanlan.zhihu.com/p/82312421

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/lgRT0sQRfYskZZZGs2rJcw