注意力機制及其理解

  • 2019 年 11 月 11 日
  • 筆記

注意力機制

什麼是注意力機制

注意力機制就是對輸入權重分配的關注,最開始使用到注意力機制是在編碼器-解碼器(encoder-decoder)中, 注意力機制通過對編碼器所有時間步的隱藏狀態做加權平均來得到下一層的輸入變量:

注意力機制的通用表達式可以寫為:

$$boldsymbol{O} = text{softmax}(boldsymbol{Q}boldsymbol{K}^top)boldsymbol{V}$$

注意力機制廣義上可以理解成一個由查詢項矩陣 $boldsymbol{Q}$ 和所對應的鍵項 $boldsymbol{K}$ 和 需加權平均的值項 $boldsymbol{V}$ 所構成的一層感知機(softmax求和)。

這裡我們可以從兩個視角來看:

  • 從工程學上理解 從工程學上簡單理解,我們可以把注意力機制理解成從數據庫(內存槽)Q中通過鍵K和值V得到輸出O,由於V是輸入,所以可以理解注意力機制的核心就是如何構建數據庫Q和鍵值K的方法。
  • 從算法上理解 從算法上來理解,我們可以把注意力機制和池化做類比,即卷積神經網絡中的池化看成一種特殊的平均加權的注意力機制,或者說注意力機制是一種具有對輸入分配偏好的通用池化方法(含參數的池化方法)。

從構建查詢項看注意力機制

最早的Attention的提出

在最早提出注意力機制的論文《Neural Machine Translation by Jointly Learning to Align and Translate》中,其主要是用來作翻譯模型,解決翻譯核對齊問題(論文採用了seq2seq+attention)。文中QK的計算表示:

$$boldsymbol{c}_{t'} = sum_{t=1}^Talpha_{t' t}boldsymbol{h}_t$$ $$alpha_{t' t} = text{softmax}(sigma(boldsymbol{s}_{t' – 1}, boldsymbol{h}_t))$$ $$sigma(boldsymbol{s}_{t' – 1}, boldsymbol{h}_t) = boldsymbol{v}^top tanh(boldsymbol{W}_s boldsymbol{s}_{t' – 1} + boldsymbol{W}_h boldsymbol{h}_t)$$

$boldsymbol{c}_{t』}$表示輸出變量,$boldsymbol{h}_t$為隱藏層,$alpha_{t' t}$表示一個權重的概率分佈,即QK得softmax值,這裡得查詢項矩陣Q採用了一個$tanh(boldsymbol{W}_s boldsymbol{s} + boldsymbol{W}_h boldsymbol{h})$,所以$sigma$其本質在是一個單層的感知機。由於這種注意力機制由Bahdanau在seq2seq中正式提出,也叫循環注意力機制,更加$sigma$函數即其參數不同我們可以把注意力機制分成多種形式。

最基礎形態的注意力機制

從上面我們將注意力機制抽象出來即:

$$boldsymbol{c}_{t} = sum_{t=1}^Tsigma(boldsymbol{q},boldsymbol{k}_t)boldsymbol{h}_t$$

q 為查詢項, k 為鍵值項, h為隱含層輸入變量,$sigma$ 為變換函數,c表示模型輸出的context vetor。 呃,趣味點的話也可以理解,輸入的h,通過其對應鍵值k查詢q,通過$sigma$輸出c

層次注意力(Hierarchical Attention Networks)

層次注意力由 Zichao Yang 提出,主要用於解決多層次問題,比如在文本分類中,我們可以把詞作為一層,把段落作為一層,這樣就有了多層,而且下面一層會對上一層有影響,因此建立了一種堆疊的層次注意力模型:

層次注意力機制就是堆疊了多個注意力模型,形成多層次注意力,其公式表達可以寫成:

$$ boldsymbol{c}_{t}^{(boldsymbol{i+1})} = sum_{t=1}^Tsigma^{(boldsymbol{i})}(boldsymbol{q}^{(boldsymbol{i})},boldsymbol{k}_t^{(boldsymbol{i})})boldsymbol{h}_t^{(boldsymbol{i})},\ boldsymbol{h}_{t}^{(boldsymbol{i})} = boldsymbol{v}_{t}^{(boldsymbol{i+1})}boldsymbol{c}_{i}^{(boldsymbol{t})}$$ $$boldsymbol{h}_{0} = boldsymbol{W}_{t}^{(0)}boldsymbol{X}$$

q 為查詢項, k 為鍵值項, h為隱含層輸入變量,$sigma$ 為變換函數,c表示模型輸出的context vetor,i表示層級。

什麼意思呢? 首先,可以看到上層的注意力是以下層的輸出作為輸入,一層一層堆疊上去。

循環注意力

前面講到,其實所謂的循環注意力模型就是最早提出的seq2seq的翻譯模型:

$$ begin{align} boldsymbol{o}_{i} &= f(boldsymbol{s}_{i}) \ boldsymbol{s}_{i} &= a(boldsymbol{s}_{i-1},boldsymbol{o}_{i-1},boldsymbol{s}_{i}) \ boldsymbol{c}_{t'} &= sum_{t=1}^Talpha_{t' t}boldsymbol{h}_t \ alpha_{t' t} &= frac{exp(e_{t' t})}{ sum_{k=1}^T exp(e_{t' k}) },quad t=1,ldots,T \ e_{t' t} &= sigma(boldsymbol{s}_{t' – 1}, boldsymbol{h}_t) \ sigma(boldsymbol{s}_{t' – 1}, boldsymbol{h}_t) &= boldsymbol{V}^top tanh(boldsymbol{W}_s boldsymbol{s}_{t' – 1} + boldsymbol{W}_h boldsymbol{h}_t) \ end{align} $$

其中

他的核心思想是將下一個輸出的狀態$boldsymbol{s}_{t-1}$一起輸入$sigma$函數。 $alpha_{t』 t}$就是注意力模型中的權重項,O表示輸出,s表示解碼器中的隱藏層變量,c表示context vetor, h表示編碼器中的隱藏層變量。

全局注意力模型(Gobal Attention)

全局注意力模型是由Minh-Thang Luong在2015年的《Effective Approaches to Attention-based Neural Machine Translation》中提出:

這個全局注意力模型是在循環注意力模型上左的改進,加個一層Global align weights(見上圖),原循環注意力模型的鍵值項K是直接採用$boldsymbol{h}_t$。其公式:

$$ begin{align} alpha_t(s) &= text{align}(boldsymbol{h}_t, bar{boldsymbol{h}_s}) \ &= frac{ text{exp}(text{score}(boldsymbol{h}_t, bar{boldsymbol{h}_s}))} { sum_{boldsymbol{s'}} text{exp}(text{score}(boldsymbol{h}_t, bar{boldsymbol{h}_{s'}})) } end{align} $$ $boldsymbol{h}_{t}$ 表示當前目標時刻 t 的編碼器的隱藏變量,$bar{boldsymbol{h}_s}$表示所有的原時刻的編碼器的隱藏變量

score表示一種打分方式,其中論文中給出的是三種:

$$ text{score}(boldsymbol{h}_t, bar{boldsymbol{h}_s)} = begin{cases} boldsymbol{h}_t^T bar{boldsymbol{h}_s}, &text{dot}\ boldsymbol{h}_t^T boldsymbol{W}_a bar{boldsymbol{h}_s}, &text{general}\ boldsymbol{v}_a^T text{tanh}(boldsymbol{W}_a[boldsymbol{h}_t;bar{boldsymbol{h}_s}]),&text{concat} end{cases} $$

dot表示點乘/點積,concat表示聯接,即將兩個變量連接起來,general是一般形式,中間加權重參數。

註: While our global attention approach is similar in spirit to the model proposed by Bahdanau et al. (2015), there are several key differences which reflect how we have both simplified and generalized from the original model.

局部注意力模型(Local Attention)

局部注意力模型其實是和全局注意力模型在同一篇論文提出的,局部注意力模型在全局注意力模型的基礎上增加了aligned position幫助定位,使查詢項Q和鍵值項K能專註部分信息:

位置aligned position的公式:

$$p_t = S cdot text{sigmod}(boldsymbol{v}_p^T text{tanh}(boldsymbol{W}_pboldsymbol{h}_t)), \p_t in [0, S]$$

S表示原句的長度,Wv為預測參數。

鍵值和查詢項的權重: $$alpha_t(s) = text{align}(boldsymbol{h}_t, bar{boldsymbol{h}_s})text{exp}(- frac{(s-p_t)^2}{2sigma^2})$$

$p_t$的範圍是【0,S】,s為$p_t$窗體中間的正數,$sigma=frac{D}{2}$:

自注意力(Self Attention)

1、從n個輸入直接輸出n個輸出,沒有序列,每個輸入對應着一個K,V,Q; 2、可以並行運算

多頭注意力模型(Multi-Head Attention)

多頭自注意力模型 其公式: $$ text{MultiHead}(Q,K,V) = text{Concat}(text{head1},…,text{head}_h)boldsymbol{W}^O $$ $$ text{head}_i = text{Attention}(boldsymbol{Q}boldsymbol{W}_i^Q,boldsymbol{K}boldsymbol{W}_i^K,boldsymbol{V}boldsymbol{W}_i^V) $$ $$ text{Attention}(boldsymbol{Q},boldsymbol{K},boldsymbol{V}) = text{softmax}(frac{boldsymbol{Q}boldsymbol{K}^T}{sqrt{d_k}})boldsymbol{V} $$

注意力模型的應用

Transformer

Transformer模型是 Google 團隊在2017年《Attention is All You Need》中提出,Transformer模型在後面成為構成 BERT 的基石之一,那麼我們來看看是怎麼通過自注意力模型構建Transformer的:

Transformer從結構上來說依然是個Encoder-Decoder模型,但是,它和傳統的seq2seq主要有三點不同:

  • 使用位置編碼,也就是Positional Encoding代替序列信息。
  • 使用Transformer Block來實現注意力機制
  • 採用多頭自注意力,可以並行運算

位置編碼(Positional Encoding)

公式: $$ boldsymbol{P}_{i,2j} = text{sin}(frac{i}{10000^{2j/d}}) $$ $$ boldsymbol{P}_{i,2j+1} = text{sin}(frac{i}{10000^{2j/d}}) $$ $$ boldsymbol{H} = boldsymbol{X} + boldsymbol{P}, \ boldsymbol{X} in Bbb{R}, boldsymbol{P} in Bbb{R} $$

Position-wise FFN

  • input(batch, seq len, fea size) 轉換成 (batch*seq len, fea siz)
  • 使用了兩層MLP
  • 最後的輸出在轉化為3-D
  • 等於使用了一個$1times1$的卷積層
  • Layer Normalizaiton

Layer Normalization

Layer Normalization最早由 Jimmy Lei Ba 在2016年《Layer Normalization》一文中提出。

shape:[N, C, H, W] N 代表batch長度,C代表通道數,H代表每層的隱藏單元數,W代表每層的權重;

  • BatchNorm是在batch上,對NHW做歸一化;
  • LayerNorm在channel方向上,對CHW歸一化;
  • InstanceNorm在單個通道像素上,對HW做歸一化;
  • GroupNorm,有點類似LayerNorm,將channel分組,然後再做歸一化;

BERT

BERT,全稱 Bidirectional Encoder Representations from Transformers,是由

BERT特點:

  • 使用 Transformer Block 代替 RNN,通過堆疊Transformer Block將模型變深;
  • 使用隨機 Mark 的方式訓練;
  • 使用雙向編碼的形式;

後面我們通過實現BERT來回歸整個Attention系列: BERT代碼實現及解讀

### 推薦系統中的注意力機制 Jun Xiao, et al. Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks. 2017

參考文獻

  • https://github.com/d2l-ai/d2l-zh
  • Neural Machine Translation by Jointly Learning to Align and Translate. Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. ICLR, 2015.
  • Hierarchical attention networks for document classification. Zichao Yang et al. ACL, 2016.
  • Effective approaches to attention-based neural machine translation. Minh-Thang Luong, Hieu Pham, and Christopher D Manning. EMNLP, 2015.
  • Long Short-Term Memory-Networks for Machine Reading. Jianpeng Cheng, Li Dong and Mirella Lapata. EMNLP, 2016.
  • Attention Is All You Need. Ashish Vaswani, et al. NIPS, 2017.