Transformer原理理解


參考博客

https://wmathor.com/index.php/archives/1438/,大佬講的非常清晰!!!博客排版也非常值得學習。

https://zhuanlan.zhihu.com/p/85612521,Transformer三部曲,也解釋了attention機制

Transformer

Transformer 是谷歌大腦在 2017 年底發表的論文 attention is all you need 中所提出的 seq2seq 模型。現在已經取得了大范圍的應用和擴展,而 BERT 就是從 Transformer 中衍生出來的預訓練語言模型。

Transformer 和 LSTM 的最大區別,就是 LSTM 的訓練是迭代的、串行的,必須要等當前字處理完,才可以處理下一個字。而 Transformer 的訓練時並行的,即所有是同時訓練的,這樣就大大增加了計算效率。

Transformer 使用了位置嵌入 (Positional Encoding) 來理解語言的順序,使用自注意力機制(Self Attention Mechanism)全連接層進行計算。

Transformer 模型主要分為兩大部分,分別是 Encoder 和 Decoder

  • Encoder編碼器負責把輸入(語言序列)隱射成隱藏層(下圖中第 2 步用九宮格代表的部分),即把自然語言序列映射為隱藏層的數學表達的過程
  • Decoder解碼器再把隱藏層映射為自然語言序列。

例如下圖機器翻譯的例子(Decoder 輸出的時候,是通過 N 層 Decoder Layer 才輸出一個 token,並不是通過一層 Decoder Layer 就輸出一個 token)

Transformer Encoder結構圖

Encoder的關鍵部分就是上圖的四個框框。下面將分別說明原理和重點。

第一部分:positional encoding(位置編碼)

由於 Transformer 模型沒有循環神經網絡的迭代操作,所以我們必須提供每個字的位置信息給 Transformer,這樣它才能識別出語言中的順序關系。

現在定義一個位置嵌入的概念,也就是 Positional Encoding,位置嵌入的維度為 [max_sequence_length, embedding_dimension], 位置嵌入的維度與詞向量的維度是相同的,都是 embedding_dimensionmax_sequence_length 屬於超參數,指的是限定每個句子最長由多少個詞構成。

注意,我們一般以為單位訓練 Transformer 模型。首先初始化字編碼(embedding)的大小為 [vocab_size, embedding_dimension]vocab_size 為字庫中所有字的數量,embedding_dimension 為字向量的維度,對應到 PyTorch 中,其實就是 nn.Embedding(vocab_size, embedding_dimension)

論文中使用了 sin 和 cos 函數的線性變換來提供給模型位置信息:

PE是positional encoding的縮寫,上式中 pos 指的是一句話中某個字的位置,取值范圍是 [0,max_sequence_length),i 指的是字向量的維度序號,取值范圍是 [0,embedding_dimension/2),dmodel 指的是 embedding_dimension​的值,也就是詞向量的維度。

上面有 sin 和 cos 一組公式,也就是對應着 embedding_dimension 維度的一組奇數和偶數的序號的維度,偶數對應上面,奇數對應下面。分別用上面的 sin 和 cos 函數做處理,從而產生不同的周期性變化。而位置嵌入在 embedding_dimension​維度上隨着維度序號增大,周期變化會越來越慢,最終產生一種包含位置信息的紋理,就像論文原文中第六頁講的,位置嵌入函數的周期從 2π 到 10000∗2π 變化,而每一個位置在 embedding_dimension​維度上都會得到不同周期的 sin 和 cos 函數的取值組合,從而產生獨一的紋理位置信息,最終使得模型學到位置之間的依賴關系和自然語言的時序特性

可以參考這篇文章 Transformer 中的 Positional Encoding

下面畫一下位置嵌入,縱向觀察,可見隨着 embedding_dimension​序號增大,位置嵌入函數的周期變化越來越平緩

畫法的python代碼見https://wmathor.com/index.php/archives/1438/

 

第二部分:self-attention mechanism(自注意力機制)

對於輸入的句子 X,通過 WordEmbedding 得到該句子中每個字的字向量,同時通過 Positional Encoding 得到所有字的位置向量,將其相加(維度相同,可以直接相加),得到該字真正的向量表示。第 t 個字的向量記作 xt

此時的詞向量包括了word embedding和位置向量。

接着我們定義三個矩陣 WQ,WK.WV,使用這三個矩陣分別對所有的字向量進行三次線性變換,於是所有的字向量又衍生出三個新的向量 qt,kt,vt。我們將所有的 q向量拼成一個大矩陣,記作查詢矩陣 Q,將所有的 kt 向量拼成一個大矩陣,記作鍵矩陣 K,將所有的 vt 向量拼成一個大矩陣,記作值矩陣 V(見下圖)

把上圖的結構拼接在一起拼成Q、K、V矩陣。K矩陣的拼法是一列一列的拼(為了方便查詢)。

為了獲得第一個字的注意力權重,我們需要用第一個字的查詢向量 q1 乘以鍵矩陣 K(見下圖)

得到的結果要經過softmax,使得它們的和為1

 

 得到的是對應每個key的分值(score),作為權重,如下圖:

得到權重后,將權重分別乘以對應的值向量,如下圖:

 在整個self-attention中計算傳播如下:

最后將這些權重化的值向量v求和,就得到了第一個字的輸出。

動圖傳遞如下:

對於單個向量,整個self-attention的計算步驟如下:

  • 先用W和所有子向量得到Q、K、V
  • 對於一個字向量,先得到q向量
  • 用q向量與K矩陣相乘(相當於與每個k向量相乘求和),將結果用softmax轉換為權重
  • v向量加權求和就是最終的結果。

計算順序和結果如下圖:

用矩陣表示整個self-attention計算過程

第一步:計算所有時刻的Q、K、V,輸入是矩陣X,X的第t行表示第t個詞的向量xt

然后將Q和KT相乘,然后除以一個縮放因子,dk是向量Q、V、K的維度,當維度較大時,Q和KT相乘值可能會很大,softmax之后會有較多的值接近0。經過softmax轉換為權重后乘以V,得到最后的輸出。

Multi-Head attention(多頭注意力機制)

每一組Q、K、V可以得到一個輸出矩陣Z,多頭就能得到多個輸出矩陣Z。

Padding Mask

上面 Self Attention 的計算過程中,我們通常使用 mini-batch 來計算,也就是一次計算多句話,即 X 的維度是 [batch_size, sequence_length],sequence_length​是句長,而一個 mini-batch 是由多個不等長的句子組成的,我們需要按照這個 mini-batch 中最大的句長對剩余的句子進行補齊,一般用 0 進行填充,這個過程叫做 padding。

 

第三部分:殘差連接和Layer Normalization

殘差連接

把經過self-attention后的輸出和原來的輸入加起來,把原來的輸入殘差連接過來。

 

Layer Normalization

Layer Normalization 的作用是把神經網絡中隱藏層歸一為標准正態分布,也就是 i.i.d 獨立同分布,以起到加快訓練速度,加速收斂的作用。

首先計算均值,以矩陣的列為單位:

然后計算方差,也是以矩陣的列為單位:

然后進行歸一化,根據中心極限定理,

加一個ε是為了防止分母為0.

Layer Normalization與Batch Normalization的對比:Batch是在Batch之間,Layer是在單個數據內。

 

整個Encoder結構的解釋

 

上圖展示了更多細節:輸入 x1,x2 經 self-attention 層之后變成 z1,z2,然后和輸入 x1,x2 進行殘差連接,經過 LayerNorm 后輸出給全連接層。全連接層也有一個殘差連接和一個 LayerNorm,最后再輸出給下一個 Encoder(每個 Encoder Block 中的 FeedForward 層權重都是共享的)

用公式來進行說明如下:

第一步:子向量和位置編碼

第二步:自注意力機制

第三步:殘差連接和Layer Normalization

第四步:FeedForward部分,其實就是兩層線性映射並用激活函數激活。比如說ReLU。

 第五步:FeedForward的殘差連接和Layer Normalization

 其中,

 

Transformer Decoder結構

整體上看,Decoder的結構從下到上依次是:

  • Masked Multi-Head Self-Attention
  • Multi-Head Encoder-Decoder Attention
  • FeedForward Network

和 Encoder 一樣,上面三個部分的每一個部分,都有一個殘差連接,后接一個 Layer Normalization。Decoder 的中間部件並不復雜,大部分在前面 Encoder 里我們已經介紹過了,但是 Decoder 由於其特殊的功能,因此在訓練時會涉及到一些細節

Masked Multi-Head Self-Attention

具體來說,傳統 Seq2Seq 中 Decoder 使用的是 RNN 模型,因此在訓練過程中輸入 t 時刻的詞,模型無論如何也看不到未來時刻的詞,因為循環神經網絡是時間驅動的,只有當 t 時刻運算結束了,才能看到 t+1 時刻的詞。而 Transformer Decoder 拋棄了 RNN,改為 Self-Attention,由此就產生了一個問題,在訓練過程中,整個 ground truth (正確的標注)都暴露在 Decoder 中,這顯然是不對的,我們需要對 Decoder 的輸入進行一些處理,該處理被稱為 Mask.

之后再做 softmax,就能將 - inf 變為 0,得到的這個矩陣即為每個字之間的權重

Multi-Head:就是有許多組Q、K、V,多做幾次。

Masked Encoder-Decoder Attention

其實這一部分的計算流程和前面 Masked Self-Attention 很相似,結構也一摸一樣。

唯一不同的是這里的 K,V 為 Encoder 的輸出,Q 為 Decoder 中 Masked Self-Attention 的輸出

 

Transformer的總結

轉載一下大佬的思考性問題:

為什么要引入attention機制?

Attention機制理論上可以建模任意長度的長距離依賴,並且符合人類直覺

Transformer 為什么需要進行 Multi-head Attention?

原論文中說到進行 Multi-head Attention 的原因是將模型分為多個頭,形成多個子空間,可以讓模型去關注不同方面的信息,最后再將各個方面的信息綜合起來。其實直觀上也可以想到,如果自己設計這樣的一個模型,必然也不會只做一次 attention,多次 attention 綜合的結果至少能夠起到增強模型的作用,也可以類比 CNN 中同時使用多個卷積核的作用,直觀上講,多頭的注意力有助於網絡捕捉到更豐富的特征 / 信息

Transformer 相比於 RNN/LSTM,有什么優勢?為什么?

  • RNN 系列的模型,無法並行計算,因為 T 時刻的計算依賴 T-1 時刻的隱層計算結果,而 T-1 時刻的計算依賴 T-2 時刻的隱層計算結果
  • Transformer的特征提取能力比RNN系列的模型要好

為什么說 Transformer 可以代替 seq2seq?

這里用代替這個詞略顯不妥當,seq2seq 雖已老,但始終還是有其用武之地,seq2seq 最大的問題在於將 Encoder 端的所有信息壓縮到一個固定長度的向量中,並將其作為 Decoder 端首個隱藏狀態的輸入,來預測 Decoder 端第一個單詞 (token) 的隱藏狀態。在輸入序列比較長的時候,這樣做顯然會損失 Encoder 端的很多信息,而且這樣一股腦的把該固定向量送入 Decoder 端,Decoder 端不能夠關注到其想要關注的信息。Transformer 不但對 seq2seq 模型這兩點缺點有了實質性的改進 (多頭交互式 attention 模塊),而且還引入了 self-attention 模塊,讓源序列和目標序列首先 “自關聯” 起來,這樣的話,源序列和目標序列自身的 embedding 表示所蘊含的信息更加豐富,而且后續的 FFN 層也增強了模型的表達能力,並且 Transformer 並行計算的能力遠遠超過了 seq2seq 系列模型

Transformer有哪些優點和不足?

優點:完全基於attention,在可以並行的情況下仍然有很強的特征抽取能力。

缺點:仍然是自回歸的形式、理論上非圖靈完備、缺少Recurrent Inductive Bias和條件計算、對超長序列建模能力較差。

其余問題

https://blog.csdn.net/weixin_43837878/article/details/118153000?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242.0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM