一、Attention Model 概述算法
深度學習裏的Attention model其實模擬的是人腦的注意力模型,舉個例子來講,當咱們觀賞一幅畫時,雖然咱們能夠看到整幅畫的全貌,可是在咱們深刻仔細地觀察時,其實眼睛聚焦的就只有很小的一塊,這個時候人的大腦主要關注在這一小塊圖案上,也就是說這個時候人腦對整幅圖的關注並非均衡的,是有必定的權重區分的。這就是深度學習裏的Attention Model的核心思想。網絡
人腦的注意力模型,說究竟是一種資源分配模型,在某個特定時刻,你的注意力老是集中在畫面中的某個焦點部分,而對其它部分視而不見。框架
二、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框架最抽象的一種表示:spa
對於句子對<X,Y>,咱們的目標是給定輸入句子X,期待經過Encoder-Decoder框架來生成目標句子Y。X和Y能夠是同一種語言,也能夠是兩種不一樣的語言。而X和Y分別由各自的單詞序列構成:.net
Encoder顧名思義就是對輸入句子X進行編碼,將輸入句子經過非線性變換轉化爲中間語義表示C:翻譯
對於解碼器Decoder來講,其任務是根據句子X的中間語義表示C和以前已經生成的歷史信息y1, y2….yi-1來生成i時刻要生成的單詞yi 設計
三、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的定義上可能有所不一樣。
四、論文中模型簡述
論文中的模型結構圖以下:
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模型