當前位置:
首頁 > 知識 > 究竟什麼是神經網路?這或許是最簡單有趣的解釋

究竟什麼是神經網路?這或許是最簡單有趣的解釋

神經元

先來認識下真正的神經元。

圖 1: 典型神經元的結構(來自維基百科 「樹突」 詞條)

神經元大致可以分為樹突、突觸、細胞體和軸突。樹突為神經元的輸入通道,其功能是將其他神經元的動作電位傳遞至細胞體。其他神經元的動作電位藉由位於樹突分支上的多個突觸傳遞至樹突上。神經細胞可以視為有兩種狀態的機器,激活時為 「是」,不激活時為 「否」。神經細胞的狀態取決於從其他神經細胞接收到的信號量,以及突觸的性質(抑制或加強)。當信號量超過某個閾值時,細胞體就會被激活,產生電脈衝。電脈衝沿著軸突並通過突觸傳遞到其它神經元。(內容來自維基百科 「感知機」 詞條,稍作整理)

我們的視覺系統非常複雜。大致來講,當光線投射到視網膜後,視覺膜上的光感受細胞的突觸直接與雙極細胞相連,雙極細胞突觸則與最外層的節細胞相連,節細胞將動作電位傳遞到大腦。我們的視網膜有大約 1 億 3 千萬個光感受細胞接收光信號,然後通過大約 120 萬個節細胞軸突將信息從視網膜傳遞到大腦。(內容來自維基百科 「視覺系統」 詞條)

視覺系統使我們有了視知覺能力,將外部世界的二維投射重構為三維世界。

人類的視覺系統可以毫不費力的識別出下面圖片中的數字(當然還有文字)。但如果讓計算機來識別,就會明顯感覺到視覺識別的困難。

圖 2: 街道地址(來源於維基百科 「Handwriting recognition」 詞條)

我們不能簡單地把 「數字 2 像一隻水面上的天鵝,數字 7 像一把鋤頭」 這樣的規則教給計算機。因此,我們需要把手寫識別的問題表述成計算機可以理解的方式。

圖 3: 水面上的天鵝像極了數字 2

假設我們有 5x5 像素的圖片來顯示每個數字,例如數字 2 表示如下:

@@@@@

. . . . . @

@@@@@

@. . . . .

@@@@@

由於我們的神經網路是以數字組成向量作為輸入的,所以我們將每個圖片轉換成長度為 25 的向量,其元素的值是 1(「這個像素位於該圖像中」)或 0(「這個像素不在該圖像中」)

例如,數字 2 可以表示為:

two_digit=[1,1,1,1,1

0,0,0,0,1

1,1,1,1,1

1,0,0,0,0

1,1,1,1,1]

我們希望神經網路最終的輸出是一個具體的數字,因此我們需要 10 個不同的輸出結果。例如,對於數字 2,正確的輸出結果將是:

[0,0,1,0,0,0,0,0,0,0]

圖 4: 使用 python 列表解析式建立一個代表 0-9 不同數字的列表

其中 targets[2] 就是輸出結果數字 2。

那麼,神經網路是如何把信息的輸入轉換成我們想要的輸出的呢?

感知器(Perceptron)

感知器是一種二元分類器,它是神經網路的基石。感知器是對神經細胞的模擬,如權量(突觸)、偏置(閾值)及激活函數(細胞體)。

輸入以向量的形式表示 x=(x_0, x_1, x_2),你可以把它們理解為不同的特徵維度,其中的 x_0 是偏置單元(bias unit), 相當於線性回歸中的常數項。在經過 「神經元」(激活函數)的計算後,感知器會輸出一個大於 0 或小於 0 的數。箭頭上的數字代表每個特徵的權量(weights),相當於線性回歸模型的參數,是收集信息的神經突觸。

例如,上圖列出了每個特徵的權量,於是我們有這樣的模型:

hθ(x)=-3+2*x_1+2*x_2

當 x_1 和 x_2 同時為 1 時,輸出為 1,而不同時都將得到負數。這實際上就是邏輯與或稱為與門。

我們的感知器將根據輸出大於或小於 0 來對輸入進行分類:

前饋神經網路

前饋神經網路是多個感知器的組合,這些感知器以不同的方式產生連接,並由不同的激活函數控制激活。

圖 6: 前饋神經網路示意圖

我們來認識下前饋神經網路:

它包括輸入層(input layer)、輸出層(output layer)和一個或多個隱藏層(hidden layers)。上圖的神經網路由 3 個單元的輸入層,4 個單元的隱藏層和 2 個單元的輸出層組成。單元等於感知器。

輸入層的單元是隱藏層單元的輸入,隱藏層單元的輸出是輸出層單元的輸入。

兩個感知器之間的連接有一個權量。

第 t 層的每個感知器與第 t-1 層的每個感知器相互關聯。當然,你也可以設置權量為 0,從而在實質上取消連接。

在加工輸入數據時,你將輸入數據賦予輸入層的每個單元,而隱藏層的每個單元是輸入層每個單元的加權求和。也就是說,輸入層的數據會被前向傳播到隱藏層的每個單元。同理,隱藏層的輸出作為輸入會前向傳播到輸入層,計算得到最後的輸出,即神經網路的輸出。

多個隱藏層的神經網路同理。

超越線性

在 「感知器」 中我們談到,單層感知器雖然可以建立與門、或門、非門等,但無法建立更為複雜的異或門(XOR),即兩個輸入相同時輸出 1,否則輸出 0。

為了更為直觀地理解這個問題,我們可以看下圖:

圖 7: 雙輸入感知器的決策空間

模型有兩個輸入(input1 和 input2),我們可以線性地區分或門的兩類情況:即同時為 0 時在左下角,其它情況在右上角;與門的情況也可以線性地區分,即輸出同時為 1 時在右上角,其它情況在左下角。但異或門呢?這種情況是無法作出線性區分的,也就是說,單層感知器無法實現異或門。

多層感知器嗎?

先來分析輸入和輸出的情況。最左邊兩列列出了輸入的 4 種情況。異或門的輸出是最右邊一列的情況,即兩個輸入相同時輸出 1,否則為 0。我們在輸入層和輸出層之間加入兩個單元的隱藏層,那麼,它給輸出層的輸入應該是什麼呢?答案如下圖。你可以發現,對於隱藏層的 a_1 單元(上標 2 代表這是第 2 層)來說,它實際上是且門(都為 1 時才輸出 1);對 a_2 單元來說,它的邏輯是 (not x_1) and (not x_2),即同時為 0 時才輸出 1。而從隱藏層到輸出層,是邏輯或。前饋神經網路可以實現異或門!

圖 8: 異或門輸入輸出下推導隱藏層

於是我們建立如下的神經網路,但是其輸出並非我們想要。為什麼?

圖 9: 線性激活函數下的前饋神經網路

這是因為上面感知器的激活函數是線性函數。這種情況下,神經網路的輸出也只是輸入的某種線性函數,只不過是通過網路的形式來進行加權。線性函數的線性組合仍然是線性函數。也就是說,即便是多層的感知器,激活函數為線性時也無法實現輸入 00 和輸入 11 時的輸出比輸入 01 和 10 時大,即非線性。

如果激活函數是線性函數,前饋神經網路將不會比單層感知器強大多少,不管它有多少層。

我們需要 logistic 函數的幫助。大部分神經網路會使用非線性激活函數,比如 logistic 函數(也被稱為 Sigmoid 函數,這是就其形狀而言的)。此外,由於訓練神經網路要使用微積分,而要使用微積分,就得使用光滑函數(在反向傳播時我們會詳細講解)。logistic 函數也滿足這一要求。

在 logistic 函數的作用下,線性函數的輸出值將被轉化到 0 到 1 之間。從下圖右上角的 logistc 曲線可以看到,輸入值越大,輸出越接近 1,輸入為 4 時輸出為 0.99;輸入值越小,輸出越接近 0,輸入值為 - 4 時,輸出為 0.01。

下圖是單層感知器的激活函數為 logitic 函數時與門的示例。

圖 10: 激活函數為 logitic 函數時的與門單層感知器

綜上,我們可以通過前饋神經網路和 logistic 函數解決異或門的問題:

圖 11: 非線性神經網路實現異或門

反向傳播(backpropagation):訓練神經網路

反向傳播是使用數據來訓練神經網路的演算法,它是神經網路的梯度下降演算法。

假設我們有一個訓練集,其中含有輸入向量和相應的目標輸出向量。同時,假定我們的網路已經擁有一組權量(相當於我們知道每個神經元的激活函數),那麼接下來,我們就需要使用以下演算法來調整這些權量。

1、利用初始權量,在輸入向量上運行前向傳播,從而得到所有網路所有神經元的輸出。

2、這樣,每個輸出層神經元都會得到一個誤差,即輸出值與實際值之差。

3、計算作為神經元權量的函數的誤差的梯度,然後根據誤差降低最快的方向調整權量。

4、將這些輸出誤差反向傳播給隱藏層以便計算相應誤差。

5、計算這些誤差的梯度,並利用同樣的方式調整隱藏層的權量。

不斷迭代,直到網路收斂。

要理解上述過程,梯度下降演算法是關鍵。

圖 12: 單個參數的損失函數示例

在梯度下降演算法中,我們需要損失函數(即上面提到的作為神經元權量的函數的誤差)。損失函數衡量了模型的誤差,即神經網路的輸出值與實際值之間的差異,它的參數是模型的參數,即連接的權量。當損失函數達到全局最低時,得到最優的權權量。在訓練階段,權量不斷被更新,慢慢接近全局最低值。例如,權量是 0.6 時,它就需要向 0.4 變化,這樣才能接近全局最低值。

上圖描述的是只有一個參數的情況,即模型的誤差取決於一個參數。然而,神經網路的誤差取決於每一個權量,它的損失函數也會複雜得多。

其中,i 代表第幾層,k 代表第 i 層的第幾個單元。可見,損失函數把整個神經網路的誤差都加和了。後面的第二部分是正則化項,暫時不用理睬,不影響後面的理解。

有人可能會問,為什麼神經網路的損失函數是上面的形式?這個問題等價於為什麼 logistic 函數採用上面的形式?

在回歸模型中,損失函數是平方誤差函數(最小二乘法):

損失函數衡量了模型的輸出與實際值之間的誤差:

但對 logistic 函數而言,平方誤差函數是一個非凸函數,利用梯度下降演算法,它將無法保證找到損失函數的全局最優解。

圖 13: 非凸函數

對 logistic 函數,我們需要其他的損失函數:

圖 14:

圖 15:

如果 y=1,而 h(x)=1 的話,則 cost=0,即圖 14 曲線上(1,0)的位置;如果 h(x)=0,則 cost 函數輸出值趨向於無窮大,這意味著當我們認為某種情況不會發生,例如用戶不會成為付費用戶,而事實上是可能的時,這種損失是不可估量的。同理,如果 y=0,而 h(x)=0 的話,則 cost=0,即圖 15 曲線上(0,0)的位置;如果 h(x)=1,則 cost 趨向於無窮大。

可以把兩種情況寫在一個表達式中:

也即:

神經網路衡量整個網路的誤差,所以在形式上看起來會複雜些,但實質是一樣的。

那麼,接下來我們要如何更新權量才能使得損失函數接近全局最低值呢?

在神經網路中,我們使用反向傳播演算法來更新神經元之間連接的權量。反向傳播的意思是指,我們從輸出層開始計算,計算輸出層與實際值的誤差,然後返回到前面的隱藏層計算其誤差,以此類推,不斷迭代,直到網路收斂。

在完成第一步的前向傳播後,我們會得到神經網路的輸出值,利用損失函數可以計算出輸出值與實際值之間的誤差。損失函數的偏導數可以告訴我們參數往哪個方向更新可以得到更小的損失函數值。導數的幾何意義為曲線的斜率,例如,對於圖 12 簡單的損失函數而言,參數在 0.5 時斜率為正,參數值需要減少才能得到更小的損失函數值;而如果參數值為 0.1,斜率為負,參數值需要增加才能得到更小的損失函數值。導數可以告訴我們全局最低的方向!

為了得到最小的 J(θ),我們需要不斷更新參數θ,即神經網路連接的權量。每次更新的變化值由下面的公式決定:

其中,

為損失函數的偏導數,前面為負是因為斜率為正時,我們需要減少參數的值才能 「下山」,而斜率為負時,我們需要增加參數的值才能 「下山」, 代表學習速率,代表下山的步子有多大,如果步子太小,要走很遠才能走到山底,如果步子太大,容易越過谷底,導致無法收斂;J(θ) 為神經元輸出的誤差。

從隱藏層到輸出層的兩個神經元之間的權量一旦更新,就可以更新隱藏層神經元的輸出,從而得到隱藏層神經元新的誤差值(更新後的輸出值和之前前向傳播時得到的輸出值),進而根據上述公式更新隱藏層和上一層兩個神經元之間的權量。依此類推,直到更新完整個神經網路的權量。

利用損失函數繼續更新整個網路的權量,直到神經網路輸出值的誤差達到最小。

所有神經元之間的權量確定後,神經網路就完成訓練了。

綜上,讓機器人看到 2 絕非易事。

參考資料:

Machine Learning from Coursera by Andrew Ng.

Data Science from Scratch by Joel Grus.

A Deep Learning Tutorial: From Perceptrons to Deep Networks BY IVAN VASILEV.

維基百科

註:本文原作者舒小曼,本文源自作者在知乎問題「如何簡單形象又有趣地講解神經網路是什麼?」的回答。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 唯物 的精彩文章:

大白話解釋模型產生過擬合的原因!

TAG:唯物 |

您可能感興趣

不一樣的經典,帶你了解什麼是真正的玄幻網路小說!
還記得那些讓你徹夜難眠的網路小說嗎?在這裡給大家推薦幾本讓你愛不釋手的經典之作
網路盒子玩不轉?那是因為你還不知道這些秘籍
有了網軍就可以打網路戰?沒那麼簡單
這5部網路小說你可能沒有聽過,但是內容真的很精彩!
你知道網路世界有多可怕嗎?看好了,這些都是女孩子
網路小說三大「毒書」,作者已經驚呆了,網友們這是要幹什麼?
這五本你沒有看過的網路小說,可以說沒有名氣但卻非常精彩!
你知道網路平台上的主機為什麼那麼便宜嗎?這裡有你想要的!
網路遊戲竟然有這麼多好處,但重點仍然是?
你心目中最好看的一本網路小說是什麼?
拒絕簡單粗暴,不再一覽無餘,這才是網路大電影該有的樣子!
寫網路小說前,了解這些或許能幫助你更順暢的創作
你知道網路世界有多可怕嗎?……看好了,這些都是女孩子
網路那些暴利項目,什麼才是你最需要的?賺錢吧
你最喜歡的網路小說有幾本,都是以什麼題材為主
是什麼原因讓你不玩網路遊戲的?
尋尋覓覓無好書,又要鬧書荒了?不,這幾本網路小說,徹底解憂愁
為什麼有那麼多人選擇做網路主播?就這麼現實
那些年我們錯信的網路謠言,除了空腹不能喝酸奶還有那些?