TensorFlow LSTM Attention 機制圖解
深度學習的最新趨勢是注意力機制。在接受采訪時,現任OpenAI研究主管的Ilya Sutskever提到,注意力機制是最令人興奮的進步之一,他們在這里進行投入。聽起來令人興奮但是什么是注意機制?
基於人類視覺注意機制,神經網絡中的注意機制非常松散。人的視覺注意力得到了很好的研究,雖然存在着不同的模式,但它們基本上都是以“低分辨率”感知周圍的圖像,以“高分辨率”的方式集中在圖像的某個區域,然后隨着時間的推移調整焦點。
注意力機制解決什么問題?
為了理解我們可以做什么,我們以神經機器翻譯(NMT)為例。傳統的機器翻譯系統通常依賴於基於文本統計屬性的復雜特征工程。簡而言之,這些系統是復雜的,並且大量的工程設計都在構建它們。神經機器翻譯系統工作有點不同。在NMT中,我們將一個句子的含義映射成一個固定長度的向量表示,然后基於該向量生成一個翻譯。通過不依賴於n-gram數量的東西,而是試圖捕捉文本的更高層次的含義,NMT系統比許多其他方法更廣泛地推廣到新句子。也許更重要的是,NTM系統更容易構建和訓練,而且不需要任何手動功能工程。事實上,Tensorflow中的一個簡單的實現不超過幾百行代碼。
大多數NMT系統通過使用循環神經網絡將源語句(例如,德語句子)編碼為向量,然后基於該向量來解碼英語句子,也使用RNN來工作。

在上述圖中,將“Echt”,“Dicke”和“Kiste”字饋送到編碼器中,並且在特殊信號(未示出)之后,解碼器開始產生翻譯的句子。解碼器繼續生成單詞,直到產生句子令牌的特殊結尾。這里,h向量表示編碼器的內部狀態。
如果仔細觀察,您可以看到解碼器應該僅基於編碼器的最后一個隱藏狀態(上面的h_3)生成翻譯。這個h3矢量必須編碼我們需要知道的關於源語句的所有內容。它必須充分體現其意義。在更技術術語中,該向量是一個嵌入的句子。事實上,如果您使用PCA或t-SNE繪制不同句子在低維空間中的嵌入以降低維數,您可以看到語義上類似的短語最終彼此接近。這太棒了
然而,假設我們可以將所有關於潛在的非常長的句子的信息編碼成單個向量似乎有些不合理,然后使解碼器僅產生良好的翻譯。讓我們說你的源語句是50個字。英文翻譯的第一個詞可能與源句的第一個字高度相關。但這意味着解碼器必須從50個步驟前考慮信息,並且該信息需要以矢量編碼。已知經常性神經網絡在處理這種遠程依賴性方面存在問題。在理論上,像LSTM這樣的架構應該能夠處理這個問題,但在實踐中,遠程依賴仍然是有問題的。例如,研究人員已經發現,反轉源序列(向后饋送到編碼器中)產生明顯更好的結果,因為它縮短了從解碼器到編碼器相關部分的路徑。類似地,兩次輸入輸入序列也似乎有助於網絡更好地記住事物。
我認為把句子顛倒一個“黑客”的做法。它使事情在實踐中更好地工作,但這不是一個原則性的解決方案。大多數翻譯基准都是用法語和德語來完成的,與英語非常相似(甚至中文的單詞順序與英語非常相似)。但是有一些語言(如日語),一個句子的最后一個單詞可以高度預測英語翻譯中的第一個單詞。在這種情況下,扭轉輸入會使事情變得更糟。那么,有什么辦法呢?注意機制
使用注意機制,我們不再嘗試將完整的源語句編碼為固定長度的向量。相反,我們允許解碼器在輸出生成的每個步驟“參加”到源句子的不同部分。重要的是,我們讓模型基於輸入句子以及迄今為止所產生的內容,學習了要注意的內容。所以,在很好的語言(如英語和德語)中,解碼器可能會順序地選擇事情。在制作第一個英文單詞時參加第一個單詞,等等。這是通過聯合學習來整合和翻譯的神經機器翻譯所做的,看起來如下:

在這里,y是我們由解碼器產生的翻譯詞,x是我們的源語句。上圖說明使用雙向循環網絡,但這並不重要,您可以忽略反向方向。重要的部分是每個解碼器輸出字y_t現在取決於所有輸入狀態的加權組合,而不僅僅是最后一個狀態。 a的權重定義為每個輸出應考慮每個輸入狀態的多少。所以,如果a_ {3,2}是一個大數字,這意味着解碼器在產生目標句子的第三個單詞時,對源語句中的第二個狀態給予了很大的關注。 a通常被歸一化為總和為1(因此它們是輸入狀態的分布)。
關注的一大優點在於它使我們能夠解釋和可視化模型正在做什么。例如,通過在翻譯句子時可視化注意力矩陣a,我們可以了解模型的翻譯方式:

原文鏈接:http://www.wildml.com/2016/01/attention-and-memory-in-deep-learning-and-nlp/
更多 Tensorflow 教程:http://www.tensorflownews.com/