目前採用編碼器-解碼器 (Encode-Decode) 結構的模型很是熱門,是由於它在許多領域較其餘的傳統模型方法都取得了更好的結果。這種結構的模型一般將輸入序列編碼成一個固定長度的向量表示,對於長度較短的輸入序列而言,該模型可以學習出對應合理的向量表示。然而,這種模型存在的問題在於:當輸入序列很是長時,模型難以學到合理的向量表示。html
在這篇博文中,咱們將探索加入LSTM/RNN模型中的attention機制是如何克服傳統編碼器-解碼器結構存在的問題的。git
經過閱讀這篇博文,你將會學習到:github
讓咱們開始學習吧。網絡
使用傳統編碼器-解碼器的RNN模型先用一些LSTM單元來對輸入序列進行學習,編碼爲固定長度的向量表示;而後再用一些LSTM單元來讀取這種向量表示並解碼爲輸出序列。函數
採用這種結構的模型在許多比較難的序列預測問題(如文本翻譯)上都取得了最好的結果,所以迅速成爲了目前的主流方法。性能
例如:學習
這種結構在不少其餘的領域上也取得了不錯的結果。然而,它存在一個問題在於:輸入序列不論長短都會被編碼成一個固定長度的向量表示,而解碼則受限於該固定長度的向量表示。ui
這個問題限制了模型的性能,尤爲是當輸入序列比較長時,模型的性能會變得不好(在文本翻譯任務上表現爲待翻譯的原始文本長度過長時翻譯質量較差)。編碼
「一個潛在的問題是,採用編碼器-解碼器結構的神經網絡模型須要將輸入序列中的必要信息表示爲一個固定長度的向量,而當輸入序列很長時則難以保留所有的必要信息(由於太多),尤爲是當輸入序列的長度比訓練數據集中的更長時。」spa
— Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015
Attention機制的基本思想是,打破了傳統編碼器-解碼器結構在編解碼時都依賴於內部一個固定長度向量的限制。
Attention機制的實現是經過保留LSTM編碼器對輸入序列的中間輸出結果,而後訓練一個模型來對這些輸入進行選擇性的學習而且在模型輸出時將輸出序列與之進行關聯。
換一個角度而言,輸出序列中的每一項的生成機率取決於在輸入序列中選擇了哪些項。
「在文本翻譯任務上,使用attention機制的模型每生成一個詞時都會在輸入序列中找出一個與之最相關的詞集合。以後模型根據當前的上下文向量 (context vectors) 和全部以前生成出的詞來預測下一個目標詞。
… 它將輸入序列轉化爲一堆向量的序列並自適應地從中選擇一個子集來解碼出目標翻譯文本。這感受上像是用於文本翻譯的神經網絡模型須要「壓縮」輸入文本中的全部信息爲一個固定長度的向量,不論輸入文本的長短。」
— Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015
雖然模型使用attention機制以後會增長計算量,可是性能水平可以獲得提高。另外,使用attention機制便於理解在模型輸出過程當中輸入序列中的信息是如何影響最後生成序列的。這有助於咱們更好地理解模型的內部運做機制以及對一些特定的輸入-輸出進行debug。
「論文提出的方法可以直觀地觀察到生成序列中的每一個詞與輸入序列中一些詞的對齊關係,這能夠經過對標註 (annotations) 權重參數可視化來實現…每一個圖中矩陣的每一行表示與標註相關聯的權重。由此咱們能夠看出在生成目標詞時,源句子中的位置信息會被認爲更重要。」
— Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015
被普遍應用於計算機視覺領域的卷積神經網絡模型一樣存在相似的問題: 對於特別大的圖片輸入,模型學習起來比較困難。
由此,一種啓發式的方法是將在模型作預測以前先對大型圖片進行某種近似的表示。
「人類的感知有一個重要的特性是不會當即處理外界的所有輸入,相反的,人類會將注意力專一於所選擇的部分來獲得所須要的信息,而後結合不一樣時間段的局部信息來創建一個內部的場景表示,從而引導眼球的移動及作出決策。」
這種啓發式方法某種程度上也能夠認爲是考慮了attention,但在這篇博文中,這種方法並不認爲是基於attention機制的。
基於attention機制的相關論文以下:
這部分將列舉幾個具體的應用實例,介紹attention機制是如何用在LSTM/RNN模型來進行序列預測的。
文本翻譯這個實例在前面已經提過了。
給定一個法語的句子做爲輸入序列,須要輸出翻譯爲英語的句子。Attention機制被用在輸出輸出序列中的每一個詞時會專一考慮輸入序列中的一些被認爲比較重要的詞。
咱們對原始的編碼器-解碼器模型進行了改進,使其有一個模型來對輸入內容進行搜索,也就是說在生成目標詞時會有一個編碼器來作這個事情。這打破了以前的模型是基於將整個輸入序列強行編碼爲一個固定長度向量的限制,同時也讓模型在生成下一個目標詞時重點考慮輸入中相關的信息。
— Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015
Attention在文本翻譯任務(輸入爲法語文本序列,輸出爲英語文本序列)上的可視化(圖片來源於Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015)
與以前啓發式方法不一樣的是,基於序列生成的attention機制能夠應用在計算機視覺相關的任務上,幫助卷積神經網絡重點關注圖片的一些局部信息來生成相應的序列,典型的任務就是對一張圖片進行文本描述。
給定一張圖片做爲輸入,輸出對應的英文文本描述。Attention機制被用在輸出輸出序列的每一個詞時會專一考慮圖片中不一樣的局部信息。
咱們提出了一種基於attention的方法,該方法在3個標準數據集上都取得了最佳的結果……同時展示了attention機制可以更好地幫助咱們理解模型地生成過程,模型學習到的對齊關係與人類的直觀認知很是的接近(以下圖)。
— Show, Attend and Tell: Neural Image Caption Generation with Visual Attention, 2016
Attention在圖片描述任務(輸入爲圖片,輸出爲描述的文本)上的可視化(圖片來源於Attend and Tell: Neural Image Caption Generation with Visual Attention, 2016)
給定一個用英文描述的前提和假設做爲輸入,輸出假設與前提是否矛盾、是否相關或者是否成立。
舉個例子:
前提:在一個婚禮派對上拍照
假設:有人結婚了
該例子中的假設是成立的。
Attention機制被用於關聯假設和前提描述文本之間詞與詞的關係。
咱們提出了一種基於LSTM的神經網絡模型,和把每一個輸入文本都獨立編碼爲一個語義向量的模型不一樣的是,該模型同時讀取前提和假設兩個描述的文本序列並判斷假設是否成立。咱們在模型中加入了attention機制來找出假設和前提文本中詞/短語之間的對齊關係。……加入attention機制可以使模型在實驗結果上有2.6個點的提高,這是目前數據集上取得的最好結果…
Attention在語義蘊涵任務(輸入是前提文本,輸出是假設文本)上的可視化(圖片來源於Reasoning about Entailment with Neural Attention, 2016)
給定一個英文的語音片斷做爲輸入,輸出對應的音素序列。
Attention機制被用於對輸出序列的每一個音素和輸入語音序列中一些特定幀進行關聯。
…一種基於attention機制的端到端可訓練的語音識別模型,可以結合文本內容和位置信息來選擇輸入序列中下一個進行編碼的位置。該模型有一個優勢是可以識別長度比訓練數據長得多的語音輸入。
Attention在語音識別任務(輸入是音幀,輸出是音素的位置)上的可視化(圖片來源於Attention-Based Models for Speech Recognition, 2015)
給定一篇英文文章做爲輸入序列,輸出一個對應的摘要序列。
Attention機制被用於關聯輸出摘要中的每一個詞和輸入中的一些特定詞。
… 在最近神經網絡翻譯模型的發展基礎之上,提出了一個用於生成摘要任務的基於attention的神經網絡模型。經過將這個機率模型與一個生成式方法相結合來生成出準確的摘要。
— A Neural Attention Model for Abstractive Sentence Summarization, 2015
Attention在文本摘要任務(輸入爲文章,輸出爲文本摘要)上的可視化(圖片來源於A Neural Attention Model for Abstractive Sentence Summarization, 2015)
在這個模型中,encoder只將最後一個輸出遞給了decoder,這樣一來,decoder就至關於對輸入只知道梗概意思,而沒法獲得更多輸入的細節,好比輸入的位置信息。因此想一想就知道了,若是輸入的句子比較短、意思比較簡單,翻譯起來還行,長了複雜了就作很差了嘛。
前面說了,只給我遞來最後一個輸出,很差;但若是把每一個step的輸出都傳給我,又有一個問題了,怎麼對齊?
什麼是對齊?好比說英文翻譯成中文,假設英文有10個詞,對應的中文翻譯只有6個詞,那麼就有了哪些英文詞對哪些中文詞的問題了嘛。
傳統的翻譯專門有一塊是搞對齊的,是一個比較獨立的task(傳統的NLP基本上每一塊都是獨立的task啦)。
咱們從輸出端,即decoder部分,倒過來一步一步看公式。
$$ S_t=f(S_{t-1}, y_{t-1}, c_t) \tag{1} $$
$S_t$是指decoder在$t$時刻的狀態輸出,$S_{t-1}$是指decoder在$t-1$時刻的狀態輸出,$y_{t-1}$是$t-1$時刻的label(注意是label,不是咱們輸出的$y$),$c_t$看下一個公式,$f$是一個RNN。
$$ {c_{t}} = \sum\limits_{j = 1}^{{T_x}} {{a_{tj}}{h_j}} \tag{2} $$
$h_j$是指第$j$個輸入在encoder裏的輸出,$a_{tj}$是一個權重
$$ {a_{tj}} = \frac{{exp \left( {{e_{tj}}} \right)}}{{\sum\nolimits_{k = 1}^{{T_x}} {exp \left( {{e_{tk}}} \right)} }} \tag{3}$$
這個公式跟softmax是何其類似,道理是同樣的,是爲了獲得條件機率$P(a|e)$,這個$a$的意義是當前這一步decoder對齊第$j$個輸入的程度。
最後一個公式,
$$ e_{tj} = g(S_{t-1}, h_j) = V\cdot \tanh { \left( W\cdot h_j+U\cdot S_{t-1}+b \right) } \tag{4}$$
這個$g$能夠用一個小型的神經網絡來逼近,它用來計算$S_{t-1}$, $h_j$這二者的關係分數,若是分數大則說明關注度較高,注意力分佈就會更加集中在這個輸入單詞上,這個函數在文章Neural Machine Translation by Jointly Learning to Align and Translate(2014)中稱之爲校準模型(alignment model),文中提到這個函數是RNN前饋網絡中的一系列參數,在訓練過程會訓練這些參數, 基於Attention-Based LSTM模型的文本分類技術的研究(2016)給出了上式的右側部分做爲拓展。
好了,把四個公式串起來看,這個attention機制能夠總結爲一句話:當前一步輸出$S_t$應該對齊哪一步輸入,主要取決於前一步輸出$S_{t-1}$和這一步輸入的encoder結果$h_j$。
看了這個方法的感覺是,計算力發達的這個年代,真是什麼複雜的東西都有人敢試了啊。這要是放在之前,得跑多久才能收斂啊......
神經網絡搞NLP雖然還有諸多受限的地方,但這種end-to-end 的one task方式,太吸引人,有前途。
若是你想進一步地學習如何在LSTM/RNN模型中加入attention機制,可閱讀如下論文:
目前Keras官方尚未單獨將attention模型的代碼開源,下面有一些第三方的實現:
經過這篇博文,你應該學習到了attention機制是如何應用在LSTM/RNN模型中來解決序列預測存在的問題。
具體而言,採用傳統編碼器-解碼器結構的LSTM/RNN模型存在一個問題:不論輸入長短都將其編碼成一個固定長度的向量表示,這使模型對於長輸入序列的學習效果不好(解碼效果不好)。而attention機制則克服了上述問題,原理是在模型輸出時會選擇性地專一考慮輸入中的對應相關的信息。使用attention機制的方法被普遍應用在各類序列預測任務上,包括文本翻譯、語音識別等。
感謝原做者Jason Brownlee。原文連接見:Attention in Long Short-Term Memory Recurrent Neural Networks
轉載:http://www.jeyzhang.com/understand-attention-in-rnn.html