2
神經(jīng)元
先來(lái)認(rèn)識(shí)下真正的神經(jīng)元。
圖 1: 典型神經(jīng)元的結(jié)構(gòu)(來(lái)自維基百科 “樹(shù)突” 詞條)
神經(jīng)元大致可以分為樹(shù)突、突觸、細(xì)胞體和軸突。樹(shù)突為神經(jīng)元的輸入通道,其功能是將其他神經(jīng)元的動(dòng)作電位傳遞至細(xì)胞體。其他神經(jīng)元的動(dòng)作電位借由位于樹(shù)突分支上的多個(gè)突觸傳遞至樹(shù)突上。神經(jīng)細(xì)胞可以視為有兩種狀態(tài)的機(jī)器,激活時(shí)為 “是”,不激活時(shí)為 “否”。神經(jīng)細(xì)胞的狀態(tài)取決于從其他神經(jīng)細(xì)胞接收到的信號(hào)量,以及突觸的性質(zhì)(抑制或加強(qiáng))。當(dāng)信號(hào)量超過(guò)某個(gè)閾值時(shí),細(xì)胞體就會(huì)被激活,產(chǎn)生電脈沖。電脈沖沿著軸突并通過(guò)突觸傳遞到其它神經(jīng)元。(內(nèi)容來(lái)自維基百科 “感知機(jī)” 詞條,稍作整理)
我們的視覺(jué)系統(tǒng)非常復(fù)雜。大致來(lái)講,當(dāng)光線投射到視網(wǎng)膜后,視覺(jué)膜上的光感受細(xì)胞的突觸直接與雙極細(xì)胞相連,雙極細(xì)胞突觸則與最外層的節(jié)細(xì)胞相連,節(jié)細(xì)胞將動(dòng)作電位傳遞到大腦。我們的視網(wǎng)膜有大約 1 億 3 千萬(wàn)個(gè)光感受細(xì)胞接收光信號(hào),然后通過(guò)大約 120 萬(wàn)個(gè)節(jié)細(xì)胞軸突將信息從視網(wǎng)膜傳遞到大腦。(內(nèi)容來(lái)自維基百科 “視覺(jué)系統(tǒng)” 詞條)
視覺(jué)系統(tǒng)使我們有了視知覺(jué)能力,將外部世界的二維投射重構(gòu)為三維世界。
人類的視覺(jué)系統(tǒng)可以毫不費(fèi)力的識(shí)別出下面圖片中的數(shù)字(當(dāng)然還有文字)。但如果讓計(jì)算機(jī)來(lái)識(shí)別,就會(huì)明顯感覺(jué)到視覺(jué)識(shí)別的困難。
圖 2: 街道地址(來(lái)源于維基百科 “Handwriting recognition” 詞條)
我們不能簡(jiǎn)單地把 “數(shù)字 2 像一只水面上的天鵝,數(shù)字 7 像一把鋤頭” 這樣的規(guī)則教給計(jì)算機(jī)。因此,我們需要把手寫(xiě)識(shí)別的問(wèn)題表述成計(jì)算機(jī)可以理解的方式。
圖 3: 水面上的天鵝像極了數(shù)字 2
假設(shè)我們有 5x5 像素的圖片來(lái)顯示每個(gè)數(shù)字,例如數(shù)字 2 表示如下:
@@@@@
. . . . . @
@@@@@
@. . . . .
@@@@@
由于我們的神經(jīng)網(wǎng)絡(luò)是以數(shù)字組成向量作為輸入的,所以我們將每個(gè)圖片轉(zhuǎn)換成長(zhǎng)度為 25 的向量,其元素的值是 1(“這個(gè)像素位于該圖像中”)或 0(“這個(gè)像素不在該圖像中”)
例如,數(shù)字 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]
我們希望神經(jīng)網(wǎng)絡(luò)最終的輸出是一個(gè)具體的數(shù)字,因此我們需要 10 個(gè)不同的輸出結(jié)果。例如,對(duì)于數(shù)字 2,正確的輸出結(jié)果將是:
[0,0,1,0,0,0,0,0,0,0]
圖 4: 使用 python 列表解析式建立一個(gè)代表 0-9 不同數(shù)字的列表
其中 targets[2] 就是輸出結(jié)果數(shù)字 2。
那么,神經(jīng)網(wǎng)絡(luò)是如何把信息的輸入轉(zhuǎn)換成我們想要的輸出的呢?
感知器(Perceptron)
感知器是一種二元分類器,它是神經(jīng)網(wǎng)絡(luò)的基石。感知器是對(duì)神經(jīng)細(xì)胞的模擬,如權(quán)量(突觸)、偏置(閾值)及激活函數(shù)(細(xì)胞體)。
輸入以向量的形式表示 x=(x_0, x_1, x_2),你可以把它們理解為不同的特征維度,其中的 x_0 是偏置單元(bias unit), 相當(dāng)于線性回歸中的常數(shù)項(xiàng)。在經(jīng)過(guò) “神經(jīng)元”(激活函數(shù))的計(jì)算后,感知器會(huì)輸出一個(gè)大于 0 或小于 0 的數(shù)。箭頭上的數(shù)字代表每個(gè)特征的權(quán)量(weights),相當(dāng)于線性回歸模型的參數(shù),是收集信息的神經(jīng)突觸。
例如,上圖列出了每個(gè)特征的權(quán)量,于是我們有這樣的模型:
hθ(x)=-3+2*x_1+2*x_2
當(dāng) x_1 和 x_2 同時(shí)為 1 時(shí),輸出為 1,而不同時(shí)都將得到負(fù)數(shù)。這實(shí)際上就是邏輯與或稱為與門(mén)。
我們的感知器將根據(jù)輸出大于或小于 0 來(lái)對(duì)輸入進(jìn)行分類:
這是一個(gè)單層的感知器。通過(guò)修改權(quán)量,我們也可以建立或門(mén)(weights=[2,2], bias=-1)、非門(mén)(weights=[-2],bias=1,只有一個(gè)輸入端)。但是,無(wú)論如何,你都無(wú)法通過(guò)一個(gè)單層的感知器來(lái)建立 “異或門(mén)”(XOR),即兩個(gè)輸入相同時(shí)輸出 1,否則輸出 0。這種情況下,我們就需要更復(fù)雜的神經(jīng)網(wǎng)絡(luò)了,即多層神經(jīng)網(wǎng)絡(luò),也被稱為前饋神經(jīng)網(wǎng)絡(luò)(feedforward neural network)。
前饋神經(jīng)網(wǎng)絡(luò)
前饋神經(jīng)網(wǎng)絡(luò)是多個(gè)感知器的組合,這些感知器以不同的方式產(chǎn)生連接,并由不同的激活函數(shù)控制激活。
圖 6: 前饋神經(jīng)網(wǎng)絡(luò)示意圖
我們來(lái)認(rèn)識(shí)下前饋神經(jīng)網(wǎng)絡(luò):
它包括輸入層(input layer)、輸出層(output layer)和一個(gè)或多個(gè)隱藏層(hidden layers)。上圖的神經(jīng)網(wǎng)絡(luò)由 3 個(gè)單元的輸入層,4 個(gè)單元的隱藏層和 2 個(gè)單元的輸出層組成。單元等于感知器。
輸入層的單元是隱藏層單元的輸入,隱藏層單元的輸出是輸出層單元的輸入。
兩個(gè)感知器之間的連接有一個(gè)權(quán)量。
第 t 層的每個(gè)感知器與第 t-1 層的每個(gè)感知器相互關(guān)聯(lián)。當(dāng)然,你也可以設(shè)置權(quán)量為 0,從而在實(shí)質(zhì)上取消連接。
在加工輸入數(shù)據(jù)時(shí),你將輸入數(shù)據(jù)賦予輸入層的每個(gè)單元,而隱藏層的每個(gè)單元是輸入層每個(gè)單元的加權(quán)求和。也就是說(shuō),輸入層的數(shù)據(jù)會(huì)被前向傳播到隱藏層的每個(gè)單元。同理,隱藏層的輸出作為輸入會(huì)前向傳播到輸入層,計(jì)算得到最后的輸出,即神經(jīng)網(wǎng)絡(luò)的輸出。
多個(gè)隱藏層的神經(jīng)網(wǎng)絡(luò)同理。
超越線性
在 “感知器” 中我們談到,單層感知器雖然可以建立與門(mén)、或門(mén)、非門(mén)等,但無(wú)法建立更為復(fù)雜的異或門(mén)(XOR),即兩個(gè)輸入相同時(shí)輸出 1,否則輸出 0。
為了更為直觀地理解這個(gè)問(wèn)題,我們可以看下圖:
圖 7: 雙輸入感知器的決策空間
模型有兩個(gè)輸入(input1 和 input2),我們可以線性地區(qū)分或門(mén)的兩類情況:即同時(shí)為 0 時(shí)在左下角,其它情況在右上角;與門(mén)的情況也可以線性地區(qū)分,即輸出同時(shí)為 1 時(shí)在右上角,其它情況在左下角。但異或門(mén)呢?這種情況是無(wú)法作出線性區(qū)分的,也就是說(shuō),單層感知器無(wú)法實(shí)現(xiàn)異或門(mén)。
多層感知器嗎?
先來(lái)分析輸入和輸出的情況。最左邊兩列列出了輸入的 4 種情況。異或門(mén)的輸出是最右邊一列的情況,即兩個(gè)輸入相同時(shí)輸出 1,否則為 0。我們?cè)谳斎雽雍洼敵鰧又g加入兩個(gè)單元的隱藏層,那么,它給輸出層的輸入應(yīng)該是什么呢?答案如下圖。你可以發(fā)現(xiàn),對(duì)于隱藏層的 a_1 單元(上標(biāo) 2 代表這是第 2 層)來(lái)說(shuō),它實(shí)際上是且門(mén)(都為 1 時(shí)才輸出 1);對(duì) a_2 單元來(lái)說(shuō),它的邏輯是 (not x_1) and (not x_2),即同時(shí)為 0 時(shí)才輸出 1。而從隱藏層到輸出層,是邏輯或。前饋神經(jīng)網(wǎng)絡(luò)可以實(shí)現(xiàn)異或門(mén)!
圖 8: 異或門(mén)輸入輸出下推導(dǎo)隱藏層
于是我們建立如下的神經(jīng)網(wǎng)絡(luò),但是其輸出并非我們想要。為什么?
圖 9: 線性激活函數(shù)下的前饋神經(jīng)網(wǎng)絡(luò)
這是因?yàn)樯厦娓兄鞯募せ詈瘮?shù)是線性函數(shù)。這種情況下,神經(jīng)網(wǎng)絡(luò)的輸出也只是輸入的某種線性函數(shù),只不過(guò)是通過(guò)網(wǎng)絡(luò)的形式來(lái)進(jìn)行加權(quán)。線性函數(shù)的線性組合仍然是線性函數(shù)。也就是說(shuō),即便是多層的感知器,激活函數(shù)為線性時(shí)也無(wú)法實(shí)現(xiàn)輸入 00 和輸入 11 時(shí)的輸出比輸入 01 和 10 時(shí)大,即非線性。
如果激活函數(shù)是線性函數(shù),前饋神經(jīng)網(wǎng)絡(luò)將不會(huì)比單層感知器強(qiáng)大多少,不管它有多少層。
我們需要 logistic 函數(shù)的幫助。大部分神經(jīng)網(wǎng)絡(luò)會(huì)使用非線性激活函數(shù),比如 logistic 函數(shù)(也被稱為 Sigmoid 函數(shù),這是就其形狀而言的)。此外,由于訓(xùn)練神經(jīng)網(wǎng)絡(luò)要使用微積分,而要使用微積分,就得使用光滑函數(shù)(在反向傳播時(shí)我們會(huì)詳細(xì)講解)。logistic 函數(shù)也滿足這一要求。
在 logistic 函數(shù)的作用下,線性函數(shù)的輸出值將被轉(zhuǎn)化到 0 到 1 之間。從下圖右上角的 logistc 曲線可以看到,輸入值越大,輸出越接近 1,輸入為 4 時(shí)輸出為 0.99;輸入值越小,輸出越接近 0,輸入值為 - 4 時(shí),輸出為 0.01。
下圖是單層感知器的激活函數(shù)為 logitic 函數(shù)時(shí)與門(mén)的示例。
圖 10: 激活函數(shù)為 logitic 函數(shù)時(shí)的與門(mén)單層感知器
綜上,我們可以通過(guò)前饋神經(jīng)網(wǎng)絡(luò)和 logistic 函數(shù)解決異或門(mén)的問(wèn)題:
圖 11: 非線性神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)異或門(mén)
反向傳播(backpropagation):訓(xùn)練神經(jīng)網(wǎng)絡(luò)
反向傳播是使用數(shù)據(jù)來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)的算法,它是神經(jīng)網(wǎng)絡(luò)的梯度下降算法。
假設(shè)我們有一個(gè)訓(xùn)練集,其中含有輸入向量和相應(yīng)的目標(biāo)輸出向量。同時(shí),假定我們的網(wǎng)絡(luò)已經(jīng)擁有一組權(quán)量(相當(dāng)于我們知道每個(gè)神經(jīng)元的激活函數(shù)),那么接下來(lái),我們就需要使用以下算法來(lái)調(diào)整這些權(quán)量。
1、利用初始權(quán)量,在輸入向量上運(yùn)行前向傳播,從而得到所有網(wǎng)絡(luò)所有神經(jīng)元的輸出。
2、這樣,每個(gè)輸出層神經(jīng)元都會(huì)得到一個(gè)誤差,即輸出值與實(shí)際值之差。
3、計(jì)算作為神經(jīng)元權(quán)量的函數(shù)的誤差的梯度,然后根據(jù)誤差降低最快的方向調(diào)整權(quán)量。
4、將這些輸出誤差反向傳播給隱藏層以便計(jì)算相應(yīng)誤差。
5、計(jì)算這些誤差的梯度,并利用同樣的方式調(diào)整隱藏層的權(quán)量。
不斷迭代,直到網(wǎng)絡(luò)收斂。
要理解上述過(guò)程,梯度下降算法是關(guān)鍵。
圖 12: 單個(gè)參數(shù)的損失函數(shù)示例
在梯度下降算法中,我們需要損失函數(shù)(即上面提到的作為神經(jīng)元權(quán)量的函數(shù)的誤差)。損失函數(shù)衡量了模型的誤差,即神經(jīng)網(wǎng)絡(luò)的輸出值與實(shí)際值之間的差異,它的參數(shù)是模型的參數(shù),即連接的權(quán)量。當(dāng)損失函數(shù)達(dá)到全局最低時(shí),得到最優(yōu)的權(quán)權(quán)量。在訓(xùn)練階段,權(quán)量不斷被更新,慢慢接近全局最低值。例如,權(quán)量是 0.6 時(shí),它就需要向 0.4 變化,這樣才能接近全局最低值。
上圖描述的是只有一個(gè)參數(shù)的情況,即模型的誤差取決于一個(gè)參數(shù)。然而,神經(jīng)網(wǎng)絡(luò)的誤差取決于每一個(gè)權(quán)量,它的損失函數(shù)也會(huì)復(fù)雜得多。
其中,i 代表第幾層,k 代表第 i 層的第幾個(gè)單元??梢?jiàn),損失函數(shù)把整個(gè)神經(jīng)網(wǎng)絡(luò)的誤差都加和了。后面的第二部分是正則化項(xiàng),暫時(shí)不用理睬,不影響后面的理解。
有人可能會(huì)問(wèn),為什么神經(jīng)網(wǎng)絡(luò)的損失函數(shù)是上面的形式?這個(gè)問(wèn)題等價(jià)于為什么 logistic 函數(shù)采用上面的形式?
在回歸模型中,損失函數(shù)是平方誤差函數(shù)(最小二乘法):
損失函數(shù)衡量了模型的輸出與實(shí)際值之間的誤差:
但對(duì) logistic 函數(shù)而言,平方誤差函數(shù)是一個(gè)非凸函數(shù),利用梯度下降算法,它將無(wú)法保證找到損失函數(shù)的全局最優(yōu)解。
圖 13: 非凸函數(shù)
對(duì) logistic 函數(shù),我們需要其他的損失函數(shù):
圖 14:
圖 15:
如果 y=1,而 h(x)=1 的話,則 cost=0,即圖 14 曲線上(1,0)的位置;如果 h(x)=0,則 cost 函數(shù)輸出值趨向于無(wú)窮大,這意味著當(dāng)我們認(rèn)為某種情況不會(huì)發(fā)生,例如用戶不會(huì)成為付費(fèi)用戶,而事實(shí)上是可能的時(shí),這種損失是不可估量的。同理,如果 y=0,而 h(x)=0 的話,則 cost=0,即圖 15 曲線上(0,0)的位置;如果 h(x)=1,則 cost 趨向于無(wú)窮大。
可以把兩種情況寫(xiě)在一個(gè)表達(dá)式中:
也即:
神經(jīng)網(wǎng)絡(luò)衡量整個(gè)網(wǎng)絡(luò)的誤差,所以在形式上看起來(lái)會(huì)復(fù)雜些,但實(shí)質(zhì)是一樣的。
那么,接下來(lái)我們要如何更新權(quán)量才能使得損失函數(shù)接近全局最低值呢?
在神經(jīng)網(wǎng)絡(luò)中,我們使用反向傳播算法來(lái)更新神經(jīng)元之間連接的權(quán)量。反向傳播的意思是指,我們從輸出層開(kāi)始計(jì)算,計(jì)算輸出層與實(shí)際值的誤差,然后返回到前面的隱藏層計(jì)算其誤差,以此類推,不斷迭代,直到網(wǎng)絡(luò)收斂。
在完成第一步的前向傳播后,我們會(huì)得到神經(jīng)網(wǎng)絡(luò)的輸出值,利用損失函數(shù)可以計(jì)算出輸出值與實(shí)際值之間的誤差。損失函數(shù)的偏導(dǎo)數(shù)可以告訴我們參數(shù)往哪個(gè)方向更新可以得到更小的損失函數(shù)值。導(dǎo)數(shù)的幾何意義為曲線的斜率,例如,對(duì)于圖 12 簡(jiǎn)單的損失函數(shù)而言,參數(shù)在 0.5 時(shí)斜率為正,參數(shù)值需要減少才能得到更小的損失函數(shù)值;而如果參數(shù)值為 0.1,斜率為負(fù),參數(shù)值需要增加才能得到更小的損失函數(shù)值。導(dǎo)數(shù)可以告訴我們?nèi)肿畹偷姆较颍?/p>
為了得到最小的 J(θ),我們需要不斷更新參數(shù)θ,即神經(jīng)網(wǎng)絡(luò)連接的權(quán)量。每次更新的變化值由下面的公式?jīng)Q定:
其中, 為損失函數(shù)的偏導(dǎo)數(shù),前面為負(fù)是因?yàn)樾甭蕿檎龝r(shí),我們需要減少參數(shù)的值才能 “下山”,而斜率為負(fù)時(shí),我們需要增加參數(shù)的值才能 “下山”, 代表學(xué)習(xí)速率,代表下山的步子有多大,如果步子太小,要走很遠(yuǎn)才能走到山底,如果步子太大,容易越過(guò)谷底,導(dǎo)致無(wú)法收斂;J(θ) 為神經(jīng)元輸出的誤差。
從隱藏層到輸出層的兩個(gè)神經(jīng)元之間的權(quán)量一旦更新,就可以更新隱藏層神經(jīng)元的輸出,從而得到隱藏層神經(jīng)元新的誤差值(更新后的輸出值和之前前向傳播時(shí)得到的輸出值),進(jìn)而根據(jù)上述公式更新隱藏層和上一層兩個(gè)神經(jīng)元之間的權(quán)量。依此類推,直到更新完整個(gè)神經(jīng)網(wǎng)絡(luò)的權(quán)量。
利用損失函數(shù)繼續(xù)更新整個(gè)網(wǎng)絡(luò)的權(quán)量,直到神經(jīng)網(wǎng)絡(luò)輸出值的誤差達(dá)到最小。
所有神經(jīng)元之間的權(quán)量確定后,神經(jīng)網(wǎng)絡(luò)就完成訓(xùn)練了。
綜上,讓機(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.
維基百科
雷鋒網(wǎng)按:本文原作者舒小曼,本文源自作者在知乎問(wèn)題“如何簡(jiǎn)單形象又有趣地講解神經(jīng)網(wǎng)絡(luò)是什么?”的回答。
深度學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)特訓(xùn)班
20年清華大學(xué)神經(jīng)網(wǎng)絡(luò)授課導(dǎo)師鄧志東教授,帶你系統(tǒng)學(xué)習(xí)人工智能之神經(jīng)網(wǎng)絡(luò)理論及應(yīng)用!
課程鏈接:http://www.mooc.ai/course/65
加入AI慕課學(xué)院人工智能學(xué)習(xí)交流QQ群:624413030,與AI同行一起交流成長(zhǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。