神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

吳攀發表於2017-04-11



神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

嗨,大家好,我是 Talla 公司的高階資料科學家 Daniel Shank,今天我要談談一個新的振奮人心的機器學習架構,它被稱為神經圖靈機(Neutral Turing Machine/NTM)。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

首先,我要對這個架構做一個總體的概述,即這個架構是什麼?然後我會開始討論為何說這個架構是重要的,以及它是如何與未來的機器學習相關的,再然後,我會談為什麼我們不能馬上在每個地方用到這些東西。例如,假如它非常有作用,那為何我們不將它立即用在產品中。最後我會討論最近發表在 Nature 上的神經圖靈機(Neutral Machine)的論文以及它後續的架構,並且我會展示對這個模型的一些有趣的擴充套件。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

為什麼我們要關心神經圖靈機?為了解釋神經圖靈機為何如此重要,我們必須實實在在解釋一下普通的圖靈機(Turing machine)是什麼。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

圖靈機就是一種簡單的計算機模型。正如現代計算機一樣,其思想中也包含了一個外部儲存器和某種處理器。本質上,圖靈機包含上面寫有指令的磁帶和能夠沿著磁帶讀取的裝置。根據從磁帶上讀取到的指令,計算機能夠決定在磁帶上不同的方向上移動以寫入或者擦除新符號等等。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

那什麼又是神經圖靈機(Neural Turing Machine)呢?簡而言之,神經圖靈機就是一種神經網路,但是它從圖靈機中獲得靈感來嘗試執行一些計算機可以解決得很好而機器學習模型並不能很好地解決的任務。本質上,它包括一個神經網路控制器(controller)、讀取磁帶裝置的模擬器或處理器,如果你願意的話,還可以加上外部儲存或記憶(memory)。它在所有讀取到的輸入上都是持續的。就像長短期記憶(LSTM)網路或者其他相關的模型一樣,它是一個迴圈神經網路(recurrent neural network)。這意味著,像我們大多數人熟悉的一樣,它讀取類似變數的輸入,但是,神經圖靈機和圖靈機也有不同之處:除了有一個記憶 / 記憶體之外,神經圖靈機也可以接受一連串連續的輸入並提供輸出。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

這裡的關鍵思想是神經圖靈機基本上就是可微分的圖靈機,這是很重要的,因為我們每天在計算機上做的演算法和事情對計算機來說是非常困難的,原因是計算機的計算是絕對的。要麼是 0 要麼是 1。計算機在「非此即彼」的邏輯或者整數中運作。然而大多數的神經網路和機器學習實際上不是這樣的。它們使用實數。它們使用更加平滑的曲線,使得它們更加容易訓練,這意味著,在看到它們的輸出時,你可以輕易地通過輸出追蹤回去調整引數以得到希望的輸出。當計算機 CPU 盡是諸如異或門(XOR)和與門(AND)等跳變函式時,這是非常難以實現的。神經圖靈機採用了基本的圖靈機中的所有功能找到了平滑的模擬函式。因此,比如在磁帶上,神經圖靈機可以決定稍微向左或者向右移動,而不是單純的向左或者向右,這可以讓你完成一些了不起的事情。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

在神經圖靈機能夠執行的事情中,我們有一些激動人心的例子,當然也有一些不那麼令人激動的......

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

但是缺點是它只能夠學習簡單的演算法。例如接受輸入並複製它。這看起來是極其平常的,但是對當前的神經網路來說,這實際上是一件非常困難的事情,因為神經網路需要學習出一個演算法才能把這個工作做得足夠好。神經圖靈機能夠接受輸入和輸出,並且學習得到能夠從輸入對映到輸出的演算法。這確實相當令人興奮,因為這本質上是在嘗試著取代程式設計師。雖然我們還未實現,但是這的確很酷。這意味著一旦習得了演算法,它們可以接受輸入並且外推到基於該演算法的任何變數輸出。接下來你會立即明白這為什麼很酷。因為它們還非常擅長語言建模(language modeling)。如果你不知道什麼是語言建模,你可以思考一下自動完成(autocomplete)。語言建模就是猜測一個單詞在句子或者文件語境中的意思。神經圖靈機也能夠在 Facebook 的 bAbI 資料集上表現得很有前景,bAbI 資料集是被設計用來鼓勵研究者們提升神經網路的通用認知推理能力的。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機在複製 / 重複任務上的泛化

這是一個神經圖靈機執行復制 / 重複任務的例子。它已經學會了接受相對短的序列,並重復幾次。正如你可以在上圖看到的一樣,開始的時候它犯錯。但是最終看起來相當好,圖中上邊的是目標,下邊的是輸出。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機神經圖靈機的表現超越了長短時記憶網路

相反,你拿這個例子與長短時記憶網路(LSTM)相比,LSTM 實際上是一種非常強大的神經網路模型。它們會很快就傾向於崩潰。出現這種情況的原因是,LSTM 確實是在學習一些東西,但是它們並不是在學習演算法。LSTM 試圖一次解決整個問題,所以它們意識不到前兩次所做的事情就是它們之後應該做的。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機平衡括號表示式

在神經圖靈機可以做到的事中,一個有趣的例子是它們可以識別平衡的括號。這個是特別有趣的,因為這涉及到的使用了棧(stack)的演算法,所以本質上你可以隨著左括號的進入去跟蹤它們,然後嘗試去匹配與之對應的右括號。這件事神經網路可以做,但是會以更加統計的方式完成,而神經圖靈機實際上可以像人類程式設計師一樣去完成這個任務。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

好了,現在我們談一下 bAbI 資料集以及為什麼我們如此關注它。bAbI 資料集本質上是一系列後面帶有問題的故事,而且所有的問題都被設計成需要某種形式的推理能力才能回答。我這裡有一個簡單的例子——使用位置來進行推理。這裡的關鍵點是,如果你問某人在哪裡,實際上問的是他們最後去了哪裡。這看起來非常明顯,當涉及到人物撿起東西或者行走時,這個問題實際上會變得有些複雜。故事也會涉及到關於物體相對尺寸的實際推理。基本上,這件事情背後的基本理念永遠是,一個在所有這種任務中表現良好的系統,接近一個更加通用的知識推理系統。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機bAbI 資料集上的結果

這裡僅僅是一些基於 bAbI 資料集的結果。注意,實際上 bAbI 資料集是訓練集。就像我之前給你展示的,給定其中的每一個故事,你會看到的是,訓練集實際上提供了一個提示,這涉及到實際故事中的什麼內容對回答問題是重要的。事實證明,導致這個問題非常困難的原因,不僅是你必須做出邏輯推理,你還必須意識到什麼東西是相關的。你會看到,這兩者之間是存在競爭的。bAbI 資料集的許多子任務或者子部分都達到了超過 95% 的準確率,這作為系統通過給定領域的基準測試。


神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機挑戰和建議

神經圖靈機可以做這些炫酷的事情:它們可以學會演算法,它們可以理解一個小故事的意思,但是為什麼我們不能一直用這些東西呢?嗯,它們的結構是如此地有趣,但也伴隨著一些問題。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

問題:

  • 架構依賴;

  • 大量的引數;

  • 並不能從 GPU 加速中受益;

  • 難以訓練

首先,一旦你指定了一般的架構,在實現它的時候仍然需要做出很多決策。例如,對於每一個給定的輸入或輸出單元,在給定的時間步長下你能夠讀取或者寫入多少向量?這些都很重要,它不僅僅是提高你的識別準確率的問題。如果你不能正確地做到這些,那它很有可能永遠都得不到一個合理的結果。引數的數量是極其大的,這會讓你的 RAM 壓力很大。這是機器學習中的一個重要部分,它們並不會受益於 GPU 加速,雖然正如我們所見,GPU 加速是機器學習中的重要一部分。原因是這是序列式的,很難並行化,因為它們當下所做的都是基於之前的輸入。很難將這些部分分解成容易的平行計算。它是很難訓練的,這一點和我剛才提到的所有問題都有所不同。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

 難以訓練:

  • 數值不穩定性;

  • 很難使用記憶(memory);

  • 需要很好的優化;

  • 實際中很難使用

它們往往具有很強的數值不穩定性。部分原因是實際中給它們設計的任務。因為它們是在學習演算法,所以它們往往不會犯小錯誤,它們傾向於犯大錯誤。如果你在演算法中犯了一個錯誤,那麼所有的輸出結果都會是不正確的。這意味著,當你訓練它們的時候,它們總是很難找到需要的演算法。如果餵給大量的資料,給予足夠的時間,大多數神經網路都會得到一些結果。而神經圖靈機經常會卡住。大家知道,它們經常一遍又一遍地一味地產生那些經常重複的值。這是因為使用記憶是很困難的。他們不僅必須學會記住以後解決問題所需要的東西,還必須記住不要意外地忘記它,這一層要求額外地增加了複雜性。因此,為了解決這個問題,你最終會用一些迴圈神經網路通用的巧妙的優化方法。但是為了讓這些方法起作用,你需要想盡一切辦法。所有的這些問題都讓神經圖靈機很難用在日常應用中。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

有很多應對數學不穩定性的方法。非常通用的一個方法就是梯度裁剪(gradient clipping),尤其是在使用 LSTM 的時候。梯度裁剪的本質就是,無論我們怎麼認為一個壞的結果由初始引數導致的,我們都要限制一下其改變的程度。這可以幫助我們避免在任何時候當我們得到壞結果的時候就去擦除一切引數。當機器犯錯時,我們不能完全丟掉已經學到的東西。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

損失裁剪本質上是梯度裁剪的擴充套件。相同的基本思想就是,神經圖靈機會非常遠離它們的目標。就像損失函式的總值一樣,給我們能夠改變的引數總和設定一個上限。我們經常結合這兩種方法。基本上,我們需要把很多有效果的更改繫結到一個有不同含義的引數上面。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

好了,實際上另一個有趣的方向是 Graves 的 RMSprop。RMSprop 實際上是常見的反向傳播演算法的一個擴充套件,這個大家可能比較熟悉。反向傳播是如今訓練所有的神經網路的關鍵。RMSprop 是一個用來平滑梯度的系統。所以,在有序的資料點中,本質上你所做的就是對任何給定引數的效果取一個平均值。Graves 的 RMSprop 實際上是這個方法的一個變體。它本質上是做一個執行估計的方差,而非僅僅取一個平均值。它標準化並且保證損失的極值在實際中不會衰減太多,或者不會把引數減小那麼多。這是一個非常聰明的方法,它也非常有趣,因為為了解決這個問題,人們不得不通讀 Alex Graves 的一些論文。如果你僅僅實現普通的 RMSprop,它往往效果不佳。所幸,還有一些可以替代的優化方法。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

說實在的,儘管為了找出哪一個方法能夠幫助你,你常常必須嘗試多個演算法,但是 Adam 優化器確實是一個常用的優化方法,並且它還支援瞭如今的大多數機器學習框架。像 Graves 的 RMSprop 方法一樣,它基本上也是平滑梯度。這個方法有些複雜,所以我不會在這裡討論它是如何起作用的。但是一般而言,它確實是一個不錯的備選方法。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

另一件值得注意的事就是值的初始化,尤其是記憶。一些人確實利用了由快速訓練神經圖靈機所帶來的記憶偏差。但是一般來說,這實際上是他們的架構有問題的特點。因為初始記憶會讓以後的計算產生很大的偏差,所以如果你以一組壞的引數開始的話,它可以徹底毀掉整個模型。就像很多其他這種技術一樣,它們有助於提升通用神經網路的效能。但是在這種情況下,如果你做得不正確,它很可能不會收斂,你將不會得到一個合理的結果,所以為了合理地優化,你必須頻繁地嘗試不同的引數值作為初始點。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

另外一個方法,也是比較有趣的,那就是 curriculum learning,就是在開始的時候喂一些簡單的資料。你從序列開始,讓它學習複製一些東西到某一長度,比如說 5。當它可以把這個做得很好時,你再將長度增加到 10,然後再某一點,你達到了新的長度,比如說 20,然後在某一點你相當自信你可以將模型泛化,就像我們之前看到的,將複製序列的長度增大到 100 或者更大。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

現在我要繼續討論最近的擴充套件。非常令人興奮,如果我沒有記錯的話,它是在幾個星期之前出現在 Nature 上的。它以一些有趣的方式擴充套件了神經圖靈機,並且幫助解決了一些問題。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

可微分神經計算機(參見機器之心文章《DeepMind 深度解讀 Nature 論文:可微神經計算機》)或者最近的一些模型本質上就是經過一些修改的神經圖靈機。從某種程度來說,它們放棄了基於索引移動的定址方式。我之前一直在講沿著記憶或者磁帶的移動。它們不再這樣做;它們嘗試基於它們看到的東西直接在記憶中搜尋給定的向量。它們還有分配記憶和釋放記憶的能力,如果你曾經使用過某種低水平的程式語言的話,你就會理解這個。以同樣的方式,很難跟蹤記憶區域中的內容,所以你不會在程式設計中犯錯誤,這樣很容易將記憶中的某個區域標記為禁止訪問,因此你不會在以後意外地刪除它們,這有助於優化。它們也有那種將序列輸入序列進行本地記憶地能力。當神經圖靈機學習複製的時候,它們學習將所有地輸入按順序寫進記憶,並回到記憶地開頭將它們讀出來這個過程。在這種情況下,從某種程度來說它們擁有了某種形式的時間記憶(temporal memory),在瞬時記憶中它們可以回想起它們所做的上一件事,上一件事的上一件事,以此類推,這意味著它們可以遍歷由它們需要做的事組成地一個連結串列。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

這是可微分神經計算機體系結構的總結。你們看到的左邊的圖表代表的是輸入和輸出變數的長度,然後讀頭和寫頭允許計算機在記憶區進行存取。這裡你可以看到它一次讀入整個向量並在第 6 區域寫入。就像我之前描述過的,記憶區域在右邊有一個附加的暫時連結。如果你追蹤這些箭頭,你會看到實際上這些箭頭就是模型能夠回想並重復它最近的輸入和輸出的方式。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

這裡我們看到的圖片展示的是可微分計算機也在執行復制的任務。你看到的綠色的方塊是它寫入記憶中的東西,紫色的方塊是它從記憶中讀出來的內容。通常,當你給它輸入一些序列的時候,如果你沿著左邊看的話,你所看到的正在發生的事是計算機正在釋放某些區域的記憶,因為它需要寫入東西,所以這是在分配記憶,底部的方塊顯示了這個活動。然後,當寫入完成之後,輸出。然後,它就會說,「做好了,我們可以重新分配這塊記憶了」。你就會得到這種交替的模式,「我需要這塊記憶。好了,我做好了。我需要這塊記憶......」可微分神經計算機確實學會了做這件事,這使事情變得更加容易,讓這些事情變得更加有趣。


神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機動態神經計算機在推理任務上的效能

我從為見過的讓計算機之間顯得有些不同的例子就是它們能夠做這種邏輯推理的事情,雖然是結合了某種模糊的推理。你在這裡看到的是一個家族樹(family tree),用這個家族樹去訓練模型,本質上,「Mary 是 Jodie 的女兒」,或者「Simon 是 Steve 的兒子」。那麼,你問計算機:「Freya 和 Fergus 是什麼關係?」或者「Freya 和 Fergus 是什麼關係?」答案是舅舅,所以它們確實是能夠回答這個問題的。如果你去讀這篇論文的話,你會發現一些有趣的例子,例如學會找最短路徑,橫穿倫敦地鐵系統的圖結構以及類似的東西,這些都是有趣的。我這裡沒有相關的幻燈片,但是如果你對它很感興趣,強烈建議你讀一下 Nature 上的這篇文章,連結如下:http://www.nature.com/nature/journal/v538/n7626/abs/nature20101.html

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

動態神經計算機在 bAbI 資料集上也有良好的表現。bAbI 資料集在過去一年左右有了很大的進步。實際上你會看到,除了少數幾個之外,大多數先進的模型都已經通過了 bAbI 資料集,而且做得相當好。你會看到,動態神經計算機(DNC)只在兩個領域沒有通過,其他的都通過了,而且還和可以 Facebook 的模型相媲美,Facebook 的模型被設計得非常好,因為這些資料集就是它們自己的資料集。這非常令人興奮,你可以說,只剩下不多的幾個領域需要攻克了,這是將神經網路的學習任務向前推進的一大步,而之前我們是沒有能力去觸及這些任務的。

神經圖靈機深度講解:從圖靈機基本概念到可微分神經計算機

謝謝大家。這裡有一些參考資料;我推薦 Theano、Lasagne 和 Go 的實現。我要推薦列表上的最後一篇文章,這是一種使用更少的記憶體使這些東西工作的方式,越來越接近在實際產品中應用神經圖靈機的要求。


原文連結:http://blog.talla.com/neural-turing-machines-perils-and-promise

相關文章