原文地址:http://www.cnblogs.com/subconscious/p/5058741.html
神經(jīng)網(wǎng)絡是一門重要的機器學習技術。它是目前最為火熱的研究方向--深度學習的基礎。學習神經(jīng)網(wǎng)絡不僅可以讓你掌握一門強大的機器學習方法,同時也可以更好地幫助你理解深度學習技術。
本文以一種簡單的,循序的方式講解神經(jīng)網(wǎng)絡。適合對神經(jīng)網(wǎng)絡了解不多的同學。本文對閱讀沒有一定的前提要求,但是懂一些機器學習基礎會更好地幫助理解本文。
神經(jīng)網(wǎng)絡是一種模擬人腦的神經(jīng)網(wǎng)絡以期能夠實現(xiàn)類人工智能的機器學習技術。人腦中的神經(jīng)網(wǎng)絡是一個非常復雜的組織。成人的大腦中估計有1000億個神經(jīng)元之多。

圖1 人腦神經(jīng)網(wǎng)絡
那么機器學習中的神經(jīng)網(wǎng)絡是如何實現(xiàn)這種模擬的,并且達到一個驚人的良好效果的?通過本文,你可以了解到這些問題的答案,同時還能知道神經(jīng)網(wǎng)絡的歷史,以及如何較好地學習它。
由于本文較長,為方便讀者,以下是本文的目錄:
一.前言
二.神經(jīng)元
三.單層神經(jīng)網(wǎng)絡(感知器)
四.兩層神經(jīng)網(wǎng)絡(多層感知器)
五.多層神經(jīng)網(wǎng)絡(深度學習)
六.回顧
七.展望
八.總結
九.后記
十.備注
一. 前言
讓我們來看一個經(jīng)典的神經(jīng)網(wǎng)絡。這是一個包含三個層次的神經(jīng)網(wǎng)絡。紅色的是輸入層,綠色的是輸出層,紫色的是中間層(也叫隱藏層)。輸入層有3個輸入單元,隱藏層有4個單元,輸出層有2個單元。后文中,我們統(tǒng)一使用這種顏色來表達神經(jīng)網(wǎng)絡的結構。

圖2 神經(jīng)網(wǎng)絡結構圖
在開始介紹前,有一些知識可以先記在心里:
設計一個神經(jīng)網(wǎng)絡時,輸入層與輸出層的節(jié)點數(shù)往往是固定的,中間層則可以自由指定;
神經(jīng)網(wǎng)絡結構圖中的拓撲與箭頭代表著預測過程時數(shù)據(jù)的流向,跟訓練時的數(shù)據(jù)流有一定的區(qū)別;
結構圖里的關鍵不是圓圈(代表“神經(jīng)元”),而是連接線(代表“神經(jīng)元”之間的連接)。每個連接線對應一個不同的權重(其值稱為權值),這是需要訓練得到的。
除了從左到右的形式表達的結構圖,還有一種常見的表達形式是從下到上來表示一個神經(jīng)網(wǎng)絡。這時候,輸入層在圖的最下方。輸出層則在圖的最上方,如下圖:

圖3 從下到上的神經(jīng)網(wǎng)絡結構圖
從左到右的表達形式以Andrew Ng和LeCun的文獻使用較多,Caffe里使用的則是從下到上的表達。在本文中使用Andrew Ng代表的從左到右的表達形式。
下面從簡單的神經(jīng)元開始說起,一步一步介紹神經(jīng)網(wǎng)絡復雜結構的形成。
二. 神經(jīng)元
1.引子****** ****
對于神經(jīng)元的研究由來已久,1904年生物學家就已經(jīng)知曉了神經(jīng)元的組成結構。
一個神經(jīng)元通常具有多個樹突,主要用來接受傳入信息;而軸突只有一條,軸突尾端有許多軸突末梢可以給其他多個神經(jīng)元傳遞信息。軸突末梢跟其他神經(jīng)元的樹突產(chǎn)生連接,從而傳遞信號。這個連接的位置在生物學上叫做“突觸**”。
人腦中的神經(jīng)元形狀可以用下圖做簡單的說明:

圖4 神經(jīng)元
1943年,心理學家McCulloch和數(shù)學家Pitts參考了生物神經(jīng)元的結構,發(fā)表了抽象的神經(jīng)元模型MP。在下文中,我們會具體介紹神經(jīng)元模型。


圖5 Warren McCulloch(左)和 Walter Pitts(右)
2.結構
神經(jīng)元模型是一個包含輸入,輸出與計算功能的模型。輸入可以類比為神經(jīng)元的樹突,而輸出可以類比為神經(jīng)元的軸突,計算則可以類比為細胞核。
下圖是一個典型的神經(jīng)元模型:包含有3個輸入,1個輸出,以及2個計算功能。
注意中間的箭頭線。這些線稱為“連接”。每個上有一個“權值”。

圖6 神經(jīng)元模型
連接是神經(jīng)元中最重要的東西。每一個連接上都有一個權重。
一個神經(jīng)網(wǎng)絡的訓練算法就是讓權重的值調(diào)整到最佳,以使得整個網(wǎng)絡的預測效果最好。
我們使用a來表示輸入,用w來表示權值。一個表示連接的有向箭頭可以這樣理解:在初端,傳遞的信號大小仍然是a,端中間有加權參數(shù)w,經(jīng)過這個加權后的信號會變成aw,因此在連接的末端,信號的大小就變成了aw。
在其他繪圖模型里,有向箭頭可能表示的是值的不變傳遞。而在神經(jīng)元模型里,每個有向箭頭表示的是值的加權傳遞。

圖7 連接(connection)
如果我們將神經(jīng)元圖中的所有變量用符號表示,并且寫出輸出的計算公式的話,就是下圖。

圖8 神經(jīng)元計算
可見z是在輸入和權值的線性加權和疊加了一個函數(shù)g的值。在MP模型里,函數(shù)g是sgn函數(shù),也就是取符號函數(shù)。這個函數(shù)當輸入大于0時,輸出1,否則輸出0。
下面對神經(jīng)元模型的圖進行一些擴展。首先將sum函數(shù)與sgn函數(shù)合并到一個圓圈里,代表神經(jīng)元的內(nèi)部計算。其次,把輸入a與輸出z寫到連接線的左上方,便于后面畫復雜的網(wǎng)絡。最后說明,一個神經(jīng)元可以引出多個代表輸出的有向箭頭,但值都是一樣的。
神經(jīng)元可以看作一個計算與存儲單元。計算是神經(jīng)元對其的輸入進行計算功能。存儲是神經(jīng)元會暫存計算結果,并傳遞到下一層。

圖9 神經(jīng)元擴展
當我們用“神經(jīng)元”組成網(wǎng)絡以后,描述網(wǎng)絡中的某個“神經(jīng)元”時,我們更多地會用“單元”(unit)來指代。同時由于神經(jīng)網(wǎng)絡的表現(xiàn)形式是一個有向圖,有時也會用“節(jié)點”(node)來表達同樣的意思。
3.效果
神經(jīng)元模型的使用可以這樣理解:
我們有一個數(shù)據(jù),稱之為樣本。樣本有四個屬性,其中三個屬性已知,一個屬性未知。我們需要做的就是通過三個已知屬性預測未知屬性。
具體辦法就是使用神經(jīng)元的公式進行計算。三個已知屬性的值是a1
,a2
,a3
,未知屬性的值是z。z可以通過公式計算出來。
這里,已知的屬性稱之為特征,未知的屬性稱之為目標。假設特征與目標之間確實是線性關系,并且我們已經(jīng)得到表示這個關系的權值w1
,w2
,w3
。那么,我們就可以通過神經(jīng)元模型預測新樣本的目標。
4.影響
1943年發(fā)布的MP模型,雖然簡單,但已經(jīng)建立了神經(jīng)網(wǎng)絡大廈的地基。但是,MP模型中,權重的值都是預先設置的,因此不能學習。
1949年心理學家Hebb提出了Hebb學習率,認為人腦神經(jīng)細胞的突觸(也就是連接)上的強度上可以變化的。于是計算科學家們開始考慮用調(diào)整權值的方法來讓機器學習。這為后面的學習算法奠定了基礎。

圖10 Donald Olding Hebb
盡管神經(jīng)元模型與Hebb學習律都已誕生,但限于當時的計算機能力,直到接近10年后,第一個真正意義的神經(jīng)網(wǎng)絡才誕生。
三. 單層神經(jīng)網(wǎng)絡(感知器)
1.引子****
1958年,計算科學家Rosenblatt提出了由兩層神經(jīng)元組成的神經(jīng)網(wǎng)絡。他給它起了一個名字--“感知器”(Perceptron)(有的文獻翻譯成“感知機”,下文統(tǒng)一用“感知器”來指代)。
感知器是當時首個可以學習的人工神經(jīng)網(wǎng)絡。Rosenblatt現(xiàn)場演示了其學習識別簡單圖像的過程,在當時的社會引起了轟動。
人們認為已經(jīng)發(fā)現(xiàn)了智能的奧秘,許多學者和科研機構紛紛投入到神經(jīng)網(wǎng)絡的研究中。美國軍方大力資助了神經(jīng)網(wǎng)絡的研究,并認為神經(jīng)網(wǎng)絡比“原子彈工程”更重要。這段時間直到1969年才結束,這個時期可以看作神經(jīng)網(wǎng)絡的第一次高潮。

圖11 Rosenblat與感知器
2.結構
下面來說明感知器模型。
在原來MP模型的“輸入”位置添加神經(jīng)元節(jié)點,標志其為“輸入單元”。其余不變,于是我們就有了下圖:從本圖開始,我們將權值w1
, w2
, w3
寫到“連接線”的中間。

圖12 單層神經(jīng)網(wǎng)絡
在“感知器”中,有兩個層次。分別是輸入層和輸出層。輸入層里的“輸入單元”只負責傳輸數(shù)據(jù),不做計算。輸出層里的“輸出單元”則需要對前面一層的輸入進行計算。
我們把需要計算的層次稱之為“計算層”,并把擁有一個計算層的網(wǎng)絡稱之為“單層神經(jīng)網(wǎng)絡”。有一些文獻會按照網(wǎng)絡擁有的層數(shù)來命名,例如把“感知器”稱為兩層神經(jīng)網(wǎng)絡。但在本文里,我們根據(jù)計算層的數(shù)量來命名。
假如我們要預測的目標不再是一個值,而是一個向量,例如[2,3]。那么可以在輸出層再增加一個“輸出單元”。
下圖顯示了帶有兩個輸出單元的單層神經(jīng)網(wǎng)絡,其中輸出單元z1
的計算公式如下圖。

圖13 單層神經(jīng)網(wǎng)絡(Z1
)
可以看到,z1
的計算跟原先的z并沒有區(qū)別。
我們已知一個神經(jīng)元的輸出可以向多個神經(jīng)元傳遞,因此z2
的計算公式如下圖。

圖14 單層神經(jīng)網(wǎng)絡(Z2
)
可以看到,z2
的計算中除了三個新的權值:w4
,w5
,w6
以外,其他與z1
是一樣的。
整個網(wǎng)絡的輸出如下圖。

圖15 單層神經(jīng)網(wǎng)絡(Z1
和Z2
)
目前的表達公式有一點不讓人滿意的就是:w4
,w5
,w6
是后來加的,很難表現(xiàn)出跟原先的w1
,w2
,w3
的關系。
因此我們改用二維的下標,用wx,y
來表達一個權值。下標中的x代表后一層神經(jīng)元的序號,而y代表前一層神經(jīng)元的序號(序號的順序從上到下)。
例如,w1,2
代表后一層的第1個神經(jīng)元與前一層的第2個神經(jīng)元的連接的權值(這種標記方式參照了Andrew Ng的課件)。根據(jù)以上方法標記,我們有了下圖。

圖16 單層神經(jīng)網(wǎng)絡(擴展)
如果我們仔細看輸出的計算公式,會發(fā)現(xiàn)這兩個公式就是線性代數(shù)方程組。因此可以用矩陣乘法來表達這兩個公式。
例如,輸入的變量是[a1
,a2
,a3
]T
(代表由a1
,a2
,a3
組成的列向量),用向量a來表示。方程的左邊是[z1
,z2
]T
,用向量z來表示。
系數(shù)則是矩陣W(2行3列的矩陣,排列形式與公式中的一樣)。
于是,輸出公式可以改寫成:
g(W * a) = z;
這個公式就是神經(jīng)網(wǎng)絡中從前一層計算后一層的矩陣運算。
3.效果
與神經(jīng)元模型不同,感知器中的權值是通過訓練得到的。因此,根據(jù)以前的知識我們知道,感知器類似一個邏輯回歸模型,可以做線性分類任務。
我們可以用決策分界來形象的表達分類的效果。決策分界就是在二維的數(shù)據(jù)平面中劃出一條直線,當數(shù)據(jù)的維度是3維的時候,就是劃出一個平面,當數(shù)據(jù)的維度是n維時,就是劃出一個n-1維的超平面。
下圖顯示了在二維平面中劃出決策分界的效果,也就是感知器的分類效果。

圖17 單層神經(jīng)網(wǎng)絡(決策分界)
4.影響
感知器只能做簡單的線性分類任務。但是當時的人們熱情太過于高漲,并沒有人清醒的認識到這點。于是,當人工智能領域的巨擘Minsky指出這點時,事態(tài)就發(fā)生了變化。
Minsky在1969年出版了一本叫《Perceptron》的書,里面用詳細的數(shù)學證明了感知器的弱點,尤其是感知器對XOR(異或)這樣的簡單分類任務都無法解決。
Minsky認為,如果將計算層增加到兩層,計算量則過大,而且沒有有效的學習算法。所以,他認為研究更深層的網(wǎng)絡是沒有價值的。(本文成文后一個月,即2016年1月,Minsky在美國去世。謹在本文中紀念這位著名的計算機研究專家與大拿。)

圖18 Marvin Minsky
由于Minsky的巨大影響力以及書中呈現(xiàn)的悲觀態(tài)度,讓很多學者和實驗室紛紛放棄了神經(jīng)網(wǎng)絡的研究。神經(jīng)網(wǎng)絡的研究陷入了冰河期。這個時期又被稱為“AI winter”。
接近10年以后,對于兩層神經(jīng)網(wǎng)絡的研究才帶來神經(jīng)網(wǎng)絡的復蘇。
四. 兩層神經(jīng)網(wǎng)絡(多層感知器)
1.引子
兩層神經(jīng)網(wǎng)絡是本文的重點,因為正是在這時候,神經(jīng)網(wǎng)絡開始了大范圍的推廣與使用。
Minsky說過單層神經(jīng)網(wǎng)絡無法解決異或問題。但是當增加一個計算層以后,兩層神經(jīng)網(wǎng)絡不僅可以解決異或問題,而且具有非常好的非線性分類效果。不過兩層神經(jīng)網(wǎng)絡的計算是一個問題,沒有一個較好的解法。
1986年,Rumelhar和Hinton等人提出了反向傳播(Backpropagation,BP)算法,解決了兩層神經(jīng)網(wǎng)絡所需要的復雜計算量問題,從而帶動了業(yè)界使用兩層神經(jīng)網(wǎng)絡研究的熱潮。目前,大量的教授神經(jīng)網(wǎng)絡的教材,都是重點介紹兩層(帶一個隱藏層)神經(jīng)網(wǎng)絡的內(nèi)容。
這時候的Hinton還很年輕,30年以后,正是他重新定義了神經(jīng)網(wǎng)絡,帶來了神經(jīng)網(wǎng)絡復蘇的又一春。


圖19 David Rumelhart(左)以及 Geoffery Hinton(右)
2.結構
兩層神經(jīng)網(wǎng)絡除了包含一個輸入層,一個輸出層以外,還增加了一個中間層。此時,中間層和輸出層都是計算層。我們擴展上節(jié)的單層神經(jīng)網(wǎng)絡,在右邊新加一個層次(只含有一個節(jié)點)。
現(xiàn)在,我們的權值矩陣增加到了兩個,我們用上標來區(qū)分不同層次之間的變量。
例如ax
(y)
代表第y層的第x個節(jié)點。z1
,z2
變成了a1
(2)
,a2
(2)
。下圖給出了a1
(2)
,a2
(2)
的計算公式。

圖20 兩層神經(jīng)網(wǎng)絡(中間層計算)
計算最終輸出z的方式是利用了中間層的a1
(2)
,a2
(2)
和第二個權值矩陣計算得到的,如下圖。

圖21 兩層神經(jīng)網(wǎng)絡(輸出層計算)
假設我們的預測目標是一個向量,那么與前面類似,只需要在“輸出層”再增加節(jié)點即可。
我們使用向量和矩陣來表示層次中的變量。a(1)
,a(2)
,z是網(wǎng)絡中傳輸?shù)南蛄繑?shù)據(jù)。W(1)
和W(2)
是網(wǎng)絡的矩陣參數(shù)。如下圖。

圖22 兩層神經(jīng)網(wǎng)絡(向量形式)
使用矩陣運算來表達整個計算公式的話如下:
g(W(1)
-
a(1)
) = a(2)
;
g(W(2) -
a(2)
) = z;
由此可見,使用矩陣運算來表達是很簡潔的,而且也不會受到節(jié)點數(shù)增多的影響(無論有多少節(jié)點參與運算,乘法兩端都只有一個變量)。因此神經(jīng)網(wǎng)絡的教程中大量使用矩陣運算來描述。
需要說明的是,至今為止,我們對神經(jīng)網(wǎng)絡的結構圖的討論中都沒有提到偏置節(jié)點(bias unit)。事實上,這些節(jié)點是默認存在的。它本質(zhì)上是一個只含有存儲功能,且存儲值永遠為1的單元。在神經(jīng)網(wǎng)絡的每個層次中,除了輸出層以外,都會含有這樣一個偏置單元。正如線性回歸模型與邏輯回歸模型中的一樣。
偏置單元與后一層的所有節(jié)點都有連接,我們設這些參數(shù)值為向量b,稱之為偏置。如下圖。

圖23 兩層神經(jīng)網(wǎng)絡(考慮偏置節(jié)點)
可以看出,偏置節(jié)點很好認,因為其沒有輸入(前一層中沒有箭頭指向它)。有些神經(jīng)網(wǎng)絡的結構圖中會把偏置節(jié)點明顯畫出來,有些不會。一般情況下,我們都不會明確畫出偏置節(jié)點。
在考慮了偏置以后的一個神經(jīng)網(wǎng)絡的矩陣運算如下:
g(W(1)
- a(1)
-
b(1)
) = a(2)
;
g(W(2)
- a(2)
-
b(2)
) = z;
需要說明的是,在兩層神經(jīng)網(wǎng)絡中,我們不再使用sgn函數(shù)作為函數(shù)g,而是使用平滑函數(shù)sigmoid作為函數(shù)g。我們把函數(shù)g也稱作激活函數(shù)(active function)。
事實上,神經(jīng)網(wǎng)絡的本質(zhì)就是通過參數(shù)與激活函數(shù)來擬合特征與目標之間的真實函數(shù)關系。初學者可能認為畫神經(jīng)網(wǎng)絡的結構圖是為了在程序中實現(xiàn)這些圓圈與線,但在一個神經(jīng)網(wǎng)絡的程序中,既沒有“線”這個對象,也沒有“單元”這個對象。實現(xiàn)一個神經(jīng)網(wǎng)絡最需要的是線性代數(shù)庫。
3.效果
與單層神經(jīng)網(wǎng)絡不同。理論證明,兩層神經(jīng)網(wǎng)絡可以無限逼近任意連續(xù)函數(shù)。
這是什么意思呢?也就是說,面對復雜的非線性分類任務,兩層(帶一個隱藏層)神經(jīng)網(wǎng)絡可以分類的很好。
下面就是一個例子(此兩圖來自colah的博客),紅色的線與藍色的線代表數(shù)據(jù)。而紅色區(qū)域和藍色區(qū)域代表由神經(jīng)網(wǎng)絡劃開的區(qū)域,兩者的分界線就是決策分界。

圖24 兩層神經(jīng)網(wǎng)絡(決策分界)
可以看到,這個兩層神經(jīng)網(wǎng)絡的決策分界是非常平滑的曲線,而且分類的很好。有趣的是,前面已經(jīng)學到過,單層網(wǎng)絡只能做線性分類任務。而兩層神經(jīng)網(wǎng)絡中的后一層也是線性分類層,應該只能做線性分類任務。為什么兩個線性分類任務結合就可以做非線性分類任務?
我們可以把輸出層的決策分界單獨拿出來看一下。就是下圖。

圖25 兩層神經(jīng)網(wǎng)絡(空間變換)
可以看到,輸出層的決策分界仍然是直線。關鍵就是,從輸入層到隱藏層時,數(shù)據(jù)發(fā)生了空間變換。也就是說,兩層神經(jīng)網(wǎng)絡中,隱藏層對原始的數(shù)據(jù)進行了一個空間變換,使其可以被線性分類,然后輸出層的決策分界劃出了一個線性分類分界線,對其進行分類。
這樣就導出了兩層神經(jīng)網(wǎng)絡可以做非線性分類的關鍵--隱藏層。聯(lián)想到我們一開始推導出的矩陣公式,我們知道,矩陣和向量相乘,本質(zhì)上就是對向量的坐標空間進行一個變換。因此,隱藏層的參數(shù)矩陣的作用就是使得數(shù)據(jù)的原始坐標空間從線性不可分,轉換成了線性可分。
兩層神經(jīng)網(wǎng)絡通過兩層的線性模型模擬了數(shù)據(jù)內(nèi)真實的非線性函數(shù)。因此,多層的神經(jīng)網(wǎng)絡的本質(zhì)就是復雜函數(shù)擬合。
下面來討論一下隱藏層的節(jié)點數(shù)設計。在設計一個神經(jīng)網(wǎng)絡時,輸入層的節(jié)點數(shù)需要與特征的維度匹配,輸出層的節(jié)點數(shù)要與目標的維度匹配。而中間層的節(jié)點數(shù),卻是由設計者指定的。因此,“自由”把握在設計者的手中。但是,節(jié)點數(shù)設置的多少,卻會影響到整個模型的效果。如何決定這個自由層的節(jié)點數(shù)呢?目前業(yè)界沒有完善的理論來指導這個決策。一般是根據(jù)經(jīng)驗來設置。較好的方法就是預先設定幾個可選值,通過切換這幾個值來看整個模型的預測效果,選擇效果最好的值作為最終選擇。這種方法又叫做Grid Search(網(wǎng)格搜索)。
了解了兩層神經(jīng)網(wǎng)絡的結構以后,我們就可以看懂其它類似的結構圖。例如EasyPR字符識別網(wǎng)絡架構(下圖)。

圖26 EasyPR字符識別網(wǎng)絡
EasyPR使用了字符的圖像去進行字符文字的識別。輸入是120維的向量。輸出是要預測的文字類別,共有65類。根據(jù)實驗,我們測試了一些隱藏層數(shù)目,發(fā)現(xiàn)當值為40時,整個網(wǎng)絡在測試集上的效果較好,因此選擇網(wǎng)絡的最終結構就是120,40,65。
4.訓練
下面簡單介紹一下兩層神經(jīng)網(wǎng)絡的訓練。
在Rosenblat提出的感知器模型中,模型中的參數(shù)可以被訓練,但是使用的方法較為簡單,并沒有使用目前機器學習中通用的方法,這導致其擴展性與適用性非常有限。從兩層神經(jīng)網(wǎng)絡開始,神經(jīng)網(wǎng)絡的研究人員開始使用機器學習相關的技術進行神經(jīng)網(wǎng)絡的訓練。例如用大量的數(shù)據(jù)(1000-10000左右),使用算法進行優(yōu)化等等,從而使得模型訓練可以獲得性能與數(shù)據(jù)利用上的雙重優(yōu)勢。
機器學習模型訓練的目的,就是使得參數(shù)盡可能的與真實的模型逼近。具體做法是這樣的。首先給所有參數(shù)賦上隨機值。我們使用這些隨機生成的參數(shù)值,來預測訓練數(shù)據(jù)中的樣本。樣本的預測目標為yp
,真實目標為y。那么,定義一個值loss,計算公式如下。
loss = (yp
- y)2
這個值稱之為損失(loss),我們的目標就是使對所有訓練數(shù)據(jù)的損失和盡可能的小。
如果將先前的神經(jīng)網(wǎng)絡預測的矩陣公式帶入到y(tǒng)p
中(因為有z=yp
),那么我們可以把損失寫為關于參數(shù)(parameter)的函數(shù),這個函數(shù)稱之為損失函數(shù)(loss function)。下面的問題就是求:如何優(yōu)化參數(shù),能夠讓損失函數(shù)的值最小。
此時這個問題就被轉化為一個優(yōu)化問題。一個常用方法就是高等數(shù)學中的求導,但是這里的問題由于參數(shù)不止一個,求導后計算導數(shù)等于0的運算量很大,所以一般來說解決這個優(yōu)化問題使用的是梯度下降算法。梯度下降算法每次計算參數(shù)在當前的梯度,然后讓參數(shù)向著梯度的反方向前進一段距離,不斷重復,直到梯度接近零時截止。一般這個時候,所有的參數(shù)恰好達到使損失函數(shù)達到一個最低值的狀態(tài)。
在神經(jīng)網(wǎng)絡模型中,由于結構復雜,每次計算梯度的代價很大。因此還需要使用反向傳播算法。反向傳播算法是利用了神經(jīng)網(wǎng)絡的結構進行的計算。不一次計算所有參數(shù)的梯度,而是從后往前。首先計算輸出層的梯度,然后是第二個參數(shù)矩陣的梯度,接著是中間層的梯度,再然后是第一個參數(shù)矩陣的梯度,最后是輸入層的梯度。計算結束以后,所要的兩個參數(shù)矩陣的梯度就都有了。
反向傳播算法可以直觀的理解為下圖。梯度的計算從后往前,一層層反向傳播。前綴E代表著相對導數(shù)的意思。

圖27 反向傳播算法
反向傳播算法的啟示是數(shù)學中的鏈式法則。在此需要說明的是,盡管早期神經(jīng)網(wǎng)絡的研究人員努力從生物學中得到啟發(fā),但從BP算法開始,研究者們更多地從數(shù)學上尋求問題的最優(yōu)解。不再盲目模擬人腦網(wǎng)絡是神經(jīng)網(wǎng)絡研究走向成熟的標志。正如科學家們可以從鳥類的飛行中得到啟發(fā),但沒有必要一定要完全模擬鳥類的飛行方式,也能制造可以飛天的飛機。
優(yōu)化問題只是訓練中的一個部分。機器學習問題之所以稱為學習問題,而不是優(yōu)化問題,就是因為它不僅要求數(shù)據(jù)在訓練集上求得一個較小的誤差,在測試集上也要表現(xiàn)好。因為模型最終是要部署到?jīng)]有見過訓練數(shù)據(jù)的真實場景。提升模型在測試集上的預測效果的主題叫做泛化(generalization),相關方法被稱作正則化(regularization)。神經(jīng)網(wǎng)絡中常用的泛化技術有權重衰減等。
5.影響
兩層神經(jīng)網(wǎng)絡在多個地方的應用說明了其效用與價值。10年前困擾神經(jīng)網(wǎng)絡界的異或問題被輕松解決。神經(jīng)網(wǎng)絡在這個時候,已經(jīng)可以發(fā)力于語音識別,圖像識別,自動駕駛等多個領域。
歷史總是驚人的相似,神經(jīng)網(wǎng)絡的學者們再次登上了《紐約時報》的專訪。人們認為神經(jīng)網(wǎng)絡可以解決許多問題。就連娛樂界都開始受到了影響,當年的《終結者》電影中的阿諾都趕時髦地說一句:我的CPU是一個神經(jīng)網(wǎng)絡處理器,一個會學習的計算機。
但是神經(jīng)網(wǎng)絡仍然存在若干的問題:盡管使用了BP算法,一次神經(jīng)網(wǎng)絡的訓練仍然耗時太久,而且困擾訓練優(yōu)化的一個問題就是局部最優(yōu)解問題,這使得神經(jīng)網(wǎng)絡的優(yōu)化較為困難。同時,隱藏層的節(jié)點數(shù)需要調(diào)參,這使得使用不太方便,工程和研究人員對此多有抱怨。
90年代中期,由Vapnik等人發(fā)明的SVM(Support Vector Machines,支持向量機)算法誕生,很快就在若干個方面體現(xiàn)出了對比神經(jīng)網(wǎng)絡的優(yōu)勢:無需調(diào)參;高效;全局最優(yōu)解?;谝陨戏N種理由,SVM迅速打敗了神經(jīng)網(wǎng)絡算法成為主流。

圖28 Vladimir Vapnik
神經(jīng)網(wǎng)絡的研究再次陷入了冰河期。當時,只要你的論文中包含神經(jīng)網(wǎng)絡相關的字眼,非常容易被會議和期刊拒收,研究界那時對神經(jīng)網(wǎng)絡的不待見可想而知。
五. 多層神經(jīng)網(wǎng)絡(深度學習)
1.引子****
在被人摒棄的10年中,有幾個學者仍然在堅持研究。這其中的棋手就是加拿大多倫多大學的Geoffery Hinton教授。
2006年,Hinton在《Science》和相關期刊上發(fā)表了論文,首次提出了“深度信念網(wǎng)絡”的概念。與傳統(tǒng)的訓練方式不同,“深度信念網(wǎng)絡”有一個“預訓練”(pre-training)的過程,這可以方便的讓神經(jīng)網(wǎng)絡中的權值找到一個接近最優(yōu)解的值,之后再使用“微調(diào)”(fine-tuning)技術來對整個網(wǎng)絡進行優(yōu)化訓練。這兩個技術的運用大幅度減少了訓練多層神經(jīng)網(wǎng)絡的時間。他給多層神經(jīng)網(wǎng)絡相關的學習方法賦予了一個新名詞--“深度學習”。
很快,深度學習在語音識別領域暫露頭角。接著,2012年,深度學習技術又在圖像識別領域大展拳腳。Hinton與他的學生在ImageNet競賽中,用多層的卷積神經(jīng)網(wǎng)絡成功地對包含一千類別的一百萬張圖片進行了訓練,取得了分類錯誤率15%的好成績,這個成績比第二名高了近11個百分點,充分證明了多層神經(jīng)網(wǎng)絡識別效果的優(yōu)越性。
在這之后,關于深度神經(jīng)網(wǎng)絡的研究與應用不斷涌現(xiàn)。

圖29 Geoffery Hinton
由于篇幅原因,本文不介紹CNN(Conventional Neural Network,卷積神經(jīng)網(wǎng)絡)與RNN(Recurrent Neural Network,遞歸神經(jīng)網(wǎng)絡)的架構,下面我們只討論普通的多層神經(jīng)網(wǎng)絡。
2.結構
我們延續(xù)兩層神經(jīng)網(wǎng)絡的方式來設計一個多層神經(jīng)網(wǎng)絡。
在兩層神經(jīng)網(wǎng)絡的輸出層后面,繼續(xù)添加層次。原來的輸出層變成中間層,新加的層次成為新的輸出層。所以可以得到下圖。

圖30 多層神經(jīng)網(wǎng)絡
依照這樣的方式不斷添加,我們可以得到更多層的多層神經(jīng)網(wǎng)絡。公式推導的話其實跟兩層神經(jīng)網(wǎng)絡類似,使用矩陣運算的話就僅僅是加一個公式而已。
在已知輸入a(1)
,參數(shù)W(1)
,W(2)
,W(3)
的情況下,輸出z的推導公式如下:
g(W(1)
-
a(1)
) = a(2)
;
g(W(2) -
a(2)
) = a(3)
;
g(W(3) -
a(3)
) = z;
多層神經(jīng)網(wǎng)絡中,輸出也是按照一層一層的方式來計算。從最外面的層開始,算出所有單元的值以后,再繼續(xù)計算更深一層。只有當前層所有單元的值都計算完畢以后,才會算下一層。有點像計算向前不斷推進的感覺。所以這個過程叫做“正向傳播”。
下面討論一下多層神經(jīng)網(wǎng)絡中的參數(shù)。
首先我們看第一張圖,可以看出W(1)
中有6個參數(shù),W(2)
中有4個參數(shù),W(3)
中有6個參數(shù),所以整個神經(jīng)網(wǎng)絡中的參數(shù)有16個(這里我們不考慮偏置節(jié)點,下同)。

圖31 多層神經(jīng)網(wǎng)絡(較少參數(shù))
假設我們將中間層的節(jié)點數(shù)做一下調(diào)整。第一個中間層改為3個單元,第二個中間層改為4個單元。
經(jīng)過調(diào)整以后,整個網(wǎng)絡的參數(shù)變成了33個。

圖32 多層神經(jīng)網(wǎng)絡(較多參數(shù))
雖然層數(shù)保持不變,但是第二個神經(jīng)網(wǎng)絡的參數(shù)數(shù)量卻是第一個神經(jīng)網(wǎng)絡的接近兩倍之多,從而帶來了更好的表示(represention)能力。表示能力是多層神經(jīng)網(wǎng)絡的一個重要性質(zhì),下面會做介紹。
在參數(shù)一致的情況下,我們也可以獲得一個“更深”的網(wǎng)絡。

圖33 多層神經(jīng)網(wǎng)絡(更深的層次)
上圖的網(wǎng)絡中,雖然參數(shù)數(shù)量仍然是33,但卻有4個中間層,是原來層數(shù)的接近兩倍。這意味著一樣的參數(shù)數(shù)量,可以用更深的層次去表達。
3.效果
與兩層層神經(jīng)網(wǎng)絡不同。多層神經(jīng)網(wǎng)絡中的層數(shù)增加了很多。
增加更多的層次有什么好處?更深入的表示特征,以及更強的函數(shù)模擬能力。
更深入的表示特征可以這樣理解,隨著網(wǎng)絡的層數(shù)增加,每一層對于前一層次的抽象表示更深入。在神經(jīng)網(wǎng)絡中,每一層神經(jīng)元學習到的是前一層神經(jīng)元值的更抽象的表示。例如第一個隱藏層學習到的是“邊緣”的特征,第二個隱藏層學習到的是由“邊緣”組成的“形狀”的特征,第三個隱藏層學習到的是由“形狀”組成的“圖案”的特征,最后的隱藏層學習到的是由“圖案”組成的“目標”的特征。通過抽取更抽象的特征來對事物進行區(qū)分,從而獲得更好的區(qū)分與分類能力。
關于逐層特征學習的例子,可以參考下圖。

圖34 多層神經(jīng)網(wǎng)絡(特征學習)
更強的函數(shù)模擬能力是由于隨著層數(shù)的增加,整個網(wǎng)絡的參數(shù)就越多。而神經(jīng)網(wǎng)絡其實本質(zhì)就是模擬特征與目標之間的真實關系函數(shù)的方法,更多的參數(shù)意味著其模擬的函數(shù)可以更加的復雜,可以有更多的容量(capcity)去擬合真正的關系。
通過研究發(fā)現(xiàn),在參數(shù)數(shù)量一樣的情況下,更深的網(wǎng)絡往往具有比淺層的網(wǎng)絡更好的識別效率。這點也在ImageNet的多次大賽中得到了證實。從2012年起,每年獲得ImageNet冠軍的深度神經(jīng)網(wǎng)絡的層數(shù)逐年增加,2015年最好的方法GoogleNet是一個多達22層的神經(jīng)網(wǎng)絡。
在最新一屆的ImageNet大賽上,目前拿到最好成績的MSRA團隊的方法使用的更是一個深達152層的網(wǎng)絡!關于這個方法更多的信息有興趣的可以查閱ImageNet網(wǎng)站。
4.訓練
在單層神經(jīng)網(wǎng)絡時,我們使用的激活函數(shù)是sgn函數(shù)。到了兩層神經(jīng)網(wǎng)絡時,我們使用的最多的是sigmoid函數(shù)。而到了多層神經(jīng)網(wǎng)絡時,通過一系列的研究發(fā)現(xiàn),ReLU函數(shù)在訓練多層神經(jīng)網(wǎng)絡時,更容易收斂,并且預測性能更好。因此,目前在深度學習中,最流行的非線性函數(shù)是ReLU函數(shù)。ReLU函數(shù)不是傳統(tǒng)的非線性函數(shù),而是分段線性函數(shù)。其表達式非常簡單,就是y=max(x,0)。簡而言之,在x大于0,輸出就是輸入,而在x小于0時,輸出就保持為0。這種函數(shù)的設計啟發(fā)來自于生物神經(jīng)元對于激勵的線性響應,以及當?shù)陀谀硞€閾值后就不再響應的模擬。
在多層神經(jīng)網(wǎng)絡中,訓練的主題仍然是優(yōu)化和泛化。當使用足夠強的計算芯片(例如GPU圖形加速卡)時,梯度下降算法以及反向傳播算法在多層神經(jīng)網(wǎng)絡中的訓練中仍然工作的很好。目前學術界主要的研究既在于開發(fā)新的算法,也在于對這兩個算法進行不斷的優(yōu)化,例如,增加了一種帶動量因子(momentum)的梯度下降算法。
在深度學習中,泛化技術變的比以往更加的重要。這主要是因為神經(jīng)網(wǎng)絡的層數(shù)增加了,參數(shù)也增加了,表示能力大幅度增強,很容易出現(xiàn)過擬合現(xiàn)象。因此正則化技術就顯得十分重要。目前,Dropout技術,以及數(shù)據(jù)擴容(Data-Augmentation)技術是目前使用的最多的正則化技術。
5.影響
目前,深度神經(jīng)網(wǎng)絡在人工智能界占據(jù)統(tǒng)治地位。但凡有關人工智能的產(chǎn)業(yè)報道,必然離不開深度學習。神經(jīng)網(wǎng)絡界當下的四位引領者除了前文所說的Ng,Hinton以外,還有CNN的發(fā)明人Yann Lecun,以及《Deep Learning》的作者Bengio。
前段時間一直對人工智能持謹慎態(tài)度的馬斯克,搞了一個OpenAI項目,邀請Bengio作為高級顧問。馬斯克認為,人工智能技術不應該掌握在大公司如Google,F(xiàn)acebook的手里,更應該作為一種開放技術,讓所有人都可以參與研究。馬斯克的這種精神值得讓人敬佩。


圖35 Yann LeCun(左)和 Yoshua Bengio(右)
多層神經(jīng)網(wǎng)絡的研究仍在進行中?,F(xiàn)在最為火熱的研究技術包括RNN,LSTM等,研究方向則是圖像理解方面。圖像理解技術是給計算機一幅圖片,讓它用語言來表達這幅圖片的意思。ImageNet競賽也在不斷召開,有更多的方法涌現(xiàn)出來,刷新以往的正確率。
六. 回顧
1.影響****
我們回顧一下神經(jīng)網(wǎng)絡發(fā)展的歷程。神經(jīng)網(wǎng)絡的發(fā)展歷史曲折蕩漾,既有被人捧上天的時刻,也有摔落在街頭無人問津的時段,中間經(jīng)歷了數(shù)次大起大落。
從單層神經(jīng)網(wǎng)絡(感知器)開始,到包含一個隱藏層的兩層神經(jīng)網(wǎng)絡,再到多層的深度神經(jīng)網(wǎng)絡,一共有三次興起過程。詳見下圖。

圖36 三起三落的神經(jīng)網(wǎng)絡
上圖中的頂點與谷底可以看作神經(jīng)網(wǎng)絡發(fā)展的高峰與低谷。圖中的橫軸是時間,以年為單位??v軸是一個神經(jīng)網(wǎng)絡影響力的示意表示。如果把1949年Hebb模型提出到1958年的感知機誕生這個10年視為落下(沒有興起)的話,那么神經(jīng)網(wǎng)絡算是經(jīng)歷了“三起三落”這樣一個過程,跟“小平”同志類似。俗話說,天將降大任于斯人也,必先苦其心志,勞其筋骨。經(jīng)歷過如此多波折的神經(jīng)網(wǎng)絡能夠在現(xiàn)階段取得成功也可以被看做是磨礪的積累吧。
歷史最大的好處是可以給現(xiàn)在做參考??茖W的研究呈現(xiàn)螺旋形上升的過程,不可能一帆風順。同時,這也給現(xiàn)在過分熱衷深度學習與人工智能的人敲響警鐘,因為這不是第一次人們因為神經(jīng)網(wǎng)絡而瘋狂了。1958年到1969年,以及1985年到1995,這兩個十年間人們對于神經(jīng)網(wǎng)絡以及人工智能的期待并不現(xiàn)在低,可結果如何大家也能看的很清楚。
因此,冷靜才是對待目前深度學習熱潮的最好辦法。如果因為深度學習火熱,或者可以有“錢景”就一窩蜂的涌入,那么最終的受害人只能是自己。神經(jīng)網(wǎng)絡界已經(jīng)兩次有被人們捧上天了的境況,相信也對于捧得越高,摔得越慘這句話深有體會。因此,神經(jīng)網(wǎng)絡界的學者也必須給這股熱潮澆上一盆水,不要讓媒體以及投資家們過分的高看這門技術。很有可能,三十年河東,三十年河西,在幾年后,神經(jīng)網(wǎng)絡就再次陷入谷底。根據(jù)上圖的歷史曲線圖,這是很有可能的。
2.效果****
下面說一下神經(jīng)網(wǎng)絡為什么能這么火熱?簡而言之,就是其學習效果的強大。隨著神經(jīng)網(wǎng)絡的發(fā)展,其表示性能越來越強。
從單層神經(jīng)網(wǎng)絡,到兩層神經(jīng)網(wǎng)絡,再到多層神經(jīng)網(wǎng)絡,下圖說明了,隨著網(wǎng)絡層數(shù)的增加,以及激活函數(shù)的調(diào)整,神經(jīng)網(wǎng)絡所能擬合的決策分界平面的能力。

圖37 表示能力不斷增強
可以看出,隨著層數(shù)增加,其非線性分界擬合能力不斷增強。圖中的分界線并不代表真實訓練出的效果,更多的是示意效果。
神經(jīng)網(wǎng)絡的研究與應用之所以能夠不斷地火熱發(fā)展下去,與其強大的函數(shù)擬合能力是分不開關系的。
3.外因****
當然,光有強大的內(nèi)在能力,并不一定能成功。一個成功的技術與方法,不僅需要內(nèi)因的作用,還需要時勢與環(huán)境的配合。神經(jīng)網(wǎng)絡的發(fā)展背后的外在原因可以被總結為:更強的計算性能,更多的數(shù)據(jù),以及更好的訓練方法。只有滿足這些條件時,神經(jīng)網(wǎng)絡的函數(shù)擬合能力才能得已體現(xiàn),見下圖。

圖38 發(fā)展的外在原因
之所以在單層神經(jīng)網(wǎng)絡年代,Rosenblat無法制作一個雙層分類器,就在于當時的計算性能不足,Minsky也以此來打壓神經(jīng)網(wǎng)絡。但是Minsky沒有料到,僅僅10年以后,計算機CPU的快速發(fā)展已經(jīng)使得我們可以做兩層神經(jīng)網(wǎng)絡的訓練,并且還有快速的學習算法BP。
但是在兩層神經(jīng)網(wǎng)絡快速流行的年代。更高層的神經(jīng)網(wǎng)絡由于計算性能的問題,以及一些計算方法的問題,其優(yōu)勢無法得到體現(xiàn)。直到2012年,研究人員發(fā)現(xiàn),用于高性能計算的圖形加速卡(GPU)可以極佳地匹配神經(jīng)網(wǎng)絡訓練所需要的要求:高并行性,高存儲,沒有太多的控制需求,配合預訓練等算法,神經(jīng)網(wǎng)絡才得以大放光彩。
互聯(lián)網(wǎng)時代,大量的數(shù)據(jù)被收集整理,更好的訓練方法不斷被發(fā)現(xiàn)。所有這一切都滿足了多層神經(jīng)網(wǎng)絡發(fā)揮能力的條件。
“時勢造英雄”,正如Hinton在2006年的論文里說道的
“... provided that computers were fast enough, data sets were big enough, and the initial weights were close enough to a good solution. All three conditions are now satisfied.”,
外在條件的滿足也是神經(jīng)網(wǎng)絡從神經(jīng)元得以發(fā)展到目前的深度神經(jīng)網(wǎng)絡的重要因素。
除此以外,一門技術的發(fā)揚沒有“伯樂”也是不行的。在神經(jīng)網(wǎng)絡漫長的歷史中,正是由于許多研究人員的鍥而不舍,不斷鉆研,才能有了現(xiàn)在的成就。前期的Rosenblat,Rumelhart沒有見證到神經(jīng)網(wǎng)絡如今的流行與地位。但是在那個時代,他們?yōu)樯窠?jīng)網(wǎng)絡的發(fā)展所打下的基礎,卻會永遠流傳下去,不會退色。
七. 展望
**** 1.量子計算****
回到我們對神經(jīng)網(wǎng)絡歷史的討論,根據(jù)歷史趨勢圖來看,神經(jīng)網(wǎng)絡以及深度學習會不會像以往一樣再次陷入谷底?作者認為,這個過程可能取決于量子計算機的發(fā)展。
根據(jù)一些最近的研究發(fā)現(xiàn),人腦內(nèi)部進行的計算可能是類似于量子計算形態(tài)的東西。而且目前已知的最大神經(jīng)網(wǎng)絡跟人腦的神經(jīng)元數(shù)量相比,仍然顯得非常小,僅不及1%左右。所以未來真正想實現(xiàn)人腦神經(jīng)網(wǎng)絡的模擬,可能需要借助量子計算的強大計算能力。
各大研究組也已經(jīng)認識到了量子計算的重要性。谷歌就在開展量子計算機D-wave的研究,希望用量子計算來進行機器學習,并且在前段時間有了突破性的進展。國內(nèi)方面,阿里和中科院合作成立了量子計算實驗室,意圖進行量子計算的研究。
如果量子計算發(fā)展不力,仍然需要數(shù)十年才能使我們的計算能力得以突飛猛進的發(fā)展,那么缺少了強大計算能力的神經(jīng)網(wǎng)絡可能會無法一帆風順的發(fā)展下去。這種情況可以類比為80-90年時期神經(jīng)網(wǎng)絡因為計算能力的限制而被低估與忽視。假設量子計算機真的能夠與神經(jīng)網(wǎng)絡結合,并且助力真正的人工智能技術的誕生,而且量子計算機發(fā)展需要10年的話,那么神經(jīng)網(wǎng)絡可能還有10年的發(fā)展期。直到那時期以后,神經(jīng)網(wǎng)絡才能真正接近實現(xiàn)AI這一目標。

圖39 量子計算
****2.人工智能****
最后,作者想簡單地談談對目前人工智能的看法。雖然現(xiàn)在人工智能非?;馃幔蔷嚯x真正的人工智能還有很大的距離。就拿計算機視覺方向來說,面對稍微復雜一些的場景,以及易于混淆的圖像,計算機就可能難以識別。因此,這個方向還有很多的工作要做。
就普通人看來,這么辛苦的做各種實驗,以及投入大量的人力就是為了實現(xiàn)一些不及孩童能力的視覺能力,未免有些不值。但是這只是第一步。雖然計算機需要很大的運算量才能完成一個普通人簡單能完成的識圖工作,但計算機最大的優(yōu)勢在于并行化與批量推廣能力。使用計算機以后,我們可以很輕易地將以前需要人眼去判斷的工作交給計算機做,而且?guī)缀鯖]有任何的推廣成本。這就具有很大的價值。正如火車剛誕生的時候,有人嘲笑它又笨又重,速度還沒有馬快。但是很快規(guī)?;茝V的火車就替代了馬車的使用。人工智能也是如此。這也是為什么目前世界上各著名公司以及政府都對此熱衷的原因。
目前看來,神經(jīng)網(wǎng)絡要想實現(xiàn)人工智能還有很多的路要走,但方向至少是正確的,下面就要看后來者的不斷努力了。

圖40 人工智能
八 總結
本文回顧了神經(jīng)網(wǎng)絡的發(fā)展歷史,從神經(jīng)元開始,歷經(jīng)單層神經(jīng)網(wǎng)絡,兩層神經(jīng)網(wǎng)絡,直到多層神經(jīng)網(wǎng)絡。在歷史介紹中穿插講解神經(jīng)網(wǎng)絡的結構,分類效果以及訓練方法等。本文說明了神經(jīng)網(wǎng)絡內(nèi)部實際上就是矩陣計算,在程序中的實現(xiàn)沒有“點”和“線”的對象。本文說明了神經(jīng)網(wǎng)絡強大預測能力的根本,就是多層的神經(jīng)網(wǎng)絡可以無限逼近真實的對應函數(shù),從而模擬數(shù)據(jù)之間的真實關系。除此之外,本文回顧了神經(jīng)網(wǎng)絡發(fā)展的歷程,分析了神經(jīng)網(wǎng)絡發(fā)展的外在原因,包括計算能力的增強,數(shù)據(jù)的增多,以及方法的創(chuàng)新等。最后,本文對神經(jīng)網(wǎng)絡的未來進行了展望,包括量子計算與神經(jīng)網(wǎng)絡結合的可能性,以及探討未來人工智能發(fā)展的前景與價值。
九. 后記
本篇文章可以視為作者一年來對神經(jīng)網(wǎng)絡的理解與總結,包括實驗的體會,書籍的閱讀,以及思考的火花等。神經(jīng)網(wǎng)絡雖然重要,但學習并不容易。這主要是由于其結構圖較為難懂,以及歷史發(fā)展的原因,導致概念容易混淆,一些介紹的博客與網(wǎng)站內(nèi)容新舊不齊。本篇文章著眼于這些問題,沒有太多的數(shù)學推導,意圖以一種簡單的,直觀的方式對神經(jīng)網(wǎng)絡進行講解。在2015年最后一天終于寫完。希望本文可以對各位有所幫助。
作者很感謝能夠閱讀到這里的讀者。如果看完覺得好的話,還請輕輕點一下贊,你們的鼓勵就是作者繼續(xù)行文的動力。本文的備注部分是一些對神經(jīng)網(wǎng)絡學習的建議,供補充閱讀與參考。
目前為止,EasyPR的1.4版已經(jīng)將神經(jīng)網(wǎng)絡(ANN)訓練的模塊加以開放,開發(fā)者們可以使用這個模塊來進行自己的字符模型的訓練。有興趣的可以下載。
十. 備注
神經(jīng)網(wǎng)絡雖然很重要,但是對于神經(jīng)網(wǎng)絡的學習,卻并不容易。這些學習困難主要來自以下三個方面:概念,類別,教程。下面簡單說明這三點。
1.概念
對于一門技術的學習而言,首先最重要的是弄清概念。只有將概念理解清楚,才能順暢的進行后面的學習。由于神經(jīng)網(wǎng)絡漫長的發(fā)展歷史,經(jīng)常會有一些概念容易混淆,讓人學習中產(chǎn)生困惑。這里面包括歷史的術語,不一致的說法,以及被遺忘的研究等。
歷史的術語
這個的代表就是多層感知器(MLP)這個術語。起初看文獻時很難理解的一個問題就是,為什么神經(jīng)網(wǎng)絡又有另一個名稱:MLP。其實MLP(Multi-Layer Perceptron)的名稱起源于50-60年代的感知器(Perceptron)。由于我們在感知器之上又增加了一個計算層,因此稱為多層感知器。值得注意的是,雖然叫“多層”,MLP一般都指的是兩層(帶一個隱藏層的)神經(jīng)網(wǎng)絡。
MLP這個術語屬于歷史遺留的產(chǎn)物?,F(xiàn)在我們一般就說神經(jīng)網(wǎng)絡,以及深度神經(jīng)網(wǎng)絡。前者代表帶一個隱藏層的兩層神經(jīng)網(wǎng)絡,也是EasyPR目前使用的識別網(wǎng)絡,后者指深度學習的網(wǎng)絡。
不一致的說法
這個最明顯的代表就是損失函數(shù)loss function,這個還有兩個說法是跟它完全一致的意思,分別是殘差函數(shù)error function,以及代價函數(shù)cost function。loss function是目前深度學習里用的較多的一種說法,caffe里也是這么叫的。cost function則是Ng在coursera教學視頻里用到的統(tǒng)一說法。這三者都是同一個意思,都是優(yōu)化問題所需要求解的方程。雖然在使用的時候不做規(guī)定,但是在聽到各種講解時要心里明白。
再來就是權重weight和參數(shù)parameter的說法,神經(jīng)網(wǎng)絡界由于以前的慣例,一般會將訓練得到的參數(shù)稱之為權重,而不像其他機器學習方法就稱之為參數(shù)。這個需要記住就好。不過在目前的使用慣例中,也有這樣一種規(guī)定。那就是非偏置節(jié)點連接上的值稱之為權重,而偏置節(jié)點上的值稱之為偏置,兩者統(tǒng)一起來稱之為參數(shù)。
另外一個同義詞就是激活函數(shù)active function和轉移函數(shù)transfer function了。同樣,他們代表一個意思,都是疊加的非線性函數(shù)的說法。
被遺忘的研究
由于神經(jīng)網(wǎng)絡發(fā)展歷史已經(jīng)有70年的漫長歷史,因此在研究過程中,必然有一些研究分支屬于被遺忘階段。這里面包括各種不同的網(wǎng)絡,例如SOM(Self-Organizing Map,自組織特征映射網(wǎng)絡),SNN(Synergetic Neural Network,協(xié)同神經(jīng)網(wǎng)絡),ART(Adaptive Resonance Theory,自適應共振理論網(wǎng)絡)等等。所以看歷史文獻時會看到許多沒見過的概念與名詞。
有些歷史網(wǎng)絡甚至會重新成為新的研究熱點,例如RNN與LSTM就是80年代左右開始的研究,目前已經(jīng)是深度學習研究中的重要一門技術,在語音與文字識別中有很好的效果。
對于這些易于混淆以及弄錯的概念,務必需要多方參考文獻,理清上下文,這樣才不會在學習與閱讀過程中迷糊。
2.類別
下面談一下關于神經(jīng)網(wǎng)絡中的不同類別。
其實本文的名字“神經(jīng)網(wǎng)絡淺講”并不合適,因為本文并不是講的是“神經(jīng)網(wǎng)絡”的內(nèi)容,而是其中的一個子類,也是目前最常說的前饋神經(jīng)網(wǎng)絡。根據(jù)下圖的分類可以看出。

圖41 神經(jīng)網(wǎng)絡的類別
神經(jīng)網(wǎng)絡其實是一個非常寬泛的稱呼,它包括兩類,一類是用計算機的方式去模擬人腦,這就是我們常說的ANN(人工神經(jīng)網(wǎng)絡),另一類是研究生物學上的神經(jīng)網(wǎng)絡,又叫生物神經(jīng)網(wǎng)絡。對于我們計算機人士而言,肯定是研究前者。
在人工神經(jīng)網(wǎng)絡之中,又分為前饋神經(jīng)網(wǎng)絡和反饋神經(jīng)網(wǎng)絡這兩種。那么它們兩者的區(qū)別是什么呢?這個其實在于它們的結構圖。我們可以把結構圖看作是一個有向圖。其中神經(jīng)元代表頂點,連接代表有向邊。對于前饋神經(jīng)網(wǎng)絡中,這個有向圖是沒有回路的。你可以仔細觀察本文中出現(xiàn)的所有神經(jīng)網(wǎng)絡的結構圖,確認一下。而對于反饋神經(jīng)網(wǎng)絡中,結構圖的有向圖是有回路的。反饋神經(jīng)網(wǎng)絡也是一類重要的神經(jīng)網(wǎng)絡。其中Hopfield網(wǎng)絡就是反饋神經(jīng)網(wǎng)絡。深度學習中的RNN也屬于一種反饋神經(jīng)網(wǎng)絡。
具體到前饋神經(jīng)網(wǎng)絡中,就有了本文中所分別描述的三個網(wǎng)絡:單層神經(jīng)網(wǎng)絡,雙層神經(jīng)網(wǎng)絡,以及多層神經(jīng)網(wǎng)絡。深度學習中的CNN屬于一種特殊的多層神經(jīng)網(wǎng)絡。另外,在一些Blog中和文獻中看到的BP神經(jīng)網(wǎng)絡是什么?其實它們就是使用了反向傳播BP算法的兩層前饋神經(jīng)網(wǎng)絡。也是最普遍的一種兩層神經(jīng)網(wǎng)絡。
通過以上分析可以看出,神經(jīng)網(wǎng)絡這種說法其實是非常廣義的,具體在文章中說的是什么網(wǎng)絡,需要根據(jù)文中的內(nèi)容加以區(qū)分。
3.教程
如何更好的學習神經(jīng)網(wǎng)絡,認真的學習一門課程或者看一本著作都是很有必要的。
說到網(wǎng)絡教程的話,這里必須說一下Ng的機器學習課程。對于一個初學者而言,Ng的課程視頻是非常有幫助的。Ng一共開設過兩門機器學習公開課程:一個是2003年在Standford開設的,面向全球的學生,這個視頻現(xiàn)在可以在網(wǎng)易公開課上找到;另一個是2010年專門為Coursera上的用戶開設的,需要登陸Coursera上才能學習。
但是,需要注意點是,這兩個課程對待神經(jīng)網(wǎng)絡的態(tài)度有點不同。早些的課程一共有20節(jié)課,Ng花了若干節(jié)課去專門講SVM以及SVM的推導,而當時的神經(jīng)網(wǎng)絡,僅僅放了幾段視頻,花了大概不到20分鐘(一節(jié)課60分鐘左右)。而到了后來的課程時,總共10節(jié)的課程中,Ng給了完整的兩節(jié)給神經(jīng)網(wǎng)絡,詳細介紹了神經(jīng)網(wǎng)絡的反向傳播算法。同時給SVM只有一節(jié)課,并且沒有再講SVM的推導過程。下面兩張圖分別是Ng介紹神經(jīng)網(wǎng)絡的開篇,可以大致看出一些端倪。

圖42 Ng與神經(jīng)網(wǎng)絡
為什么Ng對待神經(jīng)網(wǎng)絡的反應前后相差那么大?事實上就是深度學習的原因。Ng實踐了深度學習的效果,認識到深度學習的基礎--神經(jīng)網(wǎng)絡的重要性。這就是他在后面重點介紹神經(jīng)網(wǎng)絡的原因。總之,對于神經(jīng)網(wǎng)絡的學習而言,我更推薦Coursera上的。因為在那個時候,Ng才是真正的把神經(jīng)網(wǎng)絡作為一門重要的機器學習方法去傳授。你可以從他上課的態(tài)度中感受到他的重視,以及他希望你能學好的期望。
版權說明:
本文中的所有文字,圖片,代碼的版權都是屬于作者和博客園共同所有。歡迎轉載,但是務必注明作者與出處。任何未經(jīng)允許的剽竊以及爬蟲抓取都屬于侵權,作者和博客園保留所有權利。
參考文獻:
1.Neural Networks
2.Andrew Ng Neural Networks
3.神經(jīng)網(wǎng)絡簡史
4.中科院 史忠植 神經(jīng)網(wǎng)絡 講義
5.深度學習 胡曉林