search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

DeepMind 開源內部深度學習框架 Sonnet,研究通過梯度下降學習

新智元編譯

編譯:賈岳鵬 熊笑

【新智元導讀】DeepMind 今天開源了最新的深度學習框架 Sonnet。Sonnet 被專門設計用於與 TensorFlow 協同工作,能夠更方便、直接地構建複雜神經網路模型。Sonnet 開源可以使 DeepMind 創建的其他模型輕鬆地與社區共享。Sonnet 將定期更新。

DeepMind 決定把整個研究架構轉為使用 TensorFlow(TF)已經快一年了。這被證明是一個不錯的選擇——我們的許多模型學習速度明顯更快,內置的分散式訓練功能極大地簡化了我們的代碼。

我們發現TF 的靈活性和適應性適合於為特定目的構建更高級別的框架,並且我們已經寫了一個這樣的框架,可以用 TF 快速構建神經網路模塊。我們正在積極開發這個代碼庫,但是迄今為止它是如此契合我們的研究需求,所以我們興奮地宣布,今天我們要將這一框架開源。我們把它稱為 Sonnet 框架。

自2015 年11 月首次發布以來,更高級別庫的多樣化生態系統在 TensorFlow 周圍不斷湧現,使得一般性任務能夠更快實現。Sonnet 與其中一些現有的神經網路庫具有許多相似之處,但同時具有一些為我們的研究要求專門設計的特性。在此前的 Learning to learn paper(詳見下文)中,我們用了一些代碼,其中就包括了 Sonnet 的初步版本,其他即將發布的代碼版本將建立在我們今天發布的完整庫中。

開源 Sonnet,可以使 DeepMind 創建的其他模型輕鬆地與社區共享,我們同時希望社區能夠使用 Sonnet 進行自己的研究。近幾個月來,我們還開源了我們的 DeepMind Lab 旗艦平台,目前正在與 Blizzard 合作開發支持星際爭霸II 中 AI 研究的開源 API。將來還會推出更多的版本,它們都將在我們的新的開源頁面上共享。

該庫使用面向對象的方法,類似於 Torch / NN,允許定義了一些計算前傳的模塊的創建。模塊被一些 Tensor 輸入「調用」,為 Graph 添加操作並返回 Tensor 輸出。其中一個設計選擇是確保通過在後續調用同一模塊時自動重用變數來透明地處理變數共享。

文中的許多模型當然會很自然地被視為層次結構,例如:可微分神經計算機包含可能是LSTM 的控制器,可被當做包含一個標準線性層植入。我們發現,編寫詳盡表述子模塊的代碼可以實現代碼的更易重複使用及更快應用於實驗 – Sonnet 提倡編寫可以在內部同時表述其他子模塊的模塊或者在構建過程中可被其他模塊傳遞的模塊。

我們發現非常有用的最後一個技術是讓特定模塊在任意嵌套的 Tensor 組中進行操作。 通常一組可微分神經計算機可以對可微分神經計算的狀態進行最佳表述, 而以平行列表的方式表述是容易出錯的。Sonnet 提供實用程序來應對這些任意層次結構,以便將實驗更改為使用不同類型的 RNN 不需要繁瑣的代碼更改。我們也已經對核心 TF 進行了更改以更好地支持這種使用案例。

Sonnet 被專門設計用於與 TensorFlow 協同工作,因此不會阻止訪問底層細節,如 Tensors 和可變範圍等。Sonnet 編寫的模型可以與原始的 TF 代碼以及其他高級庫中的模型自由混合。

這不是一次性發布 - 我們將定期更新 Github repository 以與我們的內部版本吻合。我們對很多新功能還有很多想法,這些功能將在準備就緒時提供。我們對來自社區的貢獻感到非常興奮。要了解更多關於 Sonnet 的信息,請訪問我們的 GitHub repository。

GitHub 庫:https://www.github.com/deepmind/sonnet

再來一個新的 TF 庫意義何在?

在 Sonnet 的Github頁面,研究人員給出了一些常見問題的回答,從中我們能更好的了解 DeepMind 構建並開源 Sonnet 的初心,以及如何更好地利用這個工具。

問:為什麼又搞了個 TF 庫出來?

答:現有的 TF 庫對於 DeepMind 來說使用起來非常不靈活,因為我們有大量的使用案例是需要做權重共享的(weight sharing)。現在,所有的東西用 tf.make_template,從一開始就能支持權重共享,由此帶來的好處顯而易見是超出開發成本的。不僅如此,將配置與連接分離開來的 paradigm 也更方便模塊組合。

問:在同一個build的後續調用中可以訪問不同的變數嗎?

答:不行。tf.make_template 不允許這樣做,它會把後續調用中訪問不同的變數當成錯誤。

問:如果錯誤地把兩個模塊做了同樣的命名會怎麼樣?

答:似乎以相同名稱構造的模塊將具有不同的名稱和可變 scope。在內部,Sonnet 使用tf.make_template,它基本上是與一些 tf.VariableScope 一起包裝了一個python函數,來確保對該函數的每次調用都發生在同一個 scope 內,並且第一個調用之後的所有調用都設置為重用變數。模板的一個特點是,如果已經在同一 scope 內輸入了任何名稱,它將使其唯一化。例如:

問:我必須給我的模塊命名嗎?

答:不。模塊有默認名,應該是snake_case中的class name,如果必要的話,它也會被用作唯一化的名稱(見上)。然而,我們推薦大家為模塊起一個包含變數的名稱,因為這一名稱也會成為內部 scope 的名稱,由此也定義了變數的名稱。大多數模塊的名稱帶有「w」(weights)和「b」(bias),來顯示內部權重。大家都喜歡這麼命名:

你選的名稱會出現在 TensorBoard 中。

問:我怎麼知道一個模塊 declare 了什麼變數?

答:你可以對一個模塊用 get_variables 的方法,來查詢 scope 內的所有變數。注意如果模塊沒有連到 graph 上,就會顯示錯誤,因為變數此時不存在,所以相關的 scope 是空的。

問:Sonnet中的所有內容都應該作為模塊實現嗎?

答:不,不創建tf.Variables並且不存儲內部配置的計算可以在常規TF Op樣式中實現,即接收輸入張量,關鍵字參數和返回張量輸出的python函數。

如果一個op要創建變數(即在內部的任何地方調用tf.get_variable,包括間接的)它必須被作為snt.AbstractModule的一個子類,這樣才能正確地處理變數共享。

需要注意,如果一個計算沒有創建任何變數,可能仍然需要使用一個Module而不是Op來實現它。

除了可變共享之外,在我們希望將配置參數附加到操作系統的情況下,使用Sonnet模塊可以很方便。一個例子是[content addressing](可微分神經計算機中的模塊),這些模塊接收多個配置參數(內存中的每個單詞的大小,讀寫頭的數量),這些輸入的一些功能定義了有效輸入。我們在這個模塊之前使用正確輸出大小的snt.Linear來提供正確的維度。由於是一個模塊,實現起來很容易——在構建時提供configuration,然後提供一個method.param_size,它給出所需輸入的維數。然後我們就能得到正確的輸入張量大小並進行連接。

如果上面的操作是作為op cosine_weights(memory, cos_params, word_size, num_heads) 實現的,那麼指示cos_params所需大小的邏輯必須存儲在一個單獨的函數中。將相關功能封裝到一個模塊中會讓代碼更清晰。

問:可以將其與其他高級TF API(如TF Slim)混合使用嗎?

答:Sonnet模塊一旦構建出來,就遵循Tensor-In-Tensor-Out的原理,因此可以與TF-Slim等的功能混合。不過需要注意的是,這可能會導致意外行為的發生——TF-Slim控制共享是通過傳遞明確的scope =和 reuse = kwargs到層函數中——如果在Sonnet模塊的_build方法中使用TF-Slim層,多次調用的話就不太可能正常工作。

問:使用Sonnet與其他庫與原始TF的開銷(overhead)是多少?

答:沒有。只有在構造計算圖時才會涉及Sonnet。一旦你到了使用Session.run的階段,只需執行Ops就行了,不用考慮將該圖合在一起用了什麼庫。

Hacker News 評論:窺見 DeepMind 內部研究

獲得了最高支持的 HN 用戶 gcr 評論稱:

作為機器學習環境來說,TensorFlow 非常複雜,不同的研究小組必須定義自己的最佳 practice。使用 TF 就像學 C ++一樣,每個人都學習一個稍微不同的,相互不相容的,但是廣泛重疊的語言子集。

Sonnet 開源后,我們看到了DeepMind的專用工具(雖然只有一點點),以及他們在工作中使用的操作的參考實現。

對於那些想要搞透 DeepMind 工作的研究院人來說,這次開源非常有用。

不過,Sonnet 並不是徹底全新的神經網路庫。目前還沒有人宣稱這次發布帶來了什麼範式上的改變,作為業內人還是很欣慰的。

研究論文:通過梯度下降學習通過梯度下降學習

下面就是文章在一開始提到的「Learning to learn paper」。這篇論文2016年底上傳到arXiv,當時論文中使用的一些代碼就包括了 Sonnet 的初步版本。

今天,DeepMind 已經更完整的代碼放在了Github上面。

這篇文章的題目非常有意思,叫做《通過梯度下降學習通過梯度下降學習》,將優化演算法作為學習問題,讓演算法學會自動探索需要的結構。作者包括牛津大學教授、DeepMind 研究員 Nando de Feritas。

摘要

在機器學習里,從手工設計的特徵到機器學習的特徵這個過程已經非常成功了。但是,優化演算法仍然是手工設計的。在本文中,我們展示了如何將優化演算法的設計轉化為學習問題,讓演算法學會自動探索需要的結構。最終學出來的演算法(由 LSTM 實施),在訓練過的任務上表現超越了通用的手工設計的演算法,並且在具有相似結構的新的任務中表現也很好(泛化能力很高)。我們在許多任務測試了這種新的演算法,包括簡單的凸問題、訓練神經網路和用神經藝術對圖像增加風格(styling images with neural art)。

原文地址:https://deepmind.com/blog/open-sourcing-sonnet/?from=groupmessage&isappinstalled=1

3月27日,新智元開源·生態AI技術峰會暨新智元2017創業大賽頒獎盛典隆重召開,包括「BAT」在內的主流 AI 公司、600多名行業精英齊聚,共同為2017人工智慧的發展畫上了濃墨重彩的一筆。

訪問以下鏈接,回顧大會盛況:



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦