深入理解Attention機制


要了解深度學習中的注意力模型,就不得不先談Encoder-Decoder框架,因為目前大多數注意力模型附着在Encoder-Decoder框架下,當然,其實注意力模型可以看作一種通用的思想,本身並不依賴於特定框架,這點需要注意。

Encoder-Decoder框架可以看作是一種深度學習領域的研究模式,應用場景異常廣泛。圖2是文本處理領域里常用的Encoder-Decoder框架最抽象的一種表示。

0?wx_fmt=png

圖2 抽象的文本處理領域的Encoder-Decoder框架

文本處理領域的Encoder-Decoder框架可以這么直觀地去理解:可以把它看作適合處理由一個句子(或篇章)生成另外一個句子(或篇章)的通用處理模型。對於句子對<Source,Target>,我們的目標是給定輸入句子Source,期待通過Encoder-Decoder框架來生成目標句子Target。Source和Target可以是同一種語言,也可以是兩種不同的語言。而Source和Target分別由各自的單詞序列構成:

0?wx_fmt=png

Encoder顧名思義就是對輸入句子Source進行編碼,將輸入句子通過非線性變換轉化為中間語義表示C:

0?wx_fmt=png

對於解碼器Decoder來說,其任務是根據句子Source的中間語義表示C和之前已經生成的歷史信息0?wx_fmt=png來生成i時刻要生成的單詞0?wx_fmt=png

0?wx_fmt=png

每個yi都依次這么產生,那么看起來就是整個系統根據輸入句子Source生成了目標句子Target。如果Source是中文句子,Target是英文句子,那么這就是解決機器翻譯問題的Encoder-Decoder框架;如果Source是一篇文章,Target是概括性的幾句描述語句,那么這是文本摘要的Encoder-Decoder框架;如果Source是一句問句,Target是一句回答,那么這是問答系統或者對話機器人的Encoder-Decoder框架。由此可見,在文本處理領域,Encoder-Decoder的應用領域相當廣泛。

Encoder-Decoder框架不僅僅在文本領域廣泛使用,在語音識別、圖像處理等領域也經常使用。比如對於語音識別來說,圖2所示的框架完全適用,區別無非是Encoder部分的輸入是語音流,輸出是對應的文本信息;而對於“圖像描述”任務來說,Encoder部分的輸入是一副圖片,Decoder的輸出是能夠描述圖片語義內容的一句描述語。一般而言,文本處理和語音識別的Encoder部分通常采用RNN模型,圖像處理的Encoder一般采用CNN模型。

Attention模型

本節先以機器翻譯作為例子講解最常見的Soft Attention模型的基本原理,之后拋離Encoder-Decoder框架抽象出了注意力機制的本質思想,然后簡單介紹最近廣為使用的Self Attention的基本思路。

Soft Attention模型

圖2中展示的Encoder-Decoder框架是沒有體現出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。為什么說它注意力不集中呢?請觀察下目標句子Target中每個單詞的生成過程如下:

0?wx_fmt=png

其中f是Decoder的非線性變換函數。從這里可以看出,在生成目標句子的單詞時,不論生成哪個單詞,它們使用的輸入句子Source的語義編碼C都是一樣的,沒有任何區別。

而語義編碼C是由句子Source的每個單詞經過Encoder 編碼產生的,這意味着不論是生成哪個單詞,0?wx_fmt=png還是0?wx_fmt=png,其實句子Source中任意單詞對生成某個目標單詞yi來說影響力都是相同的,這是為何說這個模型沒有體現出注意力的緣由。這類似於人類看到眼前的畫面,但是眼中卻沒有注意焦點一樣。

如果拿機器翻譯來解釋這個分心模型的Encoder-Decoder框架更好理解,比如輸入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文單詞:“湯姆”,“追逐”,“傑瑞”。

在翻譯“傑瑞”這個中文單詞的時候,分心模型里面的每個英文單詞對於翻譯目標單詞“傑瑞”貢獻是相同的,很明顯這里不太合理,顯然“Jerry”對於翻譯成“傑瑞”更重要,但是分心模型是無法體現這一點的,這就是為何說它沒有引入注意力的原因。

沒有引入注意力的模型在輸入句子比較短的時候問題不大,但是如果輸入句子比較長,此時所有語義完全通過一個中間語義向量來表示,單詞自身的信息已經消失,可想而知會丟失很多細節信息,這也是為何要引入注意力模型的重要原因。

上面的例子中,如果引入Attention模型的話,應該在翻譯“傑瑞”的時候,體現出英文單詞對於翻譯當前中文單詞不同的影響程度,比如給出類似下面一個概率分布值:

(Tom,0.3)(Chase,0.2) (Jerry,0.5)

每個英文單詞的概率代表了翻譯當前單詞“傑瑞”時,注意力分配模型分配給不同英文單詞的注意力大小。這對於正確翻譯目標語單詞肯定是有幫助的,因為引入了新的信息。

同理,目標句子中的每個單詞都應該學會其對應的源語句子中單詞的注意力分配概率信息。這意味着在生成每個單詞0?wx_fmt=png的時候,原先都是相同的中間語義表示C會被替換成根據當前生成單詞而不斷變化的0?wx_fmt=png。理解Attention模型的關鍵就是這里,即由固定的中間語義表示C換成了根據當前輸出單詞來調整成加入注意力模型的變化的0?wx_fmt=png。增加了注意力模型的Encoder-Decoder框架理解起來如圖3所示。

0?wx_fmt=png

                                圖3 引入注意力模型的Encoder-Decoder框架

即生成目標句子單詞的過程成了下面的形式:

0?wx_fmt=png

而每個0?wx_fmt=png可能對應着不同的源語句子單詞的注意力分配概率分布,比如對於上面的英漢翻譯來說,其對應的信息可能如下:

0?wx_fmt=png

其中,f2函數代表Encoder對輸入英文單詞的某種變換函數,比如如果Encoder是用的RNN模型的話,這個f2函數的結果往往是某個時刻輸入0?wx_fmt=png后隱層節點的狀態值;g代表Encoder根據單詞的中間表示合成整個句子中間語義表示的變換函數,一般的做法中,g函數就是對構成元素加權求和,即下列公式:

0?wx_fmt=png

其中,0?wx_fmt=png代表輸入句子Source的長度,0?wx_fmt=png代表在Target輸出第i個單詞時Source輸入句子中第j個單詞的注意力分配系數,而0?wx_fmt=png則是Source輸入句子中第j個單詞的語義編碼。假設0?wx_fmt=png下標i就是上面例子所說的“ 湯姆” ,那么0?wx_fmt=png就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分別是輸入句子每個單詞的語義編碼,對應的注意力模型權值則分別是0.6,0.2,0.2,所以g函數本質上就是個加權求和函數。如果形象表示的話,翻譯中文單詞“湯姆”的時候,數學公式對應的中間語義表示0?wx_fmt=png的形成過程類似圖4。

0?wx_fmt=png

                    圖4 Attention的形成過程

這里還有一個問題:生成目標句子某個單詞,比如“湯姆”的時候,如何知道Attention模型所需要的輸入句子單詞注意力分配概率分布值呢?就是說“湯姆”對應的輸入句子Source中各個單詞的概率分布:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何得到的呢?

為了便於說明,我們假設對圖2的非Attention模型的Encoder-Decoder框架進行細化,Encoder采用RNN模型,Decoder也采用RNN模型,這是比較常見的一種模型配置,則圖2的框架轉換為圖5。

0?wx_fmt=png

                                     圖5 RNN作為具體模型的Encoder-Decoder框架

那么用圖6可以較為便捷地說明注意力分配概率分布值的通用計算過程。

0?wx_fmt=png

                                    圖6 注意力分配概率計算

對於采用RNN的Decoder來說,在時刻i,如果要生成yi單詞,我們是可以知道Target在生成0?wx_fmt=png之前的時刻i-1時,隱層節點i-1時刻的輸出值0?wx_fmt=png的,而我們的目的是要計算生成0?wx_fmt=png時輸入句子中的單詞“Tom”、“Chase”、“Jerry”對0?wx_fmt=png來說的注意力分配概率分布,那么可以用Target輸出句子i-1時刻的隱層節點狀態0?wx_fmt=png去一一和輸入句子Source中每個單詞對應的RNN隱層節點狀態hj進行對比,即通過函數F(0?wx_fmt=png,0?wx_fmt=png)來獲得目標單詞0?wx_fmt=png和每個輸入單詞對應的對齊可能性,這個F函數在不同論文里可能會采取不同的方法,然后函數F的輸出經過Softmax進行歸一化就得到了符合概率分布取值區間的注意力分配概率分布數值。

Self Attention模型

通過上述對Attention本質思想的梳理,我們可以更容易理解本節介紹的Self Attention模型。Self Attention也經常被稱為intra Attention(內部Attention),最近一年也獲得了比較廣泛的使用,比如Google最新的機器翻譯模型內部大量采用了Self Attention模型。

在一般任務的Encoder-Decoder框架中,輸入Source和輸出Target內容是不一樣的,比如對於英-中機器翻譯來說,Source是英文句子,Target是對應的翻譯出的中文句子,Attention機制發生在Target的元素Query和Source中的所有元素之間。而Self Attention顧名思義,指的不是Target和Source之間的Attention機制,而是Source內部元素之間或者Target內部元素之間發生的Attention機制,也可以理解為Target=Source這種特殊情況下的注意力計算機制。其具體計算過程是一樣的,只是計算對象發生了變化而已,所以此處不再贅述其計算過程細節。

如果是常規的Target不等於Source情形下的注意力計算,其物理含義正如上文所講,比如對於機器翻譯來說,本質上是目標語單詞和源語單詞之間的一種單詞對齊機制。那么如果是Self Attention機制,一個很自然的問題是:通過Self Attention到底學到了哪些規律或者抽取出了哪些特征呢?或者說引入Self Attention有什么增益或者好處呢?我們仍然以機器翻譯中的Self Attention來說明,圖11和圖12是可視化地表示Self Attention在同一個英語句子內單詞間產生的聯系。

0?wx_fmt=png

                                                      圖11 可視化Self Attention實例

0?wx_fmt=png

                                                   圖12 可視化Self Attention實例

從兩張圖(圖11、圖12)可以看出,Self Attention可以捕獲同一個句子中單詞之間的一些句法特征(比如圖11展示的有一定距離的短語結構)或者語義特征(比如圖12展示的its的指代對象Law)。

很明顯,引入Self Attention后會更容易捕獲句子中長距離的相互依賴的特征,因為如果是RNN或者LSTM,需要依次序序列計算,對於遠距離的相互依賴的特征,要經過若干時間步步驟的信息累積才能將兩者聯系起來,而距離越遠,有效捕獲的可能性越小。

但是Self Attention在計算過程中會直接將句子中任意兩個單詞的聯系通過一個計算步驟直接聯系起來,所以遠距離依賴特征之間的距離被極大縮短,有利於有效地利用這些特征。除此外,Self Attention對於增加計算的並行性也有直接幫助作用。這是為何Self Attention逐漸被廣泛使用的主要原因。

轉自:https://blog.csdn.net/TG229dvt5I93mxaQ5A6U/article/details/78422216


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM