目前,深度學習(Deep Learning,簡稱DL)在算法領域可謂是大紅大紫,如今不僅是互聯網、人工智能,生活中的各大領域都能反映出深度學習引領的巨大變革。要學習深度學習,那麼首先要熟悉神經網絡(Neural Networks,簡稱NN)的一些基本概念。固然,這裏所說的神經網絡不是生物學的神經網絡,咱們將其稱之爲人工神經網絡(Artificial Neural Networks,簡稱ANN)貌似更爲合理。神經網絡最先是人工智能領域的一種算法或者說是模型,目前神經網絡已經發展成爲一類多學科交叉的學科領域,它也隨着深度學習取得的進展從新受到重視和推崇。算法
爲何說是「從新」呢?其實,神經網絡最爲一種算法模型很早就已經開始研究了,可是在取得一些進展後,神經網絡的研究陷入了一段很長時間的低潮期,後來隨着Hinton在深度學習上取得的進展,神經網絡又再次受到人們的重視。本文就以神經網絡爲主,着重總結一些相關的基礎知識,而後在此基礎上引出深度學習的概念,若有書寫不當的地方,還請你們評批指正。數組
神經元是神經網絡中最基本的結構,也能夠說是神經網絡的基本單元,它的設計靈感徹底來源於生物學上神經元的信息傳播機制。咱們學過生物的同窗都知道,神經元有兩種狀態:興奮和抑制。通常狀況下,大多數的神經元是處於抑制狀態,可是一旦某個神經元收到刺激,致使它的電位超過一個閾值,那麼這個神經元就會被激活,處於「興奮」狀態,進而向其餘的神經元傳播化學物質(其實就是信息)。網絡
下圖爲生物學上的神經元結構示意圖:機器學習
1943年,McCulloch和Pitts將上圖的神經元結構用一種簡單的模型進行了表示,構成了一種人工神經元模型,也就是咱們如今常常用到的「M-P神經元模型」,以下圖所示:函數
從上圖M-P神經元模型能夠看出,神經元的輸出學習
$y = f(\sum_{i=1}^{n}w_{i}x_{i} - \theta)$測試
其中$\theta$爲咱們以前提到的神經元的激活閾值,函數$f(·)$也被稱爲是激活函數。如上圖所示,函數$f(·)$能夠用一個階躍方程表示,大於閾值激活;不然則抑制。可是這樣有點太粗暴,由於階躍函數不光滑,不連續,不可導,所以咱們更經常使用的方法是用sigmoid函數來表示函數函數$f(·)$。優化
sigmoid函數的表達式和分佈圖以下所示:人工智能
$f(x) = \frac{1}{1+e^{-x}}$spa
感知機(perceptron)是由兩層神經元組成的結構,輸入層用於接受外界輸入信號,輸出層(也被稱爲是感知機的功能層)就是M-P神經元。下圖表示了一個輸入層具備三個神經元(分別表示爲$x_{0}$、$x_{1}$、$x_{2}$)的感知機結構:
根據上圖不難理解,感知機模型能夠由以下公式表示:
$y = f(wx + b)$
其中,$w$爲感知機輸入層到輸出層鏈接的權重,$b$表示輸出層的偏置。事實上,感知機是一種判別式的線性分類模型,能夠解決與、或、非這樣的簡單的線性可分(linearly separable)問題,線性可分問題的示意圖見下圖:
可是因爲它只有一層功能神經元,因此學習能力很是有限。事實證實,單層感知機沒法解決最簡單的非線性可分問題——異或問題(有想了解異或問題或者是感知機沒法解決異或問題證實的同窗請移步這裏《證:單層感知機不能表示異或邏輯》)。
關於感知機解決異或問題還有一段歷史值得咱們簡單去了解一下:感知器只能作簡單的線性分類任務。可是當時的人們熱情太過於高漲,並無人清醒的認識到這點。因而,當人工智能領域的巨擘Minsky指出這點時,事態就發生了變化。Minsky在1969年出版了一本叫《Perceptron》的書,裏面用詳細的數學證實了感知器的弱點,尤爲是感知器對XOR(異或)這樣的簡單分類任務都沒法解決。Minsky認爲,若是將計算層增長到兩層,計算量則過大,並且沒有有效的學習算法。因此,他認爲研究更深層的網絡是沒有價值的。因爲Minsky的巨大影響力以及書中呈現的悲觀態度,讓不少學者和實驗室紛紛放棄了神經網絡的研究。神經網絡的研究陷入了冰河期。這個時期又被稱爲「AI winter」。接近10年之後,對於兩層神經網絡的研究才帶來神經網絡的復甦。
咱們知道,咱們平常生活中不少問題,甚至說大多數問題都不是線性可分問題,那咱們要解決非線性可分問題該怎樣處理呢?這就是這部分咱們要引出的「多層」的概念。既然單層感知機解決不了非線性問題,那咱們就採用多層感知機,下圖就是一個兩層感知機解決異或問題的示意圖:
構建好上述網絡之後,經過訓練獲得最後的分類面以下:
因而可知,多層感知機能夠很好的解決非線性可分問題,咱們一般將多層感知機這樣的多層結構稱之爲是神經網絡。可是,正如Minsky以前所擔憂的,多層感知機雖然能夠在理論上能夠解決非線性問題,可是實際生活中問題的複雜性要遠不止異或問題這麼簡單,因此咱們每每要構建多層網絡,而對於多層神經網絡採用什麼樣的學習算法又是一項巨大的挑戰,以下圖所示的具備4層隱含層的網絡結構中至少有33個參數(不計偏置bias參數),咱們應該如何去肯定呢?
所謂神經網絡的訓練或者是學習,其主要目的在於經過學習算法獲得神經網絡解決指定問題所需的參數,這裏的參數包括各層神經元之間的鏈接權重以及偏置等。由於做爲算法的設計者(咱們),咱們一般是根據實際問題來構造出網絡結構,參數的肯定則須要神經網絡經過訓練樣本和學習算法來迭代找到最優參數組。
提及神經網絡的學習算法,不得不提其中最傑出、最成功的表明——偏差逆傳播(error BackPropagation,簡稱BP)算法。BP學習算法一般用在最爲普遍使用的多層前饋神經網絡中。
BP算法的主要流程能夠總結以下:
輸入:訓練集$D={(x_k, y_k)}_{k=1}^{m}$; 學習率;
過程:
1. 在(0, 1)範圍內隨機初始化網絡中全部鏈接權和閾值
2. repeat:
3. for all $(x_{k}, y_{k}) \in D$ do
4. 根據當前參數計算當前樣本的輸出;
5. 計算輸出層神經元的梯度項;
6. 計算隱層神經元的梯度項;
7. 更新鏈接權與閾值
8. end for
9. until 達到中止條件
輸出:鏈接權與閾值肯定的多層前饋神經網絡
備註:後續補充BP算法的公式推導。
神經網絡中有一類模型是爲網絡狀態定義一個「能量」,能量最小化時網絡達到理想狀態,而網絡的訓練就是在最小化這個能量函數。Boltzmann(玻爾茲曼)機就是基於能量的模型,其神經元分爲兩層:顯層和隱層。顯層用於表示數據的輸入和輸出,隱層則被理解爲數據的內在表達。Boltzmann機的神經元都是布爾型的,即只能取0、1值。標準的Boltzmann機是全鏈接的,也就是說各層內的神經元都是相互鏈接的,所以計算複雜度很高,並且難以用來解決實際問題。所以,咱們常用一種特殊的Boltzmann機——受限玻爾茲曼機(Restricted Boltzmann Mechine,簡稱RBM),它層內無鏈接,層間有鏈接,能夠看作是一個二部圖。下圖爲Boltzmann機和RBM的結構示意圖:
RBM經常用對比散度(Constrastive Divergence,簡稱CD)來進行訓練。
RBF(Radial Basis Function)徑向基函數網絡是一種單隱層前饋神經網絡,它使用徑向基函數做爲隱層神經元激活函數,而輸出層則是對隱層神經元輸出的線性組合。下圖爲一個RBF神經網絡示意圖:
訓練RBF網絡一般採用兩步:
1> 肯定神經元中心,經常使用的方式包括隨機採樣,聚類等;
2> 肯定神經網絡參數,經常使用算法爲BP算法。
ART(Adaptive Resonance Theory)自適應諧振理論網絡是競爭型學習的重要表明,該網絡由比較層、識別層、識別層閾值和重置模塊構成。ART比較好的緩解了競爭型學習中的「可塑性-穩定性窘境」(stability-plasticity dilemma),可塑性是指神經網絡要有學習新知識的能力,而穩定性則指的是神經網絡在學習新知識時要保持對舊知識的記憶。這就使得ART網絡具備一個很重要的優勢:可進行增量學習或在線學習。
SOM(Self-Organizing Map,自組織映射)網絡是一種競爭學習型的無監督神經網絡,它能將高維輸入數據映射到低維空間(一般爲二維),同事保持輸入數據在高維空間的拓撲結構,即將高維空間中類似的樣本點映射到網絡輸出層中的臨近神經元。下圖爲SOM網絡的結構示意圖:
咱們前面提到過,通常的神經網絡都是先指定好網絡結構,訓練的目的是利用訓練樣原本肯定合適的鏈接權、閾值等參數。與此不一樣的是,結構自適應網絡則將網絡結構也當作學習的目標之一,並但願在訓練過程當中找到最符合數據特色的網絡結構。
與前饋神經網絡不一樣,遞歸神經網絡(Recurrent Neural Networks,簡稱RNN)容許網絡中出現環形結構,從而可讓一些神經元的輸出反饋回來做爲輸入信號,這樣的結構與信息反饋過程,使得網絡在$t$時刻的輸出狀態不只與$t$時刻的輸入有關,還與$t-1$時刻的網絡狀態有關,從而能處理與時間有關的動態變化。
Elman網絡是最經常使用的遞歸神經網絡之一,其結構以下圖所示:
RNN通常的訓練算法採用推廣的BP算法。值得一提的是,RNN在(t+1)時刻網絡的結果O(t+1)是該時刻輸入和全部歷史共同做用的結果,這樣就達到了對時間序列建模的目的。所以,從某種意義上來說,RNN被視爲是時間深度上的深度學習也何嘗不對。
RNN在(t+1)時刻網絡的結果O(t+1)是該時刻輸入和全部歷史共同做用的結果,這麼講其實也不是很準確,由於「梯度發散」一樣也會發生在時間軸上,也就是說對於t時刻來講,它產生的梯度在時間軸上向歷史傳播幾層以後就消失了,根本沒法影響太遙遠的過去。所以,「全部的歷史」只是理想的狀況。在實際中,這種影響也就只能維持若干個時間戳而已。換句話說,後面時間步的錯誤信號,每每並不能回到足夠遠的過去,像更早的時間步同樣,去影響網絡,這使它很難以學習遠距離的影響。
爲了解決上述時間軸上的梯度發散,機器學習領域發展出了長短時記憶單元(Long-Short Term Memory,簡稱LSTM),經過門的開關實現時間上的記憶功能,並防止梯度發散。其實除了學習歷史信息,RNN和LSTM還能夠被設計成爲雙向結構,即雙向RNN、雙向LSTM,同時利用歷史和將來的信息。
深度學習指的是深度神經網絡模型,通常指網絡層數在三層或者三層以上的神經網絡結構。
理論上而言,參數越多的模型複雜度越高,「容量」也就越大,也就意味着它能完成更復雜的學習任務。就像前面多層感知機帶給咱們的啓示同樣,神經網絡的層數直接決定了它對現實的刻畫能力。可是在通常狀況下,複雜模型的訓練效率低,易陷入過擬合,所以難以受到人們的青睞。具體來說就是,隨着神經網絡層數的加深,優化函數愈來愈容易陷入局部最優解(即過擬合,在訓練樣本上有很好的擬合效果,可是在測試集上效果不好)。同時,不可忽略的一個問題是隨着網絡層數增長,「梯度消失」(或者說是梯度發散diverge)現象更加嚴重。咱們常用sigmoid函數做爲隱含層的功能神經元,對於幅度爲1的信號,在BP反向傳播梯度時,每傳遞一層,梯度衰減爲原來的0.25。層數一多,梯度指數衰減後低層基本接收不到有效的訓練信號。
爲了解決深層神經網絡的訓練問題,一種有效的手段是採起無監督逐層訓練(unsupervised layer-wise training),其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出做爲輸入,而本層隱節點的輸出做爲下一層隱節點的輸入,這被稱之爲「預訓練」(pre-training);在預訓練完成後,再對整個網絡進行「微調」(fine-tunning)訓練。好比Hinton在深度信念網絡(Deep Belief Networks,簡稱DBN)中,每層都是一個RBM,即整個網絡能夠被視爲是若干個RBM堆疊而成。在使用無監督訓練時,首先訓練第一層,這是關於訓練樣本的RBM模型,可按標準的RBM進行訓練;而後,將第一層預訓練號的隱節點視爲第二層的輸入節點,對第二層進行預訓練;... 各層預訓練完成後,再利用BP算法對整個網絡進行訓練。
事實上,「預訓練+微調」的訓練方式可被視爲是將大量參數分組,對每組先找到局部看起來較好的設置,而後再基於這些局部較優的結果聯合起來進行全局尋優。這樣就在利用了模型大量參數所提供的自由度的同時,有效地節省了訓練開銷。
另外一種節省訓練開銷的作法是進行「權共享」(weight sharing),即讓一組神經元使用相同的鏈接權,這個策略在卷積神經網絡(Convolutional Neural Networks,簡稱CNN)中發揮了重要做用。下圖爲一個CNN網絡示意圖:
CNN能夠用BP算法進行訓練,可是在訓練中,不管是卷積層仍是採樣層,其每組神經元(即上圖中的每個「平面」)都是用相同的鏈接權,從而大幅減小了須要訓練的參數數目。
1. 周志華《機器學習》
2. 知乎問答:http://www.zhihu.com/question/34681168