1、Attention Model 概述
深度學習里的Attention model其實模擬的是人腦的注意力模型,舉個例子來說,當我們觀賞一幅畫時,雖然我們可以看到整幅畫的全貌,但是在我們深入仔細地觀察時,其實眼睛聚焦的就只有很小的一塊,這個時候人的大腦主要關注在這一小塊圖案上,也就是說這個時候人腦對整幅圖的關注並不是均衡的,是有一定的權重區分的。這就是深度學習里的Attention Model的核心思想。
人腦的注意力模型,說到底是一種資源分配模型,在某個特定時刻,你的注意力總是集中在畫面中的某個焦點部分,而對其它部分視而不見。
2、Encoder-Decoder框架
所謂encoder-decoder模型,又叫做編碼-解碼模型。這是一種應用於seq2seq問題的模型。seq2seq問題簡單的說,就是根據一個輸入序列x,來生成另一個輸出序列y。常見的應用有機器翻譯,文檔提取,問答系統等。Encoder-Decoder模型中的編碼,就是將輸入序列轉化成一個固定長度的向量;解碼,就是將之前生成的固定向量再轉化成輸出序列。
Encoder-Decoder(編碼-解碼)是深度學習中非常常見的一個模型框架,比如無監督算法的auto-encoding就是用編碼-解碼的結構設計並訓練的;比如這兩年比較熱的image caption的應用,就是CNN-RNN的編碼-解碼框架;再比如神經網絡機器翻譯NMT模型,往往就是LSTM-LSTM的編碼-解碼框架。因此,准確的說,Encoder-Decoder並不是一個具體的模型,而是一類框架。Encoder和Decoder部分可以是任意的文字,語音,圖像,視頻數據,模型可以采用CNN,RNN,BiRNN、LSTM、GRU等等。所以基於Encoder-Decoder,我們可以設計出各種各樣的應用算法。
Encoder-Decoder框架可以看作是一種文本處理領域的研究模式,應用場景異常廣泛,下圖是文本處理領域里常用的Encoder-Decoder框架最抽象的一種表示:
對於句子對<X,Y>,我們的目標是給定輸入句子X,期待通過Encoder-Decoder框架來生成目標句子Y。X和Y可以是同一種語言,也可以是兩種不同的語言。而X和Y分別由各自的單詞序列構成:
Encoder顧名思義就是對輸入句子X進行編碼,將輸入句子通過非線性變換轉化為中間語義表示C:
對於解碼器Decoder來說,其任務是根據句子X的中間語義表示C和之前已經生成的歷史信息y1, y2….yi-1來生成i時刻要生成的單詞yi
3、Attention Model
在Encoder-Decoder框架中,在預測每一個yi時對應的語義編碼c都是一樣的,也就意味着無論句子X中的每個單詞對輸出Y中的每一個單詞的影響都是相同的。這樣就會產生兩個弊端:一是語義向量無法完全表示整個序列的信息,再者就是先輸入的內容攜帶的信息會被后輸入的信息稀釋掉,或者說,被覆蓋了。輸入序列越長,這個現象就越嚴重。這就使得在解碼的時候一開始就沒有獲得輸入序列足夠的信息, 那么解碼的准確度自然也就要打個折扣了。
為了解決上面的弊端,就需要用到我們的Attention Model(注意力模型)來解決該問題。在機器翻譯的時候,讓生成詞不是只能關注全局的語義編碼向量c,而是增加了一個“注意力范圍”,表示接下來輸出詞時候要重點關注輸入序列中的哪些部分,然后根據關注的區域來產生下一個輸出。模型結構如下:
此時生成目標句子單詞的過程就成了下面的形式:
比如輸入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文單詞:“湯姆”,“追逐”,“傑瑞”。在沒加入Attention Model之前,生成的語義編碼C是一致的,而加入之后,對應的語義編碼可能如下:
其中,f2函數代表Encoder對輸入英文單詞的某種變換函數,比如如果Encoder是用的RNN模型的話,這個f2函數的結果往往是某個時刻輸入xi后隱層節點的狀態值;g代表Encoder根據單詞的中間表示合成整個句子中間語義表示的變換函數,一般的做法中,g函數就是對構成元素加權求和,也就是常常在論文里看到的下列公式:
假設Ci中那個i就是上面的“湯姆”,那么Tx就是3,代表輸入句子的長度,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”),對應的注意力模型權值分別是0.6, 0.2, 0.2,所以g函數就是個加權求和函數。如果形象表示的話,翻譯中文單詞“湯姆”的時候,數學公式對應的中間語義表示Ci的形成過程類似下圖:
這里還有一個問題:生成目標句子某個單詞,比如“湯姆”的時候,你怎么知道AM模型所需要的輸入句子單詞注意力分配概率分布值呢?就是說“湯姆”對應的概率分布:
此時的Encoder和Decoder都采用RNN模型,我們來看看現在的Encoder-Decoder模型結構:
用下圖可以較為便捷地說明注意力分配概率分布值的通用計算過程:
對於采用RNN的Decoder來說,如果要生成yi單詞,在時刻t = i,我們是可以知道在生成Yi之前的隱層節點t = i時刻的輸出值Hi的,而我們的目的是要計算生成Yi時的輸入句子單詞“Tom”、“Chase”、“Jerry”對Yi來說的注意力分配概率分布,那么可以用t = i時刻的隱層節點狀態Hi去一一和輸入句子中每個單詞對應的RNN隱層節點狀態hj進行對比,即通過函數F(hj, Hi)來獲得目標單詞Yi和每個輸入單詞對應的對齊可能性,這個F函數在不同論文里可能會采取不同的方法,然后函數F的輸出經過Softmax進行歸一化就得到了符合概率分布取值區間的注意力分配概率分布數值。絕大多數AM模型都是采取上述的計算框架來計算注意力分配概率分布信息,區別只是在F的定義上可能有所不同。
4、論文中模型簡述
論文中的模型結構圖如下:
Encoder層:采用了雙向的RNN網絡,最后隱層的輸出是兩個向量的拼接 $h_t = [\leftarrow{h_t}, \rightarrow{h_t}]$ 。
Attention層:
其中
在上面公式中 $h_j$ 是Encoder層的隱層第 $j$ 時刻的輸出,$s_{i-1}$ 是Decoder層第 $i-1$ 時刻隱層的輸出。可以發現在計算 $c_i$ 的模型實際上是一個線性模型,而且 $c_i$ 事實上是Encoder層中各時刻隱層的輸出的加權平均值。
Decoder層:采用了單向的RNN模型,第 $i$ 時刻的隱層的輸出是 $s_i$ 。第 $i$ 時刻的輸出和 $s_i, y_{i-1}, c_i$ 有關
因此引入Attention 機制,在機器翻譯中,模型會自己去學得在不同時刻不同的權重系數 $a_{ij}$ 。
Attention 模型在深度學習中的應用越來越重要,這種切合人的大腦活動的模型也能更真實的模擬人的大腦。在機器翻譯中,在傳統的Encoder-Decoder 框架中,隨着翻譯的句子的增長,翻譯的質量會下降(以人腦為例,句子太長,人也是無法記住整個句子然后進行翻譯的,而是會分成小段,逐個的翻譯)。這是因為,將一個長的句子編碼成一個定長的向量很容易丟失句子中的信息。Attention 模型就能很好的解決該問題,每一時刻的翻譯都只關注與之相關較大的部分,因此Attention 能提高長句子的翻譯質量。除了在機器翻譯中的應用,在文本分類以及其他的領域都有着廣泛的應用。
推薦文章:
Neural Machine Translation by Jointly Learning to Align and Translate
致謝文章:
自然語言處理中的Attention Model:是什么及為什么
深度學習方法(八):自然語言處理中的Encoder-Decoder模型,基本Sequence to Sequence模型