近日,軟體工程師 James Le 在 Medium 上發表了一篇題為《The 10 Deep Learning Methods AI Practitioners Need to Apply》的文章,從反向傳播到最大池化最後到遷移學習,他在文中分享了主要適用於卷積神經網路、迴圈神經網路和遞迴神經網路的10大深度學習方法。機器之心對本文進行了編譯,原文連結請見文末。
過去十年來,人們對機器學習興趣不減。你幾乎每天都會在電腦科學程式、行業會議和華爾街日報上看到機器學習。對於所有關於機器學習的討論,很多人把機器學習能做什麼與希望其做什麼混為一談。從根本上說,機器學習就是使用演算法從原始資料中提取資訊,並透過模型進行實現。我們使用這個模型來推斷我們尚未建模的其他資料。
神經網路屬於機器學習模型的一種,已出現 50 多年,其基本單元即受到哺乳動物大腦中生物神經元啟發的非線性變換節點。神經元之間的連線也是仿效生物大腦,並在時間中透過訓練推移發展。
1980 年代中期和 1990 年代早期,神經網路的很多重要架構取得重大進展。然而,獲得良好結果所需的時間和資料量卻阻礙了其應用,因此人們一時興趣大減。2000 年早期,計算能力呈指數級增長,業界見證了之前不可能實現的計算技術的「寒武紀爆炸」。深度學習作為該領域的一個重要競爭者是在這個十年的爆炸性計算增長中脫穎而出,它贏得了許多重要的機器學習競賽。深度學習的熱度在 2017 年達到峰值,你在機器學習的所有領域都可以看到深度學習。
為了深入瞭解這一熱潮,我學習了 Udacity 的深度學習課程,它很好地介紹了深度學習的起源,以及透過 TensorFlow 從複雜和/或大型資料集中學習的智慧系統的設計。對於課程專案,我使用和開發了帶有卷積的影像識別神經網路,帶有嵌入表徵的 NLP 神經網路和帶有 RNN 和 LSTM 的基於字元的文字生成神經網路。所有的 Jupiter Notebook 程式碼可參見:https://github.com/khanhnamle1994/deep-learning。
下面是一個作業的結果,一個透過相似性聚類的詞向量的 t-SNE 投影。
最近,我已經開始閱讀相關學術論文。根據我的研究,下面是一些對該領域發展產生重大影響的著作:
- 紐約大學的《Gradient-Based Learning Applied to Document Recognition》(1998),介紹了機器學習領域的卷積神經網路:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf
- 多倫多大學的《Deep Boltzmann Machines》(2009),它展現了一個用於玻爾茲曼機的、包含多個隱藏變數層的新學習演算法:http://proceedings.mlr.press/v5/salakhutdinov09a/salakhutdinov09a.pdf
- 史丹佛大學和谷歌的《Building High-Level Features Using Large-Scale Unsupervised Learning》(2012),它解決了只從無標註資料中構建高階、特定類別的特徵探測器的問題:http://icml.cc/2012/papers/73.pdf
- 伯克利大學的《DeCAF—A Deep Convolutional Activation Feature for Generic Visual Recognition》(2013),它推出了 DeCAF,一個深度卷積啟用功能和所有相關網路引數的開源實現,能夠幫助視覺研究者在一系列視覺概念學習範例中開展深度表徵實驗:http://proceedings.mlr.press/v32/donahue14.pdf
- DeepMind 的《Playing Atari with Deep Reinforcement Learning》(2016),它展示了藉助強化學習直接從高維感知輸入中成功學習控制策略的首個深度學習模型:https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf
在研究和學習了大量知識之後,我想分享 10 個強大的深度學習方法,工程師可用其解決自己的機器學習問題。開始之前,讓我們定義一下什麼是深度學習。深度學習是很多人面臨的一個挑戰,因為過去十年來它在緩慢改變著形式。為了形象化地界定深度學習,下圖給出了人工智慧、機器學習和深度學習三者之間的關係。
人工智慧領域最為廣泛,已存在 60+ 年。深度學習是機器學習的一個子領域,機器學習是人工智慧的一個子領域。深度學習區分於傳統的前饋多層網路的原因通常有以下幾點:
- 更多的神經元
- 層之間更復雜的連線方式
- 訓練算力的「寒武紀爆炸」
- 自動特徵提取
當我說「更多的神經元」,我的意思是神經元數目逐年增長以表達更復雜的模型。層也從多層網路中完全連線的每層發展到卷積神經網路中層之間的區域性連線的神經元補丁,以及與迴圈神經網路中的同一神經元(除了與前一層的連線之外)的週期性連線。
接著深度學習可被定義為下面四個基本網路架構之一中的帶有大量引數和層的神經網路:
- 無監督預訓練網路
- 卷積神經網路
- 迴圈神經網路
- 遞迴神經網路
本文將主要介紹後面 3 個架構。卷積神經網路基本是一個標準的神經網路,透過共享權重在整個空間擴充套件。卷積神經網路被設計為透過在內部卷積來識別影像,可看到已識別影像上物體的邊緣。迴圈神經網路透過將邊緣饋送到下一個時間步而不是在同一時間步中進入下一層,從而實現整個時間上的擴充套件。迴圈神經網路被設計用來識別序列,比如語音訊號或文字序列,其內部迴圈可儲存網路中的短時記憶。遞迴神經網路更像是一個分層網路,其中輸入序列沒有真正的時間維度,但輸入必須以樹狀方式進行分層處理。以下 10 種方法可被用於上述所有架構。
1—反向傳播
反向傳播簡單地說就是一種計算函式(在神經網路中為複合函式形式)的偏導數(或梯度)的方法。當使用基於梯度的方法(梯度下降只是其中一種)求解最佳化問題的時候,需要在每一次迭代中計算函式的梯度。
在神經網路中,目標函式通常是複合函式的形式。這時如何計算梯度?有兩種方式:(i)解析微分(Analytic differentiation),函式的形式是已知的,直接使用鏈式法則計算導數就可以。(ii)利用有限差分的近似微分(Approximate differentiation using finite difference),這種方法的運算量很大,因為函式計算量(number of function evaluation)等於 O(N),其中 N 是引數數量。相比於解析微分,運算量大得多。有限差分通常在除錯的時候用於驗證反向傳播的實現。
2—隨機梯度下降
理解梯度下降的一種直觀的方法是想象一條河流從山頂順流而下的路徑。梯度下降的目標正好就是河流力爭實現的目標—即,到達最低點(山腳)。
假設山的地形使得河流在到達最低點之前不需要做任何停留(最理想的情況,在機器學習中意味著從初始點到達了全域性最小/最優解)。然而,也存在有很多凹點的地形,使得河流在其路徑中途停滯下來。在機器學習的術語中,這些凹點被稱為區域性極小解,是需要避免的情況。有很多種方法能解決這種問題(本文未涉及)。
因此,梯度下降傾向於停滯在區域性極小解,這取決於地形((或機器學習中的函式))的性質。但是,當山地的地形是一種特殊型別的時候,即碗形地貌,在機器學習中稱為凸函式,演算法能保證找到最優解。凸函式是機器學習最佳化中最想遇到的函式。而且,從不同的山頂(初始點)出發,到達最低點之前的路徑也是不同的。類似地,河流的流速(梯度下降演算法中的學習率或步長)的不同也會影響路徑的形態。這些變數會影響梯度下降是困在局域最優解還是避開它們。
3—學習率衰減
調整隨機梯度下降最佳化過程的學習率可以提升效能並減少訓練時間,稱為學習率退火(annealing)或適應性學習率。最簡單的也可能是最常用的訓練中的學習率調整技術是隨時間降低學習率。這有益於在訓練剛開始的時候使用更大的學習率獲得更大的變化,並在後期用更小的學習率對權重進行更精細的調整。
兩種簡單常用的學習率衰減方法如下:
- 隨 epoch 的增加而降低學習率;
- 在特定的 epoch 間斷地降低學習率。
4—dropout
擁有大量引數的深度神經網路是很強大的機器學習系統。然而,這樣的網路有很嚴重的過擬合問題。而且大型網路的執行速度很慢,使得在測試階段透過結合多個不同大型神經網路的預測解決過擬合的過程也變得很慢。dropout 正是針對這個問題應用的技術。
其關鍵的思想是在訓練過程中隨機刪除神經網路的單元和相應的連線,從而防止過擬合。在訓練過程中,dropout 將從指數級數量的不同的稀疏網路中取樣。在測試階段,很容易透過用單 untwined 網路(有更小的權重)將這些稀疏網路的預測取平均而逼近結果。這能顯著地降低過擬合,相比其它的正則化方法能得到更大的效能提升。dropout 被證明在監督學習任務比如計算機視覺、語音識別、文字分類和計算生物學中能提升神經網路的效能,並在多個基準測試資料集中達到頂尖結果。
5—最大池化
最大池化是一種基於樣本的離散化方法,目標是對輸入表徵(影像、隱藏層的輸出矩陣,等)進行下采樣,降低維度,並允許假設包含在子區域中的被丟棄的特徵。
透過提供表徵的抽象形式,這種方法在某種程度上有助於解決過擬合。同樣,它也透過減少學習引數的數量和提供基本的內部表徵的轉換不變性減少了計算量。最大池化透過在初始表徵的子區域(通常是非重疊的)取最大值而抽取特徵與防止過擬合。
6—批次歸一化
神經網路(包括深度網路)通常需要仔細調整權重初始化和學習引數。批次歸一化能使這個過程更簡單。
權重問題:
- 無論哪種權重初始化比如隨機或按經驗選擇,這些權重值都和學習權重差別很大。考慮在初始 epoch 中的一個小批次,在所需要的特徵啟用中可能會有很多異常值。
- 深度神經網路本身就具有病態性,即初始層的微小變動就會導致下一層的巨大變化。
- 在反向傳播過程中,這些現象會導致梯度的偏離,意味著梯度在學習權重以生成所需要的輸出之前,需要對異常值進行補償,從而需要額外的 epoch 進行收斂。
批次歸一化會系統化梯度,避免因異常值出現偏離,從而在幾個小批次內直接導向共同的目標(透過歸一化)。
學習率問題:
- 學習率通常保持小值,從而使梯度對權重的修正很小,因為異常值啟用的梯度不應該影響學習啟用。透過批次歸一化,這些異常值啟用會被降低,從而可以使用更大的學習率加速學習過程。
7—長短期記憶
- 長短期記憶(LSTM)網路的神經元和其它 RNN 中的常用神經元不同,有如下三種特徵:
- 它對神經元的輸入有決定權;
- 它對上一個時間步中計算內容的儲存有決定權;
- 它對將輸出傳遞到下一個時間步的時間有決定權。
LSTM 的強大在於它能只基於當前的輸入就決定以上所有的值。看看下方的圖表:
當前時間步的輸入訊號 x(t) 決定了以上 3 個值。輸入門決定了第一個值,忘記門決定了第二個值,輸出門決定了第三個值。這是由我們的大腦工作方式所啟發的,可以處理輸入中的突然的情景變化。
8—Skip-gram
詞嵌入模型的目標是為每一個詞彙項學習一個高維密集表徵,其中嵌入向量的相似表示相關詞的語義或句法的相似。skip-gram 是一種學習詞嵌入演算法的模型。
skip-gram 模型(和很多其它詞嵌入模型)背後的主要思想是:如果兩個詞彙項有相似的上下文,則它們是相似的。
換種說法,假設你有一個句子,比如「cats are mammals」,如果用「dogs」替換「cats」,該句子仍然是有意義的。因此在這個例子中,「dogs」和「cats」有相似的上下文(即,「are mammals」)。
居於上述的假設,我們可以考慮一個上下文視窗,即一個包含 k 個連續項的視窗。然後我們應該跳過一些單詞以學習能得到除跳過項外其它所有的項的神經網路,並用該神經網路嘗試預測跳過的項。如果兩個詞在大型語料庫中共享相似的上下文,那麼這些嵌入向量將有非常相近的向量。
9—連續詞袋模型
在自然語言處理中,我們希望學習將文件中每一個單詞表示為一個數值向量,並使得出現在相似上下文中的單詞有非常相似或相近的向量。在連續詞袋模型(CBOW)中,我們的目標是能利用特定詞的上下文而預測該特定詞出現的機率。
我們可以透過在大型語料庫中抽取大量語句而做到這一點。每當模型看到一個單詞時,我們就會抽取該特定單詞周圍出現的上下文單詞。然後將這些抽取的上下文單詞輸入到一個神經網路以在上下文出現的條件下預測中心詞的機率。
當我們有成千上萬個上下文單詞與中心詞,我們就有了訓練神經網路的資料集樣本。在訓練神經網路中,最後經過編碼的隱藏層輸出特定單詞的嵌入表達。這種表達就正是相似的上下文擁有相似的詞向量,也正好可以用這樣一個向量表徵一個單詞的意思。
10—遷移學習
現在讓我們考慮影像到底如何如何流經卷積神經網路的,這有助於我們將一般 CNN 學習到的知識遷移到其它影像識別任務。假設我們有一張影像,我們將其投入到第一個卷積層會得到一個畫素組合的輸出,它們可能是一些識別的邊緣。如果我們再次使用卷積,就能得到這些邊和線的組合而得到一個簡單的圖形輪廓。這樣反覆地卷積最後就能層級地尋找特定的模式或影像。因此,最後一層就會組合前面抽象的特徵尋找一個非常特定的模式,如果我們的卷積網路是在 ImageNet 上訓練的,那麼最後一層將組合前面抽象特徵識別特定的 1000 個類別。如果我們將最後一層替換為我們希望識別的類別,那麼它就能很高效地訓練與識別。
深度卷積網路每一個層會構建出越來越高階的特徵表徵方式,最後幾層往往是專門針對我們饋送到網路中的資料,因此早期層所獲得的特徵更為通用。
遷移學習就是在我們已訓練過的 CNN 模型進行修正而得到的。我們一般會切除最後一層,然後再使用新的資料重新訓練新建的最後一個分類層。這一過程也可以解釋為使用高階特徵重新組合為我們需要識別的新目標。這樣,訓練時間和資料都會大大減小,我們只需要重新訓練最後一層就完成了整個模型的訓練。
深度學習非常注重技術,且很多技術都沒有太多具體的解釋或理論推導,但大多數實驗結果都證明它們是有效的。因此也許從基礎上理解這些技術是我們後面需要完成的事情。