神經網絡硬科普,非專業出身的福利

kennyliu 8年前發布 | 38K 次閱讀 神經網絡

最近“神經網絡”非常火,各種關于神經網絡的文章滿天飛,但可能對于非專業領域出身的人來說接觸這些文章就會云里霧里了。究其原因主要是缺少適合大部分人理解的神經網絡的科普文章,其實吳軍老師的《數學之美》在科普神經網絡這方面做的就比較通俗易懂,感興趣的朋友可以去讀一下吳老師的書。本文與吳老師的講解方式不同,筆者希望能從神經網絡的起源揭開神經網絡的面紗,從而幫助更多的對神經網絡感興趣但卻沒有相關理論基礎的朋友們。

說起人工神經網絡的起源肯定要追溯到生物的神經網絡。

具體總結一下就是,神經元細由一個細胞體、一些樹突、一根軸突及許多突觸組成。神經細胞體是神經元的主體,內含細胞核。樹突是從細胞體向外延伸出許多神經纖維,用來接收來自其它神經元的輸入信號。軸突通過分支的神經末梢向外發出信號,與其他神經細胞的樹突相接觸形成所謂的突觸。下圖是人腦中的神經元細胞,大家可以對應神經元細胞圖著再理解一下。

為了便于大家對應理解人工神經網絡,這里再分別總結一下神經元細胞重要組成部分的特點:

1.樹突、軸突、突觸分別相當于細胞體的輸入端、輸出端及輸入/輸出接口(I/O),并且多輸入單輸出;

2.興奮型和抑制型突觸決定神經細胞興奮和抑制(分別對應輸出脈沖串頻率高低),其中脈沖串代表神經元的信息;

  1. 細胞體膜內外電位差(由突觸輸入信號總和)的升高超過閾值產生脈沖,神經細胞進入興奮狀態;

  2. 突觸延遲使輸入與輸出間有固定時滯。

開始進入人工神經網絡的分割線

1943年,基于生物神經網絡莫克羅-彼特氏神經模型(McCulloch-Pitts′neuronmodel)誕生。它由心理學家Warren McCulloch和數學家Walter Pitts合作提出。

McCulloch-Pitts模型的基本思想是抽象和簡化生物神經元的特征性成分。這個模型不需要捕捉神經元的所有屬性和行為,但要足以捕獲它執行計算的方式。McCulloch-Pitts模型的6個特點中前面4點和之前總結的生物神經元一致,具體對應請見下圖:

1.每個神經元都是一個多輸入單輸出的信息處理單元;

2.神經元輸入分興奮性輸入和抑制性輸入兩種類型;

3.神經元具有空間整合特性和閾值特性;

4.神經元輸入與輸出間有固定的時滯,主要取決于突觸延擱;

5.忽略時間整合作用和不應期;

6.神經元本身是非時變的,即其突觸時延和突觸強度均為常數。

McCulloch-Pitts模型公式如下:

這項偉大的建模可了不得,從人的角度來看將顏色、形狀分為兩類只需要靠眼睛辨別,但是對于機器而言它能辨別只是一堆數據。如果平面上有兩組數據(如下圖所示),機器怎么把兩組數據區分開,由圖可見平面上的直線方程就可以數據分為兩類,而Warren McCulloch和Walter Pitts所構建的人工神經元就是這么一個模型,它的實質就是把特征空間一切兩半,認為兩半分別屬兩個類。你恐怕再也想不到比這更簡單的分類器了。

但是McCulloch-Pitts模型缺乏一個對人工智能而言至關重要的學習機制。因此這里還需要為大家普及一下“歷史”。1949年唐納德·赫布(DonaldHebb)稱知識和學習發生在大腦主要是通過神經元間突觸的形成與變化,這個出人意料并影響深遠的想法簡稱赫布法則:

當細胞A的軸突足以接近以激發細胞B,并反復持續地對細胞B放電,一些生長過程或代謝變化將發生在某一個或這兩個細胞內,以致A作為對B放電的細胞中的一個效率增加。

通俗來講就是兩個神經細胞交流越多,它們連接的效率就越高,反之就越低。羅森布拉特(Frank Rosenblatt)受到赫布基礎性工作的啟發,于1957年提出了"感知器" (Perceptron)。這是第一個用算法來精確定義神經網絡的,感知器由兩層神經元組成,輸入層接收外界信號,輸出層是McCulloch-Pitts神經元,即閾值邏輯單元。

1969 年,Marvin Minsky和Seymour Papert出版了新書《感知器:計算幾何簡介》。書中論證了感知器模型的兩個關鍵問題:其一,單層的神經網絡無法解決不可線性分割的問題,典型例子如同或(XNOR,兩個輸入如果相同,輸出為1;兩個輸入如果是不同,輸出為0。)其二,受硬件水平的限制,當時的電腦完全沒有能力完成神經網絡模型所需要的超大的計算量。

在此筆者就以單層神經元為例解釋人工神經元是如何工作的。

x1,x2,…, xN:神經元的輸入。這些可以從輸入層實際觀測或者是一個隱藏層的中間值(隱藏層即介于輸入與輸出之間的所有節點組成的一層。幫助神經網絡學習數據間的復雜關系。大家不理解沒關系,后面講到多層神經網絡是會再跟大家解釋的)。

X0:偏置單元。這是常值添加到激活函數的輸入(類似數學里y=ax+b中使直線不過原點的常數b)。即截距項,通常有+1值。

w0,w1,w2,…,wN:對應每個輸入的權重。甚至偏置單元也是有權重的。

a:神經元的輸出。計算如下:

需要解釋一下的是,式子里的f是已知的激活函數,f使神經網絡(單層乃至多層)非常靈活并且具有能估計復雜的非線性關系的能力。在簡單情況下可以是一個高斯函數、邏輯函數、雙曲線函數或者甚至上是一個線性函數。利用神經網絡可讓其實現三個基本功能:與、或、非(AND, OR, NOT)。

這里介紹一個基本的f函數,其實就是我們熟知的階躍函數:

例1:and功能實現如下:**

神經元輸出:a = f( -1.5 + x1 + x2 )

真值表如下,可見列“a”與列“X1 AND X2”一致:

例2:or功能實現如下:**

神經元輸出為:

a = f(-0.5 + x1 + x2 )

真值表如下,其中列“a”與“X1 OR X2”一致:

通過例1和例2我們可以看到,只要改變偏置單元的權重,我們就可以實現or功能。如果x1或x2任何一個為正則權重總值為正。

例3:not功能實現如下:**

神經元輸出為:a = f( 1 - 2 * x1 )

真值表如下:

筆者希望通過這些例子大家能直觀的理解一個神經元在神經網絡中是如何工作的。當然神經網絡中的函數有多種選擇,除了以上例子所用的函數,這里我們再介紹一種常用的函數——sigmoid函數,幫助大家靈活的理解。函數圖像如下:

由圖可見sigmoid函數的優點在于輸出范圍有限,所以數據在傳遞的過程中不容易發散,并且其輸出范圍為(0,1),可以在輸出層表示概率。當然其也有相應的缺點,就是飽和的時候梯度太小。大家可以對應下面的and例子理解一下。

之前我們看到的例子中與、或、非功能都是線性可分的,感知器只有輸出層神經元進行激活函數處理,即只擁有一層功能神經元,學習能力非常有限(這就是本文之前提到的感知器模型關鍵問題之一)。因此非線性可分要用到多層神經元,下面筆者先介紹一下多層神經網絡。

神經網絡分為三種類型的層:

輸入層:神經網絡最左邊的一層,通過這些神經元輸入需要訓練觀察的樣本。

隱藏層:介于輸入與輸出之間的所有節點組成的一層。幫助神經網絡學習數據間的復雜關系。

輸出層:由前兩層得到神經網絡最后一層。5個分類的情況下輸出層將有5個神經元。

為什么多層網絡是有用的?下面大家試著去了解神經網絡如何用多層來模擬復雜關系。要進一步理解這個,需要舉一個同或函數的例子。其真值表如下:

這里我們可以看到當輸入都相同時,輸出為1,否則為0。這種關系不能由一個神經元獨立完成,因此需要一個多層網絡。使用多層的背后思想是:復雜關系功能可以被分解為簡單的功能及其組合。讓我們分解同或函數:

X1 XNOR X2 = NOT ( X1 XOR X2 )

= NOT [(A+B).(A'+B') ]

= (A+B)'+ (A'+B')'

=(A'.B') + (A.B)

(注意: 這里符號“+”代表或 ,符號“.”代表與,符號“'”“-”代表非)

這樣我們可以用之前講解的簡單的例子實現。

方法1: X1 XNOR X2 = (A’.B’) + (A.B)

設計神經元模擬A’.B’是一項挑戰,可通過以下實現:

神經元輸出:a = f( 0.5 – x1 – x2 )

真值表為:

現在,大家可以分別把A’.B’和A.B當作兩個獨立的部分,并結合為多層網絡。網絡的語義圖如下:

在這里大家可以看到,在第一層,我們分別確定A’.B’和A.B。在第二層,我們將輸出并且在頂部實現OR功能。最后整體的網絡實現如下圖所示:

大家仔細看會發現這不過是我們之前畫的神經元的組合:

a1:實現了A’.B’;

a2:實現了A.B;

a3:建立在a1和a2上實現OR,從而有效的實現(A’.B’ + A.B)。

通過真值表驗證其功能:

現在大家應該大概能直觀地理解多層網絡是如何工作的了。在上面的例子中,我們不得不分別計算A’.B’和A.B。如果我們想僅僅是基于基本的AND, OR, NOT函數實現同或功能的話,大家請看下面的方法2。

方法2: X1 XNOR X2 = NOT[ (A+B).(A’+B’) ]

這里我們用之前分解的第二步得到的式子來實現,網絡的語義圖如下:

大家可以看到在這里神經網絡不得不使用三個隱藏層。整體網絡的實現和我們之前所做的相似:

a1:等同于 A ;

a2:實現了 A’;

a3:等同于 B ;

a4:實現了 B’;

a5:實現了OR, 實際上是 A+B ;

a6:實現了OR, 實際上是 A’+B’;

a7:實現了AND, 實際上是(A+B).(A’+B’) ;

a8:實現了NOT, 實際上是 NOT [ (A+B).(A’+B’)],即最終XNOR的輸出

真值表如下:

注意:典型的一個神經元(除了偏置單元)為下一層的每個神經元提供數據。在這種情況下,我們已經避免了從第一層到第二層的幾個連接,這是因為它們的權重是0,并且加入它們容易影響大家清晰的理解神經元間的計算。所以這里沒有畫成下圖這種:

可見方法2我們成功的實現了同或功能,方法2的思想是如何將復雜的函數分解為多個層。但這種方法比方法1更復雜,因此大家應該會更喜歡方法1。

筆者之前學習神經網絡時也是看了很多資料,有些資料講的云里霧里的。筆者希望大家閱讀本文后能少走彎路,理解神經網絡。最后,引用吳老師書中的話做結尾:“有不少專業術語乍一聽很唬人,‘人工神經網絡’就屬于這一類,至少我第一次聽到這個詞就被唬住了。你想啊,在大家的印象當中,人們對人腦的結構都還根本沒有搞清楚,這就冒出來一個‘人工的’神經網絡,似乎是在用計算機來模擬人腦。想到人腦的結構那么復雜,大家的第一反應一定是人工神經網絡肯定非常高深。如果我們有幸遇到一個好心同時又善于表達的科學家或教授,他愿意花一兩個小時的時間,深入淺出地把人工神經網絡的底細告訴你,你便會發現,‘哦,原來是這么回事’。如果我們不幸遇到一個愛賣弄的人,他會很鄭重地告訴你‘我在使用人工神經網絡’或者‘我研究的課題是人工神經網絡’,然后就沒有下文了,如此,你除了對他肅然起敬外,不由得可能還會感到自卑。當然還有好心卻不善于表達的人試圖將這個概念給你講清楚,但是他用了一些更難懂的名詞,講得云山霧罩,最后你發現聽他講了好幾個小時,結果是更加糊涂了,你除了浪費時間外一無所獲,于是你得出一個結論:反正我這輩子不需要搞懂它了。

大家可別以為我是在說笑話,這些都是我的親身經歷。首先,我沒有遇到過一兩小時給我講懂的好心人,其次我遇到了一批在我前面賣弄的人,作為年輕人,總是希望把自己不明白的東西搞懂,于是我決定去旁聽一門課。不過,我聽了大約兩三次便不再去了,因為除了浪費時間,似乎我并沒得到什么收獲。好在我自己做研究暫時用不到它,也就不再關心了。后來在美國讀博士期間,我喜歡在睡覺前躺著看書,沒事兒就捧著幾本關于人工神經網絡的教科書在床上看,居然也看懂了。然后再用它做了兩三個項目,算是學會了。到這時回過頭來再看‘人工神經網絡’,其實并不復雜,入門也不難,只是我走了彎路。”

 

來自:http://www.jianshu.com/p/078bba15fdb0

 

 本文由用戶 kennyliu 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!