AI 從業者都會用到的 10 個深度學習方法
編譯:Python開發者-MentosZ英文:James Le
過去十年里,人們對機器學習的興趣經歷了爆炸式的整長。我們幾乎每天都可以在計算機程序、行業會議和媒體上看到機器學習的身影。很多關於機器學習的討論都混淆了「機器學習能做什麼」和「人類希望機器學習能做什麼」。從根本上講,機器學習是運用演算法從原始數據中提取信息,並用某種類型的模型進行表示,然後使用該模型對一些尚未用模型表示的其他數據來進行推斷。
神經網路就是機器學習各類模型中的其中一類,並且已經存在了至少50年。神經網路的基本單位是節點,它的想法大致來源於哺乳動物大腦中的生物神經元。生物大腦中的神經元節點之間的鏈接是隨著時間推移不斷演化的,而神經網路中的神經元節點鏈接也借鑒了這一點,會不斷演化(通過「訓練」的方式)。
神經網路中很多重要框架的建立和改進都完成於二十世紀八十年代中期和九十年代初期。然而,要想獲得較好結果需要大量的時間和數據,由於當時計算機的能力有限,神經網路的發展受到了一定的阻礙,人們的關注度也隨之下降。二十一世紀初期,計算機的運算能力呈指數級增長,業界也見證了計算機技術發展的「寒武紀爆炸」——這在之前都是無法想像的。深度學習以一個競爭者的姿態出現,在計算能力爆炸式增長的十年里脫穎而出,並且贏得了許多重要的機器學習競賽。其熱度在2017年仍然不減。如今,在機器學習的出現的地方我們都能看到深度學習的身影。
為了跟上時代的潮流,我參加了 Udacity 的「深度學習」課程。這是一個很好的入門課程,包括深度學習的動機和在 TensorFlow 中針對複雜的和/或大規模數據集進行學習的智能系統的設計。 對於課程作業,我使用和開發了用於圖像識別的卷積神經網路,帶有嵌入的自然語言處理以及運用遞歸神經網路/長期短期記憶的基於字元的文本生成程序。所有 Jupyter Notebook 的代碼都在我的GitHub。
下圖是課程作業的一個結果,詞向量的 t-SNE 投影,通過相似性進行聚類。
最近,我開始閱讀關於深度學習的學術論文。根據我的個人研究,以下文章對這個領域的發展產生了巨大的影響:
NYU 1998 年的文章《基於梯度學習的文檔識別》(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 個用於解決機器學習問題的強大的深度學習方法。但是,我們首先需要定義什麼是深度學習。
如何定義深度學習是很多人面臨的一個挑戰,因為它的形式在過去的十年中已經慢慢地發生了改變。下圖直觀地展示了人工智慧,機器學習和深度學習之間的關係。
人工智慧領域廣泛,存在時間較長。深度學習是機器學習領域的一個子集,而機器學習是人工智慧領域的一個子集。一般將深度學習網路與「典型」前饋多層網路從如下方面進行區分:
深度學習網路具有比前饋網路更多的神經元
深度學習網路連接層之間的方式更複雜
深度學習網路需要有像「寒武紀大爆發」式的計算能力進行訓練
深度學習網路能夠自動提取特徵
上文提到的「更多的神經元」是指近年來神經元的數量不斷增加,就可以用更複雜的模型來表示。層也從多層網路中每一層完全連接,發展到卷積神經網路中神經元片段的局部連接,以及與遞歸神經網路中的同一神經元的循環連接(與前一層的連接除外)。
因此,深度學習可以被定義為以下四個基本網路框架中具有大量參數和層數的神經網路:
無監督預訓練網路
卷積神經網路
循環神經網路
遞歸神經網路
在這篇文章中,我主要討論三個框架:
卷積神經網路(Convolutional Neural Network)基本上就是用共享權重在空間中進行擴展的標準神經網路。卷積神經網路主要是通過內部卷積來識別圖片,內部卷積可以看到圖像上識別對象的邊緣。
循環神經網路(Recurrent Neural Network)基本上就是在時間上進行擴展的標準神經網路,它提取進入下一時間步的邊沿,而不是在同一時間進入下一層。循環神經網路主要是為了識別序列,例如語音信號或者文本。其內部的循環意味著網路中存在短期記憶。
遞歸神經網路(Recursive Neural Network)更類似於分層網路,其中輸入序列沒有真正的時間面,但是必須以樹狀方式分層處理。以下10種方法均可應用於這些框架。
1、反向傳播
反向傳播是一種計算函數偏導數(或梯度)的簡單方法,它的形式是函數組合(如神經網路)。在使用基於梯度的方法求解最優化問題(梯度下降只是其中之一)時,需要在每次迭代中計算函數梯度。
對於一個神經網路,其目標函數是組合形式。那麼應該如何計算梯度呢?有2種常規方法:(i)微分解析法。函數形式已知的情況下,只需要用鏈式法則(基礎微積分)計算導數。(ii)有限差分法近似微分。這種方法運算量很大,因為函數評估的數量級是 O(N),其中 N 是參數的個數。與微分解析法相比,這種方法運算量更大,但是在調試時,通常會使用有限差分驗證反向傳播的效果。
2、隨機梯度下降梯度下降的一個直觀理解就是想像一條源自山頂的河流。這條河流會沿著山勢的方向流向山麓的最低點,而這也正是梯度下降法的目標。
我們所期望的最理想的情況就是河流在到達最終目的地(最低點)之前不會停下。在機器學習中,這等價於我們已經找到了從初始點(山頂)開始行走的全局最小值(或最優值)。然而,可能由於地形原因,河流的路徑中會出現很多坑窪,而這會使得河流停滯不前。在機器學習術語中,這種坑窪稱為局部最優解,而這不是我們想要的結果。有很多方法可以解決局部最優問題(這裡不再討論)。
因此,由於地形(即函數性質)的限制,梯度下降演算法很容易卡在局部最小值。但是,如果能夠找到一個特殊的山地形狀(比如碗狀,術語稱作凸函數),那麼演算法總是能夠找到最優點。在進行最優化時,遇到這些特殊的地形(凸函數)自然是最好的。另外,山頂初始位置(即函數的初始值)不同,最終到達山底的路徑也完全不同。同樣,不同的流速(即梯度下降演算法的學習速率或步長)也會導致到達目的地的方式有差異。是否會陷入或避開一個坑窪(局部最小值),都會受到這兩個因素的影響。
3、學習率衰減
調整隨機梯度下降優化演算法的學習速率可以提升性能並減少訓練時間。這被稱作學習率退火或自適應學習率。訓練中最簡單也最常用的學習率自適應方法就是逐漸降低學習率。在訓練初期使用較大的學習率,可以對學習率進行大幅調整;在訓練後期,降低學習率,以一個較小的速率更新權重。這種方法在早期可以快速學習獲得較好的權重,並在後期對權重進行微調。
兩個流行而簡單的學習率衰減方法如下:
線性地逐步降低學習率
在特定時點大幅降低學習率
4、Dropout
擁有大量參數的深度神經網路是非常強大的機器學習系統。然而,在這樣的網路中,過擬合是一個很嚴重的問題。而且大型網路的運行速度很慢,這就使得在測試階段通過結合多個不同的大型神經網路的預測來解決過擬合問題是很困難的。Dropout 方法可以解決這個問題。
其主要思想是,在訓練過程中隨機地從神經網路中刪除單元(以及相應的連接),這樣可以防止單元間的過度適應。訓練過程中,在指數級不同「稀疏度」的網路中剔除樣本。在測試階段,很容易通過使用具有較小權重的單解開網路(single untwined network),將這些稀疏網路的預測結果求平均來進行近似。這能有效地避免過擬合,並且相對於其他正則化方法能得到更大的性能提升。Dropout 技術已經被證明在計算機視覺、語音識別、文本分類和計算生物學等領域的有監督學習任務中能提升神經網路的性能,並在多個基準數據集中達到最優秀的效果。
5、最大池最大池是一種基於樣本的離散化方法。目標是對輸入表徵(圖像、隱藏層輸出矩陣等)進行下採樣,降低維度並且允許對子區域中的特徵進行假設。
通過提供表徵的抽象形式,這種方法可以在某種程度上解決過擬合問題。同樣,它也通過減少學習參數的數目以及提供基本的內部表徵轉換不變性來減少計算量。最大池是通過將最大過濾器應用於通常不重疊的初始表徵子區域來完成的。
6、批量標準化當然,包括深度網路在內的神經網路需要仔細調整權重初始值和學習參數。批量標準化能夠使這個過程更加簡單。
權重問題:
無論怎麼設置權重初始值,比如隨機或按經驗選擇,初始權重和學習後的權重差別都很大。考慮一小批權重,在最初時,對於所需的特徵激活可能會有很多異常值。
深度神經網路本身就具有病態性,即初始層的微小變化就會導致後一層的巨大變化。
在反向傳播過程中,這些現象會導致梯度的偏移,這就意味著在學習權重以產生所需要的輸出之前,梯度必須補償異常值。而這將導致需要額外的時間才能收斂。
批量標準化將這些梯度從異常值調整為正常值,並在小批量範圍內(通過標準化)使其向共同的目標收斂。
學習率問題:通常來說,學習率都比較小,這樣只有一小部分的梯度用來校正權重,因為異常激活的梯度不應該影響已經學習好的權重。通過批量標準化,這些異常激活的可能性會被降低,就可以使用更大的學習率加速學習過程。
7、長短期記憶長短期記憶網路(LSTM)和其他遞歸神經網路中的神經元有以下三個不同點:
它可以決定何時讓輸入進入神經元
它可以決定何時記住上一個時間步中計算的內容
它可以決定何時讓輸出傳遞到下一個時間戳
LSTM的強大之處在於它可以只基於當前的輸入就決定上述所有。請看下方的圖表:
當前時間戳的輸入信號 x(t) 決定了上述三點。輸入門(input gate)決定了第一點,遺忘門(forget gate)決定了第二點,輸出門(output gate)決定了第三點。只依賴輸入就可以完成這三項決定。這是受到大腦工作機制的啟發,大腦可以基於輸入來處理突然的上下文語境切換。
8、Skip-gram詞嵌入模型的目的是針對每個詞學習一個高維密集表徵,其中嵌入向量之間的相似性顯示了相應詞語之間語義或句法的相似性。Skip-gram 是一種學習詞嵌入演算法的模型。
skip-gram 模型(包括很多其它詞嵌入模型)背後的主要思想是:如果兩個辭彙項有相似的上下文,則它們是相似的。
換句話說,假設有一個句子,比如「cats are mammals」,如果用「dogs」替換「cats」,該句子仍然是有意義的。因此在這個例子中,「dogs」和「cats」有相似的上下文(即「are mammals」)。
基於以上假設,我們可以考慮一個上下文窗口(包含 K 個連續項)。然後跳過其中一個詞,試著學習一個可以得到除了跳過的這個詞以外所有詞項,並且可以預測跳過的詞的神經網路。因此,如果兩個詞在一個大語料庫中多次具有相似的上下文,那麼這些詞的嵌入向量將會是相似的。
9、連續詞袋模型在自然語言處理中,我們希望將文檔中的每一個單詞表示為一個數值向量,使得出現在相似上下文中的單詞具有相似或相近的向量表示。在連續詞袋模型中,我們的目標是利用一個特定單詞的上下文,預測該詞。
首先在一個大的語料庫中抽取大量的句子,每看到一個單詞,同時抽取它的上下文。然後我們將上下文單詞輸入到一個神經網路,並預測在這個上下文中心的單詞。
當我們有成千上萬個這樣的上下文辭彙和中心詞時,我們就得到了一個神經網路數據集的實例。然後訓練這個神經網路,在經過編碼的隱藏層的最終輸出中,我們得到了特定單詞的嵌入式表達。當我們對大量的句子進行訓練時也能發現,類似上下文中的單詞都可以得到相似的向量。
10、遷移學習我們來考慮一下卷積神經網路是如何處理圖像的。假設有一張圖像,對其應用卷積,並得到像素的組合作為輸出。假設這些輸出是邊緣,再次應用卷積,那麼現在的輸出將是邊緣或線的組合。然後再次應用卷積,此時的輸出將是線的組合,以此類推。可以把它想像成是在每一層尋找一個特定的模式。神經網路的最後一層通常會變得非常特別。如果基於 ImageNet 進行訓練,那麼神經網路的最後一層或許就是在尋找兒童、狗或者飛機之類的完整圖像。再往後倒退幾層,可能會看到神經網路在尋找眼睛、耳朵、嘴巴或者輪子等組成部分。
深度卷積神經網路中的每一層逐步建立起越來越高層次的特徵表徵,最後幾層通常是專門針對輸入數據。另一方面,前面的層則更為通用,主要用來在一大類圖片中有找到許多簡單的模式。
遷移學習就是在一個數據集上訓練卷積神經網路時,去掉最後一層,在不同的數據集上重新訓練模型的最後一層。直觀來講,就是重新訓練模型以識別不同的高級特徵。因此,訓練時間會減少很多,所以在沒有足夠的數據或者需要太多的資源時,遷移學習是一個很有用的工具。
本文只是簡單地對這些方法進行了概述,若想深入理解,建議繼續閱讀以下文章:
Andrew Beam的「Deep Learning 101」
Andrey Kurenkov的「A Brief History of Neural Nets and Deep Learning」
Adit Deshpande 的「A Beginner』s Guide to Understanding Convolutional Neural Networks」
Chris Olah:「Understanding LSTM Networks」
Algobean:「Artificial Neural Networks」
Andrej Karpathy:「The Unreasonable Effectiveness of Recurrent Neural Networks」
深度學習是非常注重技術實踐的。本文對每個新想法都沒有太多具體的解釋。大多數新想法的提出都會附帶實驗結果以證明它們的可行性。學習深度學習就像玩樂高,玩好樂高和掌握其他藝術一樣具有挑戰性,但是入門就相對容易很多的。
看完本文有收穫?請轉發分享給更多人
關注「Python開發者」,提升Python技能
推薦閱讀:
※學習奇門遁甲 - - - 基礎知識 五 八神
※無人駕駛、深度學習、人工智慧與社會,Mobiley CTO的演講
※飯後5個習慣會「助攻」長壽,一個不落的人值得學習!
※英語學習網站詳解
※火鍋餐廳標準服務程序學習資料