一、傳統編碼-解碼機制
設輸入序列$\{x^1,x^2,...,x^n\}$,輸出序列$\{y^1,y^2,...,y^m\}$,encoder的隱向量為$h_1,h_2,...$,decoder的隱向量為$s_1,s_2,...$。
解碼器的輸入只有一個向量,該向量就是輸入序列經過編碼器的上下文向量$c$ 。
這種固定長度的上下文向量設計的一個關鍵而明顯的缺點是無法記住長句子。通常,一旦完成了對整個輸入的處理,便會忘記第一部分。注意力機制誕生了(Bahdanau et al,2015)來解決這個問題。
| 模型圖 | 舉例 |
![]() |
![]() |
二、Attention編碼-解碼機制
1.attention定義
attention是一種提升encoder-decoder模型效果的機制,一般稱作attention mechanism。

(1)普通模式
用$X = [x_1, · · · , x_N]$表示$N$組輸入信息,其中每個向量$x_i, i \in [1, N]$都表示 一組輸入信息。為了節省計算資源,不需要將所有信息都輸入到神經網絡,只需要從$X$中選擇一些和任務相關的信息。注意力機制的計算可以分為兩步:一是在所有輸入信息上計算注意力分布,二是根據注意力分布來計算輸入信息的加權平均。
注意力分布:為了從$N$個輸入向量$[x_1, · · · , x_N]$中選擇出和某個特定任務相關的 信息,我們需要引入一個和任務相關的表示,稱為查詢向量(Query Vector),並通過一個打分函數來計算每個輸入向量和查詢向量之間的相關性。
給定一個和任務相關的查詢向量$q$,我們用注意力變量$z \in [1, N]$來表示被選擇信息的索引位置,即$z = i$表示選擇了第$i$個輸入向量。為了方便計算,我們采用一種“軟性”的信息選擇機制。首先計算在給定$q$和$X$下,選擇第$i$個輸入向量的概率$α_i$,
$\begin{aligned} \alpha_{i} &=p(z=i | X, \mathbf{q}) \\ &=\operatorname{softmax}\left(s\left(\mathbf{x}_{i}, \mathbf{q}\right)\right) \\ &=\frac{\exp \left(s\left(\mathbf{x}_{i}, \mathbf{q}\right)\right)}{\sum_{j=1}^{N} \exp \left(s\left(\mathbf{x}_{j}, \mathbf{q}\right)\right)} \end{aligned}$
其中$\alpha_i$稱為注意力分布(Attention Distribution),$s(x_i, q)$ 為注意力打分函數, 可以使用以下幾種方式來計算:
- 加代模型 $\quad s\left(\mathbf{x}_{i}, \mathbf{q}\right)=\mathbf{v}^{\mathrm{T}} \tanh \left(W \mathbf{x}_{i}+U \mathbf{q}\right)$
- 點積模型 $\quad s\left(\mathbf{x}_{i}, \mathbf{q}\right)=\mathbf{x}_{i}^{\mathrm{T}} \mathbf{q}$
- 縮放點積模型 $\quad s\left(\mathbf{x}_{i}, \mathbf{q}\right)=\frac{\mathbf{x}_{i}^{\mathrm{T}} \mathbf{q}}{\sqrt{d}}$
- 雙線性模型 $\quad s\left(\mathbf{x}_{i}, \mathbf{q}\right)=\mathbf{x}_{i}^{\mathrm{T}} W \mathbf{q}$
其中$W, U, v$為可學習的參數,$d$為輸入向量的維度。理論上,加性模型和點積模型的復雜度差不多,但是點積模型在實現上可以更好地利用矩陣乘積,從而計算 效率更高。但當輸入向量的維度 d 比較高,點積模型的值通常有比較大方差,從 而導致softmax函數的梯度會比較小。因此, 縮放點積模型可以較好地解決這個問題。雙線性模型可以看做是一種泛化的點積模型。假設公式(8.5)中$W=U^{T}V$ ,雙線性模型可以寫為 $s(x_i, q) = x_i^{T}U^{T}Vq =(Ux)^{T}(Vq)$,即分別對$x$和$q$進行 線性變換后計算點積。相比點積模型,雙線性模型在計算相似度時引入了非對稱性。
加權平均:注意力分布$\alpha_i$可以解釋為在給定任務相關的查詢$q$時,第$i$個輸入向量受關注的程度。我們采用一種“軟性”的信息選擇機制對輸入信息進行匯總,
$\begin{aligned} \operatorname{att}(X, \mathbf{q}) &=\sum_{i=1}^{N} \alpha_{i} \mathbf{x}_{i} \\ &=\mathbb{E}_{z \sim p(z | X, \mathbf{q})}\left[\mathbf{x}_{z}\right] \end{aligned}$

(2)鍵值對模式
更一般地,我們可以用鍵值對(key-value pair)格式來表示輸入信息,其中 “鍵”用來計算注意力分布αi,“值”用來計算聚合信息。
假設輸入為 q,Memory 中以(k,v)形式存儲需要的上下文。感覺在 Q&A 任務中,這種設置比較合理,Transformer 是采用的這種建模方式。k是question,v是answer,q是新來的question,看看歷史memory中q和哪個k更相似,然后依葫蘆畫瓢,根據相似k對應的v,合成當前question的answer。


2.attention分類

| 按score函數不同分 | 按generate context vector函數分 |
![]() |
|
(1)按score function分
解碼器的輸入是一個向量序列,長度為$m$。解碼器位置$i$的輸入是采用了attention機制的上下文向量$c_i$,不同位置的上下文向量不同。
| 通用模型圖 |
|
| (1)score function | 計算score有多種計算方法,其實本質就是度量兩個向量的相似度。如果兩個向量在同一個空間,那么可以使用 dot 點乘方式(或者 scaled dot product,scaled 背后的原因是為了減小數值,softmax 的梯度大一些,學得更快一些),簡單好使。如果不在同一個空間,需要一些變換(在一個空間也可以變換),additive 對輸入分別進行線性變換后然后相加,multiplicative 是直接通過矩陣乘法來變換。不同計算方法代表不同的attention模型$v_{\alpha},W_{\alpha}$為待學習的參數,$n$為向量的維度。 $$\operatorname{score}\left({\mathbf{s}}_{i-1},{\mathbf{h}}_{t}\right)=\left\{\begin{array}{ll}\frac{{\mathbf{s}}_{i-1} \cdot {\mathbf{h}}_{t}}{\left\|{\mathbf{s}}_{i-1}\right\| \times\left\|{\mathbf{h}}_{t}\right\|}, & \text { cosin } \\{\mathbf{s}}_{i-1} \cdot {\mathbf{h}}_{t}, & \text { dot } \\ \frac{s_{i-1} \cdot {\mathbf{h}}_{t}}{\sqrt{n}}, & \text { scaled-dot } \\ {\mathbf{s}}_{i-1}^{T} \mathbf{W}_{\alpha} {\mathbf{h}}_{t}, & \text { general } \\ {\mathbf{v}}_{\alpha}^{T} \tanh \left(\mathbf{W}_{\alpha}\left[{\mathbf{s}}_{i-1}: {\mathbf{h}}_{t}\right]\right), & \text { concat / additive }\end{array}\right.$$ |
| (2)alignment function |
權重$\alpha_{i,t}$刻畫了:在對第$i$個輸出進行解碼時,第$t$個輸入的重要程度。
計算權重的方法:首先計算$\mathbf{s_{i-1}}$和$\mathbf{h_t}$的相關性,然后對所有的$t=1,2,...,n$歸一化即可得到權重系數。即:$e_{i,t}=\operatorname{score}(\mathbf{s_{i-1}},\mathbf{h_t)}$,$\alpha_{i,t}=\frac{exp(e_{i,t})}{\sum_{t'=1}^n{exp(e_{i,t'})}},t=1,2,...,n$
|
| (3)generate context vector function | 上下文向量$c_i$由編碼器的所有隱向量加權得到$c_i=\sum^n_{t=1}{\alpha_{i,t}h_t}$,其中$\sum_{t=1}^n{\alpha_{i,t}=1}$,$\alpha_{i,t} \geq 0$。 |
| Additive Attention
|
(Additive Attention,又名 Bahdanau Attention) $$\boldsymbol{h}_i = [\overrightarrow{\boldsymbol{h}}_i^\top; \overleftarrow{\boldsymbol{h}}_i^\top]^\top, i=1,\dots,n$$ (1)score function $$\text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \mathbf{v}_a^\top \tanh(\mathbf{W}_a[\boldsymbol{s}_t; \boldsymbol{h}_i])$$ (2)alignment function $$\alpha_{t,i} = \text{align}(y_t, x_i) = \frac{\exp(\text{score}(\boldsymbol{s}_{t-1}, \boldsymbol{h}_i))}{\sum_{i'=1}^n \exp(\text{score}(\boldsymbol{s}_{t-1}, \boldsymbol{h}_{i'}))}$$ (3)generate context vector function $$\mathbf{c}_t = \sum_{i=1}^n \alpha_{t,i} \boldsymbol{h}_i$$ |
| Content-base Attention | $$\text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \text{cosine}[\boldsymbol{s_t},\boldsymbol{h}_i]$$ |
| Location-base | $$\text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \text{softmax}(\mathbf{W}_a \boldsymbol{s}_t)$$ |
| General | $$\text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \boldsymbol{s}^T_t \mathbf{W}_a \boldsymbol{h}_i$$ |
| Dot-Product Attention |
(1)score function 在memory中找相似:$e_i=a(q,k_i)$ (2)alignment function 計算attention權重,通常用softmax進行歸一化:$\alpha_i=softmax(e_i)$ (3)generate context vector function 根據attentionweight,得到輸出向量:$c=\sum_i \alpha_i v_i$ |
| Scaled Dot-Product | $$\text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \frac{\boldsymbol{s}^T_t \boldsymbol{h}_i}{\sqrt{n}}$$ |
下圖是Bahdanau Attention 和 Luong Attention的對比,這兩個 Attention 就是整個 Attention 的奠基之作。

(2)按alignment function分
在 Soft Attention 中,又划分了 global/local attention(In this paper :《Effective Approaches to Attention-based Neural Machine Translation》)。
| Global Attention | ![]() |
|
| global attention 是所有輸入向量作為加權集合,使用 softmax 作為 alignment function。 | ||
| Local Attention(半軟半硬) | ![]() |
$$\begin{aligned} 其中${\mathbf{v}}_{p}$,$\mathbf{W}_{p}$為待學習的參數,$d$為人工指定的固定常量。 |
| (1)為什么用Local? Basic Attention機制中在計算上下文向量$c_i$時,需要考慮編碼器的所有隱向量(背后邏輯是要減小噪音,進一步縮小重點關注區域)。當輸入序列較長時(如一段話或一篇文章),計算效率較低。Local Attention在計算上下文向量$c_i$時,只需要考慮編碼器的部分隱變量:首選預測編碼器端對齊的位置$p_i$,然后基於位置$p_i$選擇一個窗口來計算上下文向量$c_i$。 (2)怎么用Local? 文中提了兩個方案 local-m 和 local-p: local-m 基於的假設生硬簡單,就直接 pass了。local-p 有一個預估操作,預計當前時刻應該關注輸入序列(總長度為S)的什么位置 pt(引入了兩個參數向量,vp,wp),然后在 alignment function 中做了一點兒調整,在 softmax 算出來的attention wieght 的基礎上,加了一個以 pt 為中心的高斯分布來調整 alignment 的結果。 作者最后闡述 local-p + general(score-function 參考multiplicative attention 中的 general 版本)的方式效果是最好的。但從global/local 視角的分類來看,更常用的依然還是 global attention,因為復雜化的local attention 帶來的效果增益感覺並不大。 |
雖然Local Attention可以提高計算效率,但是會帶來兩個問題: (1)編碼器的輸入序列長度$n$並不是很長時,計算量並沒有顯著減小。 (2)位置$p_i$的預測並不是非常准確,這就直接影響了計算attention的准確性。 從global/local 視角的分類來看,更常用的依然還是 global attention,因為復雜化的local attention 帶來的效果增益感覺並不大。
|
(3)按generate context vector function分
《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》
| Hard Attention | ||
| hard attention 是一個隨機采樣,采樣集合是輸入向量的集合,采樣的概率分布是alignment function 產出的 attention weight。因此,hard attention 的輸出是某一個特定的輸入向量。 | ||
| Soft Attention | ||
| soft attention 是一個帶權求和的過程,求和集合是輸入向量的集合,對應權重是 alignment function 產出的 attention weight。hard / soft attention 中,soft attention 是更常用的,因為它可導,可直接嵌入到模型中進行訓練,hard attention 文中 suggests a Monte Carlo based sampling approximation of gradient。 |
3.attention的應用
3.1 Self-Attention
(1)為什么要Self-Attention?
可變長文本的向量表示方法一般有兩種:
- Basic Combination:average,sum
- Neural Combination:RNN、CNN
| RNN | CNN | |
| 特點 | RNN 的長距離依賴比較 tricky:RNN 很強大(可以作為 encoder 對長度任意的序列進行特征抽取,基於特征抽取的能力可以勝任分類任務,另一方面可以作為Generators 學習 Language Model),其實核心就是長距離依賴(gate architectures - 線性操作讓信息可以保持並流動,並選擇性地讓信息通過),可以對長度任意的序列進行表達,但是這種方式還是比較 tricky。並且這種序列建模方式,無法對具有層次結構的信息進行很好的表達。 RNN缺點: 並行化困難; 不能解決長距離依賴 |
CNN 在 NLP 中扮演了 n-gram 的 detector 角色,在層內可以並行。CNN works well,基於的假設是局部信息相互依賴。CNN 具有 Hierarchical Receptive Field,使得任意任意兩個位置之間的長度距離是對數級別的。 CNN缺點: 長距離依賴需要很多層 |
| 模型圖 |
|
|
所以有沒有一種方法,能夠做到既能又能還能?
- 相對於 CNN,要 constant path length 不要 logarithmic path length , 要 variable-sized perceptive field,不要固定 size 的 perceptive field;
- 相對於 RNN,考慮長距離依賴,還要可以並行!
這就是 self attention,下圖可以看到 self-attention 和 convolution 有點兒神似,它摒棄了 CNN 的局部假設,想要尋找長距離的關聯依賴。看下圖就可以理解 self-attention 的這幾個特點:
- constant path length & variable-sized perceptive field :任意兩個位置(特指遠距離)的關聯不再需要通過 Hierarchical perceptive field 的方式,它的 perceptive field 是整個句子,所以任意兩個位置建立關聯是常數時間內的。
- parallelize : 沒有了遞歸的限制,就像 CNN 一樣可以在每一層內實現並行。

self-attention 借鑒 CNN中 multi-kernel 的思想,進一步進化成為 Multi-Head attention。每一個不同的 head 使用不同的線性變換,學習不同的 relationship。
(2)什么是Self-Attention?
self attention 計算三種 attention:
- 在encoder 端計算自身的 attention,捕捉input 之間的依賴關系。
- 在 decoder 端計算自身的 attention,捕捉output 之間的依賴關系。
- 將 encoder 端得到的 self attention 加入到 decoder 端得到的 attention中,捕捉輸入序列的每個 input 和輸出序列的每個 output 之間的依賴關系。

具體見transformer
(3)Multi-Head Attention
多頭注意力(Multi-Head Attention)是利用多個查詢$Q = [q_1, · · · , q_M]$,來
平行地計算從輸入信息中選取多組信息。每個注意力關注輸入信息的不同部分。
$\operatorname{att}((K, V), Q)=\operatorname{att}\left((K, V), \mathbf{q}_{1}\right) \oplus \cdots \oplus \operatorname{att}\left((K, V), \mathbf{q}_{M}\right)$
其中$oplus$表示向量拼接。
4. 其他Attention
4.1 Hierarchical Attention
《Hierarchical Attention Networks for Document Classification》,從 word attention 到 sentence attention
在之前介紹中,我們假設所有的輸入信息是同等重要的,是一種扁平(Flat) 結構,注意力分布實際上是在所有輸入信息上的多項分布。但如果輸入信息本身具有層次(hierarchical)結構,比如文本可以分為詞、句子、段落、篇章等不同粒度的層次,我們可以使用層次化的注意力來進行更好的信息選擇[Yang et al., 2016]。
RNN 對序列建模,但是缺乏層次信息。而語言本身是具有層次結構,短語組成句子,句子組成篇章。因此研究者十分希望把語言中的這些層次結構在模型中得以體現,Hierarchical 的方式就出現了:從 word attention 到 sentence attention。
參考文獻:
【1】深度學習和自然語言處理中的Attention和Memory機制 - 雲+社區 - 騰訊雲
【2】Attention and Memory in Deep Learning and NLP – WildML
【3】台大《應用深度學習》國語課程(2020) by 陳蘊儂_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili
【4】huaxiaozhuan
【5】遍地開花的 Attention,你真的懂嗎? - 知乎
【6】lkaiser.pdf
【7】Memory, attention, sequences - Towards Data Science
【8】一步步解析Attention is All You Need! - 簡書















