詳解注意力機制(Attention)——Global/Local/Self Attention

詳解注意力(Attention)機制

​ 注意力機制在使用encoder-decoder結構進行神經機器翻譯(NMT)的過程中被提出來,並且迅速的被應用到相似的任務上,比如根據圖片生成一段描述性語句、梗概一段文字的內容。從一個高的層次看,允許decoder從多個上下文向量(context vector)中選取需要的部分,使得Encoder從只能將上下文信息壓縮到固定長度的向量中這個束縛中解放出來,進而可以表示更多的信息。

​ 目前,注意力機制在深度學習模型中十分常見,而不僅限於encoder-decoder層次結構中。值得一提的是,注意力機制可以僅應用在encoder上,以解決諸如文本分類或者表示學習的任務上。這種注意力機制的應用被稱爲自聚焦或者內部聚焦機制

​ 下面我們從神經機器學習(NMT)使用的encoder-decoder結構開始介紹聚焦機制,之後我們會介紹自聚焦機制。

1.1 Encoder-decoder聚焦機制

1.1.1 Encoder-decoder的簡介

​ 從一個抽象的層次上看,encoder將輸入壓縮成一個高維的上下文向量,而decoder則可以從這個上下文向量中產生輸出。

在這裏插入圖片描述

​ 在神經機器翻譯(NMT)中,輸入和輸出都是單詞的序列,分別表示爲x=(x1,...,xTx)x = (x_1, ..., x_{T_x})y=(y1,...,yTy)y=(y_1, ..., y_{T_y}),xxyy稱爲源句(source sentence)和目標句(target sentence)。當輸入和輸出都是句子序列時,這樣的encoder-decoder結構也被成爲是seq2seq模型。由於encoder-decoder結構處處可微的性質,模型中的參數集θ\theta的最優解等效於在整個語料庫上計算似然函數的最大值(MLE),這種訓練的方式成爲端到端(end-to-end)

argmaxθ{(x,y)corpuslogP(yx;θ)}argmax_\theta\{\sum _{(x,y)\in corpus} logP(y|x;\theta)\}

這裏我們想要最大化的函數是預測正確單詞的概率的對數。

1.1.2 Encoder

​ 我們有很多種方法對源句子做嵌入(embedding),比如CNN、全連接等等。在機器翻譯中通常使用深度RNN來實現。[論文][1]論文中首次使用了雙向RNN,這個模型由兩個深度RNN組成,除了使用的詞嵌入矩陣之外的所有參數都不一樣。第一個RNN從左到右處理輸入的句子序列,而另外一個RNN從右到左處理輸入的句子序列。得到的兩個句子Embedding在RNN處理的每一步都合併成一個雙向RNN的內部表示:ht=[ht;ht]h_t = [\vec {h_t};\overleftarrow{h_t}]

​ 雙向RNN在對source words進行編碼時考慮了整個上下文的信息,而不僅僅是之前的信息。其結果是,hth_t依賴於以某個詞xtx_t爲中心的窗口的上下文,而單向的RNN下的hth_t則依賴於單詞xtx_t及其之前出現的詞彙。聚焦於xtx_t附近的小窗口可能存在一些優勢,但不一定是決定性的。事實上,Luong使用雙向RNN獲得了最高水平的結果。在下面的段落中,encoder的隱藏狀態(hidden state)表示爲ht\vec {h_t},也常稱爲annotations。

1.1.3 Decoder

​ 與encoder可以使用不同的模型不同,神經機器學習中decoder通常只使用單向RNN(unidirectional RNN),這是因爲常識下文本生成的過程也是單向的。decoder每一次生成一個新的詞彙。

關鍵點 :讓decoder只使用encoder的最近的annotation hTxh_{T_x}促使encoder儘可能將信息壓縮到hTxh_{T_x}中。因爲hTxh_{T_x}是一個固定形狀的向量,它能攜帶的信息是有限的,所有這個表示方法會丟失部分的信息。我們可以讓decoder關注encoder的所有step產生的annotation hTih_{T_i}的集合(h1,...,hTx)(h_1, ..., h_{T_x})來起到關注整個句子序列的目的。這樣做的結果是encoder可以通過調整annotations的分佈來保存更多的信息,而decoder能夠決定哪一個step的annotation需要進行聚焦。

​ 更加準確的說,目標句子y=(y1,...,yTy)y = (y_1, ..., y_{T_y})中每步生成的yty_t基於如下分佈:
P[yt{y1,...yt1},ct]=softmax(Wsh~t)P[y_t|\{y_1, ... y_{t-1}\}, c_t] = softmax(W_s {\widetilde h}_t)

其中h~t{\widetilde h}_t意爲聚焦化的隱藏狀態,有下面公式計算得到:
h~t=tanh(Wc[ct;ht]){\widetilde h}_t = tanh(W_c[c_t; h_t])

hth_t意爲decoder的隱藏狀態(當堆疊多個RNN時,表示最上層RNN的隱藏狀態)(y1,...,yt1)({y_1, ..., y_{t-1}})表示生成之前輸出單詞的信息,ctc_t表示源上下文的向量(source context vector),[;][;]表示合併操作(concatenation)。WsWcW_s和W_c是可訓練的參數矩陣,簡單起見,省略偏置(bias)。這個source context vector ctc_t有兩種方法進行計算:globally和locally。下面的兩個子部分將會分別介紹。

​ 集束搜索:嘗試詞彙表中所有單詞可能的組合再找到概率最高的組合的方法是很難實現的。從另一個角度考慮貪婪的生成每一個單詞,也就是每次都選擇最可能單詞,這樣能夠達到次最優的結果。實際應用中,我們使用集束搜索的方式一次探索K個待選詞這中啓發式的算法。大的K值可以生成更好的目標句子,但是會降低decodeing的速度。
在這裏插入圖片描述

1.1.4 Global attention

​ 這裏,上下文向量(context vector)ctc_t通過計算源句子(source sentence)的所有註釋(annotation),也即encoder的所有隱藏狀態(hidden state)的加權和得到。一共有TxT_x個註釋(source sentence的長度),每一個註釋都是大小爲encoder隱藏層單元數的向量,ctc_t和所有註釋的形狀相同。分配向量(alignment vector)αt\alpha _t的形狀和source sentence的長度TxT_x相同,是一個變量。

ct=i=1Txαt,ihic_t = \sum _{i=1} ^{T_x} \alpha_{t, i} {\overline h}_i

αt,i=exp(score(ht,hi))iTxexp(score(ht,hi))\alpha_{t,i} = \frac {exp(score(h_t, {\overline h}_i))}{\sum _{i^‘} ^{T_x} exp(score(h_t, {\overline h}_{i^‘}))}

​ 分配向量的計算過程分爲兩步,首先分別計算decoder當前step的隱藏狀態hth_t和encoder的所有隱藏狀態hi{\overline h}_i的alignment運算的結果(alignment運算下面會介紹),再應用softmax函數計算exp(score(ht,hi))exp(score(h_t, {\overline h}_i))在所有iTxexp(score(ht,hi)){\sum _{i^‘} ^{T_x} exp(score(h_t, {\overline h}_{i^‘}))}中的比重。

​ 換句話說,ctc_t可以看作是所有encoder的隱藏狀態的分佈律(每個狀態的概率處於[0,1][0,1]並且和爲1),進而預示source sentence中對預測下一個單詞最優幫助的詞彙。score()score()函數理論上可以是任意的比較函數。Luong在他的論文中使用點積(dot product)(score(ht,hi)=hthiscore(h_t, {\overline h}_i) = {h_t}^{\top}{\overline h}_i),一個更加通用的方程是在點積基礎上增加一個由全連接神經網絡層訓練的參數矩陣WαW_ \alpha,方程表示爲score(ht,hi)=htWαhiscore(h_t, {\overline h}_i) = {h_t}^{\top} W_ \alpha{\overline h}_i,實驗發現dot product在gloabal attention中表現更好,而general方程在local attention中表現更好。下面一節將會介紹local attention。
在這裏插入圖片描述

1.1.5 Local attention

​ 每一次生成目標單詞(target word)都分析source sentence中所有單詞的做法代價太高,也許也是沒有必要的。爲了緩解這個問題,[Luong et at.][2]論文中建議只集中關注一個固定大小2D+1窗口中的source sentence 的註釋(annotation),即只關注最能幫助預測下一個詞彙的source sentence中某個詞彙前後step的隱藏狀態(hidden state):
ct=i=ptDpt+Dαt,ihic_t = \sum _{i=p_t -D} ^{p_t +D} \alpha_{t,i} {\overline h}_i

其中,D由用戶自定義,而窗口中心即聚焦的annotation ptp_t可以也設爲tt或者基於保存了之前target words (y1,...yt1)(y_1, ...y_{t-1})信息的decoder隱藏狀態的hth_t決定:pt=Txσ(vptanh(Wpht))pt = T_x · \sigma(v_p ^{\top} tanh(W_p h_t))TxT_x表示source sentence 的長度,σ\sigma表示sigmoid函數, vpv_pWpW_p是可訓練的參數矩陣。分配矩陣(alignment weights)的計算過程和global attention中的相似,僅僅是增加了一項均值爲ptp_t,標準差爲D/2D/2的標準正太分佈乘積項:

αt,i=exp(score(ht,hi))iTxexp(score(ht,hi))exp((ipt)22(D/2)2)\alpha_{t,i} = \frac {exp(score(h_t, {\overline h}_i))}{\sum _{i^‘} ^{T_x} exp(score(h_t, {\overline h}_{i^‘}))} exp(- \frac{(i-p_t)^2}{2(D/2)^2})

注意ptR[0,Tx] and iR[ptD,pt+D]p_t \in \mathbb{R} \cap [0, T_x] \ and \ i \in \mathbb{R} \cap [p_t-D, p_t+D]。添加的高斯分佈項使得alignment權重隨着ii在窗口中遠離中心ptp_t移動逐漸降低,也就是說對於給予靠近ptp_t的annotation更多的影響力。另外和global attention不同的是αt\alpha _t的大小被固定爲2D12D-1,只有處於窗口範圍內的annotation纔對輸出有影響。local attention可以看成是alignment權重與一個截斷高斯分佈相乘後的global attention(窗口外的annotation取值爲0)。local attention的示意圖如下所示:

在這裏插入圖片描述

1.2 self-attention

​ 現在我們將encoder簡單設置爲單獨的RNN處理長度爲T的句子(x1,x2,...xT)(x_1, x_2, ... x_T)。RNN將輸出映射成annotation (h1,...,hT)(h_1, ... , h_T)。正如將attention機制引入到encoder-decoder結構中一樣,不同於只關注當前的隱藏狀態hth_t,將其作爲整個句子的綜合概括會失去許多信息,self attention不同的機制也能夠將所有的annotation納入學習的範圍。

​ 如下面公式所示,annotation hth_t先被傳輸到一個全連接層,得到的輸出utu_t被用於和一個可訓練的用來表示上下文信息的參數矩陣uu(隨機初始化)進行比較以得到annotation的分配係數(alignment coefficient),隨後用softmax進行歸一化。最後得到的聚焦化的向量ss是所有annotation的加權和。

ut=tanh(Wht)u_t = tanh(W h_t)

αt,i=exp(score(ut,u))t=1Texp(score(ut,u))\alpha_{t,i} = \frac {exp(score(u_t, u))}{\sum _{t^‘=1} ^{T} exp(score(u_{t^‘},u))}

s=t=1Tαthts = \sum _{t=1} ^{T} \alpha_t h_t

score函數理論上可以是任意的比較函數。一個簡單的得分函數是score(ut,u)=utuscore(u_t, u) = u_t^ \top u

1.2.1

​ 上面提及的上下文向量(context vector)和seq2seq模型的中context vector毫無聯繫!在seq2seq模型中,context vector ctc_t是encoder所有隱藏狀態的加權和i=1Txαt,ihi\sum _{i=1} ^{T_x} \alpha _{t,i} {\overline h}_i,然後ctc_t 和decoder的隱藏狀態hth_t共同用於計算聚焦化的隱藏狀態h~=tanh(Wc[ct;ht])\widetilde h = tanh(W_c [c_t;h_t])。self attention中的上下文向量只是用來代替decoder的隱藏狀態用於計算score()score(),實際上self attention模型中並沒有decoder模塊。所以,self attention中的分配係數矩陣指示了上下文中各個單詞之間的關聯,而seq2seq模型中的上下文向量αt\alpha _t代表的是source sentence中各詞和即將生成的target詞彙之間的關聯。

1.2.2

​ 下面圖片展示了一個實際應用self attention的層次模型,其中self attention在兩個層次起作用:單詞層次和句子層次。這樣做的理由有兩個:如何自然語言的層次結構,詞彙組成語句,語句組成文本;第二,這樣使得模型可以學習到句子中需要重點關注的詞和文本中需要重點關注的句子。由於各個sentence的attentonal coefficient不同,各個句子下的各單詞的attentional coefficients可以是不同的,這使得一個句子中某個單詞的十分重要,到到了另一個句子中這個單詞就變的不那麼重要了。

在這裏插入圖片描述

[1] Bahdanau, Dzmitry, Kyunghyun Cho, and Yoshua Bengio. “Neural machine translation by
jointly learning to align and translate.” arXiv preprint arXiv:1409.0473 (2014).
[2] Luong, Minh-Thang, Hieu Pham, and Christopher D. Manning. “Effective approaches to
attention-based neural machine translation.” arXiv preprint arXiv:1508.04025 (2015).

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