Attention和Transformer詳解

本篇文章的知識點順序是按照 Transformer 的架構,從下往上,從 encoders 到 decoders 的順序編寫的,可能不利於新手的理解,可是很是全面,能夠參考其餘的文章一塊兒閱讀,效果更佳!git

1、Transformer引入

來源於機器翻譯:image-20210728100708162web

Transformer 分爲兩個部分——編碼器(encoders )和解碼器(decoders):image-20210728100731417面試

encoders 和 decoders 分解,其中 6 個 encoder 的結構是相同的,可是 6 個 decoder 的參數會獨立訓練,也就是參數是不一樣的;decoder 同理:網絡

image-20210728100835913

Transformer 原論文中的圖:image-20210728101052956架構

2、Encoder 詳解

encoder 模型:image-20210728101251484less

2.1 輸入部分

2.1.1 Embedding

12 個字對應512 維度的字向量:image-20210728101534353機器學習

2.1.2 位置嵌入

爲何須要,RNN 中的每一個 timestep (箭頭左端就是一個 timestep,右端是 3 個 timestep 的集合)共享一套參數 \(u、v、w\)​​​,自然的具備持續關係(句子中單詞的序列關係),因爲後一個 timestep 輸入必須得等前一個 timestep 的輸出,不具備並行處理的能力,而且因爲全部 timestep 共享一套參數,因此會出現梯度消失或梯度爆炸的問題;而對於 attention,具備並行處理的能力,可是並不具備位置信息顯示的能力,下面講到 attention 時會講到:image-20210728101718292函數

位置編碼公式,其中 pos 表示位置、i 表示維度、 \(2i、2i+1\)​ 表示的是奇偶數(奇偶維度),下圖就是偶數位置使用 \(\sin\)​ 函數,奇數位置使用 \(\cos\)​ 函數:image-20210728102128633學習

位置編碼嵌入單詞編碼:image-20210728102349899測試

爲何位置嵌入機制有用,咱們不要去關心三角函數公式,能夠看看 公式(3) 中的第一行,咱們作以下的解釋,對於 「我愛德」 這一句話,有三個單詞,假設序號分別爲 一、二、3,假設 \(pos=1=我、k=2=愛、pos+k=3=德\)​​​​​,也就是說 \(pos+k=3\)​​​​ 位置的位置向量的某一維能夠經過 \(pos=1\)​​​​ 和 \(k=2\)​​​​ 位置的位置向量的某一維線性組合加以線性表示,經過該線性表示能夠得出 「德」 的位置編碼信息蘊含了相對於前兩個字 「我」 和 「愛」 的位置編碼信息:image-20210728102735484

2.2 注意力機制 Attention

2.2.1 人類的注意力機制

第一眼會注意什麼?紅色的地方首先會映入眼簾;其次,咱們若是問一句:嬰兒在幹什麼?會怎麼觀察這幅圖:image-20210728104643416

2.2.2 Attention 計算

Q、K、V 三個矩陣:image-20210728104712380

理解上述公式,嬰兒和左上、左下…作點乘,點乘的結果是一個向量在另一個向量上投影的長度,是一個標量,能夠獲取兩者的類似度,類似度越大,則表示兩者越靠近,此處就是觀察嬰兒更關注左上、左下…哪一個部分:image-20210728104857716

上述公式的更詳細解釋:image-20210728110658530

Transformer 中 Q、K、V 的獲取,其中 W 是一個隨機初始化的參數,在訓練過程當中會被更新:image-20210728110839976

計算 attention 值,其中因爲 \(QK^T\) 的值很大時,經過 softmax 的公式能夠得知,softmax 的梯度會很小,則會形成梯度消失,有興趣想具體瞭解的能夠看這個連接:transformer中的attention爲何scaled?。所以有了 \(\frac{QK^T}{\sqrt{d_k}}\),分母爲 \(\sqrt{d_k}\) 的緣由是爲了控制 \(QK^T\) 的方差爲 1:image-20210728110951242

實際代碼會使用矩陣的形式,方便並行計算:image-20210728112256498

2.2.3 多頭 Attention 計算

多頭 attention,使用多套參數,多套參數至關於把原始信息放到了多個空間中,也就是捕捉了多個信息,對於使用多頭 attention 的簡單回答就是,多頭保證了transformer能夠注意到不一樣子空間的信息,捕捉到更加豐富的特徵信息。其實本質上是論文原做者發現這樣效果確實好:image-20210728112325484

多頭信息輸出,因爲多套參數獲得了多個信息,然而咱們仍是隻須要一個信息,所以能夠經過某種方法(例如矩陣相乘)把多個信息彙總爲一個信息:image-20210728112447997

多套信息合併爲一個信息:preview

3、殘差及其做用

encoder 詳解,其中 \(X+Z\) 爲殘差的結果:image-20210728133339909

殘差網絡,把輸入原封不動的和元網絡處理的結果相加:image-20210728133539327

殘差的做用,沒有殘差,最後一行公式中括號內沒有 1,只有三個連乘項,而這三個連乘項若是很小的話,則可能結果會爲 0,而有了殘差以後,即括號內有了 1,由此確保了梯度永遠不會爲 0,則不會出現梯度消失的狀況,進而網絡深度能夠增長:image-20210728133940108

4、BatchNorm 和 LayerNorm

爲何 LayerNorm 單獨對一個樣本的全部單詞作縮放能夠起到效果,9 個句子各 5 個單詞、1 個句子 20 個單詞,很明顯,因爲樣本長度不一,使用 BN 的效果必定是大打折扣的,而 LN 能夠針對每一句話作一個歸一化:image-20210728161821900

對於齊平的句子,BN 和 LN 的區別,BN因爲是針對 batch 維度的歸一化,是對「我今」、「愛天」……作歸一化;LN 是對某一層神經元的輸入進行歸一化,「我愛中國xxx」和「今每天氣真不錯」作歸一化:image-20210728163658932

5、前饋神經網絡

每一層通過attention以後,還會有一個FFN,這個FFN的做用就是空間變換。FFN包含了2層linear transformation層,中間的激活函數是ReLu。

其實,FFN的加入引入了非線性(ReLu激活函數),變換了attention output的空間, 從而增長了模型的表現能力。把FFN去掉模型也是能夠用的,可是效果差了不少。

image-20210728162303399

6、Decoder 詳解

decoder 模型架構:image-20210728162429921

mask 的做用,當預測 you 的時候,咱們是看不到 you 後面單詞的信息的,也就是 mask 掉 you 和 now:image-20210728162638495

encoder 和 decoder 交互方法:image-20210728162744666

encoder 的輸出會給全部的 decoder 提供必定的信息:image-20210728162922191

encoder 和 decoder 交互時提供的信息,encoder 生成的 K、V 矩陣,decoder 生成的是 Q 矩陣:image-20210728162953335

encoder 和 decoder 交互的整個過程:image-20210728163127826

7、Transformer 最終輸出

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

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

圖片

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

img

8、TRM 面試題講解

8.1 RNN、LSTM、Transformer 三者的區別?

  • RNN系列的模型時刻隱層狀態的計算,依賴兩個輸入,一個是 [公式] 時刻的句子輸入單詞 [公式]另外一個是 [公式] 時刻的隱層狀態 [公式] 的輸出,這是最能體現RNN本質特徵的一點,RNN的歷史信息是經過這個信息傳輸渠道日後傳輸的。而RNN並行計算的問題就出在這裏,由於 [公式] 時刻的計算依賴 [公式] 時刻的隱層計算結果,而 [公式] 時刻的計算依賴 [公式] 時刻的隱層計算結果,如此下去就造成了所謂的序列依賴關係。
  • img
  • 很明顯,Transformer 中引入 Self Attention 後會更容易捕獲句子中長距離的相互依賴的特徵,由於若是是 RNN 或者 LSTM,須要依次序序列計算,對於遠距離的相互依賴的特徵,要通過若干時間步步驟的信息累積才能將二者聯繫起來,而距離越遠,有效捕獲的可能性越小。
  • 可是Self Attention在計算過程當中會直接將句子中任意兩個單詞的聯繫經過一個計算步驟直接聯繫起來,因此遠距離依賴特徵之間的距離被極大縮短,有利於有效地利用這些特徵。除此外,Self Attention對於增長計算的並行性也有直接幫助做用。這是爲什麼Self Attention逐漸被普遍使用的主要緣由。

8.2 爲何有縮放因子 [公式] ?attention爲何scaled?

    • 先一句話回答這個問題: 縮放因子的做用是歸一化
    • 假設[公式] , [公式]裏的元素的均值爲0,方差爲1,那麼 [公式] 中元素的均值爲0,方差爲d. 當d變得很大時, [公式] 中的元素的方差也會變得很大,若是 [公式] 中的元素方差很大,那麼[公式] 的分佈會趨於陡峭(分佈的方差大,分佈集中在絕對值大的區域)。總結一下就是[公式]的分佈會和d有關。所以[公式] 中每個元素乘上 [公式] 後,方差又變爲1。這使得[公式] 的分佈「陡峭」程度與d解耦,從而使得訓練過程當中梯度值保持穩定。
      • 能夠看到,數量級對softmax獲得的分佈影響很是大。在數量級較大時,softmax將幾乎所有的機率分佈都分配給了最大值對應的標籤。若是某一維度的數量級較大,進而會致使 softmax 將來求梯度時會消失。preview
  • Transformer 的並行化
    • decoders 沒有並行化,6 個encoder 之間也沒有並行化,encoder 內部的兩個子模塊也沒有並行化,可是 encoder 內部的兩個子模塊自身是能夠並行化的

8.3 Decoder端的Mask

Transformer模型屬於自迴歸模型(p.s. 非自迴歸的翻譯模型我會專門寫一篇文章來介紹),也就是說後面的token的推斷是基於前面的token的。Decoder端的Mask的功能是爲了保證訓練階段和推理階段的一致性。

論文原文中關於這一點的段落以下:

We also modify the self-attention sub-layer in the decoder stack to prevent from attending to subsequent positions. This masking, combined with the fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.

在推理階段,token是按照從左往右的順序推理的。也就是說,在推理timestep=T的token時,decoder只能「看到」timestep < T的 T-1 個Token, 不能和timestep大於它自身的token作attention(由於根本還不知道後面的token是什麼)。爲了保證訓練時和推理時的一致性,因此,訓練時要一樣防止token與它以後的token去作attention。

好比我要翻譯出來的一句話爲「我愛陳有德」的時候,若是沒有 mask,當咱們在訓練階段,翻譯到「愛」的時候,因爲沒有 mask,「陳有德」三個字對翻譯「愛」是有輸出貢獻的,也就是說訓練階段,模型是基於知道這個時刻後面的單詞進行的訓練,然而當咱們在測試階段的時候,咱們並不知道「愛」後面是什麼,也就是說訓練階段不 mask,那麼測試階段會受到必定的影響。(這裏要說明,訓練階段咱們是知道 ground truth 「我愛陳有德」 的,而 decoders 的第一個 output Embedding 就是真實的那個 ground truth 「我愛陳有德」,也就是說訓練階段不 mask,那麼預測 「愛」 時,「陳有德」 就會有貢獻,而在測試階段,沒有 ground truth,decoders 的第一個 output Embedding 是隨機的,此時訓練階段和測試階段就會出現差異)

從下圖能夠看出,預測是一步接着一步的,因爲是序列生成過程,因此在時刻 i 的時候,大於 i 的時刻都沒有結果,只有小於 i 的時刻有結果,所以須要作Mask

圖片

8.4 如何 mask

圖片 其實就會組成一個word2word的attention map!(加了softmax以後就是一個合爲1的權重了)。好比說你的輸入是一句話 "i have a dream" 總共4個單詞,這裏就會造成一張4x4的注意力機制的圖:

圖片

這樣一來,每個單詞就對應每個單詞有一個權重

注意encoder裏面是叫self-attention,decoder裏面是叫masked self-attention。

這裏的masked就是要在作language modelling(或者像翻譯)的時候,不給模型看到將來的信息。

圖片

mask就是沿着對角線把灰色的區域用0覆蓋掉,不給模型看到將來的信息。

詳細來講,i做爲第一個單詞,只能有和i本身的attention。have做爲第二個單詞,有和i, have 兩個attention。 a 做爲第三個單詞,有和i,have,a 前面三個單詞的attention。到了最後一個單詞dream的時候,纔有對整個句子4個單詞的attention。

圖片

作完softmax後就像這樣,橫軸合爲1

8.5 Layer Normalization (歸一化)的做用

Layer Normalization是一個通用的技術,其本質是規範優化空間,加速收斂。當咱們使用梯度降低法作優化時,隨着網絡深度的增長,數據的分佈會不斷髮生變化,假設feature只有二維,那麼用示意圖來表示一下就是:

preview

爲了保證數據特徵分佈的穩定性(如左圖),咱們加入Layer Normalization,這樣能夠加速模型的優化速度。

相關文章
相關標籤/搜索