神經網絡:從神經元到深度學習

目錄

       神經元

       單層神經網絡

       兩層神經網絡

       多層神經網絡(深度學習)

       總結


神經元

1)生物上的神經元

一個神經元通常具有多個樹突,主要用來接受傳入信息;而軸突只有一條,軸突尾端有許多軸突末梢可以給其他多個神經元傳遞信息。軸突末梢跟其他神經元的樹突產生連接,從而傳遞信號。這個連接的位置在生物學上叫做“突觸”。

人腦中的神經元形狀可以用下圖做簡單的說明:

2)神經元模型

神經元模型是一個包含輸入,輸出與計算功能的模型。輸入可以類比爲神經元的樹突,而輸出可以類比爲神經元的軸突,計算則可以類比爲細胞核。

下圖是一個典型的神經元模型:包含有3個輸入,1個輸出,以及2個計算功能(注意中間的箭頭線。這些線稱爲“連接”。每個上有一個“權值”)。

如果我們將神經元圖中的所有變量用符號表示,並且寫出輸出的計算公式的話,就是下圖。

可見z是在輸入和權值的線性加權和疊加了一個函數g的值。在經典的MP模型裏,函數g是sgn函數,也就是取符號函數。這個函數當輸入大於0時,輸出1,否則輸出0。

3)解決的問題

神經元模型的使用可以這樣理解:

我們有一個數據,稱之爲樣本。樣本有四個屬性,其中三個屬性已知,一個屬性未知。我們需要做的就是通過三個已知屬性預測未知屬性。

具體辦法就是使用神經元的公式進行計算。三個已知屬性的值是a1,a2,a3,未知屬性的值是z。z可以通過公式計算出來。

這裏,已知的屬性稱之爲特徵,未知的屬性稱之爲目標。假設特徵與目標之間確實是線性關係,並且我們已經得到表示這個關係的權值w1,w2,w3。那麼,我們就可以通過神經元模型預測新樣本的目標。

單層神經網絡

1. 結構

對上面的神經元模型進行改進,“輸入”位置添加神經元節點,標誌其爲“輸入單元”。其餘不變,於是我們就有了下圖:從本圖開始,我們將權值w1, w2, w3寫到“連接線”的中間。

有兩個層次。分別是輸入層和輸出層。輸入層裏的“輸入單元”只負責傳輸數據,不做計算。輸出層裏的“輸出單元”則需要對前面一層的輸入進行計算。

我們把需要計算的層次稱之爲“計算層”,並把擁有一個計算層的網絡稱之爲“單層神經網絡”。

假如我們要預測的目標不再是一個值,而是一個向量,例如[2,3]。那麼可以在輸出層再增加一個“輸出單元”。

下圖顯示了帶有兩個輸出單元的單層神經網絡,其中輸出單元z1的計算公式如下圖。

目前的表達公式有一點不讓人滿意的就是:w4,w5,w6是後來加的,很難表現出跟原先的w1,w2,w3的關係。

因此我們改用二維的下標,用wx,y來表達一個權值。下標中的x代表後一層神經元的序號,而y代表前一層神經元的序號(序號的順序從上到下)。

例如,w1,2代表後一層的第1個神經元與前一層的第2個神經元的連接的權值(這種標記方式參照了Andrew Ng的課件)。根據以上方法標記,我們有了下圖。

如果我們仔細看輸出的計算公式,會發現這兩個公式就是線性代數方程組。因此可以用矩陣乘法來表達這兩個公式。

例如,輸入的變量是[a1,a2,a3]T(代表由a1,a2,a3組成的列向量),用向量a來表示。方程的左邊是[z1,z2]T,用向量z來表示。

係數則是矩陣W(2行3列的矩陣,排列形式與公式中的一樣)。

於是,輸出公式可以改寫成:

                                                                                g(W * a) = z;

這個公式就是神經網絡中從前一層計算後一層的矩陣運算。

2.效果

  與神經元模型不同,單層神經網絡中的權值是通過訓練得到的。因此,根據以前的知識我們知道,感知器類似一個邏輯迴歸模型,可以做線性分類任務。

  我們可以用決策分界來形象的表達分類的效果。決策分界就是在二維的數據平面中劃出一條直線,當數據的維度是3維的時候,就是劃出一個平面,當數據的維度是n維時,就是劃出一個n-1維的超平面。

  下圖顯示了在二維平面中劃出決策分界的效果,也就是單層神經網絡的決策分界效果。

兩層神經網絡

        單層神經網絡只能做簡單的線性分類任務,於是引入了兩層神經網絡(帶一個隱藏層),這也是神經網絡研究領域的一個重點。

1.結構

       兩層神經網絡除了包含一個輸入層,一個輸出層以外,還增加了一箇中間層。此時,中間層和輸出層都是計算層。我們擴展上節的單層神經網絡,在右邊新加一個層次(只含有一個節點)。

  現在,我們的權值矩陣增加到了兩個,我們用上標來區分不同層次之間的變量。

  例如ax(y)代表第y層的第x個節點。z1,z2變成了a1(2),a2(2)。下圖給出了a1(2),a2(2)的計算公式。

計算最終輸出z的方式是利用了中間層的a1(2),a2(2)和第二個權值矩陣計算得到的,如下圖。

假設我們的預測目標是一個向量,那麼與前面類似,只需要在“輸出層”再增加節點即可。

我們使用向量和矩陣來表示層次中的變量。a(1),a(2),z是網絡中傳輸的向量數據。W(1)和W(2)是網絡的矩陣參數。如下圖。

使用矩陣運算來表達整個計算公式的話如下:

       由此可見,使用矩陣運算來表達是很簡潔的,而且也不會受到節點數增多的影響(無論有多少節點參與運算,乘法兩端都只有一個變量)。因此神經網絡的教程中大量使用矩陣運算來描述。

  需要說明的是,至今爲止,我們對神經網絡的結構圖的討論中都沒有提到偏置節點(bias unit)。事實上,這些節點是默認存在的。它本質上是一個只含有存儲功能,且存儲值永遠爲1的單元。在神經網絡的每個層次中,除了輸出層以外,都會含有這樣一個偏置單元。正如線性迴歸模型與邏輯迴歸模型中的一樣。

  偏置單元與後一層的所有節點都有連接,我們設這些參數值爲向量b,稱之爲偏置。如下圖(考慮偏置節點的兩層神經網絡)。

       可以看出,偏置節點很好認,因爲其沒有輸入(前一層中沒有箭頭指向它)。有些神經網絡的結構圖中會把偏置節點明顯畫出來,有些不會。一般情況下,我們都不會明確畫出偏置節點。 

  在考慮了偏置以後的一個神經網絡的矩陣運算如下:

        需要說明的是,在兩層神經網絡中,我們不再使用sgn函數作爲函數g,而是使用平滑函數sigmoid作爲函數g。我們把函數g也稱作激活函數(active function)。

  事實上,神經網絡的本質就是通過參數與激活函數來擬合特徵與目標之間的真實函數關係。初學者可能認爲畫神經網絡的結構圖是爲了在程序中實現這些圓圈與線,但在一個神經網絡的程序中,既沒有“線”這個對象,也沒有“單元”這個對象。實現一個神經網絡最需要的是線性代數庫。

2.效果

       與單層神經網絡不同。理論證明,兩層神經網絡可以無限逼近任意連續函數。

  這是什麼意思呢?也就是說,面對複雜的非線性分類任務,兩層(帶一個隱藏層)神經網絡可以分類的很好。

  下面就是一個例子,紅色的線與藍色的線代表數據。而紅色區域和藍色區域代表由神經網絡劃開的區域,兩者的分界線就是決策分界。http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/

       可以看到,這個兩層神經網絡的決策分界是非常平滑的曲線,而且分類的很好。有趣的是,前面已經學到過,單層網絡只能做線性分類任務。而兩層神經網絡中的後一層也是線性分類層,應該只能做線性分類任務。爲什麼兩個線性分類任務結合就可以做非線性分類任務?

       我們可以把輸出層的決策分界單獨拿出來看一下。就是下圖。

        可以看到,輸出層的決策分界仍然是直線。關鍵就是,從輸入層到隱藏層時,數據發生了空間變換。也就是說,兩層神經網絡中,隱藏層對原始的數據進行了一個空間變換,使其可以被線性分類,然後輸出層的決策分界劃出了一個線性分類分界線,對其進行分類。

        這樣就導出了兩層神經網絡可以做非線性分類的關鍵--隱藏層。聯想到我們一開始推導出的矩陣公式,我們知道,矩陣和向量相乘,本質上就是對向量的座標空間進行一個變換。因此,隱藏層的參數矩陣的作用就是使得數據的原始座標空間從線性不可分,轉換成了線性可分。

  兩層神經網絡通過兩層的線性模型模擬了數據內真實的非線性函數。因此,多層的神經網絡的本質就是複雜函數擬合。

       下面來討論一下隱藏層的節點數設計。在設計一個神經網絡時,輸入層的節點數需要與特徵的維度匹配,輸出層的節點數要與目標的維度匹配。而中間層的節點數,卻是由設計者指定的。因此,“自由”把握在設計者的手中。但是,節點數設置的多少,卻會影響到整個模型的效果。如何決定這個自由層的節點數呢?目前業界沒有完善的理論來指導這個決策。一般是根據經驗來設置。較好的方法就是預先設定幾個可選值,通過切換這幾個值來看整個模型的預測效果,選擇效果最好的值作爲最終選擇。這種方法又叫做Grid Search(網格搜索)。

       瞭解了兩層神經網絡的結構以後,我們就可以看懂其它類似的結構圖。例如EasyPR字符識別網絡架構(下圖)。

       EasyPR使用了字符的圖像去進行字符文字的識別。輸入是120維的向量。輸出是要預測的文字類別,共有65類。根據實驗,我們測試了一些隱藏層數目,發現當值爲40時,整個網絡在測試集上的效果較好,因此選擇網絡的最終結構就是120,40,65。

3.訓練

       從兩層神經網絡開始,神經網絡的研究人員開始使用機器學習相關的技術進行神經網絡的訓練。例如用大量的數據(1000-10000左右),使用算法進行優化等等,從而使得模型訓練可以獲得性能與數據利用上的雙重優勢。

  機器學習模型訓練的目的,就是使得參數儘可能的與真實的模型逼近。具體做法是這樣的。首先給所有參數賦上隨機值。我們使用這些隨機生成的參數值,來預測訓練數據中的樣本。樣本的預測目標爲yp,真實目標爲y。那麼,定義一個值loss,計算公式如下。

        這個值稱之爲損失(loss),我們的目標就是使對所有訓練數據的損失和儘可能的小。

  如果將先前的神經網絡預測的矩陣公式帶入到yp中(因爲有z=yp),那麼我們可以把損失寫爲關於參數(parameter)的函數,這個函數稱之爲損失函數(loss function)。下面的問題就是求:如何優化參數,能夠讓損失函數的值最小。

  此時這個問題就被轉化爲一個優化問題。一個常用方法就是高等數學中的求導,但是這裏的問題由於參數不止一個,求導後計算導數等於0的運算量很大,所以一般來說解決這個優化問題使用的是梯度下降算法。梯度下降算法每次計算參數在當前的梯度,然後讓參數向着梯度的反方向前進一段距離,不斷重複,直到梯度接近零時截止。一般這個時候,所有的參數恰好達到使損失函數達到一個最低值的狀態。

       在神經網絡模型中,由於結構複雜,每次計算梯度的代價很大。因此還需要使用反向傳播算法。反向傳播算法是利用了神經網絡的結構進行的計算。不一次計算所有參數的梯度,而是從後往前。首先計算輸出層的梯度,然後是第二個參數矩陣的梯度,接着是中間層的梯度,再然後是第一個參數矩陣的梯度,最後是輸入層的梯度。計算結束以後,所要的兩個參數矩陣的梯度就都有了。

  反向傳播算法可以直觀的理解爲下圖。梯度的計算從後往前,一層層反向傳播。前綴E代表着相對導數的意思。

        反向傳播算法的啓示是數學中的鏈式法則。在此需要說明的是,儘管早期神經網絡的研究人員努力從生物學中得到啓發,但從BP算法開始,研究者們更多地從數學上尋求問題的最優解。不再盲目模擬人腦網絡是神經網絡研究走向成熟的標誌。正如科學家們可以從鳥類的飛行中得到啓發,但沒有必要一定要完全模擬鳥類的飛行方式,也能製造可以飛天的飛機。

  優化問題只是訓練中的一個部分。機器學習問題之所以稱爲學習問題,而不是優化問題,就是因爲它不僅要求數據在訓練集上求得一個較小的誤差,在測試集上也要表現好。因爲模型最終是要部署到沒有見過訓練數據的真實場景。提升模型在測試集上的預測效果的主題叫做泛化(generalization),相關方法被稱作正則化(regularization)。神經網絡中常用的泛化技術有權重衰減等。

       但是,值得一提的是,90年代中期支持向量機(SVM)理論被提出以後,對兩層神經網絡造成了很大的衝擊,一時間神經網絡幾乎被學者摒棄。

多層神經網絡(深度學習)

        在被摒棄了10年以後,2006年,“深度信念網絡”的概念被首次提出了。與傳統的訓練方式不同,“深度信念網絡”有一個“預訓練”(pre-training)的過程,這可以方便的讓神經網絡中的權值找到一個接近最優解的值,之後再使用“微調”(fine-tuning)技術來對整個網絡進行優化訓練。這兩個技術的運用大幅度減少了訓練多層神經網絡的時間。他給多層神經網絡相關的學習方法賦予了一個新名詞--“深度學習”。

   很快,深度學習在語音識別領域暫露頭角。接着,2012年,深度學習技術又在圖像識別領域大展拳腳。充分證明了多層神經網絡識別效果的優越性。在這之後,關於深度神經網絡的研究與應用不斷湧現。

1.結構

       我們延續兩層神經網絡的方式來設計一個多層神經網絡。

  在兩層神經網絡的輸出層後面,繼續添加層次。原來的輸出層變成中間層,新加的層次成爲新的輸出層。所以可以得到下圖。

依照這樣的方式不斷添加,我們可以得到更多層的多層神經網絡。公式推導的話其實跟兩層神經網絡類似,使用矩陣運算的話就僅僅是加一個公式而已。

  在已知輸入a(1),參數W(1),W(2),W(3)的情況下,輸出z的推導公式如下:

        多層神經網絡中,輸出也是按照一層一層的方式來計算。從最外面的層開始,算出所有單元的值以後,再繼續計算更深一層。只有當前層所有單元的值都計算完畢以後,纔會算下一層。有點像計算向前不斷推進的感覺。所以這個過程叫做“正向傳播”。

  下面討論一下多層神經網絡中的參數。

  首先我們看第一張圖,可以看出W(1)中有6個參數,W(2)中有4個參數,W(3)中有6個參數,所以整個神經網絡中的參數有16個(這裏我們不考慮偏置節點,下同)。

       假設我們將中間層的節點數做一下調整。第一個中間層改爲3個單元,第二個中間層改爲4個單元。

  經過調整以後,整個網絡的參數變成了33個。

         雖然層數保持不變,但是第二個神經網絡的參數數量卻是第一個神經網絡的接近兩倍之多,從而帶來了更好的表示(represention)能力。表示能力是多層神經網絡的一個重要性質,下面會做介紹。

    在參數一致的情況下,我們也可以獲得一個“更深”的網絡。

       上圖的網絡中,雖然參數數量仍然是33,但卻有4箇中間層,是原來層數的接近兩倍。這意味着一樣的參數數量,可以用更深的層次去表達。

2.效果

       與兩層層神經網絡不同。多層神經網絡中的層數增加了很多。

  增加更多的層次有什麼好處?更深入的表示特徵,以及更強的函數模擬能力。

  更深入的表示特徵可以這樣理解,隨着網絡的層數增加,每一層對於前一層次的抽象表示更深入。在神經網絡中,每一層神經元學習到的是前一層神經元值的更抽象的表示。例如第一個隱藏層學習到的是“邊緣”的特徵,第二個隱藏層學習到的是由“邊緣”組成的“形狀”的特徵,第三個隱藏層學習到的是由“形狀”組成的“圖案”的特徵,最後的隱藏層學習到的是由“圖案”組成的“目標”的特徵。通過抽取更抽象的特徵來對事物進行區分,從而獲得更好的區分與分類能力。

  關於逐層特徵學習的例子,可以參考下圖(多層神經網絡-特徵學習)。

       更強的函數模擬能力是由於隨着層數的增加,整個網絡的參數就越多。而神經網絡其實本質就是模擬特徵與目標之間的真實關係函數的方法,更多的參數意味着其模擬的函數可以更加的複雜,可以有更多的容量(capcity)去擬合真正的關係。

  通過研究發現,在參數數量一樣的情況下,更深的網絡往往具有比淺層的網絡更好的識別效率。這點也在ImageNet的多次大賽中得到了證實。從2012年起,每年獲得ImageNet冠軍的深度神經網絡的層數逐年增加,2015年最好的方法GoogleNet是一個多達22層的神經網絡。

  在最新一屆的ImageNet大賽上,目前拿到最好成績的MSRA團隊的方法使用的更是一個深達152層的網絡!關於這個方法更多的信息有興趣的可以查閱ImageNet網站。     

3.訓練

       在單層神經網絡時,我們使用的激活函數是sgn函數。到了兩層神經網絡時,我們使用的最多的是sigmoid函數。而到了多層神經網絡時,通過一系列的研究發現,ReLU函數在訓練多層神經網絡時,更容易收斂,並且預測性能更好。因此,目前在深度學習中,最流行的非線性函數是ReLU函數。ReLU函數不是傳統的非線性函數,而是分段線性函數。其表達式非常簡單,就是y=max(x,0)。簡而言之,在x大於0,輸出就是輸入,而在x小於0時,輸出就保持爲0。這種函數的設計啓發來自於生物神經元對於激勵的線性響應,以及當低於某個閾值後就不再響應的模擬。

  在多層神經網絡中,訓練的主題仍然是優化和泛化。當使用足夠強的計算芯片(例如GPU圖形加速卡)時,梯度下降算法以及反向傳播算法在多層神經網絡中的訓練中仍然工作的很好。目前學術界主要的研究既在於開發新的算法,也在於對這兩個算法進行不斷的優化,例如,增加了一種帶動量因子(momentum)的梯度下降算法。 

  在深度學習中,泛化技術變的比以往更加的重要。這主要是因爲神經網絡的層數增加了,參數也增加了,表示能力大幅度增強,很容易出現過擬合現象。因此正則化技術就顯得十分重要。目前,Dropout技術,以及數據擴容(Data-Augmentation)技術是目前使用的最多的正則化技術。

總結

       雖然現在人工智能非常火熱,但是距離真正的人工智能還有很大的距離。就拿計算機視覺方向來說,面對稍微複雜一些的場景,以及易於混淆的圖像,計算機就可能難以識別。因此,這個方向還有很多的工作要做。

  就普通人看來,這麼辛苦的做各種實驗,以及投入大量的人力就是爲了實現一些不及孩童能力的視覺能力,未免有些不值。但是這只是第一步。雖然計算機需要很大的運算量才能完成一個普通人簡單能完成的識圖工作,但計算機最大的優勢在於並行化與批量推廣能力。使用計算機以後,我們可以很輕易地將以前需要人眼去判斷的工作交給計算機做,而且幾乎沒有任何的推廣成本。這就具有很大的價值。正如火車剛誕生的時候,有人嘲笑它又笨又重,速度還沒有馬快。但是很快規模化推廣的火車就替代了馬車的使用。人工智能也是如此。這也是爲什麼目前世界上各著名公司以及政府都對此熱衷的原因。

  目前看來,神經網絡要想實現人工智能還有很多的路要走,但方向至少是正確的,下面就要看後來者的不斷努力了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章