深度學習的局限性和未來
按:本文來自 Keras 作者 François Chollet,同時也是根據他撰寫的《Deeping Learning with Python》一書第 9 章第 2 節改編的
作者注:這篇文章的受眾是已經有深度學習經驗的人(例如讀過本書第 1 章至第 8 章的人)。 我們假設讀者已經具有一定知識儲備。
深度學習的幾何學視角
深度學習最令人驚訝之處就在于它十分簡單。十年前,沒有人指望由梯度下降方法訓練的簡單參數模型就可以在機器感知問題上獲得驚人的結果。現在,事實證明,你只需要一個有足夠多參數的模型,并且在足夠大的數據集上使用梯度下降進行訓練。正如 Feynman 曾經描述宇宙那樣,「它并不復雜,只是很多而已」。
在深度學習中,一切都是一個向量,即一切都是幾何空間中的一個點。模型輸入(可以是文本,圖像等)和目標首先被「矢量化」,即變成一些初始輸入矢量空間和目標矢量空間。深度學習模型中的每一層對通過它的數據進行簡單的幾何變換。同時,模型的層次鏈形成一個非常復雜的幾何變換,分解成一系列簡單的幾何變換。這種復雜的轉換嘗試將輸入空間一次一個點得映射到目標空間。這種轉換是通過層的權重進行參數化的,權重根據模型當前執行的情況進行迭代更新。這種幾何變換的一個關鍵特征是它必須是可微分的,這是為了使我們能夠通過梯度下降學習它的參數。直觀地說,這意味著從輸入到輸出的幾何變形必須平滑且連續——這是一個重要的約束條件。
這種復雜的幾何變換應用到輸入數據的整個過程可以用三維的形式進行可視化,將其想象成一個人試圖將揉成團的紙球恢復平整:皺巴巴的紙球是模型開始時的輸入數據的復本。人對紙球的每個操作相當于一層簡單幾何轉換的操作。完整的撫平(紙球)動作順序是整個模型的復雜轉換。深度學習模型是用于解開高維數據復雜流形的數學機器。
深度學習的神奇之處在于:將語義轉化為矢量,轉化為幾何空間,然后逐漸學習將一個空間映射到另一個空間的復雜幾何轉換。你需要的只是足夠高維數的空間,以便捕捉原始數據中全部的關系范圍。
深度學習的局限性
用這個簡單策略實現的應用程序空間幾乎是無限的。然而,現有的深度學習技術對于更多的應用程序完全無能為力——即使提供了大量的人工注釋數據。例如,你可以嘗試收集成千上萬甚至百萬的關于軟件產品特征的英文描述的數據集,由產品經理編寫,以及由工程師團隊開發的相應的源代碼來滿足這些要求。即使有了這些數據,你也無法訓練深入的學習模式去簡單地閱讀產品說明并生成適當的代碼庫。這只是其中的一個例子。一般來說,無論你投入多少數據,深度學習模型都無法實現任何需要推理的東西,如編程或科學方法的應用——長期規劃和類似算法的數據操作。即使使用深度神經網絡學習排序算法也是非常困難的。
這是因為深度學習模型僅僅是將一個向量空間映射到另一個向量空間的簡單連續幾何變換鏈。它可以做的全部就是將一個數據流形 X 映射到另一個流形 Y,假設存在從 X到 Y 的可學習連續變換的話,并且可以使用密集的 X:Y 采樣作為訓練數據。因此,盡管深度學習模型可以被解釋為一種程序,反過來說的話,大多數程序不能被表達為深度學習模型——對于大多數任務來說,要么沒有相應的實際大小的深度神經網絡來解決任務,或者存在這樣的神經網絡,但它可能無法學習,即相應的幾何變換可能太復雜,或者可能沒有合適的數據可用來學習它。
通過堆疊更多層并使用更多訓練數據來擴展當前的深度學習技術,只能在表面上緩解一些問題。它不能解決深度學習模型在他們可以表示的內容種類非常有限的基本問題,并且大多數被期望可學習的程序不能被表示為數據流形的連續幾何變形。
擬人化機器學習模型的風險
當代人工智能的一個非常現實的風險是人們誤解了深度學習模型的作用,并高估了他們的能力。人類思維的一個基本特征是我們的「心智理論」,我們傾向于將意向,信仰和知識投射到我們身邊的事物上。在我們的意識中,在巖石上畫一個笑臉石頭就突然變「快樂」了。應用于深度學習,這意味著當我們能夠「基本成功」的訓練模型以生成用于描述圖片的標題時,我們就會相信該模型能夠「理解」圖片的內容以及「理解」它所生成的字幕。然后,當訓練數據中出現的圖像類別輕微偏離時,我們會非常驚訝地發現模型開始生成完全荒謬的標題。
尤其是「對抗性樣本」值得強調,這些例子是一個深度學習網絡的輸入樣本,旨在誘騙模型對它們進行錯誤分類。你已經意識到,可以在輸入空間中進行梯度上升以生成最大化某個閉環過濾器激活的輸入,這是我們在第 5 章中介紹的過濾器可視化技術的基礎,以及第 8 章的 Deep Dream 算法。同樣,通過梯度上升,人們可以稍微修改圖像以最大化給定類的類別預測。通過拍攝一張熊貓的圖片并添加一個「長臂猿」梯度,我們可以得到一個神經網絡,將這只熊貓歸類為長臂猿。這證明了這些模型的脆弱性,以及它們的輸入——輸出映射與我們人類自身認知之間的深刻差異。
總之,深度學習模型并不理解他們的輸入,至少沒有人類意識上的理解。我們人類對圖像,聲音和語言的理解是基于我們作為人類的感覺運動體驗——正如地球上的生物所表現的一樣。機器學習模型無法獲得這些經驗,因此無法以與人類一致的視角來「理解」他們的輸入。 通過注釋大量的訓練樣例來訓練我們的模型,我們讓他們學習在特定數據集上,將數據映射到人類概念的幾何變換,但這個映射只是我們頭腦中原始模型的簡單概要,這是我們作為人類實體的體驗得來的——它就像鏡子里的一個模糊的形象。
作為一名機器學習實踐者,請始終注意這一點,永遠不要陷入這樣一個陷阱,即相信神經網絡理解他們所執行的任務——他們不會的,至少不會以對我們有意義的方式理解。不同于我們想教他們的任務,他們被訓練來執行更為狹窄的任務:僅僅將訓練集輸入逐點映射到訓練目標中。向他們展示任何偏離訓練數據的東西,他們將給出最荒謬的結果。
局部泛化與極限泛化
深度學習模型中從輸入到輸出的直接幾何變形,與人類思考和學習的方式之間幾乎是完全不同的。這不僅僅是人類從自身的經驗中學習而不是通過明確的訓練實例來學習的問題。除了學習過程不同之外,基本表征的性質也存在根本差異。
人類能做的遠遠不只是像深度神經網絡或昆蟲那樣把即時刺激映射成即時反應。人們維持著關于目前處境、關于他們自己和其他人的復雜抽象模型,并且可以使用這些模型來預測不同的可能發生的未來并執行長期規劃。他們能夠將已知的概念合并在一起,來表示他們以前從未經歷過的事物,例如描繪穿著牛仔褲的馬,或想象如果他們中了彩票就會做什么。這種處理假設的能力,擴展了我們的心智模型空間,使其遠遠超出我們可以直接體驗到的事物空間,總而言之,進行抽象和推理,可以說是人類認知的決定性特征。我稱之為「極限泛化」:這是一種在面對未經歷的情況時,使用很少的數據甚至根本沒有新的數據就能適應新情況的能力。
這與深度網絡所做的形成鮮明對比,我稱之為「局部泛化」:如果新輸入與訓練時看到的略有不同,則由深度網絡執行的從輸入到輸出的映射立馬失去意義。例如,來思考這樣一問題,想要學習使火箭在月球上著陸的合適的發射參數。如果你要使用深層網絡來完成這項任務,無論是使用監督學習還是增強學習進行訓練,你都需要用數千乃至數百萬次的發射試驗進行訓練,也就是說,你需要將模型置于密集的輸入采樣點空間,以便學習從輸入空間到輸出空間的可靠映射。
相比之下,人類可以利用他們的抽象能力來提出物理模型——火箭科學——并得出一個確切的解決方案,只需一次或幾次試驗即可獲得月球上的火箭的發射參數。同樣,如果你開發了一個控制人體的深度網絡,要它能夠在城市中安全地駕駛汽車并不被其他汽車撞,那么這個網絡將不得不「死亡」數千次在各種場景中,直到它可以推斷出汽車和危險并制定適當的回避措施。放到一個新的城市,網絡將不得不重新學習已知的大部分知識。另一方面,人類就不必通過死亡來學習安全的行為,這要歸功于他們對假設情境的抽象建模的能力。
局部泛化:模式識別級別的泛化能力; 極限泛化:由抽象和推理得到的泛化能力
總之,盡管我們在機器感知方面取得了進展,但我們離人類級別的 AI 還很遠:我們的模型只能執行局部泛化,要適應一種新場景必須與原始數據聯系的很緊密,而人類認知能夠極限泛化,快速適應全新的情況,或為長期的未來情況做出規劃。
引申
以下是您應該記住的內容:到目前為止,深度學習的唯一真正成功之處就是在給定大量人工注釋數據的情況下,使用連續幾何變換將空間 X 映射到空間 Y 的能力。做好這件事對于每個行業來說都是一件改變行業游戲規則的事兒,但它離人類級別的 AI 還有很長的路要走。
為了解除這些局限性并開始與人類大腦進行競爭,我們需要從簡單的輸入到輸出映射轉向推理和抽象。計算機程序可能是對各種情況和概念進行抽象建模的一個合適的基礎。我們之前書中已經說過,機器學習模型可以被定義為「可學習程序」;目前我們能學習的程序屬于所有可能程序中非常狹窄和特定子集。但是如果我們能夠以模塊化和可重用的方式學習任何程序呢?
鑒于我們所了解到的深度神經網絡的工作機制、局限性以及當前的研究狀況,我們是否可以預見到神經網絡在中期之內將如何發展呢?這里分享一些我的個人想法。請注意我并沒有能預測未來的水晶球,所以我所做的大部分預測可能都將失敗。這完全就是一篇預測性的帖子,我之所以分享這些推測并不是希望它們在不久的未來會被證明是正確的,而是因為這些預測在當前看來非常有趣而且具有實踐性的。
總的來說,我預見的幾個主要方向是:
- 與通用計算機程序更接近的模型,建立在比我們當前可微分層要豐富得多的基元之上——這也是我們如何令模型獲得推理和抽象的策略,而這一點也是當前模型的根本弱點。
- 使上述成為可能的新式學習策略——它可以使得模型擺脫當前的可微分變換。
- 需要更少的人類工程師參與的模型——無休止地調參不應該成為你工作的一部分。
- 對以前學習的特征和架構進行更大和更系統化的復用;基于可復用和模塊化子程序的元學習系統(Meta-learning systems)。
此外值得注意的是,我的這些思考并不是針對已經成為監督式學習主力的深度學習。恰恰相反,這些思考適用于任何形式的機器學習,包括無監督學習、自我監督學習和強化學習。你的標簽來自于哪里以及你的訓練循環是什么樣的,這些都不重要。這些機器學習的不同分支只是同一構造的不同方面。接下來讓我們開始深入探討。
模型即程序
正如我們在前一篇文章中所提到的,我們在機器學習領域可以預期的一個轉變發展是,從純粹模式識別并且只能實現局部泛化能力(Local generalization,見上篇)的模型,轉向能夠實現抽象和推理的模型,也就是可以達到終極的泛化能力。目前人工智能程序能夠進行的基本推理形式,都是由人類程序員硬編碼的:例如依靠搜索算法、圖形處理和形式邏輯的軟件。具體而言,比如在 DeepMind 的 AlphaGo 中,大部分的「智能」都是由專業程序員設計和硬編碼的(如蒙特卡洛樹搜索),從數據中學習只發生在專門的子模塊(價值網絡和策略網絡)。但是在將來,這樣的人工智能系統很可能會被完全學習,而不需要人工進行參與。
有什么辦法可以做到這一點?讓我們來考慮一個眾所周知的網絡類型:遞歸循環神經網絡(RNN)。重要的一點是,遞歸循環神經網絡比前饋網絡的限制來的少。這是因為遞歸循環神經網絡不僅僅是一種幾何變換:它們是在 for 循環內重復應用的幾何變換。時序 for 循環本身是由人類開發者硬編碼的:它是網絡的內置假設。自然地,遞歸神經網絡在它們可以表征的內容上依然非常有限,主要是因為它們執行的每一步仍然只是一個可微分的幾何變換,而它們從當前步到下一步傳送信息的方式是通過連續幾何空間(狀態向量)中的點。
現在,設想一下神經網絡將以類似的方式「編程」,比如 for 循環編程基元,但不僅僅是一個帶有硬編碼的幾何內存硬編碼 for 循環,而是一大組編程基元,然后模型可以自由操縱這些基元以擴展它們的處理功能,例如 if 分支、while 循環、變量創建、長期記憶的磁盤存儲、排序操作和高級數據結構(如列表、圖和散列表等)等等。這樣的網絡可以表征的程序空間將遠遠大于當前深度學習模型可以表征的空間,并且其中一些程序甚至可以取得優越的泛化能力。
總而言之,我們將遠離「硬編碼算法智能」(手工軟件),以及「學習幾何智能」(深度學習)。我們將擁有提供推理和抽象能力的形式化算法模塊,以及提供非正式直覺和模式識別功能的幾何模塊。整個系統只需要很少的人工參與即可完成學習。
我認為人工智能相關的一個子領域可能即將迎來春天,那就是程序合成(Program synthesis),特別是神經程序合成(Neural program synthesis)。程序合成包括通過使用搜索算法(比如在遺傳編程中可能是遺傳搜索)來自動生成簡單的程序,用以探索可能程序的巨大空間。當找到與需求(需求通常以一組輸入-輸出對進行提供)相匹配的程序時,搜索將停止。正如你所想的,它是否讓你想起了機器學習:給出輸入-輸出對作為「訓練數據」,我們找到一個將輸入映射到輸出的「程序」,并且能將它泛化到其它輸入。不同之處在于,我們不是在硬編碼程序(神經網絡)中學習參數值,而是通過離散搜索過程生成源代碼。
我一定會非常期待在接下來的幾年內這個子領域會再次迎來第二個春天。特別是,我期待在深度學習和程序合成之間出現一個交叉子領域,在該領域我們不會采用通用語言生成程序,而是增強了一套豐富的算法原語的生成神經網絡(幾何數據處理流),例如 for 循環等等。這應該比直接生成源代碼更加容易處理和有用,它將大大擴展機器學習可以解決的問題范圍——我們可以根據適當的訓練數據自動生成程序空間。符號 AI(Symbolic AI) 和幾何 AI(Geometric AI)的融合,當代遞歸神經網絡可以看做是這種混合算法幾何模型的開山鼻祖。
超越反向傳播和可微分層
如果機器學習模型變得更像是一段程序,那么它們將變得不再可微——當然這些程序仍然會將連續的幾何層作為子程序進行使用,這都是可微的,但是整個模型卻不會。因此,在固定的硬編碼網絡中使用反向傳播來調整權重值無法成為將來訓練模型的首選辦法——至少它無法像現在這樣獨占鰲頭。我們需要找出能有效訓練非微分系統的方法。目前的方法包括有遺傳算法、進化策略、某些強化學習方法和交替方向乘子法(Alternating direction method of multipliers, ADMM)。自然而然的,梯度下降法哪兒也不會去——梯度信息對于優化可微分參數函數總是有用的。但是我們的模型肯定會比單純的可微參數函數來的更加強大,因此它們的自主改善(「機器學習」中的「學習」)需要的將不僅僅是反向傳播。
此外,反向傳播是端到端的學習模式,這對于學習良好的鏈式轉換是一件好事情,但在計算效率上卻非常低效,因為它沒有充分利用深度神經網絡的模塊化特性。為了提高效率,有一個通用的策略:引入模塊化以及層次結構。所以我們可以通過引入分離的訓練模塊以及它們之間的一些同步機制,以分層的方式組織起來,從而使得反向傳播計算更加高效。DeepMind 近期的工作「合成梯度」在某種程度上反映出了這一策略。我預期不久的將來在這一塊將有更多的工作開展。
我們可以預見的一個未來就是,這些模型將變得全局不可微分(但將具有局部可微分性),然后通過有效的搜索過程而不是梯度策略進行訓練。另一方面,通過利用一些更高效版本的反向傳播以發揮梯度下降策略的最大優點,局部可微分區域將得到更快的訓練速度。
自動化機器學習
在將來,模型架構將能夠通過學習實現,而不是需要由工程師手工設置。并且自動化學習架構與使用更豐富的基元和程序式機器模型(Program-like machine learning models)將結合在一起。
目前深度學習工程師大部分工作都是使用 Python 腳本來處理數據,然后花費很多的時間來調整深度網絡的架構和超參數以獲得一個還過得去的模型——或者說甚至獲得一個性能最先進的模型,如果這個工程師是夠雄心勃勃的話。毋庸置疑,這樣的做法并非最佳的,但是此時深度學習技術依然可以發揮一定的效用。不過不幸的是,數據處理部分卻很難實現自動化,因為它通常需要領域知識以及對工程師想要的效果有非常清晰的高層次理解。然而,超參數調整是一個非常簡單的搜索過程,并且我們已經知道了工程師在這種情況下想要取得什么效果:它由正在被微調的網絡的損失函數定義。設置基本的「AutoML」系統已經很常見了,它將負責大部分模型的調整。我甚至在幾年前設置了自己的模型并贏得了 Kaggle 競賽。
在最基本的層面上,這樣的系統可以簡單地調整棧中堆疊的層數、順序以及每一層中的單元或者說濾波器的數量。這通常是通過類似于 Hyperopt 這樣的庫來完成的,我們在《Deep Learning with Python》的第 7 章中曾討論過這點。但我們的志向可以更加遠大,并嘗試從零開始學習適當的架構,然后盡可能減少限制條件。這可以通過強化學習或者遺傳算法來實現。
另一個重要的 AutoML 方向是與模型權重一起聯合學習模型架構。由于從頭開始訓練一個全新的架構,并且還要在每次嘗試中對架構進行微調是非常耗時和低效的,所以一個真正強大的 AutoML 系統可以在通過訓練數據反向調整模型特征的同時設法改進體系結構,從而消除所有的計算冗余。當我正在撰寫這些內容時,這些方法已經開始出現了。
當這種情況發生時,機器學習工程師的工作不會消失,恰恰相反,工程師將在價值創造鏈上走上高地。他們將開始投入更多精力來打造真正反映業務目標的復雜損失函數,并深入理解他們的模型如何影響他們所部署的數字生態系統(例如,負責消費模型預測結果以及產生模型訓練數據的用戶),而這些問題目前只有巨頭公司才有暇顧及。
終生學習和模塊化子程序復用
如果模型變得越來越復雜并且建立在更豐富的算法基元之上,那么這種增加的復雜度將需要在不同任務之間實現更好地復用性,而不是每當我們有了新任務或者新數據集之后還需要從頭開始訓練新模型。事實上,許多數據集都因為數據量不夠大而不足以支持從頭訓練新的復雜模型,并且需要利用來自先前數據集中的信息。就像你不需要在每次打開一本新書時都重新學習一遍英語一樣。此外,由于當前任務與以前遇到的任務之間可能存在大量的重疊,因此對每個新任務都從頭開始訓練模型的做法非常低效。
此外,近年來反復出現的一個顯著的觀測結果是,訓練相同的模型以同時執行幾個松散連接的任務,將產生一個對每個任務都更好的模型。例如,訓練相同的神經機器翻譯模型以覆蓋從英語到德語、法語到意大利語的翻譯,將得到一個比單獨訓練來得更好的模型。又比如與圖像分割模型一起訓練圖像分類模型,共享相同的卷積核,從而產生一個在兩項任務中都表現更好的模型,等等。這一點非常直觀:這些看起來似乎不相關的任務之間總是存在著信息重疊,因此聯合訓練模型比起只在某一特定任務上訓練的模型,可以獲取與每項單獨任務有關的大量信息。
我們目前沿著跨任務模型復用(Model reuse across tasks)的方向所做的工作就是,利用預訓練權重模型來處理常見任務,例如視覺特征提取。你將在第 5 章看到這一點。在將來,我希望這種泛化能力能實現更佳的普適性:我們不僅會復用以前學過的特征(子模型的權重值),還會復用模型架構和訓練過程。隨著模型變得越來越像程序,我們將開始重用程序子程序(Program subroutines),比如人類編程語言中的函數和類。
想想今天軟件開發的過程:一旦工程師解決了一個特定的問題(例如 Python 中的 HTTP 請求問題),他們會將其打包為一個抽象且可以重用的庫。這樣未來面臨類似問題的工程師可以通過簡單地搜索現有的庫,然后下載并在項目中使用它來解決問題。相類似地,在未來元學習(Meta-learning)系統將可以通過篩選高級可重用塊的全局庫來組裝全新的程序。
當系統發現自己為幾個不同任務開發了類似的程序子程序時,如果能夠具備「抽象」的能力,即子程序的可重用版本,然后就將其存儲到全局庫種。這樣的過程將實現抽象的能力,這是實現「終極泛化」的必要組成部分:在不同任務和領域發現有用的子程序可以被認為「抽象」了一些問題解決方案的某些方面。這里「抽象」的定義與軟件工程中的抽象概念相似。這些子程序可以是幾何的(具有預訓練表征的深度學習模塊)也可以是算法的(更接近當代軟件工程師使用的軟件庫)。
元學習器能夠使用可復用基元(算法和幾何)快速開發針對特定任務的模型,從而實現“極端泛化”。
總結:洞見未來
總而言之,這里是一些我對機器學習長期發展的洞見:
- 模型將更加像程序,并且將具有遠遠超出我們目前使用的輸入數據的連續幾何變換的能力。這些程序可以說更接近人類對周圍環境和自身抽象的心理模型,并且由于其豐富的算法性質,它們將具有更強的泛化能力。
- 特別是,模型將融合算法模塊和幾何模塊,算法模塊可以提供正式推理、搜索和抽象能力,而幾何模塊可以提供非正式的直覺和模式識別功能。AlphaGo(一個需要大量手動軟件工程和人為設計決策的系統)提供了一個早期的例子,它展示了當符號 AI 和幾何 AI 融合之后將是什么樣子。
- 通過使用存儲在可復用子程序全局庫(這是一個通過在數以萬計的以前的任務和數據集上學習的高性能模型演變而來的庫)中的模塊部件,它們將實現自動成長,而不是由人類工程師手工設定。由于元學習系統確定了常見的問題解決模式,它們將變成一個可復用的子程序——就像當代軟件工程中的函數和類一樣——并添加到全局庫中,從而實現了抽象能力。
- 這個全局庫和相關聯的模型成長系統(Model-growing system)將能夠在某種形式上實現類人的「極限泛化」:給定一個新任務、新情況,系統將能夠組裝一個適用于新任務的全新工作模型,而只需要很少的數據。這要歸功于 1) 豐富的具有強泛化能力的類程序基元(Program-like primitives);2) 具有相似任務的豐富經驗。就像人類可以花費很少的時間玩好一個全新復雜的視頻游戲一樣,因為他們有許多以前的游戲經驗,并且因為從以前經驗得出的模型是抽象和類程序的,而不是刺激和行為之間的基本映射。
- 因此,這種永久學習模型成長系統(Perpetually-learning model-growing system)可以被稱為通用人工智能(Artificial General Intelligence, AGI)。但是不要擔憂任何機器人啟示錄將會降臨:因為這單純只是一個幻想,它來自于人們對智能和技術的一系列深刻誤解。然而,對這方面的批評并不在本篇的討論范疇之內。