本篇文章的知識點順序是按照 Transformer 的架構,從下往上,從 encoders 到 decoders 的順序編寫的,可能不利於新手的理解,可是很是全面,能夠參考其餘的文章一塊兒閱讀,效果更佳!git
來源於機器翻譯:web
Transformer 分爲兩個部分——編碼器(encoders )和解碼器(decoders):面試
encoders 和 decoders 分解,其中 6 個 encoder 的結構是相同的,可是 6 個 decoder 的參數會獨立訓練,也就是參數是不一樣的;decoder 同理:網絡
Transformer 原論文中的圖:架構
encoder 模型:less
12 個字對應512 維度的字向量:機器學習
爲何須要,RNN 中的每一個 timestep (箭頭左端就是一個 timestep,右端是 3 個 timestep 的集合)共享一套參數 \(u、v、w\),自然的具備持續關係(句子中單詞的序列關係),因爲後一個 timestep 輸入必須得等前一個 timestep 的輸出,不具備並行處理的能力,而且因爲全部 timestep 共享一套參數,因此會出現梯度消失或梯度爆炸的問題;而對於 attention,具備並行處理的能力,可是並不具備位置信息顯示的能力,下面講到 attention 時會講到:函數
位置編碼公式,其中 pos 表示位置、i 表示維度、 \(2i、2i+1\) 表示的是奇偶數(奇偶維度),下圖就是偶數位置使用 \(\sin\) 函數,奇數位置使用 \(\cos\) 函數:學習
位置編碼嵌入單詞編碼:測試
爲何位置嵌入機制有用,咱們不要去關心三角函數公式,能夠看看 公式(3) 中的第一行,咱們作以下的解釋,對於 「我愛德」 這一句話,有三個單詞,假設序號分別爲 一、二、3,假設 \(pos=1=我、k=2=愛、pos+k=3=德\),也就是說 \(pos+k=3\) 位置的位置向量的某一維能夠經過 \(pos=1\) 和 \(k=2\) 位置的位置向量的某一維線性組合加以線性表示,經過該線性表示能夠得出 「德」 的位置編碼信息蘊含了相對於前兩個字 「我」 和 「愛」 的位置編碼信息:
第一眼會注意什麼?紅色的地方首先會映入眼簾;其次,咱們若是問一句:嬰兒在幹什麼?會怎麼觀察這幅圖:
Q、K、V 三個矩陣:
理解上述公式,嬰兒和左上、左下…作點乘,點乘的結果是一個向量在另一個向量上投影的長度,是一個標量,能夠獲取兩者的類似度,類似度越大,則表示兩者越靠近,此處就是觀察嬰兒更關注左上、左下…哪一個部分:
上述公式的更詳細解釋:
Transformer 中 Q、K、V 的獲取,其中 W 是一個隨機初始化的參數,在訓練過程當中會被更新:
計算 attention 值,其中因爲 \(QK^T\) 的值很大時,經過 softmax 的公式能夠得知,softmax 的梯度會很小,則會形成梯度消失,有興趣想具體瞭解的能夠看這個連接:transformer中的attention爲何scaled?。所以有了 \(\frac{QK^T}{\sqrt{d_k}}\),分母爲 \(\sqrt{d_k}\) 的緣由是爲了控制 \(QK^T\) 的方差爲 1:
實際代碼會使用矩陣的形式,方便並行計算:
多頭 attention,使用多套參數,多套參數至關於把原始信息放到了多個空間中,也就是捕捉了多個信息,對於使用多頭 attention 的簡單回答就是,多頭保證了transformer能夠注意到不一樣子空間的信息,捕捉到更加豐富的特徵信息。其實本質上是論文原做者發現這樣效果確實好:
多頭信息輸出,因爲多套參數獲得了多個信息,然而咱們仍是隻須要一個信息,所以能夠經過某種方法(例如矩陣相乘)把多個信息彙總爲一個信息:
多套信息合併爲一個信息:
encoder 詳解,其中 \(X+Z\) 爲殘差的結果:
殘差網絡,把輸入原封不動的和元網絡處理的結果相加:
殘差的做用,沒有殘差,最後一行公式中括號內沒有 1,只有三個連乘項,而這三個連乘項若是很小的話,則可能結果會爲 0,而有了殘差以後,即括號內有了 1,由此確保了梯度永遠不會爲 0,則不會出現梯度消失的狀況,進而網絡深度能夠增長:
爲何 LayerNorm 單獨對一個樣本的全部單詞作縮放能夠起到效果,9 個句子各 5 個單詞、1 個句子 20 個單詞,很明顯,因爲樣本長度不一,使用 BN 的效果必定是大打折扣的,而 LN 能夠針對每一句話作一個歸一化:
對於齊平的句子,BN 和 LN 的區別,BN因爲是針對 batch 維度的歸一化,是對「我今」、「愛天」……作歸一化;LN 是對某一層神經元的輸入進行歸一化,「我愛中國xxx」和「今每天氣真不錯」作歸一化:
每一層通過attention以後,還會有一個FFN,這個FFN的做用就是空間變換。FFN包含了2層linear transformation層,中間的激活函數是ReLu。
其實,FFN的加入引入了非線性(ReLu激活函數),變換了attention output的空間, 從而增長了模型的表現能力。把FFN去掉模型也是能夠用的,可是效果差了不少。
decoder 模型架構:
mask 的做用,當預測 you 的時候,咱們是看不到 you 後面單詞的信息的,也就是 mask 掉 you 和 now:
encoder 和 decoder 交互方法:
encoder 的輸出會給全部的 decoder 提供必定的信息:
encoder 和 decoder 交互時提供的信息,encoder 生成的 K、V 矩陣,decoder 生成的是 Q 矩陣:
encoder 和 decoder 交互的整個過程:
以上,就講完了Transformer編碼和解碼兩大模塊,那麼咱們迴歸最初的問題,將「機器學習」翻譯成「machine learing」,解碼器輸出原本是一個浮點型的向量,怎麼轉化成「machine learing」這兩個詞呢?
是個工做是最後的線性層接上一個softmax,其中線性層是一個簡單的全鏈接神經網絡,它將解碼器產生的向量投影到一個更高維度的向量(logits)上,假設咱們模型的詞彙表是10000個詞,那麼logits就有10000個維度,每一個維度對應一個唯一的詞的得分。以後的softmax層將這些分數轉換爲機率。選擇機率最大的維度,並對應地生成與之關聯的單詞做爲此時間步的輸出就是最終的輸出啦!!
假設詞彙表維度是6,那麼輸出最大機率詞彙的過程以下:
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
其實就會組成一個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
Layer Normalization是一個通用的技術,其本質是規範優化空間,加速收斂。當咱們使用梯度降低法作優化時,隨着網絡深度的增長,數據的分佈會不斷髮生變化,假設feature只有二維,那麼用示意圖來表示一下就是:
爲了保證數據特徵分佈的穩定性(如左圖),咱們加入Layer Normalization,這樣能夠加速模型的優化速度。