三:自適應計算時間
標準RNN在每個時間步驟執行相同的計算量。 這似乎太不直觀了。 舉個例子來說,人在思考更難的問題時是不是會動更多的腦筋?并且在每個時間步驟執行相同的計算量會限制RNN處理長度為n的列表時的時間復雜度為O(n)。
自適應計算時間[15]是一種讓RNN在每步執行不同計算量的方法。 總體來看,這個想法的主旨很簡單:允許RNN為每個時間步執行多個計算步驟。
為了讓網絡學習到需要執行多少個計算步驟,我們希望計算步驟的數量是可微的。 我們使用與之前相同的技巧來實現這一點:即不是直接去確定離散的計算步驟,而是建立一個在計算步驟數量上的注意力分布。 輸出是每個步驟輸出的加權求和。
四:神經元程序員
神經網絡在許多任務中都非常出色,但他們也很難做一些基礎的東西,比如算術題,這對普通的計算方法來說則微不足道。如果能將神經網絡與正常編程融合在一起,就兩全其美了。
神經元程序員 [16]是一個這樣的方法:它學習創建程序來解決任務。事實上,它不需要正確的程序的例子,就能學習生成正確的程序。它探索如何以編程為手段,去完成某項任務。
本文中的實際模型通過生成類似SQL的程序來查詢表格,以回答關于表格的問題。但是,這里有一些細節使得它有點復雜,所以我們首先想象一個稍微簡單的模型,給出一個算術表達式并生成一個程序來評估該表達式。
生成的程序是以一系列操作的形式存在的。每個操作基于過去操作的輸出進行操作。所以一個操作可能是類似于“把兩步之前的操作的輸出和一步之前的操作的輸出相加”這樣的操作。它更像是一個Unix管道,而不是一個分配和讀取變量的程序。
只要我們可以通過操作來定義導數,就可以根據概率分布來區分出程序的輸出。然后,我們就可以定義一個損失函數來訓練神經網絡,以產生可以獲得正確答案的程序。這樣,神經元程序員就不需要參照好的程序,也能學會編程。神經程序員只需要問題答案來監督它的學習。
這就是神經元程序員的核心思想。但這篇論文中的神經元程序員,編寫出的程序只能回答表格問題,而不能解算術題。還有一些不錯的技巧:
- 多類別:神經元程序員中的許多操作處理標量數以外的類型。一些操作輸出表格列或單元格的選擇。只有相同類型的輸出會合并在一起。
- 參考輸入:神經元程序員需要回答諸如“有多少城市人口超過100萬?”等問題。為了促進這一點,一些操作允許網絡在他們正在回答的問題中引用常量或列的名稱。這種引用發生在指針網絡的樣式中[17]。
神經元程序員不是神經網絡編程的唯一方法。另一個令人愉悅的方法是神經元程序員 - 解釋器[18],它可以完成一些非常有意思的任務,但需要以正確的程序進行監督。
我們認為,縮小傳統編程與神經網絡之間的差距是非常重要的。雖然神經元程序員不是最終的解決方案,但我們還是能從中學到很多。
代碼
光明前景
在某種意義上,有一張紙寫寫畫畫的人比沒有的人更聰明。使用數學符號的人可以解決缺乏數學符號時難以解決的問題。而計算機的使用使我們能夠獲得超乎尋常的卓越功績。
一般來說,似乎有很多有趣的智力形式是人類創造性的啟發式直覺,與一些像語言或方程這樣更為清晰謹慎的媒介之間的相互作用。有時,媒介以物質的形式存在,為我們存儲信息,阻止我們犯錯誤或繁復計算。在其他情況下,媒體是我們大腦里可操縱的模型。無論哪種方式,媒介對智能都很重要。
機器學習的最新研究也開始這么干了——把神經網絡的直覺和別的東西結合起來。一種方法可以稱為“啟發式搜索”,例如AlphaGo[19],既有一個玩圍棋的模型,它也探索在神經網絡直覺的指導下進行游戲。同樣,DeepMath[20]使用神經網絡作為處理數學表達式的“直覺”。我們在本文中提到的“增強型RNN”是另一種方法,將RNN連接到工程媒介,以擴展其通用功能。
與媒體互動,自然涉及到采取行動、觀察以及采取更多行動的序列。這產生了一個重大挑戰:怎樣讓機器學會采取行動?這聽起來像是一個強化學習的問題。基于強化學習的研究正在試圖解決這個問題的最難版本,不過其提出的解決方案難以實際使用。而注意力機制的奇妙之處在于,通過在部分上施加不同程度的注意力來運行所有的行動來解決問題。它有效,因為我們可以設計類似于NTM內存空間的媒介,來允許分數計算和可微。強化學習每次只走一條路,從中學習。而注意力機制則把路口的所有分叉,合而為一。
注意力機制的一個主要弱點是,每一步都要采取一次“行動”。這導致當你增加神經圖靈機中的內存量時,計算成本也會線性增加。對此,想象一下這樣的情景:先分散你的注意力,然后每次我們只需要訪問部分存儲空間。然而,如果你想讓注意力依賴于存儲內容,從而可以輕易的查看每個存儲空間,這仍然很有挑戰。我們已經看到了一些試圖攻克這個問題而做出的嘗試,比如[21],但似乎還有很多工作要做。如果我們真的能夠做出這樣的次線性時間的注意力工作,那將是非常強大的成果!