走心整理——十個常用深度學習算法

        過去十年裏,人們對機器學習的興趣經歷了爆炸式的整長。我們幾乎每天都可以在計算機程序、行業會議和媒體上看到機器學習的身影。很多關於機器學習的討論都混淆了“機器學習能做什麼”和“人類希望機器學習能做什麼”。從根本上講,機器學習是運用算法從原始數據中提取信息,並用某種類型的模型進行表示,然後使用該模型對一些尚未用模型表示的其他數據來進行推斷。

        神經網絡就是機器學習各類模型中的其中一類,並且已經存在了至少50年。神經網絡的基本單位是節點,它的想法大致來源於哺乳動物大腦中的生物神經元。生物大腦中的神經元節點之間的鏈接是隨着時間推移不斷演化的,而神經網絡中的神經元節點鏈接也借鑑了這一點,會不斷演化(通過“訓練”的方式)。

        神經網絡中很多重要框架的建立和改進都完成於二十世紀八十年代中期和九十年代初期。然而,要想獲得較好結果需要大量的時間和數據,由於當時計算機的能力有限,神經網絡的發展受到了一定的阻礙,人們的關注度也隨之下降。二十一世紀初期,計算機的運算能力呈指數級增長,業界也見證了計算機技術發展的“寒武紀爆炸”——這在之前都是無法想象的。深度學習以一個競爭者的姿態出現,在計算能力爆炸式增長的十年裏脫穎而出,並且贏得了許多重要的機器學習競賽。其熱度在2017年仍然不減。如今,在機器學習的出現的地方我們都能看到深度學習的身影。

        這是柳貓自己做的一個小例子,詞向量的 t-SNE 投影,通過相似性進行聚類。

https://img4.mukewang.com/5c06355e0001943706900664.jpg

        最近,我開始閱讀關於深度學習的學術論文。根據我的個人研究,以下文章對這個領域的發展產生了巨大的影響:

  • 1998年NYU的文章《基於梯度學習的文檔識別》(Gradient-Based Learning Applied to Document Recognition) 介紹了卷積神經網絡在機器學習中的應用。

  • Toronto 2009年的文章《深度波茲曼機器》(Deep Boltzmann Machines) 針對波茲曼機提出了一種新的學習算法,其中包含許多隱藏層。

  • Stanford 和 Google 2012年聯合發表的文章《使用大規模非監督學習構建高層特徵》(Building High-Level Features Using Large-Scale Unsupervised Learning) 解決了僅利用未標記的數據構建高級、特定類的特徵檢測器的問題。

  • Berkeley 2013年的文章《用於一般視覺識別的深層卷積激活特徵》(DeCAF——A Deep Convolutional Activation Feature for Generic Visual Recognition) 發佈了名爲 DeCAF 的算法,這是深度卷積激活特徵的一個開源實現,使用相關的網絡參數,視覺研究人員能夠利用一系列視覺概念學習範例進行深入實驗。

  • DeepMind 2016年的文章《用深度強化學習玩Atari》(Playing Atari with Deep Reinforcement Learning) 提出了第一個可以成功地通過強化學習從高維感官輸入中直接學習控制策略的深度學習模型。

        柳貓整理了人工智能工程師 10 個用於解決機器學習問題的強大的深度學習方法。但是,我們首先需要定義什麼是深度學習。

        如何定義深度學習是很多人面臨的一個挑戰,因爲它的形式在過去的十年中已經慢慢地發生了改變。下圖直觀地展示了人工智能,機器學習和深度學習之間的關係。

https://img3.mukewang.com/5c0635b3000135f406900699.jpg

        人工智能領域廣泛,存在時間較長。深度學習是機器學習領域的一個子集,而機器學習是人工智能領域的一個子集。一般將深度學習網絡與“典型”前饋多層網絡從如下方面進行區分:

  • 深度學習網絡具有比前饋網絡更多的神經元

  • 深度學習網絡連接層之間的方式更復雜

  • 深度學習網絡需要有像“寒武紀大爆發”式的計算能力進行訓練

  • 深度學習網絡能夠自動提取特徵

        上文提到的“更多的神經元”是指近年來神經元的數量不斷增加,就可以用更復雜的模型來表示。層也從多層網絡中每一層完全連接,發展到卷積神經網絡中神經元片段的局部連接,以及與遞歸神經網絡中的同一神經元的循環連接(與前一層的連接除外)。

        因此,深度學習可以被定義爲以下四個基本網絡框架中具有大量參數和層數的神經網絡:

  • 無監督預訓練網絡

  • 卷積神經網絡

  • 循環神經網絡

  • 遞歸神經網絡

        在這篇文章中,我主要討論三個框架:

  • 卷積神經網絡(Convolutional Neural Network)基本上就是用共享權重在空間中進行擴展的標準神經網絡。卷積神經網絡主要是通過內部卷積來識別圖片,內部卷積可以看到圖像上識別對象的邊緣。

  • 循環神經網絡(Recurrent Neural Network)基本上就是在時間上進行擴展的標準神經網絡,它提取進入下一時間步的邊沿,而不是在同一時間進入下一層。循環神經網絡主要是爲了識別序列,例如語音信號或者文本。其內部的循環意味着網絡中存在短期記憶。

  • 遞歸神經網絡(Recursive Neural Network)更類似於分層網絡,其中輸入序列沒有真正的時間面,但是必須以樹狀方式分層處理。以下10種方法均可應用於這些框架。

1、反向傳播

        反向傳播是一種計算函數偏導數(或梯度)的簡單方法,它的形式是函數組合(如神經網絡)。在使用基於梯度的方法求解最優化問題(梯度下降只是其中之一)時,需要在每次迭代中計算函數梯度。

https://img3.mukewang.com/5c0635da00011eee06000460.jpg

        對於一個神經網絡,其目標函數是組合形式。那麼應該如何計算梯度呢?有2種常規方法:

  • (1)微分解析法。函數形式已知的情況下,只需要用鏈式法則(基礎微積分)計算導數。

  • (2)有限差分法近似微分。這種方法運算量很大,因爲函數評估的數量級是 O(N),其中 N 是參數的個數。與微分解析法相比,這種方法運算量更大,但是在調試時,通常會使用有限差分驗證反向傳播的效果。

2、隨機梯度下降

        梯度下降的一個直觀理解就是想象一條源自山頂的河流。這條河流會沿着山勢的方向流向山麓的最低點,而這也正是梯度下降法的目標。

        我們所期望的最理想的情況就是河流在到達最終目的地(最低點)之前不會停下。在機器學習中,這等價於我們已經找到了從初始點(山頂)開始行走的全局最小值(或最優值)。然而,可能由於地形原因,河流的路徑中會出現很多坑窪,而這會使得河流停滯不前。在機器學習術語中,這種坑窪稱爲局部最優解,而這不是我們想要的結果。有很多方法可以解決局部最優問題。

https://img2.mukewang.com/5c06362a00014d8706900512.jpg

        因此,由於地形(即函數性質)的限制,梯度下降算法很容易卡在局部最小值。但是,如果能夠找到一個特殊的山地形狀(比如碗狀,術語稱作凸函數),那麼算法總是能夠找到最優點。在進行最優化時,遇到這些特殊的地形(凸函數)自然是最好的。另外,山頂初始位置(即函數的初始值)不同,最終到達山底的路徑也完全不同。同樣,不同的流速(即梯度下降算法的學習速率或步長)也會導致到達目的地的方式有差異。是否會陷入或避開一個坑窪(局部最小值),都會受到這兩個因素的影響。

3、學習率衰減

        調整隨機梯度下降優化算法的學習速率可以提升性能並減少訓練時間。這被稱作學習率退火或自適應學習率。訓練中最簡單也最常用的學習率自適應方法就是逐漸降低學習率。在訓練初期使用較大的學習率,可以對學習率進行大幅調整;在訓練後期,降低學習率,以一個較小的速率更新權重。這種方法在早期可以快速學習獲得較好的權重,並在後期對權重進行微調。 

https://img1.mukewang.com/5c0636580001f7f106000337.jpg

        兩個流行而簡單的學習率衰減方法如下: 

  • 線性地逐步降低學習率 

  • 在特定時點大幅降低學習率

4、Dropout

        擁有大量參數的深度神經網絡是非常強大的機器學習系統。然而,在這樣的網絡中,過擬合是一個很嚴重的問題。而且大型網絡的運行速度很慢,這就使得在測試階段通過結合多個不同的大型神經網絡的預測來解決過擬合問題是很困難的。Dropout 方法可以解決這個問題。

https://img3.mukewang.com/5c0636700001b21806140328.jpg

        其主要思想是,在訓練過程中隨機地從神經網絡中刪除單元(以及相應的連接),這樣可以防止單元間的過度適應。訓練過程中,在指數級不同“稀疏度”的網絡中剔除樣本。在測試階段,很容易通過使用具有較小權重的單解開網絡(single untwined network),將這些稀疏網絡的預測結果求平均來進行近似。這能有效地避免過擬合,並且相對於其他正則化方法能得到更大的性能提升。Dropout 技術已經被證明在計算機視覺、語音識別、文本分類和計算生物學等領域的有監督學習任務中能提升神經網絡的性能,並在多個基準數據集中達到最優秀的效果。

5、最大池

        最大池是一種基於樣本的離散化方法。目標是對輸入表徵(圖像、隱藏層輸出矩陣等)進行下采樣,降低維度並且允許對子區域中的特徵進行假設。

https://img2.mukewang.com/5c0636870001512e05140406.jpg

        通過提供表徵的抽象形式,這種方法可以在某種程度上解決過擬合問題。同樣,它也通過減少學習參數的數目以及提供基本的內部表徵轉換不變性來減少計算量。最大池是通過將最大過濾器應用於通常不重疊的初始表徵子區域來完成的。

6、批量標準化

        當然,包括深度網絡在內的神經網絡需要仔細調整權重初始值和學習參數。批量標準化能夠使這個過程更加簡單。 

        權重問題: 

  • 無論怎麼設置權重初始值,比如隨機或按經驗選擇,初始權重和學習後的權重差別都很大。考慮一小批權重,在最初時,對於所需的特徵激活可能會有很多異常值。

  •  深度神經網絡本身就具有病態性,即初始層的微小變化就會導致後一層的巨大變化。

        在反向傳播過程中,這些現象會導致梯度的偏移,這就意味着在學習權重以產生所需要的輸出之前,梯度必須補償異常值。而這將導致需要額外的時間才能收斂。

https://img1.mukewang.com/5c06371e0001d81f06900497.jpg

        批量標準化將這些梯度從異常值調整爲正常值,並在小批量範圍內(通過標準化)使其向共同的目標收斂。 

        學習率問題:

  • 通常來說,學習率都比較小,這樣只有一小部分的梯度用來校正權重,因爲異常激活的梯度不應該影響已經學習好的權重。

  • 通過批量標準化,這些異常激活的可能性會被降低,就可以使用更大的學習率加速學習過程。電動叉車輪胎

7、長短期記憶

        長短期記憶網絡(LSTM)和其他遞歸神經網絡中的神經元有以下三個不同點:

  • 它可以決定何時讓輸入進入神經元

  • 它可以決定何時記住上一個時間步中計算的內容

  • 它可以決定何時讓輸出傳遞到下一個時間戳 LSTM的強大之處在於它可以只基於當前的輸入就決定上述所有。請看下方的圖表:

https://img3.mukewang.com/5c0637380001003806900394.jpg

        當前時間戳的輸入信號 x(t) 決定了上述三點。

  • 輸入門(input gate)決定了第一點,

  • 遺忘門(forget gate)決定了第二點,

  • 輸出門(output gate)決定了第三點。 只依賴輸入就可以完成這三項決定。這是受到大腦工作機制的啓發,大腦可以基於輸入來處理突然的上下文語境切換。

8、Skip-gram

        詞嵌入模型的目的是針對每個詞學習一個高維密集表徵,其中嵌入向量之間的相似性顯示了相應詞語之間語義或句法的相似性。Skip-gram 是一種學習詞嵌入算法的模型。 skip-gram 模型(包括很多其它詞嵌入模型)背後的主要思想是:如果兩個詞彙項有相似的上下文,則它們是相似的。

https://img3.mukewang.com/5c0638020001fcc905950404.jpg

        換句話說,假設有一個句子,比如“cats are mammals”,如果用“dogs”替換“cats”,該句子仍然是有意義的。因此在這個例子中,“dogs”和“cats”有相似的上下文(即“are mammals”)。

        基於以上假設,我們可以考慮一個上下文窗口(包含 K 個連續項)。然後跳過其中一個詞,試着學習一個可以得到除了跳過的這個詞以外所有詞項,並且可以預測跳過的詞的神經網絡。因此,如果兩個詞在一個大語料庫中多次具有相似的上下文,那麼這些詞的嵌入向量將會是相似的。

9、連續詞袋模型

        在自然語言處理中,我們希望將文檔中的每一個單詞表示爲一個數值向量,使得出現在相似上下文中的單詞具有相似或相近的向量表示。在連續詞袋模型中,我們的目標是利用一個特定單詞的上下文,預測該詞。

https://img2.mukewang.com/5c06377e000156f406000337.jpg

        首先在一個大的語料庫中抽取大量的句子,每看到一個單詞,同時抽取它的上下文。然後我們將上下文單詞輸入到一個神經網絡,並預測在這個上下文中心的單詞。

        當我們有成千上萬個這樣的上下文詞彙和中心詞時,我們就得到了一個神經網絡數據集的實例。然後訓練這個神經網絡,在經過編碼的隱藏層的最終輸出中,我們得到了特定單詞的嵌入式表達。當我們對大量的句子進行訓練時也能發現,類似上下文中的單詞都可以得到相似的向量。

10、遷移學習

        我們來考慮一下卷積神經網絡是如何處理圖像的。假設有一張圖像,對其應用卷積,並得到像素的組合作爲輸出。假設這些輸出是邊緣,再次應用卷積,那麼現在的輸出將是邊緣或線的組合。然後再次應用卷積,此時的輸出將是線的組合,以此類推。可以把它想象成是在每一層尋找一個特定的模式。神經網絡的最後一層通常會變得非常特別。

        如果基於 ImageNet 進行訓練,那麼神經網絡的最後一層或許就是在尋找兒童、狗或者飛機之類的完整圖像。再往後倒退幾層,可能會看到神經網絡在尋找眼睛、耳朵、嘴巴或者輪子等組成部分。

https://img1.mukewang.com/5c0637ac0001ca1306380359.jpg

        深度卷積神經網絡中的每一層逐步建立起越來越高層次的特徵表徵,最後幾層通常是專門針對輸入數據。另一方面,前面的層則更爲通用,主要用來在一大類圖片中有找到許多簡單的模式。

        遷移學習就是在一個數據集上訓練卷積神經網絡時,去掉最後一層,在不同的數據集上重新訓練模型的最後一層。直觀來講,就是重新訓練模型以識別不同的高級特徵。因此,訓練時間會減少很多,所以在沒有足夠的數據或者需要太多的資源時,遷移學習是一個很有用的工具。

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