【Keras之父】總結篇

         深度學習(deep learning)是機器學習的衆多分支之一。它的模型是一長串的幾何函數,各個都作用在數據上。這些運算組組成了模塊叫做層。DL模型通常都是層的堆疊,也可以說是層組成的圖。這些層由權重(weight)來參數化,權重是訓練過程中需要學習的參數。模型的知識(knowledge)保存在它的權重中,學習的過程就是爲這些權重找到正確的值。

         在深度學習中,一切都是向量,即一切都是幾何空間(geometric space)中的點(point)。首先將模型輸入(文本、圖像等)和目標向量化(vectorize),即將其轉換爲初始輸入向量空間和目標函向量空間。DL模型的每一層都對通過它的數據做一個簡單的幾何變換。模型中的層鏈共同形成了一個非常複雜的幾何變換,它可以分解爲一系列簡單的幾何變換。這個複雜變換試圖將輸入空間映射到目標空間。,每次映射到一個點。這個變換由層的權重來參數化,權重根據模型當前表現進行迭代更新。這種幾何變換有一個關鍵性質,就是它必須是可微的/differentiable,這樣纔可以通過梯度下降來學習其參數。約束條件是:從輸入到輸出的幾何變形必須是平滑且連續的。  導數和微分的基礎----數學很有魅力!

【引用原文】

         Deep-learning models are mathematicalmachines for uncrumpling complicated manifolds of high-dimensional data.

         深度學習模型是解開高維數據複雜流形的數學機器。

         That’s the magic of deep learning:turning meaning into vectors, into geometric spaces, and then incrementallylearning complex geometric transformations that map one space to another. Allyou need are spaces of sufficiently high dimensionality in order to capture thefull scope of the relationships found in the original data.

         深度學習的魅力:將意義轉換爲向量、幾何空間,然後逐步學習將一個空間映射到另一空間的複雜幾何變換。你需要的只是維度足夠大的空間,以便捕捉到原始數據中能夠找到的所有關係。

===============================================================================================

【機器學習的通用工作流程】

         (1) 定義問題:有哪些數據可用?你想要預測什麼? 你是否需要收集更多數據或僱人爲數據集手動添加標籤?

         (2) 找到能夠可靠評估目標成功的方法。對於簡單任務,可以用預測精度,但很多情況都需要與領域相關的複雜指標。

         (3) 準備用於評估模型的驗證過程。訓練集、驗證集和測試集是必須定義的。驗證集和測試集的標籤不應該泄漏到訓練數據中。舉個例子,對於時序預測,驗證數據和測試數據的時間都應該在訓練數據之後。

         (4) 數據向量化。方法是將數據轉換爲向量並預處理,使其更容易被神經網絡所處理(數據標準化等)。

         (5) 開發第一個模型,它要打敗基於常識的簡單基準方法,從而表明機器學習能夠解決你的問題。事實上並非總是如此!

         (6) 通過調節超參數和添加正則化來逐步改進模型架構。僅根據模型在驗證集(不是測試集或訓練集)上的性能來進行更改。請記住,你應該先讓模型過擬合(從而找到比你的需求更大的模型容量),然後纔開始添加正則化或降低模型尺寸。

         (7) 調節超參數時要小心驗證集過擬合,即超參數可能會過於針對驗證集而優化。我們保留一個單獨的測試集,正是爲了避免這個問題!

===============================================================================================

【關鍵網絡架構】

       三種常見網絡架構:密集連接網絡卷積網絡和循環網絡,每種類型的網絡都針對於特定的輸入模式,網絡架構(密集網絡、卷積網絡、循環網絡)中包含對數據結構的假設,即搜索良好模型所在的假設空間。

輸入模式與之對應的網絡架構選擇:

輸入模式

架構選型

向量數據 Vector Data

Dense層(密集連接網絡)

圖像數據 Image Data

Conv2D (二爲卷積神經網絡)

聲音數據Sound Data比如波形

Conv1D (首選)RNN

文本數據Text Data

Conv1D (首選)RNN

時間序列數據 Timeseries  Data

RNN (首選) Conv1D

視頻數據 Video Data

Conv3D(捕捉運動效果)

幀級 Conv2D  Conv1D (首選)RNN

立體數據 Volumetric Data

Conv3D

其他類型序列數據 Sequence Data

RNN (時間序列) Conv1D

 

【三種常見網絡架構對比】

1.密集連接網絡Densely Connected Networks

         密集連接網絡是Dense層的堆疊,用於處理向量數據(向量批量)。這種網絡假設輸入特徵中沒有特定結構。之所以叫做密集連接,是因爲Dense層的每個單元都和其他所有單元相連接。這種層試圖映射任意兩個輸入特徵之間的關係,與Conv2D不同,後者僅查看局部關係。

問題類型

層堆疊

損失函數

二分類

最後一層是sigmoid激活且只有一個單元的Dense層

binary_crossentropy
 優化器:rmsprop

單標籤多分類

最後一層是softmax激活且單元個數=類別個數的Dense層

目標是one-hot編碼:categorical_crossentropy
 目標是整數:sparse_catrgorical_crossentropy

多標籤多分類

最後一層是sigmoid激活且單元個數=類別個數的Dense層

 目標是k-hot 編碼
 binary_crossentropy
 優化器:rmsprop

連續值迴歸

最後一層是不帶激活函數且單元個數 = 要預測的值個數的Dense層

常見的損失函數:

1.    mean_squred_error MSE

2.    mean_absolute_error MAE

 

SampleCode:

1.二分類問題:

 

2.單標籤多分類

 

3.多標籤多分類

 

4.連續值向量的迴歸

 

2.卷積神經網絡Convnets 平移不變性

         卷積層能看到空間局部模式,其方法是對輸入張量的不同空間位置(圖塊)應用相同的幾何變換。這使得卷積層能夠高效利用高維數據,並且能夠高度模塊化,適用於任何維度的空間,包括一維(序列)、二維(圖像)、三維(立體數據)等。

         卷積神經網絡或卷積網絡是卷積層和最大池化層的堆疊。池化層可以對數據進行空間下采樣,這麼做有兩個目的:隨着特徵數量的增大,需要讓特徵圖的尺寸保持在合理範圍內; 讓後面的卷積層能夠“看到”輸入中更大的空間範圍。卷積神經網絡的最後通常是一個 Flatten 運算或全局池化層,將空間特徵圖轉換爲向量,再是 Dense 層,用於實現分類或迴歸。

        【注意】大部分或者全部普通卷積不久會被深度可分離卷積(depth-wise separable convolution,SeparableConv2D)替代,會得到一個更小、更快的網絡,在任務上的表現更好。其優點:速度更快並且效率更高

SampleCode:

 

3.循環神經網絡RNNs        循環神經網絡(RNN,recurrent neural network)的工作原理是對輸入序列每次處理一個時間步,並且自始至終保存一個狀態(state,這個狀態通常是一個向量或一組向量,即狀態幾何空間中的點)。如果序列中的模式不具有時間平移不變性(比如時間序列數據,最近的過去比遙遠的過去更加重要),應該優先使用循環神經網絡,而不是一維卷積神經網絡。

         Keras 中有三種 RNN 層: SimpleRNN、GRU 和 LSTM。對於大多數實際用途,應該使用 GRU 或 LSTM。兩者中 LSTM 更加強大,計算代價也更高。可以將 GRU 看作是一種更簡單、計算代價更小的替代方法。

         想要將多個 RNN 層逐個堆疊在一起,最後一層之前的每一層都應該返回輸出的完整序列 (每個輸入時間步都對應一個輸出時間步)。如果不再堆疊更多的 RNN 層,那麼通常只返回最後一個輸出,其中包含關於整個序列的信息。

===============================================================================================

         機器學習最基本的任務是分類和迴歸任務。雖然在所有這些任務上都可以訓練一個模型,但在某些情況下,這樣的模型可能無法泛化到訓練數據之外的數據。

 

【應用場景如下(能做什麼)】

1.將向量數據映射到向量數據

·     預測性醫療保健:將患者醫療記錄映射到患者治療效果的預測。

·     行爲定向:將一組網站屬性映射到用戶在網站上所花費的時間數據。

·     產品質量控制:將與某件產品製成品相關的一組屬性映射到產品明年會壞掉的概率。

2.將圖像數據映射到向量數據

·     醫生助手:將醫學影像幻燈片映射到是否存在腫瘤的預測。

·     自動駕駛車輛:將車載攝像機的視頻畫面映射到方向盤的角度控制命令。 

·     棋盤遊戲人工智能:將圍棋和象棋棋盤映射到下一步走棋。

·     飲食助手:將食物照片映射到食物的卡路里數量。

·     年齡預測:將自拍照片映射到人的年齡。

3.將時間序列數據映射爲向量數據

·     天氣預報:將多個地點天氣數據的時間序列映射到某地下週的天氣數據。

·     腦機接口:將腦磁圖(MEG)數據的時間序列映射到計算機命令。

·     行爲定向:將網站上用戶交互的時間序列映射到用戶購買某件商品的概率。

4.將文本映射到文本

·     智能回覆:將電子郵件映射到合理的單行回覆。

·     回答問題:將常識問題映射到答案。

·     生成摘要:將一篇長文章映射到文章的簡短摘要。

5.將圖像映射到文本

  • 圖像描述:將圖像映射到描述圖像內容的簡短說明。

  • 將文本映射到圖像

  • 條件圖像生成:將簡短的文字描述映射到與這段描述相匹配的圖像。 

  • 標識生成 / 選擇:將公司的名稱和描述映射到公司標識。

  • 將圖像映射到圖像

  • 超分辨率:將縮小的圖像映射到相同圖像的更高分辨率版本。

  • 視覺深度感知:將室內環境的圖像映射到深度預測圖。

  • 將圖像和文本映射到文本

  • 視覺問答:將圖像和關於圖像內容的自然語言問題映射到自然語言答案。

  • 將視頻和文本映射到文本

  • 視頻問答:將短視頻和關於視頻內容的自然語言問題映射到自然語言答案

 

【侷限性(不能做什麼)】

         一般來說,任何需要推理(比如編程或科學方法的應用)、長期規劃和算法數據處理的東西,無論投入多少數據,深度學習模型都無法實現。即使是排序算法,用深度學習網絡來學習也是非常困難的。
         原因:深度學習模型只是將一個向量空間映射到另一個向量空間的簡單而又連續的幾何變換鏈。能做的只是將一個數據流形X映射到另一個流形Y,前提是從XY存在任何可學習的連續變換。深度學習模型可以看作是一種程序,但是反過來說,大多數程序都不能被表示爲深度學習模型

1.ML擬人化的風險

         對於大多數任務而言,要麼不存在相應的深度學習神經網絡能夠解決任務,要麼即使存在這樣的網絡,它可能是不可學習的(learnable)。後一種情況的原因可能是響應的幾何變換過於複雜,也可能是沒有合適的數據用於學習。通過堆疊更多的層並使用更多訓練數據來擴展當前的深度學習技術,只能在表面上緩解一些問題,無法解決更根本的問題,比如深度學習模型可以表示的內容非常有限,比如大多數想要學習的程序都不能被表示爲數據流形的連續幾何變形。

         人類的一個基本特徵就是我們的心智理論:我們傾向於將意圖、信念和知識投射到身邊的事物上----這有點兒心理學了。對抗樣本尤其能夠突出說明這一點,對抗樣本是深度學習網絡的輸入樣本,其目的在於欺騙模型對它們進行錯誤歸類

         深度學習模型並不理解它們的輸入,至少不是人類所說的理解。人類頭腦中的原始模型是從人類作爲具身主體的體驗發展而來的。避免入坑:即相信神經網絡能夠理解它們所執行的任務---它們不理解,至少不是我們可以理解的方式。

2.局部泛化與極端泛化

         2.1  人類認知---->極端泛化

         人類是從具身體驗中自我學習的,而不是通過觀察顯式的訓練樣例來學習的。人類都是用了一個複雜的抽象模型,並可以利用這些模型來預測各種可能的未來並執行長期規劃可以將已知的概念融合在一起來表示之前從未體驗過的事物。比如繪製一匹穿着牛仔褲的馬,或者想象我們如果中了彩票會做什麼。這種處理假想情況的能力,將人類的心智模型空間擴展到遠遠超出我們能夠直接體驗的範圍,讓我們能夠進行抽象和推理,這種能力可以說是人類認知的決定性特徵。極端泛化:即只用很少的數據,甚至沒有新數據,就可以適應從未體驗過的新情況的能力

        

        2.2機器學習---->局部泛化

        深度學習執行從輸入到輸出的映射,如果新的輸入與網絡訓練時所見到的輸入稍有不同,這種映射就會立刻變得沒有意義。兩者區別如下:

 

         這個例子挺有意思:如果要開發一個能夠控制人體的深度網絡,並且希望它學會再城市裏安全行走,不會被汽車撞上。那麼這個網絡不得不再各種場景中死亡數千次,才能推斷出汽車是危險的,並做出適當的躲避行爲。將這個網絡放到一個新城市,它將不得不重新學習已知的大部分知識。但是人類不需要死亡就可以學會安全行爲,這也要歸功於人類對假想情景進行抽象建模的能力。

         深度學習唯一的真正成功之處就是:給定大量的人工標註數據,它能夠使用連續的幾何變換將空間X映射到空間Y。若想創造出與人類大腦匹敵的人工智能,需要拋棄簡單的從輸入到輸出的映射,轉而研究推理和抽象。對各種情況進行抽象建模,一個合適的基礎可能是計算機程序,機器學習模型可以被定義爲可學習的程序

 

【未來前瞻(Keras之父的設想)】

1.   與通用的計算機程序更加接近的模型,它建立在比當前可微層更加豐富的原語之上。這也是實現推理和抽象的方法,當前模型的致命弱點就是缺少推理和抽象

2.   使上一點成爲可能的新學習形式,讓模型拋棄可微變換

3.   需要更少人類工程師參與的模型。不停的調節模型應該是機器的工作,而不是工程師的工作

4.   更好地、系統性地重複使用之前學到的特徵和架構,比如使用可複用和模塊化子程序的元學習系統。

 

Keras之父的言外之意

A.  模型即程序

         將來的一個必要轉型:拋棄只能進行純模式識別並且只能實現局部泛化的模型,轉而研究能夠進行抽象和推理並且能夠實現極端泛化的模型。目前的人工智能程序能夠進行基本形式的推理,它們都是由人類程序猿硬編碼的,如依賴於搜索算法、圖操作和形式邏輯的軟件等,如DeepMind的AlphaGo。

         一方面將不再使用硬編碼的算法智能(手工軟件),另一方面不再使用學到的幾何智能(深度學習)。將正式的算法模塊和幾何模塊融合在一起,前者可以提供推理和抽象能力,後者可以提供非正式的直覺與模式識別能力。整個系統的學習過程只需要很少人蔘與,甚至不需要人蔘與。

===============================================================================================

         程序合成:是指利用搜索算法(在遺傳編程中也可能是遺傳搜索)來探索可能程序的巨大空間,從而自動生成簡單的程序,特別是神經程序合成。

         機器學習程序的巨給定輸入/輸出作爲訓練數據,找到一個程序能夠將輸入映射到輸出,還能夠泛化到新的輸入。

      【區別】:程序合成是通過離散的搜索過程來生成源代碼,機器學習是通過硬編碼的程序(神經網絡)中學習參數值。

===============================================================================================

 

B.   超越反向傳播和可微層

       如果機器學習模型變得更像程序,那麼通常就不再是可微的了。這些程序仍然使用連續的幾何層作爲子程序,這些子程序是可微的,但整個模型是不可微的。因此,使用反向傳播在固定的硬編碼的網絡中調節權重值,可能不是未來訓練模型的首選方法,至少不會只用這種方法。需要找到能夠有效地訓練不可微系統的方法。目前的方法包括遺傳算法、進化策略、某些強化學習方法和交替方向乘子法(ADMM)。當然梯度下降也不會被淘汰,梯度信息對於可微的參數化函數的最優化總是很有用的。但模型會變得越來越不滿足於可微的參數化函數,因此模型的自動開發(即機器學習中的學習)需要的也不僅僅是反向傳播。

          此外,反向傳播是端到端的,這對於學習良好的鏈式變換是很有用的,但它沒有充分利用深度網絡的模塊化,所以計算效率很低。爲了提高效率,有一個通用的策略:引入模塊化和層次結構。因此可以引入解耦的訓練模塊以及訓練模塊之間的同步機制並用一種層次化的方式來組織,從而使反向傳播更加高效。模型在全局上是不可微的(但部分是可微的)使用一種有效的搜索過程(不使用梯度)來訓練(生長)模型,而可微的部分則利用更高效版本的反向傳播得到的梯度進行訓練,其訓練速度更快

 

C.   自動化機器學習AutoML

        第一、超參數調節是一個簡單的搜索過程,它由所調節網絡的損失函數來定義,建立基本的自動化機器學習(AutoML)系統可以調節堆疊的層數、層的順序以及每一層中單元或過濾器的個數

           第二、聯合學習模型架構和模型權重。每次嘗試一個略有不同的架構都要從頭訓練一個新模型,這種方法效率很低,因此真正強大的AutoML在訓練數據上進行反向傳播來調節模型特徵的同時,還能夠不斷調節其模型架構

 

D.終身學習與模塊化子程序複用

         如果模型變得更加複雜,並且構建於更加豐富的算法原語之上,對於這種增加的複雜度,需要在不同的任務之間實現更多的複用,而不是每次面對一個新任務或新數據集時,都從頭開始訓練一個新模型。模型可以自由地操作這些原語來擴展其處理功能:比如if 分支、while語句、變量創建、長期記憶的磁盤存儲、排序運算符、高級數據結構(如List、Graph和HashTable)等。

          Keras之父經驗之談:訓練同一個模型同時完成幾個幾乎沒有聯繫的任務,這樣得到的模型在每個任務山的效果都更好。如聯合訓練一個圖像分類模型和一個圖像分割模型,二者共享相同的卷積基,這樣得到的模型在兩個任務上的表現都變得更好。這是很符合直覺的: 看似無關的任務之間總是存在一些信息重疊,與僅在特定任務上訓練的模型相比,聯合模型可以獲取關於每項任務的更多信息。

         如果一個子程序在不同任務和不同領域中都很有用,可以說它對解決問題的某些方面進行了抽象化(abstract)

 

Keras之父長期願景:

·     模型將變得更像程序,其能力將遠遠超出目前對輸入數據所做的連續幾何變換。這些程序可以說是更加接近於人類關於周圍環境和自身的抽象心智模型。因爲它們具有豐富的算法特性,所以還具有更強的泛化能力。

·     具體而言,模型將會融合算法模塊與幾何模塊,前者提供正式的推理、搜索和抽象能力,後者提供非正式的直覺和模式識別能力。AlphaGo(這個系統需要大量的手動軟件工程和人爲設計決策)就是這種符號人工智能和幾何人工智能融合的一個早期例子。

·     通過使用存儲在可複用子程序的全局庫(這個庫隨着在數千個先前任務和數據集上學習高性能模型而不斷進化)中的模塊化部件,這種模型可以自動成長(grow),而不需要人類工程師對其硬編碼。隨着元學習系統識別出經常出現的問題解決模式,這些模式將會被轉化爲可複用的子程序(正如軟件工程中的函數和類),並被添加到全局庫中。這樣就可以實現抽象。

·     這個全局庫和相關的模型成長系統能夠實現某種形式的與人類類似的極端泛化:給定一個新任務或新情況,系統使用很少的數據就能組合出一個適用於該任務的新的有效模型,這要歸功於豐富的類似程序的原語,它具有很好的泛化能力,還要歸功於在類似任務上的大量經驗。按照同樣的方法,如果一個人具有很多以前的遊戲經驗,那麼它可以很快學會玩一個複雜的新視頻遊戲,因爲從先前經驗得到的模型是抽象的、類似程序的,而不是刺激與行動之間的簡單映射。

·     因此,這種永久學習的模型生長系統可以被看作一種通用人工智能(AGI,artificial general intelligence)。但是不要指望會出現奇點式的機器人災難,那純粹只是幻想,自於人們對智能和技術的一系列深刻誤解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章