日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

transformer模型_【经典精读】Transformer模型深度解读

發布時間:2024/9/18 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 transformer模型_【经典精读】Transformer模型深度解读 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文字長度: ★★★★★

閱讀難度: ★★☆☆☆

原創程度: ★★★★☆


Transformer是2017年的一篇論文《Attention is All You Need》提出的一種模型架構,這篇論文里只針對機器翻譯這一種場景做了實驗,全面擊敗了當時的SOTA,并且由于encoder端是并行計算的,訓練的時間被大大縮短了。

它開創性的思想,顛覆了以往序列建模和RNN劃等號的思路,現在被廣泛應用于NLP的各個領域。目前在NLP各業務全面開花的語言模型如GPT, BERT等,都是基于Transformer模型。因此弄清楚Transformer模型內部的每一個細節就顯得尤為重要。

鑒于寫Transformer的中英文各類文章非常之多,一些重復的、淺顯的東西在本文里都不再贅述。在本文中,我會盡可能地去找一些很核心也很細節的點去剖析,并且將細節和整體的作用聯系起來解釋。

本文盡量做到深入淺出,力求覆蓋我自己學習時的每一個困惑,做到“知其然,且知其所以然”。我相信通過我抽絲剝繭的分析,大家會對Transformer每個部分的作用有一個更加深入的認識,從而對這個模型架構整體的認知上升到一個新的臺階,并且能夠深刻理解Transformer及其延伸工作的動機。

本文將按照下面的思路展開

0. Transformer整體架構

  • Attention的背景溯源(為什么要有attention?)
  • Attention的細節(attention是什么?)
  • Query, Key, Value
  • Multi-head Attention的本質
  • Transformer模型架構中的其他部分
  • Feed Forward Network
  • Positional Embedding
  • Layer Normalization
  • Transformer和RNN的對比
  • 參考

  • 0. Transformer架構

    Transformer模型的架構

    這里就不啰嗦encoder, decoder各自的含義以及模塊了,直戳細節。以下將會重點解答的問題有:

    • Attention是如何發揮作用的,其中的參數的含義和作用是什么,反向傳播算法如何更新其中參數,又是如何影響其他參數的更新的?
    • 為什么要用scaled attention?
    • Multi-head attention相比single head attention為什么更加work,其本質上做了一件什么事?從反向傳播算法的角度分析?
    • Positional encoding是如何發揮作用的,應用反向傳播算法時是如何影響到其他參數的更新的?同樣的理論可以延伸到其他additional embedding,比如多語言模型中的language embedding
    • 每個encoder/decoder layer中feed-forward部分的作用,并且從反向傳播算法角度分析?
    • decoder中mask后反向傳播算法過程細節,如何保證training和inference的一致性?
      • 如果不一致(decoder不用mask)會怎么樣?

    1. Attention的背景溯源

    想要深度理解Attention機制,就需要了解一下它產生的背景、在哪類問題下產生,以及最初是為了解決什么問題而產生。

    首先回顧一下機器翻譯領域的模型演進歷史:

    機器翻譯是從RNN開始跨入神經網絡機器翻譯時代的,幾個比較重要的階段分別是: Simple RNN, Contextualize RNN, Contextualized RNN with attention, Transformer(2017),下面來一一介紹。

    • Simple RNN:這個encoder-decoder模型結構中,encoder將整個源端序列(不論長度)壓縮成一個向量(encoder output),源端信息和decoder之間唯一的聯系只是: encoder output會作為decoder的initial states的輸入。這樣帶來一個顯而易見的問題就是,隨著decoder長度的增加,encoder output的信息會衰減。

    Simple RNN (without context)

    這種模型有2個主要的問題:

  • 源端序列不論長短,都被統一壓縮成一個固定維度的向量,并且顯而易見的是這個向量中包含的信息中,關于源端序列末尾的token的信息更多,而如果序列很長,最終可能基本上“遺忘”了序列開頭的token的信息。
  • 第二個問題同樣由RNN的特性造成: 隨著decoder timestep的信息的增加,initial hidden states中包含的encoder output相關信息也會衰減,decoder會逐漸“遺忘”源端序列的信息,而更多地關注目標序列中在該timestep之前的token的信息。
    • Contextualized RNN:為了解決上述第二個問題,即encoder output隨著decoder timestep增加而信息衰減的問題,有人提出了一種加了context的RNN sequence to sequence模型:decoder在每個timestep的input上都會加上一個context。為了方便理解,我們可以把這看作是encoded source sentence。這樣就可以在decoder的每一步,都把源端的整個句子的信息和target端當前的token一起輸入到RNN中,防止源端的context信息隨著timestep的增長而衰減。

    Contextualized RNN

    但是這樣依然有一個問題: context對于每個timestep都是靜態的(encoder端的final hidden states,或者是所有timestep的output的平均值)。但是每個decoder端的token在解碼時用到的context真的應該是一樣的嗎?在這樣的背景下,Attention就應運而生了:

    • Contextualized RNN with soft align (Attention) : Attention在機器翻譯領域的應用最早的提出來自于2014年的一篇論文 Neural Machine Translation by Jointly Learning to Align and Translate

    Contextualized RNN with Attention

    在每個timestep輸入到decoder RNN結構中之前,會用當前的輸入token的vector與encoder output中的每一個position的vector作一個"attention"操作,這個"attention"操作的目的就是計算當前token與每個position之間的"相關度",從而決定每個position的vector在最終該timestep的context中占的比重有多少。最終的context即encoder output每個位置vector表達的加權平均。

    context的計算公式

    2. Attention的細節

    2.1. 點積attention

    我們來介紹一下attention的具體計算方式。attention可以有很多種計算方式: 加性attention、點積attention,還有帶參數的計算方式。著重介紹一下點積attention的公式:

    Attention中(Q^T)*K矩陣計算,query和key的維度要保持一致

    如上圖所示,

    , 分別是query和key,其中,query可以看作M個維度為d的向量(長度為M的sequence的向量表達)拼接而成,key可以看作N個維度為d的向量(長度為N的sequence的向量表達)拼接而成。
    • 【一個小問題】為什么有縮放因子 ?
      • 先一句話回答這個問題: 縮放因子的作用是歸一化。
      • 假設 , 里的元素的均值為0,方差為1,那么 中元素的均值為0,方差為d. 當d變得很大時, 中的元素的方差也會變得很大,如果 中的元素方差很大,那么 的分布會趨于陡峭(分布的方差大,分布集中在絕對值大的區域)。總結一下就是的分布會和d有關。因此 中每一個元素乘上 后,方差又變為1。這使得 的分布“陡峭”程度與d解耦,從而使得訓練過程中梯度值保持穩定。

    2.2. Attention機制涉及到的參數

    一個完整的attention層涉及到的參數有:

    • 把 , , 分別映射到 , , 的線性變換矩陣 ( ), ( ), ( )
    • 把輸出的表達 映射為最終輸出 的線性變換矩陣 ( )

    2.3. Query, Key, Value

    Query和Key作用得到的attention權值作用到Value上。因此它們之間的關系是:

  • Query 和Key的維度必須一致,Value 和Query/Key的維度可以不一致。
  • Key和Value 的長度必須一致。Key和Value本質上對應了同一個Sequence在不同空間的表達。
  • Attention得到的Output 的維度和Value的維度一致,長度和Query一致。
  • Output每個位置 i 是由value的所有位置的vector加權平均之后的向量;而其權值是由位置為i 的query和key的所有位置經過attention計算得到的 ,權值的個數等于key/value的長度。
  • Attention示意圖

    在經典的Transformer結構中,我們記線性映射之前的Query, Key, Value為q, k, v,映射之后為Q, K, V。那么:

  • self-attention的q, k, v都是同一個輸入, 即當前序列由上一層輸出的高維表達。
  • cross-attention的q代表當前序列,k,v是同一個輸入,對應的是encoder最后一層的輸出結果(對decoder端的每一層來說,保持不變)
  • 而每一層線性映射參數矩陣都是獨立的,所以經過映射后的Q, K, V各不相同,模型參數優化的目標在于將q, k, v被映射到新的高維空間,使得每層的Q, K, V在不同抽象層面上捕獲到q, k, v之間的關系。一般來說,底層layer捕獲到的更多是lexical-level的關系,而高層layer捕獲到的更多是semantic-level的關系。

    2.4. Attention的作用

    下面這段我會以機器翻譯為例,用通俗的語言闡釋一下attention的作用,以及query, key, value的含義。

    Transformer模型Encoder, Decoder的細節圖(省去了FFN部分)

    query對應的是需要被表達的序列(稱為序列A),key和value對應的是用來表達A的序列(稱為序列B)。其中key和query是在同一高維空間中的(否則無法用來計算相似程度),value不必在同一高維空間中,最終生成的output和value在同一高維空間中。上面這段巨繞的話用一句更繞的話來描述一下就是:

    序列A和序列B在高維空間 中的高維表達 的每個位置分別和 計算相似度,產生的權重作用于序列B在高維空間 中的高維表達 ,獲得序列A在高維空間 中的高維表達

    Encoder部分中只存在self-attention,而Decoder部分中存在self-attention和cross-attention

    【self-attention】encoder中的self-attention的query, key, value都對應了源端序列(即A和B是同一序列),decoder中的self-attention的query, key, value都對應了目標端序列。

    【cross-attention】decoder中的cross-attention的query對應了目標端序列,key, value對應了源端序列(每一層中的cross-attention用的都是encoder的最終輸出)

    2.5. 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。

    2.6. 多頭Attention (Multi-head Attention)

    Attention是將query和key映射到同一高維空間中去計算相似度,而對應的multi-head attention把query和key映射到高維空間

    的不同子空間 中去計算相似度。

    為什么要做multi-head attention?論文原文里是這么說的:

    Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.

    也就是說,這樣可以在不改變參數量的情況下增強每一層attention的表現力。

    Multi-head Attention示意圖

    Multi-head Attention的本質是,在參數總量保持不變的情況下,將同樣的query, key, value映射到原來的高維空間的不同子空間中進行attention的計算,在最后一步再合并不同子空間中的attention信息。這樣降低了計算每個head的attention時每個向量的維度,在某種意義上防止了過擬合;由于Attention在不同子空間中有不同的分布,Multi-head Attention實際上是尋找了序列之間不同角度的關聯關系,并在最后concat這一步驟中,將不同子空間中捕獲到的關聯關系再綜合起來。

    從上圖可以看出,

    和 之間的attention score從1個變成了h個,這就對應了h個子空間中它們的關聯度。

    3. Transformer模型架構中的其他部分

    3.1. Feed Forward Network

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

    曾經我在這里有一個百思不得其解的問題:attention層的output最后會和

    相乘,為什么這里又要增加一個2層的FFN網絡?

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

    3.2. Positional Encoding

    位置編碼層只在encoder端和decoder端的embedding之后,第一個block之前出現,它非常重要,沒有這部分,Transformer模型就無法用。位置編碼是Transformer框架中特有的組成部分,補充了Attention機制本身不能捕捉位置信息的缺陷。

    position encoding

    Positional Embedding的成分直接疊加于Embedding之上,使得每個token的位置信息和它的語義信息(embedding)充分融合,并被傳遞到后續所有經過復雜變換的序列表達中去。

    3.2.1. 使用Positional Encoding帶來的獨特優勢

    優勢1

    不得不說,使用Positional Encoding作為每個token位置的唯一表示,這一思路很NB,為什么呢?

    • 模型輸入Encoder的每個token對應的向量有2部分:
      • Positional Encoding
      • Embedding Output
    • Transformer的特性使得encoder的輸入向量之間完全平等(不存在RNN那種recurrent結構),token的實際位置和positional encoding唯一綁定,我們可以通過對positional encoding進行操作來改變token在序列中的實際位置。

    [a] 輸入等于Positional Encoding + Embedding Output

    * 對inference階段而言

    • 下圖[b]中的輸入Embedding部分沒有變化,但是Positional Encoding部分被打亂了順序
    • 下圖[c]中的Positional Encoding部分沒有變化,但是Embedding部分被打亂了順序
    • 實際上[b]和[c]完全等價,因為在2種輸入中E1-P5, E2-P1, E3-P3, E4-P2, E5-P4這個對應關系恒定。

    [b] 輸入token順序不變,只改變positional encoding順序

    [c] 輸入positional encoding順序不變,token順序改變

    * 對train階段而言(針對learned postional encoding的情況)

    • 由于positional encoding是訓練出來的,那么它在inference階段代表哪個位置,完全由訓練時的實際位置決定
    • 舉個例子,在decoder中,cross-attention模塊是有mask的,目的是防止token與它之后的token去做attention,也就是left-to-right模型。如果這時我突然想要訓一個right-to-left的模型,那么做法1是在預處理階段將序列翻轉過來(比較簡單也比較容易想到);做法2是在訓練時將mask策略換一下

    Left-to-Right模型訓練時對應的decoder mask

    Right-to-Left模型訓練時對應的decoder mask
    • 做法1和做法2訓練出來的positional encoding是等價的
    • 【延伸】有興趣可以看看XLNet是如何利用mask來實現Permuted Language Model的: 潘小小:【論文串講】從GPT和BERT到XLNet

    優勢2

    論文中使用的Positional Encoding(PE)是正余弦函數,位置(pos)越小,波長越長,每一個位置對應的PE都是唯一的。同時作者也提到,之所以選用正余弦函數作為PE,是因為這可以使得模型學習到token之間的相對位置關系:因為對于任意的偏移量k,

    可以由 的線性表示:

    上面兩個公式可以由

    和的線性組合得到。也就是 乘上某個線性變換矩陣就得到了

    p.s. 后續有一個工作在attention中使用了“相對位置表示” (Self-Attention with Relative Position Representations) ,有興趣可以看看。

    3.3. Layer Normalization

    在每個block中,最后出現的是Layer Normalization。Layer Normalization是一個通用的技術,其本質是規范優化空間,加速收斂。

    當我們使用梯度下降法做優化時,隨著網絡深度的增加,數據的分布會不斷發生變化,假設feature只有二維,那么用示意圖來表示一下就是:

    數據的分布發生變化,左圖比較規范,右圖變得不規范

    為了保證數據特征分布的穩定性(如左圖),我們加入Layer Normalization,這樣可以加速模型的優化速度。

    4. 參考

    How Much Attention Do You Need? A Granular Analysis of Neural Machine Translation Architectures?www.aclweb.orgAttention is all you need; Attentional Neural Network Models | ?ukasz Kaiser | Masterclass?www.youtube.comThe Illustrated Transformer?jalammar.github.ioJuliuszh:詳解深度學習中的Normalization,BN/LN/WN?zhuanlan.zhihu.com

    其他......

    本文只是重點介紹了一下Transformer,當前基于Transformer的各類后續研究正在自然語言處理的各大領域里大放異彩,本人還有一些其他的文章與Transformer有關:

    潘小小:【論文串講】從GPT和BERT到XLNet?zhuanlan.zhihu.com潘小小:【論文串講】從BERT和XLNet到MPNet潘小小:【論文串講】從GPT和BERT到XLNet?zhuanlan.zhihu.com潘小小:【論文串講】從BERT和XLNet到MPNet?zhuanlan.zhihu.com

    本文已獨家授權公眾號淺夢的學習筆記發布在微信公眾平臺。


    花絮!

    終于寫完啦~撒花

    大家好,我叫潘小小(不是真名),是字節跳動AI-lab的一枚算法攻城獅~我的文章中絕大部分的圖文都是原創,行文風格比較偏我個人學習和思考的習慣。歡迎大家關注我的技術專欄【小小的機器世界】

    總結

    以上是生活随笔為你收集整理的transformer模型_【经典精读】Transformer模型深度解读的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。