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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

[深度学习] 自然语言处理---Transformer原理(一)

發布時間:2023/12/15 pytorch 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [深度学习] 自然语言处理---Transformer原理(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《Attention Is All You Need》是Google在2017年提出的一篇將Attention思想發揮到極致的論文。該論文提出的Transformer模型,基于encoder-decoder架構,拋棄了傳統的RNN、CNN模型,僅由Attention機制實現,并且由于encoder端是并行計算的,訓練時間大大縮短。
Transformer模型廣泛應用于NLP領域,機器翻譯、文本摘要、問答系統等等,目前火熱的Bert模型就是基于Transformer模型構建的。

Transformer優點:transformer架構完全依賴于Attention機制,解決了輸入輸出的長期依賴問題,并且擁有并行計算的能力,大大減少了計算資源的消耗。self-attention模塊,讓源序列和目標序列首先“自關聯”起來,這樣的話,源序列和目標序列自身的embedding表示所蘊含的信息更加豐富,而且后續的FFN層也增強了模型的表達能力。Muti-Head Attention模塊使得Encoder端擁有并行計算的能力.

一 整體架構

Transformer 的代碼:Attention Is All You Need | Papers With Code#2 best model for Multimodal Machine Translation on Multi30K (BLUE (DE-EN) metric)https://paperswithcode.com/paper/attention-is-all-you-need這部分我們來看看Transformer的架構。Transformer遵循了Encoder-Decoder的架構。

?在Encoder方面,6個編碼器組件協同工作,組成一個大的編碼器,解碼器同樣由6個解碼器組件組成。

  • Encoder? 6個編碼器組件依次排列,每個組件內部都是由一個多頭attention加上一個前饋網絡,attenion和前饋的輸出都經過層歸一化(LayerNormalization),并且都有各自的殘差網絡.
  • Decoder? 組件的配置基本相同, 不同的是Decoder有兩個多頭attention機制,一個是其自身的mask自注意力機制,另一個則是從Encoder到Decoder的注意力機制,而且是Decoder內部先做一次attention后再接收Encoder的輸出。
  • 說完了Encoder和Decoder,再說說輸入,模型的輸入部分由詞向量(embedding)經位置編碼(positional Encoding)后輸入到Encoder和Decoder。編碼器的輸出由一個線性層和softmax組成,將浮點數映射成具體的符號輸出。

    首先,Transformer模型也是使用經典的encoer-decoder架構,由encoder和decoder兩部分組成。

    上圖的左半邊用Nx框出來的,就是我們的encoder的一層。encoder一共有6層這樣的結構。
    上圖的右半邊用Nx框出來的,就是我們的decoder的一層。decoder一共有6層這樣的結構。
    輸入序列經過word embedding和positional encoding相加后,輸入到encoder。
    輸出序列經過word embedding和positional encoding相加后,輸入到decoder。
    最后,decoder輸出的結果,經過一個線性層,然后計算softmax。

    這張圖是一個已經簡單的翻譯模型,將英文翻譯成中文.

    比如我們輸入英文 Why do we work ? 我們需要將其翻譯成中文,我們根據序號來看
    【1】將英文文本輸入到輸入到編碼器的模型中去
    【2】通過編碼器得到我們的隱藏層特征
    【3】我們輸入<start>開始token
    【4】解碼器結合我們的隱藏層特征輸出 為
    【5】我們再將我們得到的 為 輸出到解碼器中
    【6】解碼器結合我們隱藏層特征會輸出?什
    【7】依次按照這種方式不斷輸入到解碼器中,我們將得出我們解碼器翻譯出來的中文語句。
    ? 鏈接:https://www.jianshu.com/p/29e31b73528e

    二 Encoder 與 Decoder

    ?編碼器和解碼器塊實際上是相互堆疊在一起的多個相同的編碼器和解碼器。 編碼器堆棧和解碼器堆棧都具有相同數量的單元。

    編碼器和解碼器單元的數量是一個超參數。文中使用了 6 個編碼器和解碼器。

    讓我們看看編碼器和解碼器堆棧的設置是如何工作的:

    • 將輸入序列的詞嵌入(word embeddings)傳遞給第一個編碼器。

    • 然后將它們進行轉換并傳播到下一個編碼器。

    • 編碼器堆棧中最后一個編碼器的輸出將傳遞給解碼器堆棧中所有的解碼器,如下圖所示:

    這里需要注意的一點是,除了自注意力和前饋層外,解碼器還有一層解碼器 - 解碼器注意力層。這有助于解碼器將注意力集中在輸入序列的適當部分上。

    1. Encoder

    由 6 層組成,每一層包括兩個子層:

    「第一層」是 multi-head self-attention 層,

    「第二層」是一個簡單的全連接前饋網絡。在每個子層后,都接了一個「殘差連接以及歸一化」,即每個子層的輸出為 LayerNorm(X + Sublayer(X))?為了方便殘差連接,模型中的所有子層,包括 embedding 層(初始詞嵌入)?輸出向量維度均為?

    2. Decoder

    同樣由 6 層組成,每一層包括三個子層:

    「第一層」是 masked multi-head self-attention 層,注意其輸入僅包含「當前位置之前的詞語信息」,這樣設計的目的是解碼器是按順序解碼的,其當前輸出只能基于已輸出的部分。

    「第二層」是 multi-head self-attention 層,其輸入包含編碼器的輸出信息(矩陣 K 和矩陣 V ),「第三層」是全連接前饋網絡。每個子層后同樣加入了「殘差連接和歸一化」。下圖給出了編碼器和解碼器的內部結構,注意前饋神經網絡對于序列每個位置的獨立性。

    三?Positional Encoding

    [深度學習] 自然語言處理---Transformer 位置編碼介紹_小墨魚的專欄-CSDN博客_自然語言處理位置編碼https://zengwenqi.blog.csdn.net/article/details/120294257

    四 Self Attention 與 Mutil Head Attention

    自注意力,有時也稱為內部注意力(intra-attention),是一種注意力機制,它將一個序列的不同位置聯系起來,以計算出序列的表示形式。

    它指的是 street 還是 animal?這對我們來說是一個簡單的問題,但對算法來說可不是這樣的。當模型處理到“it”這個單詞時,自注意力試圖將“it”與同一句話中的“animal”聯系起來。

    ?熟悉attention原理的童鞋都知道,attention可由以下形式表示

    首先說明一下我們的K、Q、V是什么:

    • 在encoder的self-attention中,Q、K、V都來自同一個地方(相等),他們是上一層encoder的輸出。對于第一層encoder,它們就是word embedding和positional encoding相加得到的輸入。
    • 在decoder的self-attention中,Q、K、V都來自于同一個地方(相等),它們是上一層decoder的輸出。對于第一層decoder,它們就是word embedding和positional encoding相加得到的輸入。但是對于decoder,我們不希望它能獲得下一個time step(即將來的信息),因此我們需要進行sequence masking。
    • 在encoder-decoder attention中,Q來自于decoder的上一層的輸出,K和V來自于encoder的輸出,K和V是一樣的。
    • Q、K、V三者的維度一樣,即 dq = dk = dv

    scaled dot-product attentiondot-product attention唯一的區別就是,scaled dot-product attention有一個縮放因子?? 上面公式中的dk表示的是K的維度,在論文里面,默認是64。

    那么為什么需要加上這個縮放因子呢?

    論文里給出了解釋:對于dk很大的時候,點積得到的結果維度很大,使得結果處于softmax函數梯度很小的區域。我們知道,梯度很小的情況,這對反向傳播不利。為了克服這個負面影響,除以一個縮放因子,可以一定程度上減緩這種情況。

    其思想和attention類似,但是self-attention是Transformer用來將其他相關單詞的“理解”轉換成我們正在處理的單詞的一種思路

    我們看個例子:

    1. The animal didn’t cross the street because it was too tired

    2. The animal didn’t cross the street because it was too wide

    兩句話中的單詞 it 指代不同,第一句話 it 指代 animal 而第二句指代 street。對于我們來說能很簡單的判斷出來,但是對于機器來說,是很難判斷的,尤其是相對于傳統seq2seq模型。兩句話在單詞 it 之前的內容是一樣的,傳統seq2seq模型encoder的順序輸入導致模型無法區分這種差別。而self-attention機制通過計算單詞it與其他詞之間的聯系得知it的具體指代,最終結果如下圖所示。

    ?Self Attention就是句子中的某個詞對于本身的所有詞做一次Attention。算出每個詞對于這個詞的權重,然后將這個詞表示為所有詞的加權和。每一次的Self Attention操作,就像是為每個詞做了一次Convolution操作或Aggregation操作。具體操作如下:

    1.首先,self-attention會計算出三個新的向量,在論文中,向量的維度是512維,我們把這三個向量分別稱為Query、Key、Value,這三個向量是用embedding向量與一個矩陣相乘得到的結果,這個矩陣是隨機初始化的,維度為(64,512)注意第二個維度需要和embedding的維度一樣,其值在BP的過程中會一直進行更新,得到的這三個向量的維度是64。

    2. 計算self-attention的分數值,該分數值決定了當我們在某個位置encode一個詞時,對輸入句子的其他部分的關注程度。這個分數值的計算方法是Query與Key做點成,以下圖為例,首先我們需要針對Thinking這個詞,計算出其他詞對于該詞的一個分數值,首先是針對于自己本身即q1·k1,然后是針對于第二個詞即q1·k2。

    3. 接下來,把點成的結果除以一個常數,這里我們除以8,這個值一般是采用上文提到的矩陣的第一個維度的開方即64的開方8,當然也可以選擇其他的值,然后把得到的結果做一個softmax的計算。得到的結果即是每個詞對于當前位置的詞的相關性大小,當然,當前位置的詞相關性肯定會會很大。

    4.下一步就是把Value和softmax得到的值進行相乘,并相加,得到的結果即是self-attetion在當前節點的值。

    在實際的應用場景,為了提高計算速度,我們采用的是矩陣的方式,直接計算出Query, Key, Value的矩陣,然后把embedding的值與三個矩陣直接相乘,把得到的新矩陣 Q 與 K 相乘,除以一個常數,做softmax操作,最后乘上 V 矩陣。

    歸一化之前需要通過除以向量的維度dk來進行標準化,所以最終Self Attention用矩陣變換的方式可以表示為

    最終每個Self Attention接受n個詞向量的輸入,輸出n個Aggregated的向量。

    這種通過 query 和 key 的相似性程度來確定 value 的權重分布的方法被稱為scaled dot-product attention。

    上文提到Encoder中的Self Attention與Decoder中的有所不同,Encoder中的Q、K、V全部來自于上一層單元的輸出,而Decoder只有Q來自于上一個Decoder單元的輸出,K與V都來自于Encoder最后一層的輸出。也就是說,Decoder是要通過當前狀態與Encoder的輸出算出權重后,將Encoder的編碼加權得到下一層的狀態。

    三 Multi-head Attention

    理解了Scaled dot-product attention,Multi-head attention也很簡單了。Multi-Head Attention就是將上述的Attention做h遍,然后將h個輸出進行concat得到最終的輸出。這樣做可以很好地提高算法的穩定性,在很多Attention相關的工作中都有相關的應用。

    論文進一步增加了multi-headed的機制到self-attention上,在如下兩個方面提高了attention層的效果:

  • 多頭機制擴展了模型集中于不同位置的能力。在上面的例子中,z1只包含了其他詞的很少信息,僅由實際自己詞決定。在其他情況下,比如翻譯 “The animal didn’t cross the street because it was too tired”時,我們想知道單詞"it"指的是什么。
  • 多頭機制賦予attention多種子表達方式。像下面的例子所示,在多頭下有多組query/key/value-matrix,而非僅僅一組(論文中使用8-heads)。每一組都是隨機初始化,經過訓練之后,輸入向量可以被映射到不同的子表達空間中。
  • 論文提到,他們發現將Q、K、V通過一個線性映射之后,分成 h份,對每一份進行scaled dot-product attention效果更好。然后,把各個部分的結果合并起來,再次經過線性映射,得到最終的輸出。這就是所謂的multi-head attention。上面的超參數 h就是heads數量。論文默認是8。

    這會帶來點麻煩,前向網絡并不能接收八個矩陣,而是希望輸入是一個矩陣,所以要有種方式處理下八個矩陣合并成一個矩陣。

    ?Transformer的實現中,為了提高Multi-Head的效率,將W擴大了h倍,然后通過view(reshape)和transpose操作將相同詞的不同head的k、q、v排列在一起進行同時計算,完成計算后再次通過reshape和transpose完成拼接,相當于對于所有的head進行了一個并行處理。

    值得注意的是,上面所說的分成 h 份是在 dk,kq,dv?維度上面進行切分的。因此,進入到scaled dot-product attention的 dk 實際上等于未進入之前的 Dk/h, self-attention則是取Q,K,V相同。

    作者同樣提到了另一種復雜度相似但計算方法additive attention,在 dk 很小的時候和dot-product結果相似,dk大的時候,如果不進行縮放則表現更好,但dot-product的計算速度更快,進行縮放后可減少影響(由于softmax使梯度過小,具體可見論文中的引用)

    同維度中的單頭與多頭的區別?

    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的表現力。

    在多頭注意力中,對于初學者來說一個比較經典的問題就是,在相同維度下使用單頭和多頭的區別是什么?這句話什么意思呢?以圖1-10中示例為例,此時的自注意力中使用了兩個頭,每個頭的維度為dq,即采用了多頭的方式。另外一種做法就是,只是用一個頭,但是其維度為2*dq,即采用單頭的方式。那么在這兩種情況下有什么區別呢?

    首先,從論文中內容可知,作者在頭注意力機制與多頭個數之間做了如下的限制

    ?可以看出,單個頭注意力機制的維度dq乘上多頭的個數h就等于模型的維度。

    ?

    ?那現在的問題是圖1-16中的Z能夠計算得到嗎?答案是不能。為什么?因為我沒有告訴你這里的h等于多少。如果我告訴你多頭h=2,那么毫無疑問圖1-16的計算過程就等同于圖1-14的計算過程. 且此時dk=dm/2。

    但是如果我告訴你多頭h=3,那么圖1-16的計算過程會變成

    且此時dk=dm/3。

    現在回到一開始的問題上,根據上面的論述我們可以發現,在dm固定的情況下,不管是使用單頭還是多頭的方式,在實際的處理過程中直到進行注意力權重矩陣計算前,兩者之前沒有任何區別。當進行進行注意力權重矩陣計算時,h越大那么Q,K,V就會被切分得越小,進而得到的注意力權重分配方式越多,?

    同時,當h不一樣時,dk的取值也不一樣,進而使得對權重矩陣的scale的程度不一樣。例如,如果dm=768,那么當時,則;當時,則。

    所以,當模型的維度dm確定時,一定程度上h越大整個模型的表達能力越強,越能提高模型對于注意力權重的合理分配。

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

    三 Position-wise Feed Forward

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

    曾經我在這里有一個百思不得其解的問題:attention層的output最后會和 Wo相乘,為什么這里又要增加一個2層的FFN網絡?

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

    相關問題

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

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

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

    • RNN系列的模型,并行計算能力很差。RNN并行計算的問題就出在這里,因為 T 時刻的計算依賴 T-1 時刻的隱層計算結果,而 T-1 時刻的計算依賴 T-2 時刻的隱層計算結果,如此下去就形成了所謂的序列依賴關系。

    • Transformer的特征抽取能力比RNN系列的模型要好。

      具體實驗對比可以參考:放棄幻想,全面擁抱Transformer:自然語言處理三大特征抽取器(CNN/RNN/TF)比較

      但是值得注意的是,并不是說Transformer就能夠完全替代RNN系列的模型了,任何模型都有其適用范圍,同樣的,RNN系列模型在很多任務上還是首選,熟悉各種模型的內部原理,知其然且知其所以然,才能遇到新任務時,快速分析這時候該用什么樣的模型,該怎么做好。

    為什么說Transformer可以代替seq2seq?

    seq2seq缺點:這里用代替這個詞略顯不妥當,seq2seq雖已老,但始終還是有其用武之地,seq2seq最大的問題在于將Encoder端的所有信息壓縮到一個固定長度的向量中,并將其作為Decoder端首個隱藏狀態的輸入,來預測Decoder端第一個單詞(token)的隱藏狀態。在輸入序列比較長的時候,這樣做顯然會損失Encoder端的很多信息,而且這樣一股腦的把該固定向量送入Decoder端,Decoder端不能夠關注到其想要關注的信息。

    Transformer優點:transformer不但對seq2seq模型這兩點缺點有了實質性的改進(多頭交互式attention模塊),而且還引入了self-attention模塊,讓源序列和目標序列首先“自關聯”起來,這樣的話,源序列和目標序列自身的embedding表示所蘊含的信息更加豐富,而且后續的FFN層也增強了模型的表達能力,并且Transformer并行計算的能力是遠遠超過seq2seq系列的模型,因此我認為這是transformer優于seq2seq模型的地方。

    Transformer如何并行化的?

    Transformer的并行化我認為主要體現在self-attention模塊,在Encoder端Transformer可以并行處理整個序列,并得到整個輸入序列經過Encoder端的輸出,在self-attention模塊,對于某個序列x1,x2,…,xn,self-attention模塊可以直接計算xi,xj的點乘結果,而RNN系列的模型就必須按照順序從x1?計算到xn。

    訓練-模型的參數在哪里?

    Transformer的工作流程就是上面介紹的每一個子流程的拼接

    • 輸入的詞向量首先疊加上Positional Encoding,然后輸入至Transformer內
    • 每個Encoder Transformer會進行一次Multi-head self attention->Add & Normalize->FFN->Add & Normalize流程,然后將輸出輸入至下一個Encoder中
    • 最后一個Encoder的輸出將會作為memory保留
    • 每個Decoder Transformer會進行一次Masked Multi-head self attention->Multi-head self attention->Add & Normalize->FFN->Add & Normalize流程,其中Multi-head self attention時的K、V至來自于Encoder的memory。根據任務要求輸出需要的最后一層Embedding。
    • Transformer的輸出向量可以用來做各種下游任務

    Encoder端可以并行計算,一次性將輸入序列全部encoding出來,但Decoder端不是一次性把所有單詞(token)預測出來的,而是像seq2seq一樣一個接著一個預測出來的。

    transformer的核心點積是沒有參數,transformer結構的訓練,會優化的參數主要在:

  • 嵌入層-Word Embedding
  • 前饋(Feed Forward)層
  • 多頭注意力中的“切片”操作(映射成多個/頭小向量)實際是一個全連接層(線性映射矩陣),以及多頭輸出拼接結果(Concat)后會經過一個Linear全連接層。這兩個全連接層也是殘差塊有意義的地方,如果沒有這一層,那這個注意力機制中就沒有參數,殘差就沒有意義了。
  • ?參考文獻

    • Attention is all your need
    • 《Attention is All You Need》淺讀(簡介+代碼)
    • Attention機制概念學習筆記
    • Attention和Transformer
    • 0基礎看懂BERT中attention機制的套路
    • Attention機制詳解(二)——Self-Attention與Transformer
    • 最詳細的Transformer英文版解釋(內涵高清大圖)
    • Multilingual Hierarchical Attention Networks for Document Classification
    • Layer Normalization
    • Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
    • 為什么ResNet和DenseNet可以這么深?一文詳解殘差塊為何有助于解決梯度彌散問題
    • Attention?Attention!
    • Transformer原理和實現
    • 一文看懂Transformer內部原理(含PyTorch實現)
    • Building the Mighty Transformer for Sequence Tagging in PyTorch : Part I
    • Building the Mighty Transformer for Sequence Tagging in PyTorch : Part II
    • Transformer 模型的 PyTorch 實現
    • 9012年,該用bert打比賽了
    • BERT中文翻譯PDF版
    • Transformer模型詳解
    • 圖解Transformer(完整版)
    • 關于Transformer的若干問題整理記錄
    • Transformer各層網絡結構詳解!面試必備!(附代碼實現)

    總結

    以上是生活随笔為你收集整理的[深度学习] 自然语言处理---Transformer原理(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

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