Keras作者、《Python深度學習》一書的作者 Francois Chollet 在自己的博客上公開了自己書中的內容,討論深度學習的未來:
鑒於我們對深度神經網絡的了解,包括它們的局限性,以及對當下研究圖景的掌握,我們是否能預測在短期內,深度學習將會走向何方?下面是一些純個人的思考。需要註明的是,我沒有水晶球,所以可能很多我的預測不會成為現實。這是一篇純推測的博客。我之所以在此分享這些預測,並不是因為我期望它在未來被證明是完全正確的,而是,在目前看來,它們非常有趣,而且是可行的。
在最上層,我認為有潛力的主要方向是:
更貼近通用計算機程序的模型,建立在比當下不同神經網絡層遠豐富得多的基元之上,這就是我們將如何得到推理和抽象,即當前模型的根本弱點。
能讓上述情況實現的新形式的學習——允許模型獲得更多的發展,而不僅僅局限在不同的轉移。
需要人類工程師更少幹涉的模型,無休止地調整控制旋鈕(knobs)不應該是你的工作。
對前期學習特征和架構系統性的再利用;基於可再利用和模塊化程序和子程序的元學習系統。
此外,需要說明的是,以上所舉並不特指監督式學習——這種學習方式目前是深度學習的基本業務,它們可以應用到任何形式的機器學習上,其中包括非監督學習、自監督學習、強化學習等等。你的標簽來自哪或者你的訓練環看起來是怎麽樣的在根本上也不重要。這些機器學習不同的分支只是同一結構的不同方面。
讓我們深入下去,模型即程序,在機器學習領域,我們可以期待的一個必要的轉變是:從只能做模式識別和獲得局部的泛化,到能夠執行抽象和推理的模型,這能獲得極端的泛化。當下,具有基本推理形式能力的AI程序都是由人類程序員硬編碼的:例如,依賴於搜索算法,圖形操作和形式邏輯的軟件。
例如,在DeepMind的AlphaGo程序中,其展示的絕大部分“智能”都是由專業的程序員設計和硬編碼完成的(比如,蒙特卡洛樹搜索)。從數據中進行學習僅僅發生在特定的從屬模塊中(價值網絡和策略網絡)。但是,未來,這樣的AI 系統或許可以進行完全的學習,不需要任何的人類參與。
要實現這一想法,都有哪些渠道?考慮一下一個廣為人知的神經網絡——RNN。重點是,RNN比前饋神經網絡(Feedforward Networks)的局限性要少得多。這是因為,RNN不僅僅是一個幾何變換。在一個循環內,RNN被重復應用的幾何變換。
時間循環本身由人類開發人員硬編碼:它是網絡的內置假設。當然,RNN在它們可以代表的方面仍然非常有限,主要是因為它們執行的每個步驟仍然只是一個可微的幾何變換,並且它們從一個步驟到另一步驟中傳遞信息的方式是通過連續幾何空間(狀態向量)中的點。現在,想象一下神經網絡將以類似於編程基元(例如for循環)的方式“增強”,但不僅僅是一個有硬編碼幾何存儲器的硬編碼for循環,而是一組大型的編程原語,讓模型可以自由地操縱以擴展其處理功能,例如分支,語句,變量創建,長期內存的磁盤存儲,排序運算符,高級數據結構(如列表,圖形和哈希表)等等。這樣一個網絡可以代表的程序的空間將遠大於當前深入學習模式所能表達的範圍,其中一些程序可以實現更高的泛化能力。
總而言之,我們將遠離一手掌握“硬編碼算法智能”(手工軟件),一只手“學習幾何智能”(深度學習)的方式。取而代之的是,我們將提供混合的正式算法模塊,它們能提供推理和抽象能力,同時,其中的幾何模型能提供非正式的直覺和模式識別能力。整個系統將能在不需要,或者少量人類參與的情況下進行學習。
我認為可能會獲得飛速發展的 AI 相關子領域是程序綜合(program synthesis),特別是神經網絡程序綜合。程序綜合在於通過使用搜索算法(可能是遺傳搜索,如遺傳編程)自動生成簡單的程序來探索大量的可能的程序。當找到符合所需規格的程序時,搜索就會停止,通常作為一組輸入 - 輸出對進行提供。正如你所看到的,它是否高度讓人聯想到機器學習:給出作為輸入 - 輸出對提供的“訓練數據”,我們找到一個將輸入與輸出進行匹配的“程序”,並將其推廣到新的輸入之中。不同之處在於,我們不用在硬編碼程序(神經網絡)中學習參數值,而是通過離散搜索過程生成源代碼。
我肯定期望這個子領域在未來幾年內會迎來新一波的熱潮。
特別是,我期望在深度學習和程序綜合之間出現一個交叉子域,在這裏我們不是用通用語言生成通用程序,而是用豐富的算法基元,如for循環等等生成神經網絡(幾何數據處理流)。
這應該比直接生成源代碼要容易得多,而且它會大大擴展機器學習可以解決的問題的範圍 - 我們可以自動生成給定適當的培訓數據的程序的空間——這是一種符號AI和幾何AI的混合。當代RNN可以被看作是這種混合算法幾何模型的史前祖先。
如果機器學習模型變得更像程序,那麽它們將幾乎不再是可微分的。當然,這些程序仍然會將連續的幾何圖層用作子程序,這些是可微分的,但是整個模型不會是這樣。因此,在一個固定的、硬編碼的網絡中,使用反向傳播來調整權重值,將不能成為未來訓練模型的首選方法, 至少不全部使用這一方法。
我們需要找到如何能有效地訓練不可微系統。目前的方法包括遺傳算法,“進化策略”,某些強化學習方法和ADMM(乘法器的交替方向法)。自然地,梯度下降不會受影響 - 梯度信息對於優化可微分參數函數將永遠是有用的。但是,比起僅僅使用可微分參數的函數,我們的模型肯定會變得越來越強大,因此它們的自動開發(“機器學習”中的“學習”)將不僅僅需要反向傳播。
此外,反向傳播是端到端的,這對於學習良好的鏈接變換是一件好事,但是,這種方法計算效率低下,因為它不能充分利用深層網絡的模塊化。為了使事情更有效率,有一個通用的配方:引入模塊化和層次結構。因此,我們可以通過引入具有一些同步機制的解耦訓練模塊,以分級方式組織,從而使反向傳播本身更有效率。 DeepMind最近在“合成梯度”方面的工作,反映了這一策略。我希望在不久的將來會有更多的這方面的工作。
人們可以想象這樣一個未來:模型從全局上看是不可微分的(但是會對可微分的部分做特征處理),這些模型會在訓練中得到成長,使用一個高效的搜索過程,而不用梯度。同時,可微分的部分將會通過利用梯度的優勢,得以更快地訓練,其方法是使用一些更有效率的反向傳播方法。
自動化的機器學習
未來, 模型架構將會通過機器自身的學習來獲得,而不是由工程師手寫編碼來設計。自動地學習架構將與更豐富的基元和類似程序的機器學習模型的使用共同發展。
目前,深度學習工程師的大部分工作就是用Python腳本清洗數據,然後對深層網絡的體系結構和超參數進行長時間的調優,以獲得一個可用的模型 ,甚至是獲得最先進的模型,如果工程師野心足夠大的話。毫無疑問,這不是一個最優的設置。AI 在這方面也可以提供幫助。不幸的是,數據清洗部分很難自動化,因為它通常需要專業領域知識,以及對工程師想要實現的工作有明確的高度的理解。然而,超參數調優是一個簡單的搜索過程,我們已經知道工程師在這種情況下需要實現什麽:它由被調整的網絡中的損失函數進行定義。設置基本的“AutoML”系統,來處理大部分的模型旋鈕已經是常見的做法。多年前,我甚至自己做了一個這樣的系統,贏得了Kaggle的比賽。
在最基本的層次上,這樣的系統將簡單地調整堆棧中的層數、它們的順序以及每一層中的單元或過濾器的數量。這通常是使用諸如Hyperopt一類的庫,我們在第7章(註意:使用Python深度學習)中討論過。但是我們也可以更有野心,嘗試從頭開始學習一個適當的架構,盡可能減少約束。這可以通過加強學習,例如遺傳算法來實現。
另一個重要的AutoML方向是與模型權重一起學習模型架構。因為每次嘗試一個稍微不同的架構時,都會從頭開始訓練一個新的模型,所以一個真正強大的AutoML系統將通過對訓練數據的反饋來調整模型的特征,同時管理體系結構,以消除所有計算冗余。這些方法已經開始出現,因為我正在寫類似的代碼。
當這種情況開始發生時,機器學習工程師的工作不會消失,相反,工程師將在價值創造鏈上走高。他們將開始更多地努力制定真正反映業務目標的復雜損失函數,並深入了解他們的模型如何影響其部署的數字生態系統——目前,只有最大的公司才會考慮這些問題。
終身學習(AGI)和反復利用模塊化子程序
如果模型變得更加復雜,並且建立在更加豐富的算法原語之上,那麽這種增加的復雜性將需要在任務之間有更高的重用,而不是每當有一個新任務或一個新的數據集時都需要從頭開始訓練一個新的模型。實際上,很多數據集是沒有包含足夠的信息來從頭開發新的復雜模型的,需要利用先前的數據集的信息。就像你每次打開一本新的書都不會從頭開始學習英語——這是不可能的。此外,由於當前的任務與先前的任務之間有很大的重疊,每個新任務都要從頭開始訓練模型是非常低效的。
此外,近年來出現的一個值得註意的觀察是,訓練同一個模型去同時做多個有松散關聯的任務,能產生一個在每項任務上都表現更好的模型。例如,訓練同一個神經機器翻譯模型去同時做英語-德語翻譯和法語-意大利語翻譯,將得到一個在每個語言對上都表現更好的模型。訓練一個圖像分類和圖像分割的模型,兩個任務共享同一個卷積base,得到一個在兩個任務上都表現更好的模型。等等。這是非常直觀的:在這些似乎沒有關聯的任務之間總是存在一些重疊的信息,因此,聯合模型相比僅針對一個特定任務訓練的模型能訪問更多有關各個任務的信息。
我們目前跨任務做類似模型重用的方式是利用執行常見功能的模型的預訓練權重,例如視覺特征提取。將來,我希望這一方法的通用性版本能夠變得常用:我們不僅利用先前學習的特征(子模型權重),還利用模型架構和訓練程序。隨著模型變得越來越像程序,我們將開始重用程序子例程(program subroutines),例如人類編程語言中的函數(function)和類(class)。
想想今天的軟件開發過程:一旦工程師解決了一個特定的問題(例如Python中的HTTP查詢),他們就將它封裝成一個抽象且可重用的庫。後來面臨類似問題的工程師可以簡單地搜索現有的庫,下載並在自己的項目中使用它們。以類似的方式,將來,元學習系統將能夠通過篩選高級可重用block的全局庫來組裝一個新的程序。當系統發現自己為幾個不同的任務開發類似的程序子例程時,如果出現一個“抽象的”可重用子例程版本,系統會將它存儲在全局庫中。這樣的過程將實現抽象的能力,這是實現“極端泛化”( extreme generalization)的必要組件:一個被發現在不同任務和域中有用的子例程可以說是“抽象化”問題解決的一些方面。“抽象”( abstraction)的定義與軟件工程中抽象的概念相似。這些子例程可以是幾何的(具有預訓練的表征的深度學習模塊)或算法的(更接近當代軟件工程師操作的庫)。
模型將更像程序,並且具有遠遠超出我們目前使用的輸入數據的連續幾何變換的能力。這些程序可以說是更接近於人類對周圍環境和自身的抽象思維模式,而且由於其豐富的算法性質,它們將具有更強的泛化能力。
尤其,模型將被混合起來提供正式推理,搜索和抽象功能的算法模塊,並提供具有非正式直覺和模式識別功能的幾何模塊。AlphaGo(一個需要大量人工軟件工程和人類決策的系統)提供了一個早期的例子,展示象征和幾何AI之間的混合的可能樣子。
它們將自動成長,而不是由人類工程師人工制作,使用存儲在可重復使用子程序的全局庫中的模塊化組件——這是通過在數千個先前任務和數據集上學習高性能模型演變而來的庫。由於常見的問題解決模式是通過元學習系統識別的,它們將變成可重用的子例程——非常像當代軟件工程中的函數和類——並被添加到全局庫中。這就實現了抽象的能力。
這個全局庫和相關的模型成長系統將能夠實現某種形式的類似人類的“極端泛化”:給出新的任務,新的情況,該系統將能夠組裝一個適合新任務的新的有效模型,而且使用的數據非常少。這要歸功於:1)豐富的類似程序的原始泛化得很好,2)豐富的類似任務的經驗。同樣的方式,人類可以學習使用非常少的時間學會玩一個很復雜的新視頻遊戲,因為他們有許多以前的遊戲的經驗,並且從以前的經驗得出的模型是抽象的和程序化(program-like)的,而不是一個基本的刺激-行動之間的映射。
因此,這種永久學習的模型成長系統可以被解釋為AGI——通用人工智能。但不用期待什麽奇點主義的機器人啟示錄將來臨:那完全是幻想,來源與對智能和技術的長期誤解。不過,本文不評論這一點。
已有 445 位網友參與,快來吐槽:
發表評論