Attention專場 ——(1) 簡介

1. 基於注意力機制的編碼器解碼器

1.1 整體流程

1.1.1 基本概念

在這張架構圖中,decoder的輸入吃的都是同樣的vector
在這裏插入圖片描述
而DCG的架構是這樣的:
在這裏插入圖片描述
tt爲編碼器中的時間步長,tt'爲解碼器中的時間步長。

注意力機制模型類似於encoder-decoder模型,只不過,在編碼解碼器的連接部分有部分的差別。總的來說可以概括爲下面4個步驟:

計算 value

在輸入的數據中,每個單詞或者字均由一個向量表示,按照標準LSTM流程輸入到模型中,每一個timestamps都會有對應的隱藏狀態,與普通LSTM模型不同的是,每一個timestamps得到的隱藏狀態值均需要被保留下來。
在這裏插入圖片描述

先計算Query和key

這個時候初始化一個東西,z0z^0(這個東西是亂出來的,需要model學習),它的作用相當於一個Query,去匹配第一步中所有隱藏狀態的輸出值,對於每一個隱藏狀態值hth^t都計算一個匹配度(Key),計算匹配程度的算法叫做:match。在該步驟中,0代表第0時刻,α01\alpha_0^1z0z_0h1h^1共同計算得出,其意義在於,計算z0z_0h1h^1的匹配程度,
在這裏插入圖片描述
這樣計算z0z_0hih^i四個的匹配程度後,得到α01,α02,α03,α04\alpha_0^1, \alpha_0^2, \alpha_0^3, \alpha_0^4,也就是上文提到的Key

note:softmax層可加可不加,看情況而定。

在這裏插入圖片描述
在這一步驟中,α01\alpha_0^1z0z_0h1h^1共同計算得出,具體如何計算,則沒有具體的要求,自主性比較大。一般可以抽象爲如下表達式:
ett=function(zdecode_t,aencode_t) e_{t't}=function( z^{decode\_t}, a^{encode\_t})
有兩個通常的方法:

  1. 構建一個小型的神經網絡
  2. 通過向量空間中的內積

計算Attention的結果,並應用在解碼器中

將第2步中的得到的匹配度(Key)隱藏狀態的值(Value)進行加權作爲新的解碼器在t時刻的輸入也就是c0c^0。這個時候decoder解碼器LSTM神經網絡輸出的值爲“machine”,同時可以把隱藏狀態hh或者記憶單元cc作爲z1z^1
在這裏插入圖片描述

1.2 抽象成Query、Key、Value

在這裏插入圖片描述
在這裏插入圖片描述

先上結論:

  • Query對應zz
  • Key對應aa
  • Value對應hh

將Source中的構成元素想象成是由一系列的<Key,Value>數據對構成,此時給定Target中的某個元素Query,通過計算Query和各個Key的相似性或者相關性,得到每個Key對應Value的權重係數,然後對Value進行加權求和,即得到了最終的Attention數值。所以本質上Attention機制是對Source中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重係數。

1.3 具體說明

以下內容來自動手學深度學習

1.3.1 計算背景變量

我們先描述第一個關鍵點,即計算背景變量。下圖描繪了注意力機制如何爲解碼器在時間步2計算背景變量。首先,函數a根據解碼器在時間步1的隱藏狀態和編碼器在各個時間步的隱藏狀態計算softmax運算的輸入。softmax運算輸出概率分佈並對編碼器各個時間步的隱藏狀態做加權平均,從而得到背景變量。
在這裏插入圖片描述
具體來說,令編碼器在時間步t的隱藏狀態爲ht\boldsymbol{h}_t,且總時間步數爲TT。那麼解碼器在時間步tt'的背景變量爲所有編碼器隱藏狀態的加權平均:
ct=t=1Tα^ttht,\boldsymbol{c}^{t'} = \sum_{t=1}^T \hat{\alpha}_{t'}^{t} \boldsymbol{h}_t,

其中給定tt'時,權重αttt=1,,T\alpha_{t' t}在t=1,\ldots,T的值是一個概率分佈。爲了得到概率分佈,我們可以使用softmax運算:
α^tt=exp(αtt)k=1Texp(αtt),t=1,,T.\hat{\alpha}_{t'}^{t} = \frac{\exp(\alpha_{t'}^{t})}{ \sum_{k=1}^T \exp(\alpha_{t'}^{t}) },\quad t=1,\ldots,T.

現在,我們需要定義如何計算上式中softmax運算的輸入αtt\alpha_{t'}^{t}。由於αtt\alpha_{t'}^{t}同時取決於解碼器的時間步tt'和編碼器的時間步tt,我們不妨以解碼器在時間步t1t'-1的隱藏狀態zt1\boldsymbol{z}_{t' - 1}與編碼器在時間步tt的隱藏狀態ht\boldsymbol{h}_t爲輸入,並通過函數functionfunction計算αtt)\alpha_{t'}^{t})

ett=function(zt1,ht).e_{t' t} = function(\boldsymbol{z}_{t' - 1}, \boldsymbol{h}_t).
這裏函數functionfunction有多種選擇,如果兩個輸入向量長度相同,一個簡單的選擇是計算它們的內積function(z,h)=zhfunction(\boldsymbol{z}, \boldsymbol{h})=\boldsymbol{z}^\top \boldsymbol{h}。而最早提出注意力機制的論文則將輸入連結後通過含單隱藏層的多層感知機變換 [1]:
function(z,h)=vtanh(Wzz+Whh) function(\boldsymbol{z}, \boldsymbol{h}) = \boldsymbol{v}^\top \tanh(\boldsymbol{W}_z\boldsymbol{z} + \boldsymbol{W}_h \boldsymbol{h})
其中vWsWh\boldsymbol{v}、\boldsymbol{W}_s、\boldsymbol{W}_h都是可以學習的模型參數。

1.3.2 矢量化計算

我們還可以對注意力機制採用更高效的矢量化計算。廣義上,注意力機制的輸入包括查詢項以及一一對應的鍵項和值項,其中值項是需要加權平均的一組項。在加權平均中,值項的權重來自查詢項以及與該值項對應的鍵項的計算。

在上面的例子中,查詢項爲解碼器的隱藏狀態,鍵項和值項均爲編碼器的隱藏狀態。讓我們考慮一個常見的簡單情形,即編碼器和解碼器的隱藏單元個數均爲hh,且函數function(z,h)=zhfunction(\boldsymbol{z}, \boldsymbol{h})=\boldsymbol{z}^\top \boldsymbol{h}
假設我們希望根據解碼器單個隱藏狀態st1Rh\boldsymbol{s}_{t' - 1} \in \mathbb{R}^{h}和編碼器所有隱藏狀態htRh,t=1,,T\boldsymbol{h}_t \in \mathbb{R}^{h}, t = 1,\ldots,T來計算背景向量ctRh\boldsymbol{c}^{t'}\in \mathbb{R}^{h}
我們可以將查詢項矩陣QR1×hst1\boldsymbol{Q} \in \mathbb{R}^{1 \times h}設爲\boldsymbol{s}_{t' - 1}^\top,並令鍵項矩陣KRT×h\boldsymbol{K} \in \mathbb{R}^{T \times h}和值項矩陣VRT×h\boldsymbol{V} \in \mathbb{R}^{T \times h}相同且第tt行均爲ht\boldsymbol{h}_t^\top。此時,我們只需要通過矢量化計算

softmax(QK)V\text{softmax}(\boldsymbol{Q}\boldsymbol{K}^\top)\boldsymbol{V}
即可算出轉置後的背景向量ct\boldsymbol{c}^{{t'}^\top}。當查詢項矩陣Q\boldsymbol{Q}的行數爲nn時,上式將得到nn行的輸出矩陣。輸出矩陣與查詢項矩陣在相同行上一一對應。

1.3.3 更新隱藏狀態

現在我們描述第二個關鍵點,即更新隱藏狀態。以門控循環單元爲例,在解碼器中我們可以對“門控循環單元(GRU)”一節中門控循環單元的設計稍作修改,從而變換上一時間步t1yt1t'-1的輸出\boldsymbol{y}_{t'-1}、隱藏狀態st1\boldsymbol{s}_{t' - 1}和當前時間步tt'的含注意力機制的背景變量ct\boldsymbol{c}_{t'}。解碼器在時間步tt’的隱藏狀態爲

zt=stzt1+(1st)z~t,\boldsymbol{z}_{t'} = \boldsymbol{s}_{t'} \odot \boldsymbol{z}_{t'-1} + (1 - \boldsymbol{s}_{t'}) \odot \tilde{\boldsymbol{z}}_{t'},
其中的重置門、更新門和候選隱藏狀態分別爲
rt=σ(Wyryt1+Wzrzt1+Wcrct+br),st=σ(Wyzyt1+Wzsst1+Wcsct+bs),z~t=tanh(Wyzyt1+Wzz(zt1rt)+Wczct+bz), \begin{aligned} \boldsymbol{r}_{t'} &= \sigma(\boldsymbol{W}_{yr} \boldsymbol{y}_{t'-1} + \boldsymbol{W}_{zr} \boldsymbol{z}_{t' - 1} + \boldsymbol{W}_{cr} \boldsymbol{c}_{t'} + \boldsymbol{b}_r),\\ \boldsymbol{s}_{t'} &= \sigma(\boldsymbol{W}_{yz} \boldsymbol{y}_{t'-1} + \boldsymbol{W}_{zs} \boldsymbol{s}_{t' - 1} + \boldsymbol{W}_{cs} \boldsymbol{c}_{t'} + \boldsymbol{b}_s),\\ \tilde{\boldsymbol{z}}_{t'} &= \text{tanh}(\boldsymbol{W}_{yz} \boldsymbol{y}_{t'-1} + \boldsymbol{W}_{zz} (\boldsymbol{z}_{t' - 1} \odot \boldsymbol{r}_{t'}) + \boldsymbol{W}_{cz} \boldsymbol{c}_{t'} + \boldsymbol{b}_z), \end{aligned}
其中含下標的W\boldsymbol{W}b\boldsymbol{b}分別爲門控循環單元的權重參數和偏差參數。

2. self-Attention

其實,在上文提到的Attention模型中,存在一個嚴重性的問題,也就是LSTM網絡的致命缺陷,沒有辦法並行化計算,必須等上一個時刻神經元輸出後才能夠進行本時刻的計算。

因此,有的學者爲了加快計算速度,提出了使用卷積的方法代替LSTM中hth^t的值,但是這種方法存在一個弊端:提取信息的大小隻和超參數卷積核的大小有關,而且沒有辦法處理長期的信息(卷積核大小畢竟有限)。所以,就提出了這種Transformer架構,裏面用到的思想就是self Attention的方法。

2.1 Self-Attention流程

假設輸入是x1,x2,x3,x4x^1, x^2, x^3, x^4,那麼每一個輸入先通過與一個矩陣相乘變爲a1,a2,a3,a4a^1, a^2, a^3, a^4,然後將每一個aia^i都乘上三個矩陣,得到對應的qi,ki,viq^i, k^i, v^i,再將qjq^j分別對每一個kik^i進行attention操作得到aj1,aj2,aj3,aj4a_{j1},a_{j2}, a_{j3}, a_{j4}。其中,qjq^jkik^i的公式爲:
aij=qikj/k a_{ij}=q^i k^j/\sqrt{k}
ddq,kq, k的維度數,除以d\sqrt{d}的原因是:q,kq,k的維度越大,則他們的乘積就越大,所以需要正則化。
在這裏插入圖片描述
再之後,將每一個aija_{ij}通過一個softmax值得到a^ij\hat{a}_{ij}
在這裏插入圖片描述
在這裏插入圖片描述
重複上述過程,則可以得到輸出序列b1,b2,b3,b4b^1, b^2, b^3, b^4

那麼,如何並行化呢?
首先將所有的aia^i都拼起來,得到II,乘上同一個矩陣WqW^q得到QQ,以此類推得到K,VK, V

在這裏插入圖片描述
在得到Q,K,VQ, K, V之後,按照之前的步驟,需要計算a^ij\hat{a}_{ij},於是,將kjk^j全部拼起來,就有了下面的結果:
在這裏插入圖片描述
並行計算bb
在這裏插入圖片描述

2.2 Muti-head Self-Attention流程

這裏以兩個head爲例:
在這裏插入圖片描述
在這裏插入圖片描述
做多頭的好處:每個head的關注點都不一樣,可以獲得更加精確的值。

2.2.1 多頭attention中句子的位置信息

在上述的算法過程中,輸入數據的位置信息並沒有影響到輸出,爲了增加輸入數據的合理性,於是在計算aia^i時,增加了一個記錄位置信息的向量eie^i,每一個xix^i都對應這不同的ee

在這裏插入圖片描述
ee爲什麼是加到aia^i上?這裏給出瞭解釋:
假設pip^i是一個one-hot的向量,代表了xx位置的信息
在這裏插入圖片描述

2.3 Transformer的網絡架構如下:

Transformer最大的改進在於,將Encode-Decode 層數疊了上去,而不僅僅是1.1節中的單層網絡。在疊加的多層中,每一層都是使用了attention機制,Attention的來源就是來自於最初的輸入信息,這個和ResNet有點像,都是跨層進行連接的。
在這裏插入圖片描述

2.3.1 self-Attention層

在這裏插入圖片描述

2.4 self-Attention層

在這裏插入圖片描述
還是在第一節中提到的(KQV)(KQV)的應用。
假設我們想要重新表示e2e_2也就是計算e2e_2的權重時,需要進行以下操作:

計算key和Query

首先把目標e2e_2通過一個functionfunction變換成QueryQuery(在1.1節的單層中是和解碼器的t1t'-1時刻的隱藏狀態聯繫起來,求解Query的)然後把e2e_2的鄰居們,或者是所有的輸入都看成是key

3. 通用的一些技巧

3.1 regularization attention

在注意力機制中,有時候注意力可能僅僅集中在某幾個特殊的狀態中,例如:
在這裏插入圖片描述
這個時候輸出的結果可能就只有妹子了,那麼怎麼辦,我們希望注意力集能夠均勻分佈,因此需要正則化,所以:
在這裏插入圖片描述

3.2 Mismatch test data

在RNN的Seq2Seq模型的訓練過程中,不管訓練輸出的結果是啥,都使用的正確輸入數據作爲下一時刻的輸入。
在這裏插入圖片描述
這樣的方式可能會造成一個問題,那就是在生成數據的時候,可能你第一個輸出就是錯誤的,這樣的結果就是錯上加錯

解決方法:

  1. Beam搜索
    在這裏插入圖片描述
    即每個可能的輸出都進行一次運算,保留可能性最大的K個值作爲下一時刻的輸入。

參考文獻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章