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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

搞懂Transformer

發布時間:2024/7/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搞懂Transformer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 內容簡述
    • 2 seq2seq的常用模塊
    • 3 Self-attention
    • 4 Multi-head Self-attention
    • 5 Positional Encoding
    • 6 Transformer
    • 參考資料

文為李弘毅老師【Transformer】的課程筆記,課程視頻youtube地址,點這里👈(需翻墻)。

下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權,必定刪除。

1 內容簡述

拋開Transformer的內部結構,Transformer其實就是一個seq2seq的模型,其中用到了大量的self-attention layer。本文會試圖講明白什么是self-attention layer。

2 seq2seq的常用模塊

之前使用最廣泛的seq2seq的模塊就是RNN。RNN可以分為單向的和雙向的。如果是單向的RNN,輸出中的每個time step會有一些信息丟失,比如單向的RNN在下圖中產生b3b^3b3的時候就只考慮了[a1,a2,a3][a^1, a^2, a^3][a1,a2,a3]。而雙向的RNN輸出的每個time step都考慮了輸入的所有信息,比如雙向的RNN在下圖中產生b3b^3b3的時候就考慮了[a1,a2,a3][a^1, a^2, a^3][a1,a2,a3][a3,a4][a^3, a^4][a3,a4]

但是RNN有一個不好的地方就是它的計算很難并行化,比如我要算b4b^4b4的時候,就要等前幾個結果都出來了,才能算。為了解決這個問題,就有人提出了CNN來替換RNN。

1-D CNN的模塊介紹可以參見這里。雖然CNN的計算可以并行處理,但是,CNN的kernel_size一般會比較小,輸出的某個time step想要考慮到全局的信息,就要把CNN疊很多層。

然后本文的重點就由此引出了,self-attention可以同時解決這兩個問題,也就是既可以讓每個time step的輸出考慮了全局的輸入,又可以并行計算。

左圖為RNN,右圖為CNN

3 Self-attention

self-attention最早出自google的這篇Attention Is All You Need,這篇文章比較難讀懂,但它本身并不是那么神秘,一個非常直觀的理解就是,self-attention是一個可以替代RNN的東西。下面就來剖析一下這個self-attention。我們的目的是輸入一個序列aaa,得到一個序列bbb

假設我們的輸入是xxx,首先要對xxx進行一次embedding,讓它變到我們需要的維度,我們記這個embedding的結果為aaa

a=Wxa=Wxa=Wx

然后,我們要讓這個aaa再分別乘以三個矩陣,self-attention中最為重要的三個東西query, key和value。

q:query(tomatchothers)q=Wqak:key(tobematched)k=Wkav:value(informationtobeextracted)v=Wvaq: query (to\ match\ others)\\ q = W^qa\\ k: key (to\ be\ matched)\\ k = W^ka\\ v: value(information\ to\ be\ extracted)\\ v = W^va\\ q:query(to?match?others)q=Wqak:key(to?be?matched)k=Wkav:value(information?to?be?extracted)v=Wva

然后,我們會把每一個q去對k做attention,所謂的attention就是塞兩個向量進去,然后吐出來一個表示兩個向量相關性的數值α\alphaα。attention的方法有很多種,在Attention Is All You Need中,所使用的叫做scaled dot-product attention。

α1,i=q1?ki/d\alpha_{1, i} = q^1 \cdot k^i / \sqrtozvdkddzhkzd α1,i?=q1?ki/d?

為什么要除以這個d\sqrtozvdkddzhkzdd?呢?因為當qqqkkk的維度很大時,它們內積的variance就會很大,所以要除以一個d\sqrtozvdkddzhkzdd?來scale一下。

最后還要對α\alphaα做一個softmax,得到α^\hat{\alpha}α^。大致的流程如下圖所示。

這個α^\hat{\alpha}α^其實就是每一個time step的value的重要性。用這個α^\hat{\alpha}α^對每個time step的value進行一個加權,就得到了self-attention的結果bbb。比如b1b^1b1就可以通過下式計算得到
b1=∑iα^1,ivib^1=\sum_i{\hat{\alpha}_{1, i}v^i} b1=i?α^1,i?vi

這樣得到的bbb是考慮了所有的輸入的,而且無視輸入之間的遠近,完全通過學習attention來獲取需要的value,其示意圖如下所示。

更重要的是,以上的過程都是可以并行計算的。因為每個time step的計算都是獨立的,我們可以把它們concat到一個大的矩陣里,然后一起計算,示意圖如下所示。

4 Multi-head Self-attention

self-attention是可以做成multi-head的,所謂multi-head,其實就是把qqqkkkvvv分裂成多個,然后每個分別在自己的head內做self-attention,然后把結果再concat起來,如果得到的結果維度不是我們想要的,那么再乘以一個矩陣就可以了。

做成Multi-head的目的是讓不同的head去學到不同的東西,比如有的head學局部的信息,有的head學全局的信息。

5 Positional Encoding

然而,從之前的整個流程可以看出來,self-attention是不會去關心輸入的time step順序的,任何一個輸出,time step是111還是TTT,對self-attention來說都是一樣的,李老師很形象地稱之為“天涯若比鄰”。

為了增加位置的信息,就會給aaa加上一個神奇的人為預先設定好的向量eee,有了這個eee之后,模型就可以知道輸入的位置信息了。

那為什么是e+ae+ae+a,這樣不是把aaa的信息給攪亂了嗎?會什么不是直接concat上去變成[e,a][e, a][e,a]呢?我們不妨來試試concat的話會如何,不過既然是位置信息,我們需要concat到xxx上。假設我們有一個和位置有關的向量pppppp是一個one-hot的向量,表示當前的xix^ixi是在第iii個time step上。那么在做embedding的時候,我們也需要把embedding的矩陣WWW變大,而WWW又可以拆成WiW^iWiWpW^pWp。根據矩陣的計算方法,其結果就相當于給aaa加了一個值,這個值也就是之前提到的eee的。可見,e+ae+ae+a和對xxx進行concat是等效的。

這里有一個比較神奇的地方,就是這個eee是個什么東西,為啥這么靈?換成其他的靈不靈?這就不得而知了。

論文中的position encoding用的是

PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)PE_{(pos, 2i)} = sin(pos / 10000^{2i/d_{model}}) \\ PE_{(pos, 2i+1)} = cos(pos / 10000^{2i/d_{model}}) PE(pos,2i)?=sin(pos/100002i/dmodel?)PE(pos,2i+1)?=cos(pos/100002i/dmodel?)

這是一個不用學習的參數,作者也試過讓模型自己去學,但結果差不多。作者選擇這個不用學習的版本是為了讓模型可以處理比訓練時遇到過的序列更長的序列。

也有人把這個可視化了,可以參見illustrated-transformer。

6 Transformer

從上文中可以看出,self-attention是可以替代RNN的,實際操作中,也就是把RNN替換成self-attention就結束了。

接下來讓我們來看看下面這幅經典的Transformer的圖,現在看起來應該是親切了不少。這個圖的左半個結構是Encoder,右半個結構是Decoder。把圖中的Multi-Head Attention想象成RNN就可以了。Emmm…感覺也不需要額外的說明了。值得注意的是,這里的Masked Multi-Head Attention就是指是對已經產生的序列做attention,比如我們翻譯的時候,是塞一個起始符進去,然后一個字一個字生成,直到遇到終止符。

參考資料

[1] 李宏毅-transformer
[2] illustrated-transformer
[3] Attention Is All You Need

總結

以上是生活随笔為你收集整理的搞懂Transformer的全部內容,希望文章能夠幫你解決所遇到的問題。

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