做AI必須要知道的十種深度學習方法

 2017-11-30 11:22:00.0

按:不管是AI也好,其他學科也好,學習、研究的過程中不斷反思學科的歷史,總結學科的發展現狀,找出最重要的理念,總能讓人能「吾道一以貫之」。軟件工程師James Le近期根據他研究的經驗總結出了AI研究必須要知道的十種深度學習方法,非常具有啓發性。我們編譯如下。

The 10 Deep Learning Methods AI Practitioners Need to Apply

人們對機器學習的興趣在過去十年經歷了爆炸式的發展。計算機科學項目中、業界會議中、媒體報道中,你都能夠看到機器學習的影子。但是似乎所有關於機器學習的討論中,人們常常會把AI能做什麼和他們希望AI能做什麼混爲一談。

從根本上來講,機器學習其實就是使用算法從原始數據中提取信息,並以某種類型的模型表示出來;然後我們使用這個模型來推斷我們尚未建模的其他數據。

神經網絡作爲機器學習的一類模型,它們已經存在了至少50年。神經網絡的基本單元是節點,大致上模仿了哺乳動物大腦中的生物神經元的節點;節點之間的鏈接(也是模仿生物大腦)隨着時間的推移(訓練)而演化。

在上世紀八十年代中期和九十年代早期,許多重要的神經網絡構架都已經做出了,不過要想獲得好的結果還需要足夠強大的計算能力和大體量的數據集,這些當時在當時很不理想,所以也導致人們對機器學習的熱情逐漸冷淡了下來。在21世紀初,計算機的計算能力呈現了指數級的增長——業界見證了計算機技術的「寒武紀大爆發」,這在之前幾乎是不可想象的。深度學習作爲這個領域中一個重要的架構,在計算能力爆發式增長的十年中,贏得了許多重要的機器學習競賽。這個紅利的熱度直到今年仍未降溫;今天,我們看到在機器學習的每個角落裏都會提到深度學習。

爲了更深入地瞭解這些,我參加了一門「深度學習」課程,並開發了一個圖像識別的神經網絡以及基於循環神經網絡(RNN)和長短項記憶(LSTM)的自然語言處理。可以去我的Github倉庫中查看這些代碼:

https://github.com/khanhnamle1994/deep-learning

最近,我也開始閱讀一些深度學習方面的學術論文。下面這些是我收集到的幾篇對深度學習領域的發展有重大影響的幾篇論文:

1、Gradient-Based Learning Applied to Document Recognition (1998)

意義:向機器學習世界引進了卷積神經網絡

作者:Yann LeCun, Leon Bottou, Yoshua Bengio, and Patrick Haffner

2、Deep Boltzmann Machines (2009)

意義:爲玻爾茲曼機提出了一種新的學習算法,其中包含許多隱藏變量層。

作者:Ruslan Salakhutdinov, Geoffrey Hinton

3、Building High-Level Features Using Large-Scale Unsupervised Learning (2012)

意義:解決了僅從未標記的數據構建高層次、特定類別的特徵檢測器的問題。

作者:Quoc V. Le,Marc’Aurelio Ranzato,Rajat Monga,Matthieu Devin,Kai Chen,Greg S. Corrado,Jeff Dean,Andrew Y. Ng

4、DeCAF — A Deep Convolutional Activation Feature for Generic Visual Recognition (2013)

意義:釋放了一個深度卷積激活特徵的開源實現——DeCAF,以及所有相關的網絡參數,使視覺研究人員能夠深入地在一系列視覺概念學習範例中進行實驗。

作者:Jeff Donahue,Yangqing Jia,Oriol Vinyals,Judy Hoffman,Ning Zhang,Eric Tzeng,Trevor Darrell

5、Playing Atari with Deep Reinforcement Learning (2016)

意義:提供了第一個可以使用強化學習從高維感官輸入中直接學習控制策略的深度學習模型。

作者:Volodymyr Mnih,Koray Kavukcuoglu,David Silver,Alex Graves,Ioannis Antonoglou,Daan Wierstra,Martin Riedmiller(DeepMind 團隊)

在這些學習和研究中,我發現大量非常有意思的知識點。在這裏我將分享十個深度學習的方法,AI工程師可能會將這些應用到他們的機器學習問題當中。

不過,首先先讓我們來定義一下什麼是「深度學習」。對很多人來說,給「深度學習」下一個定義確實很有挑戰,因爲在過去的十年中,它的形式已經慢慢地發生了很大的變化。

先來在視覺上感受一下「深度學習」的地位。下圖是AI、機器學習和深度學習三個概念的一個關係圖。

做AI必須要知道的十種深度學習方法

AI的領域要相對較廣泛,機器學習是AI的一個子領域,而深度學習是機器學習領域中的一個子集。

深度學習網絡與「典型」的前饋多層網絡之間是有一些區別的,如下:

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

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

  • 深度學習網絡需要用強大的計算能力來訓練

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

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

  • 無監督預訓練網絡(Unsupervised Pre-trained Networks)

  • 卷積神經網絡(Convolutional Neural Networks)

  • 循環神經網絡(Recurrent Neural Networks)

  • 遞歸神經網絡 (Recursive Neural Networks)

在這篇文章中,我主要對後三個框架比較感興趣。

卷積神經網絡 基本上就是用共享權重在空間中進行擴展的標準神經網絡。設計CNN主要是爲了通過內部卷積來識別圖片,內部卷積可以看到待識別物體的邊。

循環神經網絡 基本上是在時間上進行擴展的標準神經網絡,因爲邊進入下一個時間步,而不是在同一時間步進入下一個層。設計RNN主要是爲了識別序列,例如語音信號或者文本。它裏面的循環意味着網絡中存在短暫的記憶。

遞歸神經網絡 更類似於分層網絡,其中輸入序列沒有真正的時間面,而是輸入必須以樹狀方式分層處理。

以下10種方法可以應用於所有這些體系結構。

1、反向傳播

反向傳播是「誤差反向傳播」的簡稱,它是一種計算函數(在神經網絡中以函數形式存在)偏微分的方法。當你要用一個基於梯度的方法來解決一個最優問題時(注意梯度下降只是解決這類問題的一種方法),你希望在每一次迭代中計算函數梯度。

 做AI必須要知道的十種深度學習方法

對於神經網絡而言,目標函數具有合成的形式。那麼如何計算梯度呢?一般情況下有兩種常見的方法:

1)微分分析法。當你知道這個函數的形式時,你只需要用鏈式法則計算導數即可;

2)用有限差分方法來近似微分。這種方法的計算量很大,因爲函數評估的數量是O(N),其中N是參數的數量。與微分分析法相比,這是比較昂貴的。不過,有限差分通常在調試時驗證後端實現。

2、隨機梯度下降

一個直觀理解梯度下降的方法是去想象一條溯源山頂的河流。這條河流會沿着山勢梯度的方向流向山麓下的最低點。

 做AI必須要知道的十種深度學習方法

如果讓人來走,可能就不一樣了,你可能會先隨便選一個方向,然後沿着這個方向的梯度向下走;過一會兒再隨機換一個方向向下走;最後你發現自己差不多也到了谷底了。

數學化的理解就是:

隨機梯度下降主要用來求解類似於如下求和形式的優化問題:

做AI必須要知道的十種深度學習方法

梯度下降法:

做AI必須要知道的十種深度學習方法

當n很大時,每次迭代計算所有的梯度會非常耗時。
隨機梯度下降的想法就是每次在Delta f_i 中隨機選取一個計算代替上面的Delta f_i,以這個隨機選取的方向作爲下降的方向。這樣的方法反而比梯度下降能夠更快地到達(局部)最優解。

3、學習率衰減

在訓練模型的時候,通常會遇到這種情況:我們平衡模型的訓練速度和損失(loss)後選擇了相對合適的學習率(learning rate),但是訓練集的損失下降到一定的程度後就不在下降了,比如training loss一直在0.7和0.9之間來回震盪,不能進一步下降。如下圖所示:

做AI必須要知道的十種深度學習方法


遇到這種情況通常可以通過適當降低學習率(learning rate)來實現。但是,降低學習率又會延長訓練所需的時間。

學習率衰減(learning rate decay)就是一種可以平衡這兩者之間矛盾的解決方案。學習率衰減的基本思想是:學習率隨着訓練的進行逐漸衰減。

學習率衰減基本有兩種實現方法:

  • 線性衰減。例如:每過5個epochs學習率減半;

  • 指數衰減。例如:每過5個epochs將學習率乘以0.1。

4、dropout

在當前的大規模神經網絡中有兩個缺點:

  • 費時;

  • 容易過擬合

Dropout 可以很好地解決這個問題。Dropout說的簡單一點就是在前向傳導的時候,讓某個神經元的激活值以一定的概率p停止工作,示意圖如下:

 做AI必須要知道的十種深度學習方法

每次做完dropout,相當於從原始的網絡中找到一個更瘦的網絡。

Hinton在其論文中做了這樣的類比,無性繁殖可以保留大段的優秀基因,而有性繁殖則將基因隨機拆了又拆,破壞了大段基因的聯合適應性;但是自然選擇了有性繁殖,物競天擇,適者生存,可見有性繁殖的強大。dropout 也能達到同樣的效果,它強迫一個神經單元,和隨機挑選出來的其他神經單元共同工作,消除減弱了神經元節點間的聯合適應性,增強了泛化能力。

5、max pooling

池化(Pooling)是卷積神經網絡中另一個重要的概念,它實際上是一種形式的向下採樣。有多種不同形式的非線性池化函數,而其中「最大池化(Max pooling)」是最爲常見的。它是將輸入的圖像劃分爲若干個矩形區域,對每個子區域輸出最大值。

做AI必須要知道的十種深度學習方法 

直覺上,這種機制能夠有效地原因在於,在發現一個特徵之後,它的精確位置遠不及它和其他特徵的相對位置的關係重要。池化層會不斷地減小數據的空間大小,因此參數的數量和計算量也會下降,這在一定程度上也控制了過擬合。通常來說,CNN的卷積層之間都會週期性地插入池化層。

6、批標準化

包括深度網絡在內的神經網絡需要仔細調整權重初始化和學習參數。批標準化使這些變得輕鬆許多。

權重問題:

  • 無論權重的初始化如何,是隨機的還是經驗性的選擇,它們離學習權重都會很遠。考慮一個小批量,初期在所需的特徵激活方面會有很多異常值。

  • 深層神經網絡本身是病態的,初始層中的微小擾動都會導致後面層的非常大的變化。

在反向傳播過程中,這些現象會導致梯度彌散。這就意味着在學習權重產生所需要的輸出前,必須對梯度的異常值進行補償,這將導致需要額外的時段來收斂。

做AI必須要知道的十種深度學習方法

批量歸一化使這些梯度從分散到正常值並在小批量範圍內流向共同目標(通過歸一化)。

學習率問題:一般來說,學習率需要保持較低的值,使得只有一小部分的梯度來校正權重,原因是要使異常激活的梯度不影響已學習到的激活。通過批量標準化,可以減少這些異常激活,因此也就可以使用更高的學習率來加速學習過程。

7、long short-term memory

LSTM網絡具有以下三個方面,使其與循環神經網絡中的常見神經元不同:

1)它能夠決定何時讓輸入進入神經元;

2)它能夠決定何時記住上一個時間步中計算的內容;

3)它決定何時讓輸出傳遞到下一個時間步。

LSTM的美妙之處在於它能夠根據當前的輸入本身來決定所有這些。 所以你看下面的圖表:

做AI必須要知道的十種深度學習方法

當前時間的輸入信號x(t)決定所有上述3個點。 輸入門決定點1,遺忘門決定點2,輸出門決定點3。任何一條輸入都能夠採取所有這三個決定。這種設計其實是受到了我們大腦如何工作的啓發,並且可以基於輸入來處理突然的上下文切換。

8、skip-gram

詞嵌入模型的目標是爲每個詞項學習一個高維密集表示,其中嵌入向量之間的相似性顯示了相應詞之間的語義或句法相似性。 Skip-gram是一個學習詞嵌入算法的模型。

skip-gram模型(以及許多其他的詞語嵌入模型)背後的主要思想如下:兩個詞項相似,如果它們共享相似的上下文。

 做AI必須要知道的十種深度學習方法

換句話說,假設你有一個句子,例如「貓是哺乳動物」;如果你用「狗」而不是「貓」,這個句子還是一個有意義的句子。因此在這個例子中,「狗」和「貓」可以共享相同的上下文(即「是哺乳動物」)。

基於上述假設,你可以考慮一個上下文窗口(一個包含k個連續項的窗口),然後你跳過其中一個單詞,試着去學習一個能夠得到除跳過項外的所有項的神經網絡,並預測跳過的這個項。如果兩個詞在一個大語料庫中反覆共享相似的語境,則這些詞的嵌入向量將具有相近的向量。

9、連續詞袋

在自然語言處理問題中,我們希望學習將文檔中的每個單詞表示爲一個數字的向量,使得出現在相似的上下文中的單詞具有彼此接近的向量。在連續的單詞模型中,目標是能夠使用圍繞特定單詞的上下文並預測特定單詞。

 做AI必須要知道的十種深度學習方法

我們通過在一個大的語料庫中採取大量的句子來做到這一點,每當我們看到一個單詞時,我們就提取周圍的單詞。 然後,我們將上下文單詞輸入到一個神經網絡,並預測在這個上下文中間的單詞。

當我們有成千上萬個這樣的上下文單詞和中間詞時,我們就有一個神經網絡數據集的實例。 我們訓練神經網絡,最後編碼的隱藏層輸出表示了特定單詞的嵌入。 恰巧,當我們對大量的句子進行訓練時,類似語境中的單詞得到相似的向量。

10、遷移學習

讓我們想一下如何在CNN中處理一張圖片。假設有一張圖片,你對它進行卷積處理,然後你得到的輸出是像素的組合,我們姑且稱之爲「邊」吧。我們再次使用卷積,這時候你得到的輸出將是邊的組合,我們稱之爲「線」。如果再次使用卷積,那麼你將得到線的組合,等等。

每一層都是在尋找相應的特定模式。你的神經網絡最後一層一般會給出非常特定的模式。也許你在處理ImageNet,你的網絡最後一層可能是在找孩子、狗或飛機或別的任何東西。如果你向前兩層看,網絡可能是在找眼睛、耳朵、嘴巴或者輪子。

做AI必須要知道的十種深度學習方法

深度卷積神經網絡中的每一層的深入都是在構建越來越高層次的特徵表示。最後兩層會產生你輸入模型的數據中的特定模式。換句話說,早期的層提取的特徵則廣泛得多,在提取的大量的類中有很多簡單的模式。

遷移學習就是當你用一個數據集訓練CNN時,砍掉最後的一(些)層,再用另一個不同的數據集重新訓練最後一(些)層的模型。直觀地說,你在重新訓練模型來識別不同的高級層次特徵。作爲結果,訓練時間大幅減少。所以當你沒有足夠的數據或者訓練的資源時,遷移學習是非常有用的一個工具。


這篇文章只是展示了這些方法的一般概述。我建議閱讀下面這些文章以獲得對這些概念更詳細的解釋:

深度學習非常注重技術,而對每一個新的想法卻沒有太多具體的解釋。大多數新的idea只是用實驗結果來證明它們的工作。深度學習就像玩樂高,掌握它有一定的挑戰性,但是入門還是很容易的。

via towardsdatascience

文章來源:雷鋒網