Self-Attention
之前的RNN輸入是難以並行化的,我們下一個輸入可能依賴前一個輸出,只有知道了前面的輸出才能計算后面的輸出。
於是提出了 self-attention ,但是這時候 $b^{i}$ 能夠並行化計算
我們的輸入 $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