1. 程式人生 > >Attention和增強迴圈神經網路

Attention和增強迴圈神經網路

譯者序:

       本文重點講述的是一種被稱為attention的方法,有的人將其譯為“聚焦”,但覺得這種翻譯將原文對神經網路擬人化的手法給扔掉了,因此保留了原來的稱謂。Attention,顧名思義,就是讓神經網路對部分內容引起注意,而忽略其他不重要的內容。目前我看到過這篇文章的兩種譯文版本,但都有不少缺陷,或是殘缺,或是表述不清難以理解,因此汲取兩個版本的優點對原文重新進行翻譯。

       Attention方法的通用的技巧是將原本不可微的離散資料結合一個attention分佈變得可微,從而使得離散資料也可以作為神經網路的輸入向量,本文闡述了attention方法的四個應用方向:神經圖靈機、attentional介面、自適應計算時間模型、神經程式設計器,四種模型在應用attention方法時都有相似點和不同點,這也是這些方法的奇妙之處。這些增強的RNN模型在未來或許會有非常廣闊的應用空間,值得大家細細品讀。

       另外英文原文中作者精心製作了使用者可操作的動圖幫助理解,譯文中無法直接引用,所以需要的朋友請跳轉到原文中自己體會。

 ============華麗的分割線==============

       迴圈神經網路(Recurrent Neural Networks)是深度學習中的一個重要結構,它讓神經網路能夠作用於序列化的資料,比如文字、音訊和視訊。它們可以將一個序列濃縮為一個高度理解的模型、進行序列標註以及通過模型生成一個新的序列。


       基礎的RNN常常在長序列問題面前艱難掙扎,因為有“記憶消失”現象,但是有一個特殊變種LSTM(長短記憶網路)可以克服。這種模型被證明是十分強大的,在翻譯、語音識別、影象捕捉等很多工中取得了卓越的成果。因此,迴圈神經網路在過去的幾年中被運用得非常廣泛。

       另一方面,可以看到近年來給RNN增加新特性的嘗試在逐漸增多,主要有以下四個方向:


神經圖靈機:擁有額外的記憶模組用來讀或寫。

Attentional介面:允許RNN對部分輸入集中注意力。

自適應計算時間:允許在每個計算時間步驟中處理不同的計算量。

神經編碼器:可以呼叫方法,構建程式。

       單獨來講,這些技術都有效地擴充套件了RNN,但是真正引人注意的是它們可以結合在一塊兒,就像是更廣闊的空間中點的聚合。更進一步地說,它們依賴同一種底層技巧進行工作,這種技巧叫做attention。

       我們猜測這些增強RNN將在未來幾年擴充套件深度學習領域扮演十分重要的角色。

神經圖靈機(Neural Turing Machines)

       神經圖靈機(Graves,et al.,2014)將一個RNN和一個額外的記憶模組相結合。對於神經網路,向量就是它們的自然語言,因此這個記憶模組是存放向量的陣列。


       那麼,圖靈機的Reading和Writing操作是怎麼工作的呢?這裡最大的挑戰是我們想讓這兩種方法可微。通常地,可微指我們希望它們知道從哪兒讀或者寫到哪裡去,因此需要學習從什麼地方讀或寫。這個事情比較棘手,因為儲存地址是幾乎離散(不可微)的。NTMs採用了一個非常聰明的方法來解決這個問題:每一步中,它們從每一個位置讀或寫,只是程度不同。

       舉一個例子讓我們關注Reading過程。RNN給出了attention 分佈,這個分佈描述了我們在傳遞過程中所關注的不同記憶位置的量的權重大小,而不是從一個特定的位置取得的量。這樣,讀操作的結果就是一個權重累加和。


       相似的,Writing時我們對每個位置都不同程度地進行寫操作。這裡的attention distribution描述的是每一個位置的寫入量。在這個操作中我們得到的一個位置的新值是舊的記憶內容和要寫入的值的一個“凸組合”,這兩者的位置由attention權重決定。


       NTMs怎樣確定對記憶模組中哪一個位置集中注意呢?事實上,它們結合了兩種方法:基於內容的attention和基於位置的attention。基於內容的attention允許NTMs在記憶模組中搜索並關注相匹配的位置;而基於位置的attention允許在儲存中進行相對運動,使得NTMs可以迴圈。


       讀和寫的特性使得NTMs可以演算很多簡單的演算法,超越的先前的神經網路。舉個例子,它們可以學習將一個長序列儲存在儲存單元中,然後迴圈它,反反覆覆。在它們做這件事的時候,我們可以觀察它們讀寫的位置來更好的理解他們在做什麼。


       它們也能夠學習模仿一個lookup table,甚至學習對數字進行排序(儘管它們有點欺騙的味道)!但在另一方面,仍然有一些它們無法完成的基本任務,比如數字相加或相乘。

       從原始的NTM論文開始,不乏一些令人激動的論文介紹了相似的研究方向。The Neural GPU (Kaiser &Sutskever, 2015) 克服了NTM不能對數字進行相加或相乘的缺點。 Zaremba &Sutskever, 2016 訓練NTMs 用來強化學習,以替代原始的可區分讀或寫。Neural Random Access Machines (Kurach et al., 2015)是基於指標進行工作的。一些論文闡釋了使用不同的資料結構,比如棧和佇列(Grefenstette etal. 2015Joulin &Mikolov, 2015). 還有memorynetworks (Weston et al., 2014Kumar et al., 2015) 是另一種解決相似問題的方法。

       就目的性來說,這些模型能夠完成上述任務,比如學習如何對數字相加,並且客觀上講這些任務並不難,傳統的程式解決這些問題就像吃午餐一樣容易。但是神經網路能做很多其他事情,像神經圖靈機這樣的模型似乎已經在它們的能力上有了深遠的突破。

程式碼

Attentional介面

       當我要翻譯一個句子,我會特別注意正在翻譯的詞;當我謄寫一段錄音時,我會仔細聽我正要寫下來的段落;如果你讓我描述我所在的房間,那麼我會瞥一眼我正要描述的物品。

       使用attention方法能讓神經網路作出相似的表現——對餵給它們資訊的一個子集集中注意。例如,一個RNN能將另一個RNN的輸出作為輸入,在每一個時間步驟,它會關注另一個RNN的不同位置的輸出。

       我們希望attention是可微的,這樣能夠學習在什麼位置集中注意力。為了做到這一步,我們使用和神經圖靈機一樣的技巧:對每一個位置都表示關注,只是程度不同。


       這種attention RNN會生成一個query來描述它想要關注的位置,每一個元素同query點乘產生一個評分,描述元素和query匹配的契合度。這個評分會餵給一個softmax來建立attention分佈。

       RNNs中attention的一個用途就是翻譯 (Bahdanau, et al. 2014)。傳統的序列到序列模型不得不將整個輸入濃縮為一個向量,然後再將它展開回去。Attention方法避免了這一點,允許下層RNN處理輸入,然後生成相應的輸出,傳遞它看到的每個詞的資訊。輸出聚焦在與輸入單詞相關的一組詞上(這樣聚焦的結果作為上層RNN的輸入)。

       這種RNN間的attention有很多其他應用,比如語音識別 (Chan, etal. 2015),讓一個RNN處理音訊,另一個RNN在它上面滑動,關注attention操作後的相關部分。

       這種attention的其他應用包括文字分析 (Vinyals, et al., 2014),它允許模型在生成語法樹時去瞥一眼單詞;會話模型 (Vinyals &Le, 2015),讓模型在生成響應內容時關注之前的會話內容。

       Attention也能夠用在卷積神經網路和RNN之間的介面上。讓RNN在每一步中關注圖片的不同位置。首先,用一個卷積網路處理影象,抽取出高層次特徵;然後執行一個RNN來生成圖片的描述。在RNN生成描述的每一個單詞時,它關注卷積網路對相關部分的解釋。我們可以將這些工作進行視覺化:

       更廣泛的,只要一個神經網路的輸出中有重複結構,就能使用attentional介面連線該神經網路。

       Attentional介面被證明是一種具有普適性並且十分強大的技術,正被越來越廣泛地使用。

自適應計算時間

       標準的RNN在每一個時間步驟中所做的計算量是相同的,這似乎跟我們的直觀感覺不符,應對困難的問題難道不應該花更多的時間嗎?這也限制了對長度為n的list,RNN進行的運算元目的上限為O(n)。

       自適應計算時間模型 (Graves, 2016)是一種讓RNN在每個時間步驟裡進行不同數量計算的一種方法。其思想非常簡單:允許RNN在一個時間步驟中進行多個步驟的操作。

為了讓網路學習該進行多少步計算,我們希望每一次計算步驟數目是可微的。通過使用和之前相同的技巧來達到這一點:在步驟數目之上加了一個attention分佈,而不是直接使用離散的數字決定執行的步驟數目。那麼最終輸出就是每一步輸出的權重組合。

       上圖省略了一些細節,下圖是三個完整時間步驟的完整過程。

       看起來有些複雜,那麼讓我們一步一步的來執行這個過程吧。從高層看,我們仍然在執行RNN,並且輸出狀態的加權組合。

       每一步的權重由一個“停止神經元”決定,這是一個sigmoid神經元,它用來監控RNN的狀態並給出一個停止權重,我們可以把這個權重看成是這一步應該停止的概率。

       我們有一個初始為1的預算,跟著下圖上方的預算執行軌跡減去停止權重,當它小於閾值epsilon時,停止。


       當我們停止時,可能還剩餘一些預算,因為當預算小於epsilon就停止了,這些預算怎麼處理呢?技術上,它會被留給未來的步驟,但我們並不想進行這些運算,因此它被分給了最後一步。

       我們訓練自適應時間模型時,給損失函式加上了一個“思考成本”,用來懲罰模型所使用的計算量。你把“思考成本”設定得越大,模型就會在降低計算時間上作出更多的權衡。

       自適應計算時間是一種非常新的想法,我們相信伴隨著相似的想法,它會變得更加重要。

程式碼

       目前為止,貌似只有 MarkNeumann’s (TensorFlow)的自適應計算時間模型程式碼是開源的。

神經程式設計器

       神經網路在處理很多工上都表現得非常出色,但在一些基礎的問題上仍然有很大的困難,例如算術,而這些問題用常規方法計算往往又是很輕鬆的。因此,將神經網路與常規程式相融合可能會是一個很好的方法,並且在兩者的領域都能做得更好。

       神經程式設計器(Neelakantan, et al., 2015) 是其中一種融合方法,它為了解決問題而學習如何創造程式。事實上,它學習生成這樣的程式是不需要正確程式例子的,他會自己發現如何生產程式來完成某些任務。

       論文中實際的模型通過生成類似於SQL語句的程式查詢資料庫表,從而回答關於資料庫表的問題。然而有很多細節使得這個問題有一點複雜,所以讓我們從想象一個更稍微簡單的模型作為開始吧,給定一個算術表示式,生成一個程式來驗證它。

       生成的程式是一系列操作組成的序列,每一個操作定義瞭如何處理以前操作的輸出,因此,一個操作可能是“將上兩步操作的輸出相加”。比起可以進行變數賦值和讀取的程式,這可能更像是Unix中的pipe。

       作為控制器的RNN每次生成程式的一個操作,在每一步中,控制器RNN輸出下一個操作可能性的概率分佈。例如,我們比較確信第一個時間步驟進行加法操作,接著在第二個時間步驟中難以決定是做乘法還是做除法,等等。

       現在可以驗證這些操作的結果分佈了。我們使用attention技巧執行所有的操作,並對輸出一起取加權平均值,而不是每一步執行一個單一的操作,權重是每一步執行各個操作的概率(即之前每一步輸出的概率分佈)。

       只要能夠對這些操作進行衍生,基於概率的程式輸出就會變的多樣。我們可以定義一個損失,然後給出正確值訓練神經網路生成程式。按這種方法,神經程式設計器就不需要通過學習正確的程式樣例來生成程式了,唯一的監督是程式應該輸出的正確答案。

       這就是神經程式設計器的核心思想,但是這篇論文中的版本是回答關於資料庫表的問題,而不是算術表示式。這裡有一些額外的處理技巧:

l   多種型別處理:這個神經程式設計器中的很多操作處理的不是標量數,而是型別。一些操作輸出的是選中的表的列或者單元,只有當輸出型別一致時才會合併。

l   引用輸入:神經程式設計器需要回答像“有多少城市的人口大於1,000,000”的問題時,給出了帶有人口數量列資訊的城市列表。為了達到這一步,一些操作允許網路引用當前需要回答的問題中的常量,或者列的名稱。在指標網路(Vinyals, etal., 2015)中,引用隨著attention發生。

       神經程式設計器並不是唯一讓神經網路生成程式的方法,另一種更可愛的方法是神經程式設計-直譯器(Reed & de Freitas, 2015) ,它完成了一些很有趣的任務,但是需要正確程式進行有監督訓練。

       我們覺得在傳統程式和神經網路之間的鴻溝上搭建橋樑是非常重要的,儘管神經程式設計器肯定不是最終的方法,依然可以從它身上學到很多重要的東西。

程式碼

       神經程式設計器目前沒有看到開源實現,但是有神經程式設計-直譯器的開源實現,作者是Ken Morishita (Keras)。

總結

       從某種意義上說,身邊有一張紙的人會比沒有的人聰明很多;懂得數學符號的人可以解決很多其他人不能解決的問題;與計算機接觸使我們能夠獲得難以置信的專長,將其他人遠遠甩在後面。

       一般來說,很多有意思的智慧表現形式是富有創造性的人類直覺和清脆細緻的媒介相互作用的結果,比如語言和方程。有時候,這種媒介是物質存在,為我們儲存資訊,防止我們犯錯誤,或者承擔繁重的計算任務。其他情況下,媒介是我們腦袋中的模型。無論哪種,似乎都是智慧的基礎。

       最近的機器學習成果開始有了這種味道,將神經網路的直覺與其他東西相結合。其中一種方法叫做“啟發式搜尋”,例如AlphaGo(Silver, etal., 2016) 有一個模型,是在神經網路指導下讓Go工作並探索如何進行遊戲。相似的,DeepMath(Alemi, etal., 2016) 使用神經網路作為思維來操縱數學表示式。本文介紹的“增強RNN”是另外一種方法,它將RNN與工程媒介相連線,目的是為了拓展它們的泛化能力。

       同媒介互動自然包括了產生一個由採取行動、觀察以及採取更多動作的序列。這樣就有一個重大的挑戰:我們怎麼學習採取什麼樣的動作呢?這聽起來像是一個強化學習問題,我們當然可以採用強化學習的方法。但是強化學習克服的是這個問題最困難的版本,這種方法也難以使用。Attention方法最好的一點就是對這個問題它給出了一種更簡單的解決方法——通過程度的不同從所用動作中只選擇部分。我們能設計媒介,比如NTM記憶模組,使得動作成為浮點值並可微,正是由於將離散量變得可微,Attention方法才可行。而強化學習讓我們面前只有一條單一的路徑,並只能從這條路徑去學習(採取什麼樣的動作),Attention方法在分叉路口沿著每個方向前進,然後對每條路徑的結果進行彙總。

       Attention方法的主要缺陷是我們在每一步中採取了所有的動作,這使得在像NTM增加記憶單元時,開銷呈線性地增長。可以想到的一種做法是讓attention稀疏化,這樣就只需要接觸部分記憶單元。然而,這裡面仍然有挑戰,因為你可能想要關注記憶模組的內容,這使得必須去檢視每個記憶單元。目前已經有一些初步的嘗試去解決這個問題,比如 Andrychowicz& Kurach, 2016,但仍有很多工作待進行。如果真的出現了子線性時間內的attention方法,那將非常強大!

       增強迴圈神經網路,以及其依賴的attention技術是非常令人激動的。我們期待看到更好的未來。

相關推薦

Attention增強迴圈神經網路

譯者序:        本文重點講述的是一種被稱為attention的方法,有的人將其譯為“聚焦”,但覺得這種翻譯將原文對神經網路擬人化的手法給扔掉了,因此保留了原來的稱謂。Attention,顧名思義,就是讓神經網路對部分內容引起注意,而忽略其他不重要的內容。目前我

序列模型(5)-----雙向神經網路(BRNN)深層迴圈神經網路(Deep RNN)

一、雙向迴圈神經網路BRNN 採用BRNN原因: 雙向RNN,即可以從過去的時間點獲取記憶,又可以從未來的時間點獲取資訊。為什麼要獲取未來的資訊呢? 判斷下面句子中Teddy是否是人名,如果只從前面兩個詞是無法得知Teddy是否是人名,如果能有後面的資訊就很好判斷了,這就需要用的雙向迴圈神經網路。

長文 | LSTM迴圈神經網路基礎教程(PDF下載)

來自公眾號 機器學習演算法與Python學習目錄:前言前饋網路回顧迴圈網路時間反向傳播BPTT梯

基於注意力模型卷積迴圈神經網路的中文自然場景文字識別

 最近,在進行相關中文文字識別的工作,查閱了許多論文。最終決定參考谷歌的基於注意力機制的街景文字識別的論文:"Attention-based Extraction of Structured Information from Street View Imagery",並對官方原始碼進行修改

迴圈神經網路教程第四部分-用PythonTheano實現GRU/LSTM迴圈神經網路

作者:徐志強 連結:https://zhuanlan.zhihu.com/p/22371429 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 本篇教程的程式碼在Github上。這裡是迴圈神經網路教程的最後一部分,前幾部分別是: 本篇中我們將學習LSTM(長短項記憶)網路和G

04-迴圈神經網路(RNN)LSTM

RNN(Recurrent NeuralNetwork)和LSTM(Long Short Term Memory)RNN(Recurrent NeuralNetwork)RNN:存在隨著時間的流逝,訊號會不斷的衰弱(梯度消失)LSTM(Long Short Term Memo

迴圈神經網路教程 第四部分 用Python Theano實現GRU/LSTM RNN

在本文中,我們將瞭解LSTM(長期短期記憶體)網路和GRU(門控迴圈單元)。 LSTM是1997年由Sepp Hochreiter和JürgenSchmidhuber首次提出的,是當下最廣泛使用的NLP深度學習模型之一。 GRU,首次在2014年使用,是一個

Keras學習(五)——RNN迴圈神經網路分類

本篇文章主要介紹通過RNN實現MNIST手寫資料集分類。 示例程式碼: import numpy as np from keras.datasets import mnist from keras.utils import np_utils from keras.models impor

【火爐煉AI】深度學習004-Elman迴圈神經網路

【火爐煉AI】深度學習004-Elman迴圈神經網路 (本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) Elman神經網路是最早的迴圈神經網路,由Elman於1990年提出,又稱為SRN(Simp

迴圈神經網路(RNN)到LSTM網路

  通常,資料的存在形式有語音、文字、影象、視訊等。因為我的研究方向主要是影象識別,所以很少用有“記憶性”的深度網路。懷著對迴圈神經網路的興趣,在看懂了有關它的理論後,我又看了Github上提供的tensorflow實現,覺得收穫很大,故在這裡把我的理解記錄下來,也希望對大家能有所幫助。

協同過濾結合迴圈神經網路的推薦系統——期末作業

Recommendation System using Collaborative Filtering and Recurrent Neural Network author:Fu-ze Zhong Email: [email protected] School of Data

DeepLearning.ai作業:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)(1)

title: ‘DeepLearning.ai作業:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)(1)’ id: dl-ai-5-1h1 tags: dl.ai homework categories: AI Deep

DeepLearning.ai筆記:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)

title: ‘DeepLearning.ai筆記:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)’ id: dl-ai-5-1 tags: dl.ai categories: AI Deep Learning date: 2

DeepLearning.ai作業:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)(2)

title: ‘DeepLearning.ai作業:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)(2)’ id: dl-ai-5-1h2 tags: dl.ai homework categories: AI Deep

DeepLearning.ai作業:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)(3)

title: ‘DeepLearning.ai作業:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)(3)’ id: dl-ai-5-1h3 tags: dl.ai homework categories: AI Deep

深度學習花書學習筆記 第十章 序列建模:迴圈神經網路

展開計算圖 就是將迴圈圖展開成展開圖而已。 迴圈神經網路   就是如上網路,將某一層不斷重複,輸出重新作為輸入的一部分。 雙向RNN 應用於上下文環境都影響結果的場景,如語音識別,文章翻譯等 基於編碼-解碼的序列到序列架構 可以將可變長度的輸入轉

TensorFlow從入門到理解(四):你的第一個迴圈神經網路RNN(分類例子)

執行程式碼: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # set random seed for comparing the two result calculations

TensorFlow從入門到理解(五):你的第一個迴圈神經網路RNN(迴歸例子)

執行程式碼: import tensorflow as tf import numpy as np import matplotlib.pyplot as plt BATCH_START = 0 TIME_STEPS = 20 BATCH_SIZE = 50 INPUT_SIZE = 1 OUTP

tensorflow基本教程10:RNN迴圈神經網路對於手寫體識別預測

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #this is data mnist=input_data.read_data_sets("MNIST_data",one_

機器學習之迴圈神經網路(十)

摘要:        多層反饋RNN(Recurrent neural Network、迴圈神經網路)神經網路是一種節點定向連線成環的人工神經網路。這種網路的內部狀態可以展示動態時序行為。不同於前饋神經網路的是,RNN可以利用它內部的記憶來處理任意時序的輸入序列,這讓