【新智元導讀】在Yann LeCun「深度學習已死」的驚人發言下,可微分編程的概念引發了廣泛關注。機器學習著名博主colah(Christopher Olah)在2015年展望30年後的深度學習,提到了可微分編程。他從深度學習三大觀點之一的表示(representation)角度出發,認為深度學習研究的是優化和函數編程之間的聯繫,而可微分編程則是函數編程和優化的自然交集,十分優雅而簡潔,值得進一步研究。
目前,深度學習是一個非常成功的工具。但這個工具是我們偶然發現的,作為一個領域,還沒有統一的看法或共同的理解。事實上,這個領域還存在幾種相互競爭的表述!
我認為在30年後回過頭看,我們將看到很不一樣的深度學習。
30年後的深度學習:神經科學觀點、概率統計觀點和表徵觀點,誰會勝出?
如果我們認為30年後,我們可能會以一種非常不同的方式看待深度學習,那麼這就提出了一個有趣的問題:
到那時,我們將如何看待深度學習?
當然,沒有人能真正知道我們將來如何理解這個領域。但有趣的是,我們現在可以做一些推測。
目前,有三種表述正在相互競爭,打算成為我們理解深度學習的關鍵。有借鑑生物學原理的神經科學的表述。有以數據轉換和自然流形假設為中心的表示(representation)的表述。最後,還有一種概率性的表述,把神經網絡解釋為隱藏變量(latent variables)。這些表述並不是相互排斥的,但是它們對深度學習的思考方式卻有著很大的不同。
而這篇文章將把表示的表述延伸到一個新的答案:深度學習研究的是優化和函數編程之間的聯繫。
從這個角度看,深度學習中對表示的表述,對應於函數編程中的類型理論(type theory)。這個理論認為,深度學習處在我們已知的兩個領域的交匯處,這兩個領域都已經有了很多的研究,它們是如此美麗,如此自然,我心中的數學家幾乎可以相信,這就是對現實的根本描述。
這是一個推斷性的想法。我並不是說這就是真的,而是想提出,這是可信的,完全可以想像深度學習正朝著這個方向發展。需要指出:我主要是在進行美學上的論證,而不是事實論證。我想表明,這是一個自然而優雅的想法,它涵蓋了我們目前所說的深度學習。
優化與函數複合
深度學習的獨特之處是它研究的是深度神經網絡——多層神經網絡。在多層的進程中,模型逐漸彎曲數據,將其彎曲成易於解決給定任務的形式。
這些層的細節每隔一段時間就會改變一次。保持不變的是有一個序列的層。
每一層都是一個函數,作用於前一層的輸出。整體而言,這個網絡是一個複合函數鏈(a chain of composed functions)。這個複合函數鏈經過優化以執行任務。
我所知道的所有深度學習模型都涉及優化複合函數。我認為這是當前的研究的核心。
表示即整數
在每一層,神經網絡都將數據轉換成另一種形式,以使任務更容易達成。我們稱這些轉換後的數據為「表示」(representation)。
表示(representations)與整數(types)是相對應的。
計算機科學中的整數(type)是一種基礎數據類型,指以n 比特嵌入某種數據的方式。類似地,深度學習中表示(representation)是指將數據流形嵌入n維的一種方式。
正如兩個函數只有在它們的type一致的情況下才能複合在一起一樣,兩個layer也只有在它們的representation一致時才能組合。在錯誤的representation中的數據對於神經網絡來說是無意義的。在訓練過程中,相鄰的層會協商它們將要傳遞的representation,網絡的性能取決於網絡所期望的representation中的數據。
f層後面跟著一個f。f的輸出表示是f的輸入。
在神經網絡架構非常簡單的情況下,只有線性序列的層。一層輸出的表示需要與下一層輸入的表示相匹配。
但是許多神經網絡具有更複雜的結構。舉一個非常簡單的例子,讓我們來想像一個具有多種類似輸入的神經網絡,它執行多個相關的任務。它也許需要RGB圖像和灰度圖像作為輸入。也許是以人的照片作為輸入,然後試圖預測照片中人的年齡和性別。由於輸入類型和任務類型相似,因此最好在一個模型中完成所有這些任務,這樣訓練數據就可以發揮作用。其結果是多個輸入層映射到一個representation中,並且多個輸出由相同的representation映射。
也許這個例子過於人為設計,但是將不同類型的數據映射成相同的表示可能會達成一些了不起的成果。例如,通過將來自兩種語言的單詞映射成一種表示,我們可以找到翻譯的對應單詞,而這些詞是開始時不知道的。通過將圖像和單詞映射到相同的表示中,我們可以將圖像分類為計算機從未見過的類!
表示和整數可以分別作為深度學習和函數式編程的基本構建塊。深度學習的主要描述,即流形(manifold)和表示(representation),其中心是神經網絡講數據彎曲成新的表示。幾何學,邏輯學,拓撲學和函數式編程之間已知的聯繫表明,表示和整數之間的聯繫可能具有根本性意義。
深度學習和函數編程:RNN、CNN等模型與函數的驚人對應
現代神經網絡背後的一個重要見解是,一個神經元的許多副本都可以在神經網絡中使用。
在編程中,函數的抽象是關鍵。我們可以寫一次代碼,然後根據需要使用它,省去了重複編碼的過程。這不僅大大減少了我們需要編寫和維護的代碼量,加快了開發過程,還降低了引入錯誤的風險,並使我們所犯的錯誤更容易被發現。
在神經網絡中,在不同地方使用同一個神經元的多個副本,實際上就相當於在程序中多次調用函數。由於需要學習的內容較少,模型學習速度更快,也能學習到更好的模型。這種技術也叫做「權重綁定」(weight tying),對我們最近從深度學習中看到的優秀表現至關重要。
當然,不能隨便把神經元的副本放得到處都是。為了讓模型有用,你需要有使用的原則,利用數據中的某些結構。在實踐中,有一些被廣泛使用的模型,比如循環層和卷積層。
這些神經網絡模式只是高階函數,也就是把函數作為參數的函數。類似的情況已經在函數編程中得到了廣泛的研究。實際上,很多這些網絡模型都與常見的函數相對應,比如fold函數。唯一不同的是,它們不接收正常的函數作為對象,而是接收神經網絡模塊。
編碼循環神經網絡(RNN)就是fold函數。RNN常被用來接受長度可變的列表,比如將句子作為輸入。
fold函數 = 編碼RNN
生成循環神經網絡就是unfold函數。生成RNN常用來讓神經網絡產生一個輸出列表,比如一個句子中的單詞。
unfold函數 = 生成RNN
生成RNN也是在做累積映射(Accumulating Map)。當我們要按順序進行預測時,常會用到它們。例如,在語音識別中,我們可能希望基於過去的上下文,預測音頻片段中每個時間步長的現象。
累積映射 = RNN
雙向RNN是一個比較晦澀的變體,我這裡就提一下。在函數編程術語中,它們是像拉鏈那樣,錯位結合在一起的一左一右兩個累加映射,用來對過去和未來的情況進行序列預測。
錯位結合左右累加映射=雙向RNN
卷積神經網絡(CNN)是映射的變體。普通的映射將函數應用於每個元素。卷積神經網絡也考慮鄰近元素,將函數應用於每個元素周圍的小窗口。
窗口映射=卷積層
在二維卷積神經網絡中,這種情況特別顯著。
二維卷積網絡
遞歸神經網絡(「TreeNets」)是fold函數的泛化。它們從下到上處理數據結構,主要用於自然語言處理,讓神經網絡在解析樹上進行運算。
Catamorphism = TreeNet
上面的例子說明了神經網絡中常見的模型非常自然地對應簡單的函數程序。
一種全新的編程,可微分編程:函數編程和優化的自然交集
這些模式(pattern)都是可以組合在一起,構建更大網絡的模塊。就像基本的構建模塊一樣,這些組合都是函數程序,其中包含大量的神經網絡。函數程序提供高層次的結構,而其中的構建塊就是靈活的部分,能夠學習在函數程序提供的框架內執行實際的任務。
Sutskever等人(2014)通過將編碼器RNN和生成器RNN組合到一起,執行將英語翻譯為法語的任務。在函數編程術語中,它們基本上就是fold英語句子,然後unfold生成法語翻譯。
Vinyals等人(2014)用卷積網絡和生成器RNN生成圖說。本質上,這個系統用卷積網絡處理輸入的圖像,然後unfold結果向量,生成一個描述圖像的句子。
這些模型都視為一種新的、可微分的函數編程。
你寫一個非常粗糙的函數程序,由靈活、可學習的模塊組成,你同時定義程序正確的行為,並給它大量的數據。然後你應用梯度下降或者其他一些優化算法。最終的結果是,你得到了一個厲害的系統,我們不知道如何直接構建這個系統,但是它能生成圖說、分類圖片。
這就是函數編程和優化的自然交集,我認為它十分優美。
結語
我覺得這個想法真的很美。同時,這也是一篇很奇怪的文章,發布出來我自己感覺有些彆扭。除了自己的熱情之外,我提出了一個沒有任何支撐的推測性理念。老實說,根據我所知的一些客觀觀點,我上面提的這個想法是錯誤的,大多數未經驗證的想法都是錯誤的。但這也可能是對的,而且我認為值得一提。
此外,我也不是探索這個方向合適的人,這需要從同類類型理論(homotopy type theory)的角度來分析神經網絡,我沒有相關的背景。但是,這個想法需要更多、更廣泛的討論。因此,我需要將這篇文章發布出來。
最後,我希望這篇文章能夠激起更多關於深度學習的討論和思考。
再說,如果我不能推測,寫博客又有什麼意義呢?希望我能在自己的激動和不確定之間找到適當的平衡。
原文地址:http://colah.github.io/posts/2015-09-NN-Types-FP/