1. 程式人生 > >AI必知的十大深度學習演算法

AI必知的十大深度學習演算法

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

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

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

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

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

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

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

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

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

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

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

  • 迴圈神經網路(Recurrent Neural Networks)

  • 遞迴神經網路 (Recursive Neural Networks)

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

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

迴圈神經網路:基本上是在時間上進行擴充套件的標準神經網路,因為邊進入下一個時間步,而不是在同一時間步進入下一個層。設計RNN主要是為了識別序列,例如語音訊號或者文字。它裡面的迴圈意味著網路中存在短暫的記憶。

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

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

1、反向傳播

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


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

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

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

2、隨機梯度下降

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

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

數學化的理解就是:

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

梯度下降法:

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

3、學習率衰減

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

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

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

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

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

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

4、dropout

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

  • 費時;

  • 容易過擬合

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

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

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

5、max pooling

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

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

6、批標準化

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

權重問題:

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

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

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

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

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

7、long short-term memory

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

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

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

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

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

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

8、skip-gram

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

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

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

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

9、連續詞袋

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

 

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

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

10、遷移學習

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

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

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

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