這篇文章整理有關注意力機制(Attention Mechanism )的知識,主要涉及以下幾點內容:
1、注意力機制是為了解決什么問題而提出來的?
2、軟性注意力機制的數學原理;
3、軟性注意力機制、Encoder-Decoder框架與Seq2Seq
4、自注意力模型的原理。
一、注意力機制可以解決什么問題?
神經網絡中的注意力機制(Attention Mechanism)是在計算能力有限的情況下,將計算資源分配給更重要的任務,同時解決信息超載問題的一種資源分配方案。在神經網絡學習中,一般而言模型的參數越多則模型的表達能力越強,模型所存儲的信息量也越大,但這會帶來信息過載的問題。那么通過引入注意力機制,在眾多的輸入信息中聚焦於對當前任務更為關鍵的信息,降低對其他信息的關注度,甚至過濾掉無關信息,就可以解決信息過載問題,並提高任務處理的效率和准確性。
這就類似於人類的視覺注意力機制,通過掃描全局圖像,獲取需要重點關注的目標區域,而后對這一區域投入更多的注意力資源,獲取更多與目標有關的細節信息,而忽視其他無關信息。通過這種機制可以利用有限的注意力資源從大量信息中快速篩選出高價值的信息。
二、軟性注意力機制的數學原理
在神經網絡模型處理大量輸入信息的過程中,利用注意力機制,可以做到只選擇一些關鍵的的輸入信息進行處理,來提高神經網絡的效率,比如在機器閱讀理解任務中,給定一篇很長的文章,然后就文章的內容進行提問。提出的問題只和段落中一兩個句子有關,其余部分都是無關的,那么只需要把相關的片段挑出來讓神經網絡進行處理,而不需要把所有文章內容都輸入到神經網絡中。
(一)普通模式
用數學語言來表達這個思想就是:用X=[x1, x2, ..., xN]表示N個輸入信息,為了節省計算資源,不需要讓神經網絡處理這N個輸入信息,而只需要從X中選擇一些與任務相關的信息輸進行計算。軟性注意力(Soft Attention)機制是指在選擇信息的時候,不是從N個信息中只選擇1個,而是計算N個輸入信息的加權平均,再輸入到神經網絡中計算。相對的,硬性注意力(Hard Attention)就是指選擇輸入序列某一個位置上的信息,比如隨機選擇一個信息或者選擇概率最高的信息。但一般還是用軟性注意力機制來處理神經網絡的問題。
注意力值的計算是任務處理中非常重要的一步,這里單獨拿出來,完整的帶注意力機制的神經網絡工作流程在文章的第三部分。
注意力值的計算可以分為兩步:(1)在所有輸入信息上計算注意力分布;(2)根據注意力分布來計算輸入信息的加權平均。
1、注意力分布
給定這樣一個場景:把輸入信息向量X看做是一個信息存儲器,現在給定一個查詢向量q,用來查找並選擇X中的某些信息,那么就需要知道被選擇信息的索引位置。采取“軟性”選擇機制,不是從存儲的多個信息中只挑出一條信息來,而是雨露均沾,從所有的信息中都抽取一些,只不過最相關的信息抽取得就多一些。
於是定義一個注意力變量z∈[1, N]來表示被選擇信息的索引位置,即z=i來表示選擇了第i個輸入信息,然后計算在給定了q和X的情況下,選擇第i個輸入信息的概率αi:
其中σi構成的概率向量就稱為注意力分布(Attention Distribution)。s(xi , q)是注意力打分函數,有以下幾種形式:
其中W、U和v是可學習的網絡參數,d是輸入信息的維度。
2、加權平均
注意力分布αi表示在給定查詢q時,輸入信息向量X中第i個信息與查詢q的相關程度。采用“軟性”信息選擇機制給出查詢所得的結果,就是用加權平均的方式對輸入信息進行匯總,得到Attention值:
下圖是計算Attention值的過程圖:
(二)鍵值對注意力模式
更一般的,可以用鍵值對(key-value pair)來表示輸入信息,那么N個輸入信息就可以表示為(K, V)= [(k1,v1),(k2,v2),...,(kN,vN)],其中“鍵”用來計算注意分布σi,“值”用來計算聚合信息。
那么就可以將注意力機制看做是一種軟尋址操作:把輸入信息X看做是存儲器中存儲的內容,元素由地址Key(鍵)和值Value組成,當前有個Key=Query的查詢,目標是取出存儲器中對應的Value值,即Attention值。而在軟尋址中,並非需要硬性滿足Key=Query的條件來取出存儲信息,而是通過計算Query與存儲器內元素的地址Key的相似度來決定,從對應的元素Value中取出多少內容。每個地址Key對應的Value值都會被抽取內容出來,然后求和,這就相當於由Query與Key的相似性來計算每個Value值的權重,然后對Value值進行加權求和。加權求和得到最終的Value值,也就是Attention值。
如下圖所示,以上的計算可以歸納為三個過程:
第一步:根據Query和Key計算二者的相似度。可以用上面所列出的加性模型、點積模型或余弦相似度來計算,得到注意力得分si;
第二步:用softmax函數對注意力得分進行數值轉換。一方面可以進行歸一化,得到所有權重系數之和為1的概率分布,另一方面可以用softmax函數的特性突出重要元素的權重;
第三步:根據權重系數對Value進行加權求和:
圖示如下:
可以把以上的過程用簡潔的公式整理出來:
以上就是軟性注意力機制的數學原理。
三、軟性注意力機制與Encoder-Decoder框架
注意力機制是一種通用的思想,本身不依賴於特定框架,但是目前主要和Encoder-Decoder框架(編碼器-解碼器)結合使用。下圖是二者相結合的結構:
類似的,Encoder-Decoder框架作為一種深度學習領域的常用框架模式,在文本處理、語言識別和圖像處理等領域被廣泛使用。其編碼器和解碼器並非是特定的某種神經網絡模型,在不同的任務中會套用不同的模型,比如文本處理和語言識別中常用RNN模型,圖形處理中一般采用CNN模型。
在前面整理的關於循環神經網絡的文章中,說明了以RNN作為編碼器和解碼器的Encoder-Decoder框架也叫做異步的序列到序列模型,而這就是如雷灌耳的Seq2Seq模型!驚不驚喜,意不意外!?
以下是沒有引入注意力機制的RNN Encoder-Decoder框架:
下面就以Seq2Seq模型為例,來對比未加入注意力機制的模型和加入了注意力機制后的模型。
(一)未加入注意力機制的RNN Encoder-Decoder
未加入注意力機制的RNN Encoder-Decoder框架在處理序列數據時,可以做到先用編碼器把長度不固定的序列X編碼成長度固定的向量表示C,再用解碼器把這個向量表示解碼為另一個長度不固定的序列y,輸入序列X和輸出序列y的長度可能是不同的。
《Learning phrase representations using RNN encoder-decoder for statistical machine translation》這篇論文提出了一種RNN Encoder-Decoder的結構,如下圖。除外之外,這篇文章的牛逼之處在於首次提出了GRU(Gated Recurrent Unit)這個常用的LSTM變體結構。
把這種結構用在文本處理中,給定輸入序列X=[x1,x2,...,xT],也就是由單詞序列構成的句子,這樣的一個解碼-編碼過程相當於是求另一個長度可變的序列y=[y1, y2, ..., yT′]的條件概率分布:p(y)=p(y1, y2, ..., yT′ | x1,x2,...,xT)。經過解碼后,這個條件概率分布可以轉化為下面的連乘形式:
所以在得到了表示向量c和之前預測的所有詞 {y1,y2,..., yt-1}后,這個模型是可以用來預測第t個詞yt的,也就是求條件概率p(yt | {y1,y2,..., yt-1}, c)。
對照上面這個圖,我們分三步來計算這個條件概率:
1、把輸入序列X中的元素一步步輸入到Encoder的RNN網絡中,計算隱狀態ht,然后再把所有的隱狀態[h1, h2, ..., hT]整合為一個語義表示向量c:
2、Decoder的RNN網絡每一時刻t都會輸出一個預測的yt。首先根據語義表示向量c、上一時刻預測的yt-1和Decoder中的隱狀態st-1,計算當前時刻t的隱狀態st:
3、由語義表示向量c、上一時刻預測的詞yt-1和Decoder中的隱狀態st,預測第t個詞yt,也就是求下面的條件概率。
可以看到,在生成目標句子的每一個單詞時,使用的語義表示向量c都是同一個,也就說生成每一個單詞時,並沒有產生[c1,c2,..,cT′]這樣與每個輸出的單詞相對應的多個不同的語義表示。那么在預測某個詞yt時,任何輸入單詞對於它的重要性都是一樣的,也就是注意力分散了。
(二)加入注意力機制的RNN Encoder-Decoder
《Neural Machine Translation by Jointly Learning to Align and Translate 》這篇論文在上面那篇論文的基礎上,提出了一種新的神經網絡翻譯模型(NMT)結構,也就是在RNN Encoder-Decoder框架中加入了注意力機制。這篇論文中的編碼器是一個雙向GRU,解碼器也是用RNN網絡來生成句子。
用這個模型來做機器翻譯,那么給定一個句子X=[x1,x2,...,xT],通過編碼-解碼操作后,生成另一種語言的目標句子y=[y1, y2, ..., yT′],也就是要計算每個可能單詞的條件概率,用於搜索最可能的單詞,公式如下:
生成第t個單詞的過程圖示如下:
和未加入注意力機制的RNN Encoder-Decoder框架相比,一方面從yi的條件概率計算公式來看,g(•)這個非線性函數中的語義向量表示是隨輸出yi的變化而變化的ci,而非萬年不變的c;另一方面從上圖來看,每生成一個單詞yt,就要用原句子序列X和其他信息重新計算一個語義向量表示ci,而不能吃老本。所以增加了注意力機制的RNN Encoder-Decoder框架的關鍵就在於,固定不變的語義向量表示c被替換成了根據當前生成的單詞而不斷變化的語義表示ci。
好,那我們來看看如何計算生成的單詞yi的條件概率。
第一步:給定原語言的一個句子X=[x1,x2,...,xT],把單詞一個個輸入到編碼器的RNN網絡中,計算每個輸入數據的隱狀態ht。這篇論文中的編碼器是雙向RNN,所以要分別計算出順時間循環層和逆時間循環層的隱狀態,然后拼接起來:
第二步:跳到解碼器的RNN網絡中,在第t時刻,根據已知的語義表示向量ct、上一時刻預測的yt-1和解碼器中的隱狀態st-1,計算當前時刻t的隱狀態st:
第三步:第2步中的ct還沒算出來,咋就求出了隱狀態st了?沒錯,得先求ct,可前提又是得知道st-1:
這里的eij就是還沒有歸一化的注意力得分。a(•)這個非線性函數叫做對齊模型(alignment model),這個函數的作用是把編碼器中的每個單詞xj對應的隱狀態hj,和解碼器中生成單詞yi的前一個詞對應的隱狀態si-1進行對比,從而計算出每個輸入單詞xj和生成單詞yi之間的匹配程度。匹配程度越高,注意力得分就越高,那么在生成單詞yi時,就需要給與這個輸入單詞更多的關注。
得到注意力得分eij后,用softmax函數進行歸一化,得到注意力概率分布σij。用這個注意力分布作為每個輸入單詞xj受關注程度的權重,對每個輸入單詞對應的隱狀態hj進行加權求和,就得到了每個生成的單詞yi所對應的語義向量表示ci,也就是attention值。
第四步:求出Attention值可不是我們的目的,我們的目的是求出生成的單詞yi的條件概率。經過上面三步的計算,萬事俱備,就可以很舒服地得到單詞yi的條件概率:
以上就是一個注意力機制與RNN Encoder-Decoder框架相結合,並用於機器翻譯的例子,我們不僅知道了怎么計算Attention值(語言向量表示ci),而且知道了怎么用Attention值來完成機器學習任務。
四、自注意力模型
1、通俗解釋
首先通過與軟注意力Encoder-Decoder模型進行對比,來獲得對自注意力模型(Self-Attention Model)的感性認識。
在軟注意力Encoder-Decoder模型中,更具體地來說,在英-中機器翻譯模型中,輸入序列和輸出序列的內容甚至長度都是不一樣的,注意力機制是發生在編碼器和解碼器之間,也可以說是發生在輸入句子和生成句子之間。而自注意力模型中的自注意力機制則發生在輸入序列內部,或者輸出序列內部,可以抽取到同一個句子內間隔較遠的單詞之間的聯系,比如句法特征(短語結構)。
如果是單純的RNN網絡,對於輸入序列是按步驟順序計算隱狀態和輸出的,那么對於距離比較遠又相互依賴的特征,捕獲二者之間聯系的可能性比較小,而在序列內部引入自注意力機制后,可以將句子中任意兩個單詞通過一個計算直接聯系起來,就更容易捕獲相互依賴的特征。
2、理論闡述
有了感性認識后,我們用公式來定義自注意力模型。
自注意力模型在我看來是在同一層網絡的輸入和輸出(不是模型最終的輸出)之間,利用注意力機制“動態”地生成不同連接的權重,來得到該層網絡輸出的模型。
前面說了自注意力模型可以建立序列內部的長距離依賴關系,其實通過全連接神經網絡也可以做到,但是問題在於全連接網絡的連接邊數是固定不變的,因而無法處理長度可變的序列。而自注意力模型可以動態生成不同連接的權重,那么生成多少個權重,權重的大小是多少,都是可變的,當輸入更長的序列時,只需要生成更多連接邊即可。如下圖,虛線連接邊是動態變化的。
用數學公式來表達自注意力機制:假設一個神經層中的輸入序列為X=[x1,x2,...,xN],輸出序列為同等長度的H=[h1, h2, ..., hN],首先通過線性變換得到三組向量序列:
其中Q, K, V 分別為查詢向量序列,鍵向量序列和值向量序列, WQ, WK, WV分別是可以學習的參數矩陣。
於是輸出向量hi這樣計算:
其中 i, j ∈ [1, N]為輸出和輸入向量序列的位置,連接權重 αij由注意力機制動態生成。
自注意力模型可以作為神經網絡的一層來使用,也可以用來替換卷積層或循環層,也可以與卷積層或循環層交叉堆疊使用。
這些數學表達式背后的含義真的明白了嗎?哈哈,其實不太明白,需要在實踐當中去領悟。不過下面這張圖或許有助於加深對以上公式的理解。在下圖中,輸入序列和輸出序列都是同一個句子,通過由自注意力機制動態生成的權重,可以發現making與more-difficult的權重比較大(顏色深),於是捕獲了這三個詞之間存在的聯系——構成了一個短語。
參考資料:
1、邱錫鵬:《神經網絡與深度學習》
2、深度學習中的注意力機制(2017版)
https://blog.csdn.net/malefactor/article/details/78767781
3、Dzmitry Bahdanau、KyungHyun Cho、Yoshua Bengio.
《Neural Machine Translation by Jointly Learning to Align and Translate 》
4、Cho, K., van Merrienboer, B., Gulcehre, C., Bougares, F., Schwenk, H., and Bengio, Y. (2014a).
《Learning phrase representations using RNN encoder-decoder for statistical machine translation》