歡迎轉載,轉載請註明:本文出自Bin的專欄blog.csdn.NET/xbinworld。
技術交流QQ羣:433250724,歡迎對算法、技術感興趣的同窗加入。html
上一篇博文深度學習方法(八):Encoder-Decoder模型,基本Sequence to Sequence模型描述了基本的Encoder-Decoder模型,在做爲翻譯模型的時候,這種基本的Encoder-Decoder模型有較大缺點,就是Encoder部分每個輸入對Decoder部分每個輸出的貢獻都是同樣的。下面先看一個例子[1],算法
輸入的是英文句子:Tom chase Jerry,Encoder-Decoder生成:「湯姆」,「追逐」,「傑瑞」。
在基本模型中,每個英文單詞對傑瑞都是同樣的貢獻,這彷佛是不太合理的;也就是說markdown
沒有引入注意力的模型在輸入句子比較短的時候估計問題不大,可是若是輸入句子比較長,此時全部語義徹底經過一箇中間語義向量來表示,單詞自身的信息已經消失,可想而知會丟失不少細節信息,這也是爲什麼要引入注意力模型的重要緣由。若是引入AM模型的話,應該在翻譯「傑瑞」的時候,體現出英文單詞對於翻譯當前中文單詞不一樣的影響程度,好比給出相似下面一個機率分佈值:網絡
(Tom,0.3)(Chase,0.2)(Jerry,0.5)
即生成目標句子單詞的過程成了下面的形式:框架
而每一個Ci可能對應着不一樣的源語句子單詞的注意力分配機率分佈,好比對於上面的英漢翻譯來講,其對應的信息可能以下:函數
其中,f2函數表明Encoder對輸入英文單詞的某種變換函數,好比若是Encoder是用的RNN模型的話,這個f2函數的結果每每是某個時刻輸入xi後隱層節點的狀態值(通過激活函數);g表明Encoder根據單詞的中間表示合成整個句子中間語義表示的變換函數,通常的作法中,g函數就是對構成元素加權求和,也就是經常在論文裏看到的下列公式:學習
假設Ci中那個i就是上面的「湯姆」,那麼Tx就是3,表明輸入句子的長度,h1=f2(「Tom」),h2=f2(「Chase」),h3=f2(「Jerry」),對應的注意力模型權值分別是0.6,0.2,0.2,因此g函數就是個加權求和函數。若是形象表示的話,翻譯中文單詞「湯姆」的時候,數學公式對應的中間語義表示Ci的造成過程相似下圖:
優化
這裏還有一個問題:生成目標句子某個單詞,好比「湯姆」的時候,你怎麼知道AM模型所須要的輸入句子單詞注意力分配機率分佈值呢?就是說「湯姆」對應的機率分佈:編碼
(Tom,0.6)(Chase,0.2)(Jerry,0.2)atom
是如何獲得的呢?
爲了便於說明,咱們假設對圖1的非AM模型的Encoder-Decoder框架進行細化,Encoder採用RNN模型,Decoder也採用RNN模型,這是比較常見的一種模型配置,則圖1的圖轉換爲下圖:
注意力分配機率分佈值的通用計算過程:
至關於在原來的模型上,又加了一個單層DNN網絡,當前輸出詞Yi針對某一個輸入詞j的注意力權重由當前的隱層Hi,以及輸入詞j的隱層狀態(hj)共同決定;而後再接一個sofrmax獲得0-1的機率值。
寫成公式[2]:
也就是說,si−1先跟每一個h分別計算獲得一個數值,而後使用softmax獲得i時刻的輸出在Tx個輸入隱藏狀態中的注意力分配向量。這個分配向量也就是計算ci的權重。咱們如今再把公式按照執行順序彙總一下[3]:
[3]做者還給了一個示意圖:
上面主要在討論解碼,相比於上面解碼的創新,編碼就比較普通了,只是傳統的單向的RNN中,數據是按順序輸入的,所以第j個隱藏狀態h→j只能攜帶第j個單詞自己以及以前的一些信息;而若是逆序輸入,則h←j包含第j個單詞及以後的一些信息。若是把這兩個結合起來,hj=[h→j,h←j]就包含了第j個輸入和先後的信息。
Attention機制的一個主要優點是它讓咱們可以解釋並可視化整個模型。舉個例子,經過對attention權重矩陣a的可視化,咱們可以理解模型翻譯的過程(相關詞的關注點)。
當從法語譯爲英語時,網絡模型順序地關注每一個輸入狀態,但有時輸出一個詞語時會關注兩個原文的詞語,好比將「la Syrie」翻譯爲「Syria」。
下面討論一些RNN+NLP以外的AM的問題,這些參考[4]
**
**
若是再仔細觀察attention的等式,咱們會發現attention機制有必定的成本。咱們須要爲每一個輸入輸出組合分別計算attention值。50個單詞的輸入序列和50個單詞的輸出序列須要計算2500個attention值。這還不算太糟糕,但若是你作字符級別的計算,並且字符序列長達幾百個字符,那麼attention機制將會變得代價昂貴。
其實它和咱們的直覺偏偏相反。人類的注意力是節省計算資源的。當專一於一件事時,咱們能忽略其它事情。但這並非咱們上一個模型的做法。咱們在決定專一於某個方面以前先仔細觀察每件事。直觀地說,這至關於輸出一個翻譯後的詞語,而後遍歷記憶裏全部文本再決定下一個輸出什麼。這彷佛是一種浪費,並且沒人會這麼幹。事實上,它更相似於內存訪問,不是attention,在我看來有點兒用詞不當(下文會繼續討論)。不過,這並無阻礙attention機制的流行傳播。
attention的另外一種替代方法是用強化學習(Reinforcement Learning)來預測關注點的大概位置。這聽起來更像是人的注意力,這也是Recurrent Models of Visual Attention文中的做法。然而,強化學習模型不能用反向傳播算法端到端訓練,所以它在NLP的應用不是很普遍(我本人反而以爲這裏有突破點,數學上的不可求解必然會獲得優化,attention model在RL領域的應用確實很是有趣)。
到目前爲止,咱們已經見識了attention在機器翻譯領域的應用。但上述的attention機制一樣也能應用於遞歸模型。讓咱們再來看幾個例子。
在Show,Attend and Tell一文中,做者將attention機制應用於生成圖片的描述。他們用卷積神經網絡來「編碼」圖片,並用一個遞歸神經網絡模型和attention機制來生成描述。經過對attention權重值的可視化(就如以前機器翻譯的例子同樣),在生成詞語的同時咱們能解釋模型正在關注哪一個部分。
在Grammar as a Foreign Language論文中,做者用遞歸神經網絡模型和attention機制的來生成語法分析樹。可視化的attention矩陣讓人深刻地瞭解網絡模型如何生成這些樹:
在Teaching Machines to Read and Comprehend論文裏,做者利用RNN模型讀入文本,先讀入一個(合成的)問題,而後產生一個答案。經過將attention可視化,咱們能夠看到網絡模型在試圖尋找問題答案的時候關注哪些方面:
attention機制解決的根本問題是容許網絡返回到輸入序列,而不是把全部信息編碼成固定長度的向量。正如我在上面提到,我認爲使用attention有點兒用詞不當。換句話說,attention機制只是簡單地讓網絡模型訪問它的內部存儲器,也就是編碼器的隱藏狀態。在這種解釋中,網絡選擇從記憶中檢索東西,而不是選擇「注意」什麼。不一樣於典型的內存,這裏的內存訪問機制是彈性的,也就是說模型檢索到的是全部內存位置的加權組合,而不是某個獨立離散位置的值。彈性的內存訪問機制好處在於咱們能夠很容易地用反向傳播算法端到端地訓練網絡模型(雖然有non-fuzzy的方法,其中的梯度使用抽樣方法計算,而不是反向傳播)。
記憶機制自己的歷史更久遠。標準遞歸網絡模型的隱藏狀態自己就是一種內部記憶。RNN因爲存在梯度消失問題而沒法從長距離依賴學習。LSTM經過門控機制對此作了改善,它容許顯式的記憶刪除和更新。
更復雜的內存結構的趨勢還在延續。End-To-End Memory Networks一文中的方法容許網絡在輸出內容前屢次讀入相同的序列,每一步都更新記憶內容。舉個例子,輸入一個故事,在通過多步推理以後回答一個問題。然而,當網絡參數的權重以某種特定方式被綁定,端到端記憶網絡的記憶機制就和這裏所介紹的attention機制同樣了,只是它是多跳的記憶(由於它試圖整合多個句子信息)。
神經圖靈機器使用相似的記憶機制,但有一個更復雜的解決方案,它同時基於內容(如在這裏)和位置,使網絡模型經過學習模式來執行簡單的計算機程序,好比排序算法。
在未來,咱們極可能看到記憶機制和attention機制之間有更清晰的區別,也許是沿着Reinforcement Learning Neural Turing Machines,它嘗試學習訪問模式來處理外部接口。
本文其實是對網絡上的一些很棒的博文的整理,便於本身之後回憶理解,實際上網上寫的東西通常都比較淺顯易懂,可是真正要理解仍是建議看一下相關論文,基本的兩篇推薦[2][6],更多論文能夠參考網頁[7][8]的參考文獻;最後再推薦一個網頁文章[5],介紹了RNN模型在Attention以及Memory方向的一些變化,總結的很不錯,後面有時間我再用本身的理解來記錄一下,看完本文的同窗能夠看看:)
[1] http://blog.csdn.net/malefactor/article/details/50550211
[2] NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE
[3] http://blog.csdn.net/u014595019/article/details/52826423
[4] http://geek.csdn.net/news/detail/50558
[5] http://distill.pub/2016/augmented-rnns/
[6] Sequence to Sequence Learning with Neural Networks, 2014, Google
[7] https://www.52ml.net/20093.html
[8] http://blog.csdn.net/malefactor/article/details/50583474