- 原文地址:The future of deep learning
- 原文做者:Francois Chollet
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:Changkun Ou
- 校對者:MoutainOne, sunshine940326
這篇文章改編自個人書 Deep Learning with Python(Manning 出版社)第 9 章第 3 節(譯者注:「結論」一章最後一小節)。
它是討論當前深度學習的侷限性及其將來系列文章的第二篇。
你能夠在這裏閱讀第一篇:深度學習的侷限性。html
鑑於咱們已經瞭解深度神經網的工做原理、侷限性以及目前的研究現狀,那咱們可以預測它將來的趨勢嗎? 這裏給出一些純粹的我的想法。 注意,我並無預知將來的能力,因此我預測的不少東西可能並不會成爲現實。這是一個完徹底全的思考性文章。我與大家分享這些不是由於我但願它們在將來被證實徹底正確,而是由於它們在如今頗有意思而且可行。前端
從高處審視,我以爲比較有前途的主要方向有:python
此外,請注意,這些考慮並非特定於已經做爲深度學習基礎設施的有監督學習,而是適用於任何形式的機器學習,包括無監督、自監督及強化學習。你訓練數據標籤的來源或你的訓練循環怎麼樣其實並不重要,機器學習的這些不一樣的分支只是同一結構的不一樣面而已。react
就讓咱們來一探究竟吧。android
正如咱們在上一篇文章中指出的那樣,咱們能夠預計的是,機器學習領域開發的一個必要轉型就是:從使用模型自己進行純模式識別並僅能實現局部泛化當中脫離開來,轉爲可以進行抽象及推理的模型,從而實現極端泛化(extreme generalization)。目前的 AI 程序所具備的基本形式的推理能力均爲程序員們手動寫死的代碼,例如:依賴搜索算法、圖操做、形式邏輯的軟件;又好比 DeepMind 的 AlphaGo,大多數所謂的「智能」其實都是被專業程序員設計並寫死實現的(例如 Monte-Carlo 樹搜索);從數據中學習只發生在特殊的一些子模塊(價值網絡及策略網絡)中。可是,這樣的 AI 系統在將來可能會在沒有人爲參與的狀況下被充分學習。ios
什麼可使得這種狀況成爲可能呢?考慮一個衆所周知的網絡類型:RNN。很重要的一點就是,RNN 的侷限性遠小於前饋神經網絡。這是由於 RNN 不只僅只是一個簡單幾何變換,而是在 for 循環裏不斷重複的幾何變換。時間 for 循環自己由程序員寫死的,這是網絡自己的假設。固然,RNN 在它們可以表示的方面依然十分有限,主要緣由是它們執行的每一個步驟都是一個可微的幾何變換,而且它們每一步傳遞信息的方式是經過連續幾何空間中的點(狀態向量)。如今,想象神經網絡將以相似編程原語(例如 for 循環,但不只僅是一個單一的寫死的具備寫死的幾何記憶的 for 循環)的方式「加強」,具備一組大量的編程原語,使得模型可以自由的操縱而且擴充它的處理函數,例如 if 條件分支、while 循環語句、變量建立、長期記憶的磁盤存儲、排序運算符、諸如列表、圖、哈希表等的高級數據結構等等。這樣一個網絡能夠表示的程序的空間將遠大於當前深度學習模型所能表達的範圍,其中一些程序能夠實現更高的泛化能力。git
總而言之,咱們將遠離寫死的算法智能(手工軟件)和學會的幾何智能(深度學習),取而代之的是去提供混合推理和抽象能力的正式算法模塊和非正式直覺和模式識別功能的幾何模塊,使得不多甚至沒有人蔘與整個系統的學習。程序員
有一個相關的 AI 子領域我認爲可能會出現巨大突破,那就是程序合成(Program Synthesis),尤爲是神經程序合成(Neural Program Synthesis)。程序合成在於經過使用搜索算法(可能的遺傳搜索、遺傳編程)自動生成簡單的程序,從而探索可能程序的一個更大的空間。當找到符合要求的程序後,中止搜索,並做爲一組輸入輸入對來提供。正如你所看到的,這讓咱們高度聯想到機器學習:給定訓練數據做爲輸入輸出對,找到一個程序使其匹配輸入輸出對,並可以泛化新的輸入。不一樣之處在於,咱們不用去學習寫死程序(一個神經網路)的參數,而是經過離散的搜索過程來生成源代碼。github
我至關期待這個子領域能在將來的幾年裏掀起一股新浪潮。特別地,我指望深度學習和程序合成之間可以再出現一個交叉子領域,在這裏咱們再也不用通用語言來寫程序,而是生成經過豐富的算法原語集加強的神經網絡(幾何數據處理流),好比 for 循環等等。這會比直接生成源代碼要容易且有用得多,並且他會大大的擴展機器學習能夠解決問題的範圍 —— 咱們能夠自動生成給定適當訓練數據的程序空間。一個符號 AI 與幾何 AI 的混合。當代的 RNN 能夠看作是這種混合算法與幾何模型的鼻祖。算法
圖:一個依賴幾何原語(模式識別、直覺)和算法原語(推理、搜索、記憶)的學習程序。
若是機器學習模型變得更像程序,那麼它們將幾乎再也不是可微的 —— 固然,這些程序依然會將連續的幾何圖層做爲可微的子程序,可是整個模型卻不會這樣。所以,使用反向傳播來調整固定、寫死的網絡權重不能成爲將來訓練模型的首選方法 —— 至少不能是惟一的方法。咱們須要找出有效地訓練不可微系統的方法。目前的方法包括遺傳算法、「進化策略」、某些強化學習方法和 ADMM(乘子交替方向法)。天然地,梯度降低不會被淘汰 —— 由於梯度信息老是對優化可微參數的函數有用。可是,咱們的模型確定會變得愈來愈有野心,而不只僅只知足於可微參數的函數。所以它們的自動開發(「機器學習」中的「學習」)將須要的不只僅只普通的反向傳播。
此外,反向傳播是端到端的,這對於學習良好的鏈式變換(Chained Transformation)是一件好事,但它卻計算效率低下,由於它不能充分利用深度神經網絡的模塊化性質。 爲了使事情更有效率,有一個通用的方案:引入模塊化和層次結構。 所以,咱們能夠經過引入具備一些同步機制的解耦訓練模塊,以分級方式組織,從而使反向傳播自己更有效率。 DeepMind 最近在「合成梯度」(Synthetic Gradient) 方面的工做(譯者注:指這篇論文),反映了這一策略。 我但願在不久的未來會有更多的這方面的工做。
能夠想象這樣一個將來,那時人們能夠訓練全局不可微(但具備可微的部分)的模型,他們使用一個高效的搜索過程,而非利用梯度方法。但與此同時,可微的部分則經過使用的某些利用梯度優點從而更高效版本的反向傳播而訓練得更快。
在將來,模型架構也是學習的對象,而再也不由工程師手工搭建。學習架構將自動與使用更豐富的原語,以及相似程序的機器學習模型配合使用。
目前,深刻學習工程師的大部分工做就是用 Python 腳本清洗數據,而後對深度神經網絡的架構和超參數進行長時間的調優,最終得到一個有用的模型 —— 若是工程師有野心的話,甚至能夠說是當下最好的模型。無需多說,這並非一個最理想的設置,但 AI 其實也能夠幫忙。不幸的是,數據清洗的部分很難自動化,由於它一般須要對應的領域知識(Domain Knowledge),以及對工程師想要實現的工做有明確的高層理解。 然而,超參數調優其實只是一個簡單的搜索過程,咱們已經知道工程師在這種狀況下須要實現什麼:它由被調整網絡的損失函數所定義。 設置基本的「AutoML」系統已是一個常見的作法了,它負責大部分模型的參數調優。我甚至在幾年前就這麼幹了,還贏得過 Kaggle 的比賽。
在最基本的級別上,這樣的系統將簡單地調整(網絡)棧中的層數、它們的順序以及每一層中的單元或過濾器的數量。 這一般能夠由諸如 Hyperopt 的庫來完成,咱們在第 7 章中討論過(注:Deep Learning with Python)。可是咱們也能夠更加有野心,嘗試從頭開始學習一個適當的網絡架構,儘量少的約束。這能夠經過增強學習來實現,例如遺傳算法。
另外一個重要的 AutoML 方向是與模型權重一塊兒學習模型架構。由於每次嘗試一個稍微不一樣的架構都須要從新訓練模型是異常低效的,因此一個真正強大的 AutoML 系統將經過對訓練數據的反饋來調整模型的特徵,同時管理網絡架構,進而消除全部計算冗餘。這樣的方法已經開始出現,由於我正在寫這些東西。
當這種狀況開始發生時,機器學習工程師的工做並不會消失 —— 相反,工程師將在價值創造鏈上站的更高。他們將開始更多地努力制定真正反映業務目標的複雜損失函數,並更加深刻了解他們的模型如何影響其部署的數字生態系統(例如,消耗模型預測內容並生成模型訓練數據的用戶)—— 考慮那些目前只有大公司才能考慮的問題。
若是模型變得更加複雜,而且創建在更豐富的算法原語之上,那麼這種增長的複雜性將須要更高的任務之間的複用,而不是每當咱們有一個新的任務或一個新的數據集從頭開始訓練一個新的模型。實際上,不少數據集並無包含足夠的信息來從頭開發新的複雜模型,並且利用來自先前遇到的數據集的信息也是有必要的。 這就像你每次打開新書時都不會從頭開始學習英語 —— 這是不可能的。此外,因爲當前任務與之前遇到的任務之間的重疊很大,對每一個新任務重頭開始訓練模型的效率是很是低的。
此外,近年來反覆出現的一個值得注意的現象是,同一個模型同時進行多個鬆散鏈接任務的同時會產生一個更好的模型,而這個模型對每一個任務的結果都更好。例如,訓練相同的神經網絡機器翻譯模型來涵蓋「英語到德語」的翻譯和「法語到意大利語」的翻譯將得到對每一個語言間翻譯效果都更好的模型。與圖像分割模型聯合訓練圖像分類模型,並共享相同的卷積基,能獲得對於兩個任務更好的模型,等等。這是至關直觀的:在這些看似斷開鏈接的任務之間老是存在一些信息重疊。所以,聯合模型能夠得到比僅針對該特定任務訓練的模型更多的關於每一個獨立任務的信息。
你已經在第 5 章中看到,咱們目前是沿着跨任務複用模型的方式,利用預訓練的權重來執行常見函數的模型,如視覺特徵提取。在將來,我會指望出現這種更通常的版本:咱們不只將利用之前學習的特徵(子模型權重),還能夠利用模型架構和訓練過程。隨着模型愈來愈像程序,咱們將開始複用程序的子程序,就像編程語言中的函數和類那樣。
想一想今天的軟件開發過程:一旦工程師解決了一個特定的問題(例如 Python 中的 HTTP 查詢),他們將把它打包成一個抽象的和可複用的庫。將來面臨相似問題的工程師能夠簡單地搜索現有的庫,下載並在本身的項目中使用它們。相似的方式,未來的元學習系統將可以經過篩選全局庫中高度可複用塊來組裝新程序。當系統發現本身爲幾個不一樣的任務開發相似的程序子程序時,若是能夠產生一個「抽象的」子程序的可複用版本,就會將其存儲在全局庫中。這樣的過程將實現抽象的能力,這是實現「極端泛化」的必要組件:在不一樣任務和領域中被發現的有用的子程序能夠說是「抽象化」問題解決的一些方面。 「抽象」的定義與軟件工程中抽象的概念類似,這些子程序能夠是幾何(具備預先訓練表示的深度學習模塊)或算法(更靠近當代軟件工程師操縱的庫)。
圖: 元學習者可以使用可複用的(算法與幾何)原語快速開發特定任務的模型,從而實現「極端泛化」。
簡單來講,如下是我對機器學習的一些長期願景:
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃。