1. 程式人生 > >神經網絡淺講:從神經元到深度學習

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

永遠 創新 方向 轉化 展期 反向傳播 通用 堅持 高性能計算

https://www.cnblogs.com/subconscious/p/5058741.html

 神經網絡是一門重要的機器學習技術。它是目前最為火熱的研究方向--深度學習的基礎。學習神經網絡不僅可以讓你掌握一門強大的機器學習方法,同時也可以更好地幫助你理解深度學習技術。

  本文以一種簡單的,循序的方式講解神經網絡。適合對神經網絡了解不多的同學。本文對閱讀沒有一定的前提要求,但是懂一些機器學習基礎會更好地幫助理解本文。

  神經網絡是一種模擬人腦的神經網絡以期能夠實現類人工智能的機器學習技術。人腦中的神經網絡是一個非常復雜的組織。成人的大腦中估計有1000億個神經元之多。

技術分享圖片

圖1 人腦神經網絡

  那麽機器學習中的神經網絡是如何實現這種模擬的,並且達到一個驚人的良好效果的?通過本文,你可以了解到這些問題的答案,同時還能知道神經網絡的歷史,以及如何較好地學習它。

  由於本文較長,為方便讀者,以下是本文的目錄:

  一.前言

  二.神經元

  三.單層神經網絡(感知器)

  四.兩層神經網絡(多層感知器)

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

  六.回顧

  七.展望

  八.總結

  九.後記

  十.備註

一. 前言

  讓我們來看一個經典的神經網絡。這是一個包含三個層次的神經網絡。紅色的是輸入層,綠色的是輸出層,紫色的是中間層(也叫隱藏層)。輸入層有3個輸入單元,隱藏層有4個單元,輸出層有2個單元。後文中,我們統一使用這種顏色來表達神經網絡的結構。

技術分享圖片

圖2 神經網絡結構圖

  在開始介紹前,有一些知識可以先記在心裏:

  1. 設計一個神經網絡時,輸入層與輸出層的節點數往往是固定的,中間層則可以自由指定;
  2. 神經網絡結構圖中的拓撲與箭頭代表著預測過程時數據的流向,跟訓練時的數據流有一定的區別;
  3. 結構圖裏的關鍵不是圓圈(代表“神經元”),而是連接線(代表“神經元”之間的連接)。每個連接線對應一個不同的權重(其值稱為權值),這是需要訓練得到的。

  除了從左到右的形式表達的結構圖,還有一種常見的表達形式是從下到上來表示一個神經網絡。這時候,輸入層在圖的最下方。輸出層則在圖的最上方,如下圖:

技術分享圖片

圖3 從下到上的神經網絡結構圖

  從左到右的表達形式以Andrew Ng和LeCun的文獻使用較多,Caffe裏使用的則是從下到上的表達。在本文中使用Andrew Ng代表的從左到右的表達形式。

  下面從簡單的神經元開始說起,一步一步介紹神經網絡復雜結構的形成。

二. 神經元

  1.引子 

  對於神經元的研究由來已久,1904年生物學家就已經知曉了神經元的組成結構。

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

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

技術分享圖片

圖4 神經元

  1943年,心理學家McCulloch和數學家Pitts參考了生物神經元的結構,發表了抽象的神經元模型MP。在下文中,我們會具體介紹神經元模型。

技術分享圖片 技術分享圖片

圖5 Warren McCulloch(左)和 Walter Pitts(右)

  2.結構

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

  下圖是一個典型的神經元模型:包含有3個輸入,1個輸出,以及2個計算功能。

  註意中間的箭頭線。這些線稱為“連接”。每個上有一個“權值”。

技術分享圖片

圖6 神經元模型

  連接是神經元中最重要的東西。每一個連接上都有一個權重。

  一個神經網絡的訓練算法就是讓權重的值調整到最佳,以使得整個網絡的預測效果最好。

  我們使用a來表示輸入,用w來表示權值。一個表示連接的有向箭頭可以這樣理解:在初端,傳遞的信號大小仍然是a,端中間有加權參數w,經過這個加權後的信號會變成a*w,因此在連接的末端,信號的大小就變成了a*w。

  在其他繪圖模型裏,有向箭頭可能表示的是值的不變傳遞。而在神經元模型裏,每個有向箭頭表示的是值的加權傳遞。

技術分享圖片

圖7 連接(connection)

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

技術分享圖片

圖8 神經元計算

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

  下面對神經元模型的圖進行一些擴展。首先將sum函數與sgn函數合並到一個圓圈裏,代表神經元的內部計算。其次,把輸入a與輸出z寫到連接線的左上方,便於後面畫復雜的網絡。最後說明,一個神經元可以引出多個代表輸出的有向箭頭,但值都是一樣的。

  神經元可以看作一個計算與存儲單元。計算是神經元對其的輸入進行計算功能。存儲是神經元會暫存計算結果,並傳遞到下一層。

技術分享圖片

圖9 神經元擴展

  當我們用“神經元”組成網絡以後,描述網絡中的某個“神經元”時,我們更多地會用“單元”(unit)來指代。同時由於神經網絡的表現形式是一個有向圖,有時也會用“節點”(node)來表達同樣的意思。

  3.效果

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

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

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

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

  4.影響

  1943年發布的MP模型,雖然簡單,但已經建立了神經網絡大廈的地基。但是,MP模型中,權重的值都是預先設置的,因此不能學習。

  1949年心理學家Hebb提出了Hebb學習率,認為人腦神經細胞的突觸(也就是連接)上的強度上可以變化的。於是計算科學家們開始考慮用調整權值的方法來讓機器學習。這為後面的學習算法奠定了基礎。

技術分享圖片

圖10 Donald Olding Hebb

  盡管神經元模型與Hebb學習律都已誕生,但限於當時的計算機能力,直到接近10年後,第一個真正意義的神經網絡才誕生。

三. 單層神經網絡(感知器)

  1.引子  

  1958年,計算科學家Rosenblatt提出了由兩層神經元組成的神經網絡。他給它起了一個名字--“感知器”(Perceptron)(有的文獻翻譯成“感知機”,下文統一用“感知器”來指代)。

  感知器是當時首個可以學習的人工神經網絡。Rosenblatt現場演示了其學習識別簡單圖像的過程,在當時的社會引起了轟動。

  人們認為已經發現了智能的奧秘,許多學者和科研機構紛紛投入到神經網絡的研究中。美國軍方大力資助了神經網絡的研究,並認為神經網絡比“原子彈工程”更重要。這段時間直到1969年才結束,這個時期可以看作神經網絡的第一次高潮。

技術分享圖片

圖11 Rosenblat與感知器

  2.結構

  下面來說明感知器模型。

  在原來MP模型的“輸入”位置添加神經元節點,標誌其為“輸入單元”。其余不變,於是我們就有了下圖:從本圖開始,我們將權值w1, w2, w3寫到“連接線”的中間。

技術分享圖片

圖12 單層神經網絡

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

  我們把需要計算的層次稱之為“計算層”,並把擁有一個計算層的網絡稱之為“單層神經網絡”。有一些文獻會按照網絡擁有的層數來命名,例如把“感知器”稱為兩層神經網絡。但在本文裏,我們根據計算層的數量來命名。

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

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

技術分享圖片

圖13 單層神經網絡(Z1)

  可以看到,z1的計算跟原先的z並沒有區別。

  我們已知一個神經元的輸出可以向多個神經元傳遞,因此z2的計算公式如下圖。

技術分享圖片

圖14 單層神經網絡(Z2)

  可以看到,z2的計算中除了三個新的權值:w4,w5,w6以外,其他與z1是一樣的。

  整個網絡的輸出如下圖。

技術分享圖片

圖15 單層神經網絡(Z1和Z2)

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

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

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

技術分享圖片

圖16 單層神經網絡(擴展)

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

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

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

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

g(W * a) = z;

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

  3.效果

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

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

  下圖顯示了在二維平面中劃出決策分界的效果,也就是感知器的分類效果。

技術分享圖片

圖17 單層神經網絡(決策分界)

  

  4.影響 

  感知器只能做簡單的線性分類任務。但是當時的人們熱情太過於高漲,並沒有人清醒的認識到這點。於是,當人工智能領域的巨擘Minsky指出這點時,事態就發生了變化。

  Minsky在1969年出版了一本叫《Perceptron》的書,裏面用詳細的數學證明了感知器的弱點,尤其是感知器對XOR(異或)這樣的簡單分類任務都無法解決。

  Minsky認為,如果將計算層增加到兩層,計算量則過大,而且沒有有效的學習算法。所以,他認為研究更深層的網絡是沒有價值的。(本文成文後一個月,即2016年1月,Minsky在美國去世。謹在本文中紀念這位著名的計算機研究專家與大拿。)

技術分享圖片

圖18 Marvin Minsky

  

  由於Minsky的巨大影響力以及書中呈現的悲觀態度,讓很多學者和實驗室紛紛放棄了神經網絡的研究。神經網絡的研究陷入了冰河期。這個時期又被稱為“AI winter”。

  接近10年以後,對於兩層神經網絡的研究才帶來神經網絡的復蘇。

四. 兩層神經網絡(多層感知器)

  1.引子

  兩層神經網絡是本文的重點,因為正是在這時候,神經網絡開始了大範圍的推廣與使用。

  Minsky說過單層神經網絡無法解決異或問題。但是當增加一個計算層以後,兩層神經網絡不僅可以解決異或問題,而且具有非常好的非線性分類效果。不過兩層神經網絡的計算是一個問題,沒有一個較好的解法。

  1986年,Rumelhar和Hinton等人提出了反向傳播(Backpropagation,BP)算法,解決了兩層神經網絡所需要的復雜計算量問題,從而帶動了業界使用兩層神經網絡研究的熱潮。目前,大量的教授神經網絡的教材,都是重點介紹兩層(帶一個隱藏層)神經網絡的內容。

  這時候的Hinton還很年輕,30年以後,正是他重新定義了神經網絡,帶來了神經網絡復蘇的又一春。

技術分享圖片 技術分享圖片

圖19 David Rumelhart(左)以及 Geoffery Hinton(右)

  2.結構

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

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

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

技術分享圖片

圖20 兩層神經網絡(中間層計算)

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

技術分享圖片

圖21 兩層神經網絡(輸出層計算)

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

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

技術分享圖片

圖22 兩層神經網絡(向量形式)

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

g(W(1) * a(1)) = a(2);

g(W(2) * a(2)) = z;

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

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

  偏置單元與後一層的所有節點都有連接,我們設這些參數值為向量b,稱之為偏置。如下圖。

技術分享圖片

圖23 兩層神經網絡(考慮偏置節點)

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

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

g(W(1) * a(1) + b(1)) = a(2);

g(W(2) * a(2) + b(2)) = z;

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

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

  3.效果

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

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

  下面就是一個例子(此兩圖來自colah的博客),紅色的線與藍色的線代表數據。而紅色區域和藍色區域代表由神經網絡劃開的區域,兩者的分界線就是決策分界。

技術分享圖片

圖24 兩層神經網絡(決策分界)

  

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

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

技術分享圖片

圖25 兩層神經網絡(空間變換)

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

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

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

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

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

技術分享圖片

圖26 EasyPR字符識別網絡

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

  4.訓練

  下面簡單介紹一下兩層神經網絡的訓練。

  在Rosenblat提出的感知器模型中,模型中的參數可以被訓練,但是使用的方法較為簡單,並沒有使用目前機器學習中通用的方法,這導致其擴展性與適用性非常有限。從兩層神經網絡開始,神經網絡的研究人員開始使用機器學習相關的技術進行神經網絡的訓練。例如用大量的數據(1000-10000左右),使用算法進行優化等等,從而使得模型訓練可以獲得性能與數據利用上的雙重優勢。

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

loss = (yp - y)2

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

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

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

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

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

技術分享圖片

圖27 反向傳播算法

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

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

  5.影響

  兩層神經網絡在多個地方的應用說明了其效用與價值。10年前困擾神經網絡界的異或問題被輕松解決。神經網絡在這個時候,已經可以發力於語音識別,圖像識別,自動駕駛等多個領域。

  歷史總是驚人的相似,神經網絡的學者們再次登上了《紐約時報》的專訪。人們認為神經網絡可以解決許多問題。就連娛樂界都開始受到了影響,當年的《終結者》電影中的阿諾都趕時髦地說一句:我的CPU是一個神經網絡處理器,一個會學習的計算機。

  但是神經網絡仍然存在若幹的問題:盡管使用了BP算法,一次神經網絡的訓練仍然耗時太久,而且困擾訓練優化的一個問題就是局部最優解問題,這使得神經網絡的優化較為困難。同時,隱藏層的節點數需要調參,這使得使用不太方便,工程和研究人員對此多有抱怨。

  90年代中期,由Vapnik等人發明的SVM(Support Vector Machines,支持向量機)算法誕生,很快就在若幹個方面體現出了對比神經網絡的優勢:無需調參;高效;全局最優解。基於以上種種理由,SVM迅速打敗了神經網絡算法成為主流。

技術分享圖片

圖28 Vladimir Vapnik

  神經網絡的研究再次陷入了冰河期。當時,只要你的論文中包含神經網絡相關的字眼,非常容易被會議和期刊拒收,研究界那時對神經網絡的不待見可想而知。

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

  1.引子  

  在被人摒棄的10年中,有幾個學者仍然在堅持研究。這其中的棋手就是加拿大多倫多大學的Geoffery Hinton教授。

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

  很快,深度學習在語音識別領域暫露頭角。接著,2012年,深度學習技術又在圖像識別領域大展拳腳。Hinton與他的學生在ImageNet競賽中,用多層的卷積神經網絡成功地對包含一千類別的一百萬張圖片進行了訓練,取得了分類錯誤率15%的好成績,這個成績比第二名高了近11個百分點,充分證明了多層神經網絡識別效果的優越性。

  在這之後,關於深度神經網絡的研究與應用不斷湧現。

技術分享圖片

圖29 Geoffery Hinton

  由於篇幅原因,本文不介紹CNN(Conventional Neural Network,卷積神經網絡)與RNN(Recurrent Neural Network,遞歸神經網絡)的架構,下面我們只討論普通的多層神經網絡。

  2.結構

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

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

技術分享圖片

圖30 多層神經網絡

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

  在已知輸入a(1),參數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;

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

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

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

技術分享圖片

圖31 多層神經網絡(較少參數)

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

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

技術分享圖片

圖32 多層神經網絡(較多參數)

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

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

技術分享圖片

圖33 多層神經網絡(更深的層次)

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

  3.效果

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

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

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

  關於逐層特征學習的例子,可以參考下圖。

技術分享圖片

圖34 多層神經網絡(特征學習)

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

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

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

  4.訓練

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

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

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

  5.影響

  目前,深度神經網絡在人工智能界占據統治地位。但凡有關人工智能的產業報道,必然離不開深度學習。神經網絡界當下的四位引領者除了前文所說的Ng,Hinton以外,還有CNN的發明人Yann Lecun,以及《Deep Learning》的作者Bengio。

  前段時間一直對人工智能持謹慎態度的馬斯克,搞了一個OpenAI項目,邀請Bengio作為高級顧問。馬斯克認為,人工智能技術不應該掌握在大公司如Google,Facebook的手裏,更應該作為一種開放技術,讓所有人都可以參與研究。馬斯克的這種精神值得讓人敬佩。

技術分享圖片 技術分享圖片

圖35 Yann LeCun(左)和 Yoshua Bengio(右)

  多層神經網絡的研究仍在進行中。現在最為火熱的研究技術包括RNN,LSTM等,研究方向則是圖像理解方面。圖像理解技術是給計算機一幅圖片,讓它用語言來表達這幅圖片的意思。ImageNet競賽也在不斷召開,有更多的方法湧現出來,刷新以往的正確率。

六. 回顧

  1.影響  

  我們回顧一下神經網絡發展的歷程。神經網絡的發展歷史曲折蕩漾,既有被人捧上天的時刻,也有摔落在街頭無人問津的時段,中間經歷了數次大起大落。

  從單層神經網絡(感知器)開始,到包含一個隱藏層的兩層神經網絡,再到多層的深度神經網絡,一共有三次興起過程。詳見下圖。

技術分享圖片

圖36 三起三落的神經網絡

  上圖中的頂點與谷底可以看作神經網絡發展的高峰與低谷。圖中的橫軸是時間,以年為單位。縱軸是一個神經網絡影響力的示意表示。如果把1949年Hebb模型提出到1958年的感知機誕生這個10年視為落下(沒有興起)的話,那麽神經網絡算是經歷了“三起三落”這樣一個過程,跟“小平”同誌類似。俗話說,天將降大任於斯人也,必先苦其心誌,勞其筋骨。經歷過如此多波折的神經網絡能夠在現階段取得成功也可以被看做是磨礪的積累吧。

  歷史最大的好處是可以給現在做參考。科學的研究呈現螺旋形上升的過程,不可能一帆風順。同時,這也給現在過分熱衷深度學習與人工智能的人敲響警鐘,因為這不是第一次人們因為神經網絡而瘋狂了。1958年到1969年,以及1985年到1995,這兩個十年間人們對於神經網絡以及人工智能的期待並不現在低,可結果如何大家也能看的很清楚。

  因此,冷靜才是對待目前深度學習熱潮的最好辦法。如果因為深度學習火熱,或者可以有“錢景”就一窩蜂的湧入,那麽最終的受害人只能是自己。神經網絡界已經兩次有被人們捧上天了的境況,相信也對於捧得越高,摔得越慘這句話深有體會。因此,神經網絡界的學者也必須給這股熱潮澆上一盆水,不要讓媒體以及投資家們過分的高看這門技術。很有可能,三十年河東,三十年河西,在幾年後,神經網絡就再次陷入谷底。根據上圖的歷史曲線圖,這是很有可能的。

  2.效果  

  下面說一下神經網絡為什麽能這麽火熱?簡而言之,就是其學習效果的強大。隨著神經網絡的發展,其表示性能越來越強。

  從單層神經網絡,到兩層神經網絡,再到多層神經網絡,下圖說明了,隨著網絡層數的增加,以及激活函數的調整,神經網絡所能擬合的決策分界平面的能力。

技術分享圖片

圖37 表示能力不斷增強

  可以看出,隨著層數增加,其非線性分界擬合能力不斷增強。圖中的分界線並不代表真實訓練出的效果,更多的是示意效果。

  神經網絡的研究與應用之所以能夠不斷地火熱發展下去,與其強大的函數擬合能力是分不開關系的。

  3.外因  

  當然,光有強大的內在能力,並不一定能成功。一個成功的技術與方法,不僅需要內因的作用,還需要時勢與環境的配合。神經網絡的發展背後的外在原因可以被總結為:更強的計算性能,更多的數據,以及更好的訓練方法。只有滿足這些條件時,神經網絡的函數擬合能力才能得已體現,見下圖。

技術分享圖片

圖38 發展的外在原因

  之所以在單層神經網絡年代,Rosenblat無法制作一個雙層分類器,就在於當時的計算性能不足,Minsky也以此來打壓神經網絡。但是Minsky沒有料到,僅僅10年以後,計算機CPU的快速發展已經使得我們可以做兩層神經網絡的訓練,並且還有快速的學習算法BP。

  但是在兩層神經網絡快速流行的年代。更高層的神經網絡由於計算性能的問題,以及一些計算方法的問題,其優勢無法得到體現。直到2012年,研究人員發現,用於高性能計算的圖形加速卡(GPU)可以極佳地匹配神經網絡訓練所需要的要求:高並行性,高存儲,沒有太多的控制需求,配合預訓練等算法,神經網絡才得以大放光彩。

  互聯網時代,大量的數據被收集整理,更好的訓練方法不斷被發現。所有這一切都滿足了多層神經網絡發揮能力的條件。

  “時勢造英雄”,正如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.”,

  外在條件的滿足也是神經網絡從神經元得以發展到目前的深度神經網絡的重要因素。

  除此以外,一門技術的發揚沒有“伯樂”也是不行的。在神經網絡漫長的歷史中,正是由於許多研究人員的鍥而不舍,不斷鉆研,才能有了現在的成就。前期的Rosenblat,Rumelhart沒有見證到神經網絡如今的流行與地位。但是在那個時代,他們為神經網絡的發展所打下的基礎,卻會永遠流傳下去,不會退色。

七. 展望

  1.量子計算

  回到我們對神經網絡歷史的討論,根據歷史趨勢圖來看,神經網絡以及深度學習會不會像以往一樣再次陷入谷底?作者認為,這個過程可能取決於量子計算機的發展。

  根據一些最近的研究發現,人腦內部進行的計算可能是類似於量子計算形態的東西。而且目前已知的最大神經網絡跟人腦的神經元數量相比,仍然顯得非常小,僅不及1%左右。所以未來真正想實現人腦神經網絡的模擬,可能需要借助量子計算的強大計算能力。

  各大研究組也已經認識到了量子計算的重要性。谷歌就在開展量子計算機D-wave的研究,希望用量子計算來進行機器學習,並且在前段時間有了突破性的進展。國內方面,阿裏和中科院合作成立了量子計算實驗室,意圖進行量子計算的研究。

  如果量子計算發展不力,仍然需要數十年才能使我們的計算能力得以突飛猛進的發展,那麽缺少了強大計算能力的神經網絡可能會無法一帆風順的發展下去。這種情況可以類比為80-90年時期神經網絡因為計算能力的限制而被低估與忽視。假設量子計算機真的能夠與神經網絡結合,並且助力真正的人工智能技術的誕生,而且量子計算機發展需要10年的話,那麽神經網絡可能還有10年的發展期。直到那時期以後,神經網絡才能真正接近實現AI這一目標。

技術分享圖片

圖39 量子計算

  2.人工智能

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

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

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

技術分享圖片

圖40 人工智能

八 總結

  本文回顧了神經網絡的發展歷史,從神經元開始,歷經單層神經網絡,兩層神經網絡,直到多層神經網絡。在歷史介紹中穿插講解神經網絡的結構,分類效果以及訓練方法等。本文說明了神經網絡內部實際上就是矩陣計算,在程序中的實現沒有“點”和“線”的對象。本文說明了神經網絡強大預測能力的根本,就是多層的神經網絡可以無限逼近真實的對應函數,從而模擬數據之間的真實關系。除此之外,本文回顧了神經網絡發展的歷程,分析了神經網絡發展的外在原因,包括計算能力的增強,數據的增多,以及方法的創新等。最後,本文對神經網絡的未來進行了展望,包括量子計算與神經網絡結合的可能性,以及探討未來人工智能發展的前景與價值。

九. 後記

  本篇文章可以視為作者一年來對神經網絡的理解與總結,包括實驗的體會,書籍的閱讀,以及思考的火花等。神經網絡雖然重要,但學習並不容易。這主要是由於其結構圖較為難懂,以及歷史發展的原因,導致概念容易混淆,一些介紹的博客與網站內容新舊不齊。本篇文章著眼於這些問題,沒有太多的數學推導,意圖以一種簡單的,直觀的方式對神經網絡進行講解。在2015年最後一天終於寫完。希望本文可以對各位有所幫助。

  作者很感謝能夠閱讀到這裏的讀者。如果看完覺得好的話,還請輕輕點一下贊,你們的鼓勵就是作者繼續行文的動力。本文的備註部分是一些對神經網絡學習的建議,供補充閱讀與參考。

  

  目前為止,EasyPR的1.4版已經將神經網絡(ANN)訓練的模塊加以開放,開發者們可以使用這個模塊來進行自己的字符模型的訓練。有興趣的可以下載。

十. 備註

  神經網絡雖然很重要,但是對於神經網絡的學習,卻並不容易。這些學習困難主要來自以下三個方面:概念,類別,教程。下面簡單說明這三點。

  1.概念

  對於一門技術的學習而言,首先最重要的是弄清概念。只有將概念理解清楚,才能順暢的進行後面的學習。由於神經網絡漫長的發展歷史,經常會有一些概念容易混淆,讓人學習中產生困惑。這裏面包括歷史的術語,不一致的說法,以及被遺忘的研究等。 

  歷史的術語

  這個的代表就是多層感知器(MLP)這個術語。起初看文獻時很難理解的一個問題就是,為什麽神經網絡又有另一個名稱:MLP。其實MLP(Multi-Layer Perceptron)的名稱起源於50-60年代的感知器(Perceptron)。由於我們在感知器之上又增加了一個計算層,因此稱為多層感知器。值得註意的是,雖然叫“多層”,MLP一般都指的是兩層(帶一個隱藏層的)神經網絡。

  MLP這個術語屬於歷史遺留的產物。現在我們一般就說神經網絡,以及深度神經網絡。前者代表帶一個隱藏層的兩層神經網絡,也是EasyPR目前使用的識別網絡,後者指深度學習的網絡。

  不一致的說法

  這個最明顯的代表就是損失函數loss function,這個還有兩個說法是跟它完全一致的意思,分別是殘差函數error function,以及代價函數cost function。loss function是目前深度學習裏用的較多的一種說法,caffe裏也是這麽叫的。cost function則是Ng在coursera教學視頻裏用到的統一說法。這三者都是同一個意思,都是優化問題所需要求解的方程。雖然在使用的時候不做規定,但是在聽到各種講解時要心裏明白。

  再來就是權重weight和參數parameter的說法,神經網絡界由於以前的慣例,一般會將訓練得到的參數稱之為權重,而不像其他機器學習方法就稱之為參數。這個需要記住就好。不過在目前的使用慣例中,也有這樣一種規定。那就是非偏置節點連接上的值稱之為權重,而偏置節點上的值稱之為偏置,兩者統一起來稱之為參數。

  另外一個同義詞就是激活函數active function和轉移函數transfer function了。同樣,他們代表一個意思,都是疊加的非線性函數的說法。

  被遺忘的研究

  由於神經網絡發展歷史已經有70年的漫長歷史,因此在研究過程中,必然有一些研究分支屬於被遺忘階段。這裏面包括各種不同的網絡,例如SOM(Self-Organizing Map,自組織特征映射網絡),SNN(Synergetic Neural Network,協同神經網絡),ART(Adaptive Resonance Theory,自適應共振理論網絡)等等。所以看歷史文獻時會看到許多沒見過的概念與名詞。

  有些歷史網絡甚至會重新成為新的研究熱點,例如RNN與LSTM就是80年代左右開始的研究,目前已經是深度學習研究中的重要一門技術,在語音與文字識別中有很好的效果。 

  對於這些易於混淆以及弄錯的概念,務必需要多方參考文獻,理清上下文,這樣才不會在學習與閱讀過程中迷糊。

  2.類別

  下面談一下關於神經網絡中的不同類別。

  其實本文的名字“神經網絡淺講”並不合適,因為本文並不是講的是“神經網絡”的內容,而是其中的一個子類,也是目前最常說的前饋神經網絡。根據下圖的分類可以看出。

技術分享圖片

圖41 神經網絡的類別

  神經網絡其實是一個非常寬泛的稱呼,它包括兩類,一類是用計算機的方式去模擬人腦,這就是我們常說的ANN(人工神經網絡),另一類是研究生物學上的神經網絡,又叫生物神經網絡。對於我們計算機人士而言,肯定是研究前者。

  在人工神經網絡之中,又分為前饋神經網絡和反饋神經網絡這兩種。那麽它們兩者的區別是什麽呢?這個其實在於它們的結構圖。我們可以把結構圖看作是一個有向圖。其中神經元代表頂點,連接代表有向邊。對於前饋神經網絡中,這個有向圖是沒有回路的。你可以仔細觀察本文中出現的所有神經網絡的結構圖,確認一下。而對於反饋神經網絡中,結構圖的有向圖是有回路的。反饋神經網絡也是一類重要的神經網絡。其中Hopfield網絡就是反饋神經網絡。深度學習中的RNN也屬於一種反饋神經網絡。

  具體到前饋神經網絡中,就有了本文中所分別描述的三個網絡:單層神經網絡,雙層神經網絡,以及多層神經網絡。深度學習中的CNN屬於一種特殊的多層神經網絡。另外,在一些Blog中和文獻中看到的BP神經網絡是什麽?其實它們就是使用了反向傳播BP算法的兩層前饋神經網絡。也是最普遍的一種兩層神經網絡。

  通過以上分析可以看出,神經網絡這種說法其實是非常廣義的,具體在文章中說的是什麽網絡,需要根據文中的內容加以區分。

  3.教程

  如何更好的學習神經網絡,認真的學習一門課程或者看一本著作都是很有必要的。

  說到網絡教程的話,這裏必須說一下Ng的機器學習課程。對於一個初學者而言,Ng的課程視頻是非常有幫助的。Ng一共開設過兩門機器學習公開課程:一個是2003年在Standford開設的,面向全球的學生,這個視頻現在可以在網易公開課上找到;另一個是2010年專門為Coursera上的用戶開設的,需要登陸Coursera上才能學習。

  但是,需要註意點是,這兩個課程對待神經網絡的態度有點不同。早些的課程一共有20節課,Ng花了若幹節課去專門講SVM以及SVM的推導,而當時的神經網絡,僅僅放了幾段視頻,花了大概不到20分鐘(一節課60分鐘左右)。而到了後來的課程時,總共10節的課程中,Ng給了完整的兩節給神經網絡,詳細介紹了神經網絡的反向傳播算法。同時給SVM只有一節課,並且沒有再講SVM的推導過程。下面兩張圖分別是Ng介紹神經網絡的開篇,可以大致看出一些端倪。

技術分享圖片

圖42 Ng與神經網絡

  為什麽Ng對待神經網絡的反應前後相差那麽大?事實上就是深度學習的原因。Ng實踐了深度學習的效果,認識到深度學習的基礎--神經網絡的重要性。這就是他在後面重點介紹神經網絡的原因。總之,對於神經網絡的學習而言,我更推薦Coursera上的。因為在那個時候,Ng才是真正的把神經網絡作為一門重要的機器學習方法去傳授。你可以從他上課的態度中感受到他的重視,以及他希望你能學好的期望。

版權說明:

  本文中的所有文字,圖片,代碼的版權都是屬於作者和博客園共同所有。歡迎轉載,但是務必註明作者與出處。任何未經允許的剽竊以及爬蟲抓取都屬於侵權,作者和博客園保留所有權利。

參考文獻:

  1.Neural Networks

  2.Andrew Ng Neural Networks

  3.神經網絡簡史

  4.中科院 史忠植 神經網絡 講義

  5.深度學習 胡曉林

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