Self-Attention 和 Transformer


Self-Attention

之前的RNN輸入是難以並行化的,我們下一個輸入可能依賴前一個輸出,只有知道了前面的輸出才能計算后面的輸出。

於是提出了 self-attention ,但是這時候 $b^{i}$ 能夠並行化計算

論文地址:https://arxiv.org/pdf/1706.03762.pdf

我們的輸入 $x^{i}$,先經過一個Embedding,變成 $a^{i}$ ,然后丟進 self-attention 層中。如上圖所示。

在self-attention中,我們的 $a^{i}$ 都乘上3個不同的矩陣,進行 transformation,得到3個不同的向量,分別是 $q$、$k$ 和 $v$。

$q$ 是query,它要去match的。$k$ 是key,用來被 $q$ match的;$v$ 是value,它是要被抽取出來的information。現在我們的每一個timestamp都有一個 $q$、$k$ 和 $v$ 這3個不同的向量。

接下來我們對拿每一個 $q$ 對每一個 $k$ 做attention。如上圖所示,$q^{1}$ 和 $k^{1}$ 做attention,得到 $\alpha _{1,1}$,下標(1,1)表示 $q^{1}$ 和 $k^{1}$ 的attention 

attention有許多算法,它做的本質事情就是 吃 兩個向量,輸出一個分數,這個分數表明兩個向量有多匹配

然后 $q^{1}$ 和 $k^{i}$ 計算得到 $\alpha _{1,i}$ ,計算公式和計算示意圖如上圖所示。然后我們會把得到的 $\alpha _{1,i}$ 經過一個softmax,得到 $\hat{\alpha }_{1,i}$,如下圖所示

得到 $\hat{\alpha }_{1,i}$ 后,讓 $\hat{\alpha }_{1,i}$ 分別乘以 $v^{i}$后累加,得到 $b^{1}$,我們輸出 sequence 的第一個向量就是 $b^{1}$。但可以發現我們產生 $b^{1}$ 就已經使用了整個 sequence 的信息

self-attention 輸入是一個 sequence,輸出也是sequence

其他 $b^{i}$ 也是同樣的計算流程,可以並行計算,比如 $b^{2}$,這樣就得到了輸出sequence的第二個向量

論文中的公式:$Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V$

Q、K、V是矩陣各個向量拼接而成的矩陣,整個矩陣計算的示意圖如下圖所示

從上面可以看到,self-attention 就是一連串矩陣運算

 

Multi-Head Attention

我們用 2 heads 的情況舉例,這種情況下,我們的 $q^{i}$ 會分裂成兩個—— $q^{i,1}$ 和 $q^{i,2}$。 

實際中 head 的數目也是參數,可以調

然后 $q^{i,1}$ 和 $k^{i,1}$ 、$k^{j,1}$ 分別計算 attention,最后計算出 $b^{i,1}$,如上圖所示。用同樣的步驟計算出 $b^{i,1}$ 和 $b^{i,2}$,把它們兩個 concat 后乘以一個矩陣 $W^{o}$ ,得到 $b^{i}$。

論文中的公式:$Multi-Head(Q,K,V)=Concat(head_{1},...,head_{h})W^{o}$

其中$head_{i}=Attention(QW^{Q}_{i},KW^{K}_{i},VW^{V}_{i})$

但是 self-attention 沒有用到  sequence 的位置信息

所以在輸入 $x^{i}$ 經過 transformation 得到 $a^{i}$ 后,還要加上一個 $e^{i}$, $e^{i}$ 是人工設置的,這個 $e^{i}$ 代表了位置信息。

論文3.5節Positional Encoding

定義這個向量的方式有多種多樣。 比如,用 $p^{i}$ 表示位置信息,讓 $p^{i}$ 和一個矩陣 $W^{p}$ 相乘得到的就是我們的 $e^{i}$

下面是做 self-attention 的一個動態示意圖。可以看到 encoder 階段 self-attention 是並行的且用到了所有單詞的信息。

 

transformer

transformer 模型架構圖如下圖所示,對 encoder 和 decoder 使用了 self-attention 機制

左邊是 encoder ,右邊是 decoder

encoder 是左邊灰色的圖塊,它可以重復 N 次,在 encoder 中,有一個 Multi-Head Attention 層,根據前面了解到的信息。這層的輸入是一個 sequence,輸出也是一個 sequence。如下圖所示。

然后再經過 Add & Norm。Add 指我們會把 Multi-Head Attention 的輸入和輸出加起來得到 $b'$,Norm指我們會把得到的 $b'$ 做 Layer Norm

Layer Norm 和 Batch Norm 的不同:

在做 Batch Norm 的時候,在同一個 batch 里面,對不同 data 同樣的 dimension 做 normalization,希望整個 batch 里面同一個 dimension 的均值為0,方差為1

Layer Norm 是給一組 data,我們希望不同 dimension 的均值為0,方差為1。如下圖所示

之后再經過 Feed Forward ,它對剛剛的輸出進行處理,然后再經過一個 Add & Norm。

下面看看右邊的 decoder ,它也可以重復 N 次。

它的輸入是上一個 tiemstamp 的輸出,同樣經過 embedding 和 positional encoding 后進入 decoder 中。decoder 的第一層是 Masked Multi-Head Attention,Masked 是說我們在做 self-attention 的時候這個 decoder 只會 attend 到它已經產生出來的 sequence。然后經過 Add & Norm ,再經過 Multi-Head,這個 Multi-Head Attention 會 attend 到之前 encoder 的輸出,……,然后輸出。

上面這張圖顯示了英語到法語翻譯(eight attention heads之一)訓練的 transformer 第5層到第6層中encoder 的 “it” 一詞的 self-attention 分布。

可以看到 “it” attend 到了 animal,可以看到我們的模型自動學到了在做 attention 時,“it” 要 attend 到 “animal”

當我們只改動左邊的一個單詞,把 tired 改為 wide。這句子里 “it” 再指動物,而是指 street,說它太寬了,我們的模型也能 attend 到 street。

詳細文章:https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html


免責聲明!

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



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