天天看點

[譯] 深度學習的未來

<b>本文講的是[譯] 深度學習的未來,</b>

<b></b>

它是讨論目前深度學習的局限性及其未來系列文章的第二篇。

鑒于我們已經了解深度神經網的工作原理、局限性以及目前的研究現狀,那我們能夠預測它未來的趨勢嗎? 這裡給出一些純粹的個人想法。 注意,我并沒有預知未來的能力,是以我預測的很多東西可能并不會成為現實。這是一個完完全全的思考性文章。我與你們分享這些不是因為我希望它們在未來被證明完全正确,而是因為它們在現在很有意思并且可行。

從高處審視,我覺得比較有前途的主要方向有:

建構于頂層豐富的原始資料之上而不是目前的可微層次的模型,将更加接近通用目的的計算機程式 —— 目前模型的根本弱點是我們将如何得到(資料的)推理 (reasoning)和抽象(abstraction)。

允許模型擺脫(每一步之間的)可微變換 (differentiable transformation) 限制的新學習模式使得實作上述模型成為可能(譯者注:神經網絡的每一步傳播本質上是一個可微的線性變換,借助神經元的激活函數産生了非線性)。

不需要人工調參的模型 —— 你的工作不應該是無休止地測試不同的參數。

更好地、系統地複用學過的特征和架構;基于可複用和子產品化子程式的元學習(meta-learning)系統(譯者注:元學習的動機是自動了解并應用什麼類型算法适合什麼樣類型的問題)。

此外,請注意,這些考慮并不是特定于已經作為深度學習基礎設施的有監督學習,而是适用于任何形式的機器學習,包括無監督、自監督及強化學習。你訓練資料标簽的來源或你的訓練循環怎麼樣其實并不重要,機器學習的這些不同的分支隻是同一結構的不同面而已。

就讓我們來一探究竟吧。

正如我們在上一篇文章中指出的那樣,我們可以預計的是,機器學習領域開發的一個必要轉型就是:從使用模型本身進行純模式識别并僅能實作局部泛化當中脫離開來,轉為能夠進行抽象及推理的模型,進而實作極端泛化(extreme generalization)。目前的 AI 程式所具有的基本形式的推理能力均為程式員們手動寫死的代碼,例如:依賴搜尋算法、圖操作、形式邏輯的軟體;又比如 DeepMind 的 AlphaGo,大多數所謂的「智能」其實都是被專業程式員設計并寫死實作的(例如 Monte-Carlo 樹搜尋);從資料中學習隻發生在特殊的一些子子產品(價值網絡及政策網絡)中。但是,這樣的 AI 系統在未來可能會在沒有人為參與的情況下被充分學習。

什麼可以使得這種情況成為可能呢?考慮一個衆所周知的網絡類型:RNN。很重要的一點就是,RNN 的局限性遠小于前饋神經網絡。這是因為 RNN 不僅僅隻是一個簡單幾何變換,而是在 for 循環裡不斷重複的幾何變換。時間 for 循環本身由程式員寫死的,這是網絡本身的假設。當然,RNN 在它們能夠表示的方面依然十分有限,主要原因是它們執行的每個步驟都是一個可微的幾何變換,并且它們每一步傳遞資訊的方式是通過連續幾何空間中的點(狀态向量)。現在,想象神經網絡将以類似程式設計原語(例如 for 循環,但不僅僅是一個單一的寫死的具有寫死的幾何記憶的 for 循環)的方式「增強」,具有一組大量的程式設計原語,使得模型能夠自由的操縱并且擴充它的處理函數,例如 if 條件分支、while 循環語句、變量建立、長期記憶的磁盤存儲、排序運算符、諸如清單、圖、哈希表等的進階資料結構等等。這樣一個網絡可以表示的程式的空間将遠大于目前深度學習模型所能表達的範圍,其中一些程式可以實作更高的泛化能力。

總而言之,我們将遠離寫死的算法智能(手工軟體)和學會的幾何智能(深度學習),取而代之的是去提供混合推理和抽象能力的正式算法子產品和非正式直覺和模式識别功能的幾何子產品,使得很少甚至沒有人參與整個系統的學習。

有一個相關的 AI 子領域我認為可能會出現巨大突破,那就是程式合成(Program Synthesis),尤其是神經程式合成(Neural Program Synthesis)。程式合成在于通過使用搜尋算法(可能的遺傳搜尋、遺傳程式設計)自動生成簡單的程式,進而探索可能程式的一個更大的空間。當找到符合要求的程式後,停止搜尋,并作為一組輸入輸入對來提供。正如你所看到的,這讓我們高度聯想到機器學習:給定訓練資料作為輸入輸出對,找到一個程式使其比對輸入輸出對,并能夠泛化新的輸入。不同之處在于,我們不用去學習寫死程式(一個神經網路)的參數,而是通過離散的搜尋過程來生成源代碼。

我相當期待這個子領域能在未來的幾年裡掀起一股新浪潮。特别地,我期望深度學習和程式合成之間能夠再出現一個交叉子領域,在這裡我們不再用通用語言來寫程式,而是生成通過豐富的算法原語集增強的神經網絡(幾何資料處理流),比如 for 循環等等。這會比直接生成源代碼要容易且有用得多,而且他會大大的擴充機器學習可以解決問題的範圍 —— 我們可以自動生成給定适當訓練資料的程式空間。一個符号 AI 與幾何 AI 的混合。當代的 RNN 可以看做是這種混合算法與幾何模型的鼻祖。

A learned program relying on both geometric (pattern recognition, intuition) and algorithmic (reasoning, search, memory) primitives.

圖:一個依賴幾何原語(模式識别、直覺)和算法原語(推理、搜尋、記憶)的學習程式。

如果機器學習模型變得更像程式,那麼它們将幾乎不再是可微的 —— 當然,這些程式依然會将連續的幾何圖層作為可微的子程式,但是整個模型卻不會這樣。是以,使用反向傳播來調整固定、寫死的網絡權重不能成為未來訓練模型的首選方法 —— 至少不能是唯一的方法。我們需要找出有效地訓練不可微系統的方法。目前的方法包括遺傳算法、「進化政策」、某些強化學習方法和 ADMM(乘子交替方向法)。自然地,梯度下降不會被淘汰 —— 因為梯度資訊總是對優化可微參數的函數有用。但是,我們的模型肯定會變得越來越有野心,而不僅僅隻滿足于可微參數的函數。是以它們的自動開發(「機器學習」中的「學習」)将需要的不僅僅隻普通的反向傳播。

可以想象這樣一個未來,那時人們可以訓練全局不可微(但具有可微的部分)的模型,他們使用一個高效的搜尋過程,而非利用梯度方法。但與此同時,可微的部分則通過使用的某些利用梯度優勢進而更高效版本的反向傳播而訓練得更快。

在未來,模型架構也是學習的對象,而不再由工程師手工搭建。學習架構将自動與使用更豐富的原語,以及類似程式的機器學習模型配合使用。

目前,深入學習工程師的大部分工作就是用 Python 腳本清洗資料,然後對深度神經網絡的架構和超參數進行長時間的調優,最終獲得一個有用的模型 —— 如果工程師有野心的話,甚至可以說是當下最好的模型。無需多說,這并不是一個最理想的設定,但 AI 其實也可以幫忙。不幸的是,資料清洗的部分很難自動化,因為它通常需要對應的領域知識(Domain Knowledge),以及對工程師想要實作的工作有明确的高層了解。 然而,超參數調優其實隻是一個簡單的搜尋過程,我們已經知道工程師在這種情況下需要實作什麼:它由被調整網絡的損失函數所定義。 設定基本的「AutoML」系統已經是一個常見的做法了,它負責大部分模型的參數調優。我甚至在幾年前就這麼幹了,還赢得過 Kaggle 的比賽。

另一個重要的 AutoML 方向是與模型權重一起學習模型架構。因為每次嘗試一個稍微不同的架構都需要重新訓練模型是異常低效的,是以一個真正強大的 AutoML 系統将通過對訓練資料的回報來調整模型的特征,同時管理網絡架構,進而消除所有計算備援。這樣的方法已經開始出現,因為我正在寫這些東西。

當這種情況開始發生時,機器學習工程師的工作并不會消失 —— 相反,工程師将在價值創造鍊上站的更高。他們将開始更多地努力制定真正反映業務目标的複雜損失函數,并更加深入了解他們的模型如何影響其部署的數字生态系統(例如,消耗模型預測内容并生成模型訓練資料的使用者)—— 考慮那些目前隻有大公司才能考慮的問題。

如果模型變得更加複雜,并且建立在更豐富的算法原語之上,那麼這種增加的複雜性将需要更高的任務之間的複用,而不是每當我們有一個新的任務或一個新的資料集從頭開始訓練一個新的模型。實際上,很多資料集并沒有包含足夠的資訊來從頭開發新的複雜模型,而且利用來自先前遇到的資料集的資訊也是有必要的。 這就像你每次打開新書時都不會從頭開始學習英語 —— 這是不可能的。此外,由于目前任務與以前遇到的任務之間的重疊很大,對每個新任務重頭開始訓練模型的效率是非常低的。

此外,近年來反複出現的一個值得注意的現象是,同一個模型同時進行多個松散連接配接任務的同時會産生一個更好的模型,而這個模型對每個任務的結果都更好。例如,訓練相同的神經網絡機器翻譯模型來涵蓋「英語到德語」的翻譯和「法語到意大利語」的翻譯将獲得對每個語言間翻譯效果都更好的模型。與圖像分割模型聯合訓練圖像分類模型,并共享相同的卷積基,能得到對于兩個任務更好的模型,等等。這是相當直覺的:在這些看似斷開連接配接的任務之間總是存在一些資訊重疊。是以,聯合模型可以獲得比僅針對該特定任務訓練的模型更多的關于每個獨立任務的資訊。

你已經在第 5 章中看到,我們目前是沿着跨任務複用模型的方式,利用預訓練的權重來執行常見函數的模型,如視覺特征提取。在未來,我會期望出現這種更一般的版本:我們不僅将利用以前學習的特征(子模型權重),還可以利用模型架構和訓練過程。随着模型越來越像程式,我們将開始複用程式的子程式,就像程式設計語言中的函數和類那樣。

想想今天的軟體開發過程:一旦工程師解決了一個特定的問題(例如 Python 中的 HTTP 查詢),他們将把它打包成一個抽象的和可複用的庫。未來面臨類似問題的工程師可以簡單地搜尋現有的庫,下載下傳并在自己的項目中使用它們。類似的方式,将來的元學習系統将能夠通過篩選全局庫中高度可複用塊來組裝新程式。當系統發現自己為幾個不同的任務開發類似的程式子程式時,如果可以産生一個「抽象的」子程式的可複用版本,就會将其存儲在全局庫中。這樣的過程将實作抽象的能力,這是實作「極端泛化」的必要元件:在不同任務和領域中被發現的有用的子程式可以說是「抽象化」問題解決的一些方面。 「抽象」的定義與軟體工程中抽象的概念相似,這些子程式可以是幾何(具有預先訓練表示的深度學習子產品)或算法(更靠近當代軟體工程師操縱的庫)。

A meta-learner capable of quickly developing task-specific models using reusable primitives (both algorithmic and geometric), thus achieving "extreme generalization".

圖: 元學習者能夠使用可複用的(算法與幾何)原語快速開發特定任務的模型,進而實作「極端泛化」。

簡單來說,以下是我對機器學習的一些長期願景:

模型将更像是程式,并且具有遠遠超出我們目前使用的輸入資料的連續幾何變換的能力。這些程式可以說是更接近于人類對周圍環境和自身的抽象思維模式,而且由于其豐富的算法性質,它們将具有更強的泛化能力。

環境及其自身,由于其豐富的算法性質,它們能夠獲得更強的泛化能力。

特别地,模型将混合提供正式推理、搜尋和抽象能力的算法子產品,和提供非正式的直覺和模式識别功能的幾何子產品。AlphaGo(一個需要大量手動軟體工程和人造設計決策的系統)提供了一個早期的範例,說明了符号與幾何 AI 之間進行混合可能的樣子。

它們将不再由人類工程師手工打造,自動成長并使用存儲在可複用子程式的全局庫中的子產品化部件(通過在數千個前有任務和資料集上學習過的高性能模型而演變出現的庫)。由于常見的問題解決模式是通過元學習系統來識别的,它們将變成可複用的子程式并被添加到全局庫中,像極了當代軟體工程中的函數和類,進而實作了抽象的能力。

這個全局庫和相關的模式增長系統将能夠實作某種形式的人類「極端泛化」:給定一個新的任務、一個新的情況,該系統将能夠使用非常少的資料組裝适合于任務的新的有效模型。這歸功于:第一,可以像原語一樣使用,豐富且泛化良好的程式(包);第二,豐富的類似任務的經驗。同樣地,人類也可以用很少的遊戲時間來學習複雜的新遊戲,因為他們有許多以前的遊戲的經驗,并且從以前的經驗得出的模型是抽象的和類似程式的,而不是刺激和行動之間的基本映射。

就此來看,這種永恒學習的模型成長系統可以被解釋為人造通用智能(AGI, Artificial General Intelligence)。但請不要指望任何奇點主義的(Singularitarian)機器人災難發生:那是純粹的幻想,是來自一系列長期對智能和技術的深刻誤解。然而,這個批評不在本文讨論的範圍之内(譯者注:奇點主義是指采取有益于人類、避免導緻超越人類智慧的人造智慧出現的行動)。

<b>原文釋出時間為:2017年7月26日</b>

<b>本文來自雲栖社群合作夥伴掘金,了解相關資訊可以關注掘金網站。</b>