Attention和增強循環神經網絡

https://blog.csdn.net/a398942089/article/details/53888797

CHRIS OLAHSHAN CARTER 譯:Krse Lee

原文:http://distill.pub/2016/augmented-rnns

譯者序:

       本文重點講述的是一種被稱爲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) 是另一種解決相似問題的方法。

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

代碼

       對於這些模型有很多開源的實現。神經圖靈機的實現包括 Taehoon Kim’s(TensorFlow), Shawn Tan’s (Theano), Fumin’s (Go), Kai Sheng Tai’s (Torch),以及Snip’s (Lasagne)。Neural GPU公開代碼放在了 TensorFlowModels repository。Memory networks的開源實現包括 Facebook’s (Torch/Matlab), YerevaNN’s (Theano),以及Taehoon Kim’s (TensorFlow)。

 

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技術是非常令人激動的。我們期待看到更好的未來。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章