神經(jīng)網(wǎng)絡(luò)--基礎(chǔ)

20161019 工作很忙,更新極其緩慢

引言
本系列是本人第一次在簡書寫東西,想將手頭上正在學(xué)的神經(jīng)網(wǎng)絡(luò)歸納整理,盡量詳細(xì)地介紹神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)、計(jì)算公式與C語言實(shí)現(xiàn)。文中內(nèi)容基本參考消化了計(jì)算機(jī)的潛意識(shí)的博文,文中圖片基本來自他的博文和Ng老師的課件,所用的符號(hào)和上下標(biāo)與Ng老師的一致,在此感謝。


神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)

說到神經(jīng)網(wǎng)絡(luò),對(duì)神經(jīng)網(wǎng)絡(luò)有概念的人第一個(gè)冒出來的肯定是下面這幅圖,這是最基本的3層神經(jīng)網(wǎng)絡(luò),圖中圓圈標(biāo)識(shí)神經(jīng)元,有輸入層、1層隱藏層、輸出層。輸入層有3個(gè)輸入單元,隱藏層有4個(gè)單元,輸出層有2個(gè)單元,中間交錯(cuò)的是傳遞路線。輸入層一般表示每個(gè)樣本(sample)的特征(features),特征是根據(jù)不同的樣本我們自己提取的(例如一段聲音波形,我提取了最大值、總能量等作為特征,根據(jù)這些特征,我們可以把這段聲音歸類,而歸類的依據(jù)就是輸出層的輸出結(jié)果)。

神經(jīng)網(wǎng)絡(luò)基本結(jié)構(gòu)

神經(jīng)網(wǎng)絡(luò)中有一些設(shè)計(jì)規(guī)則需要記?。?p>

  1. 設(shè)計(jì)一個(gè)神經(jīng)網(wǎng)絡(luò)時(shí),輸入層與輸出層的節(jié)點(diǎn)數(shù)往往是固定的,中間層則可以自由指定;
  2. 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖中的拓?fù)渑c箭頭代表著預(yù)測過程時(shí)數(shù)據(jù)的流向,跟訓(xùn)練時(shí)的數(shù)據(jù)流有一定的區(qū)別;
  3. 結(jié)構(gòu)圖里的關(guān)鍵不是圓圈(代表“神經(jīng)元”),而是連接線(代表“神經(jīng)元”之間的連接)。每個(gè)連接線對(duì)應(yīng)一個(gè)不同的權(quán)重(其值稱為權(quán)值),這是需要訓(xùn)練得到的。

神經(jīng)元模型

神經(jīng)元模型包括輸入、輸出和計(jì)算模塊,如下圖所示是經(jīng)典的神經(jīng)元模型,神經(jīng)元首先對(duì)輸入信號(hào)進(jìn)行加權(quán)求和,這里的權(quán)值在神經(jīng)網(wǎng)絡(luò)計(jì)算中是很重要,一個(gè)神經(jīng)網(wǎng)絡(luò)算法就是不斷地調(diào)整每一層的權(quán)值矩陣來使得整個(gè)網(wǎng)絡(luò)的預(yù)測結(jié)果達(dá)到最佳。求和之后經(jīng)過一個(gè)非線性函數(shù)后輸出,這個(gè)非線性函數(shù)在很多地方被稱為激活函數(shù)。


神經(jīng)元的計(jì)算模型

我們用Ng老師的符號(hào)來表示上圖,得到下面圖所示,輸出z是在輸入和權(quán)值的線性加權(quán)和疊加了一個(gè)函數(shù)g的值。在MP模型里,函數(shù)g是sgn函數(shù),也就是取符號(hào)函數(shù)。這個(gè)函數(shù)當(dāng)輸入大于0時(shí),輸出1,否則輸出0。很多地方為了簡化,會(huì)把sum函數(shù)g放在同一個(gè)圈內(nèi)作為一個(gè)節(jié)點(diǎn),當(dāng)看到一個(gè)節(jié)點(diǎn)時(shí),一定要知道節(jié)點(diǎn)內(nèi)部是有這些計(jì)算過程的。

神經(jīng)元計(jì)算模型(符號(hào))

1943年發(fā)布的MP模型,雖然簡單,但已經(jīng)建立了神經(jīng)網(wǎng)絡(luò)大廈的地基。但是,MP模型中,權(quán)重的值都是預(yù)先設(shè)置的,因此不能學(xué)習(xí)。
1949年心理學(xué)家Hebb提出了Hebb學(xué)習(xí)率,認(rèn)為人腦神經(jīng)細(xì)胞的突觸(也就是連接)上的強(qiáng)度上可以變化的。于是計(jì)算科學(xué)家們開始考慮用調(diào)整權(quán)值的方法來讓機(jī)器學(xué)習(xí)。這為后面的學(xué)習(xí)算法奠定了基礎(chǔ)。

單層神經(jīng)網(wǎng)絡(luò)

1958年,計(jì)算科學(xué)家Rosenblatt提出了由兩層神經(jīng)元組成的神經(jīng)網(wǎng)絡(luò)。他給它起了一個(gè)名字--“感知器”(Perceptron)?!≡凇案兄鳌敝?,有兩個(gè)層次。分別是輸入層和輸出層。輸入層里的“輸入單元”只負(fù)責(zé)傳輸數(shù)據(jù),不做計(jì)算。輸出層里的“輸出單元”則需要對(duì)前面一層的輸入進(jìn)行計(jì)算。

我們把需要計(jì)算的層次稱之為“計(jì)算層”,并把擁有一個(gè)計(jì)算層的網(wǎng)絡(luò)稱之為“單層神經(jīng)網(wǎng)絡(luò)”。有一些文獻(xiàn)會(huì)按照網(wǎng)絡(luò)擁有的層數(shù)來命名,例如把“感知器”稱為兩層神經(jīng)網(wǎng)絡(luò)。但在本文里,我們根據(jù)計(jì)算層的數(shù)量來命名。

如下圖是一個(gè)兩個(gè)輸出的單層神經(jīng)網(wǎng)絡(luò),這里我們的預(yù)測目標(biāo)不再是一個(gè)值,而是兩個(gè)值,一般用向量表示。那么單層網(wǎng)絡(luò)模型的計(jì)算公式如下圖所示。(注意權(quán)值w的下標(biāo),如W1,2表示這一層第1個(gè)神經(jīng)元對(duì)前一層第二個(gè)神經(jīng)元的權(quán)重)

單層神經(jīng)網(wǎng)絡(luò)

我們仔細(xì)看輸出的計(jì)算公式,會(huì)發(fā)現(xiàn)這兩個(gè)公式就是線性代數(shù)方程組。因此可以用矩陣乘法來表達(dá)這兩個(gè)公式。例如,輸入的變量是[a1,a2,a3]T,用向量a來表示。方程的左邊是[z1,z2]T,用向量z來表示,權(quán)重則是矩陣W(2行3列的矩陣),于是,輸出公式可以改寫成:
g(W a) = z

這個(gè)公式就是神經(jīng)網(wǎng)絡(luò)中從前一層計(jì)算后一層的矩陣運(yùn)算。

兩層神經(jīng)網(wǎng)絡(luò)

介紹

Minsky說過單層神經(jīng)網(wǎng)絡(luò)無法解決異或問題。但是當(dāng)增加一個(gè)計(jì)算層以后,兩層神經(jīng)網(wǎng)絡(luò)不僅可以解決異或問題,而且具有非常好的非線性分類效果。不過兩層神經(jīng)網(wǎng)絡(luò)的計(jì)算是一個(gè)問題,沒有一個(gè)較好的解法。

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

結(jié)構(gòu)

兩層神經(jīng)網(wǎng)絡(luò)除了包含一個(gè)輸入層,一個(gè)輸出層以外,還增加了一個(gè)中間層(即開頭我們給出的模型)。此時(shí),中間層和輸出層都是計(jì)算層?,F(xiàn)在,我們的權(quán)值矩陣增加到了兩個(gè),Ng老師用上標(biāo)來區(qū)分不同層次之間的變量。
例如ax(i)代表第i層的第x個(gè)節(jié)點(diǎn)。a1(2),a2(2)的計(jì)算公式如下圖所示:

兩層神經(jīng)網(wǎng)絡(luò)-中間層計(jì)算

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

兩層神經(jīng)網(wǎng)絡(luò)-輸出層計(jì)算

假設(shè)我們的預(yù)測目標(biāo)是一個(gè)向量,那么與前面類似,只需要在“輸出層”再增加節(jié)點(diǎn)即可。我們使用向量和矩陣來表示層次中的變量。a(1),a(2),z是網(wǎng)絡(luò)中傳輸?shù)南蛄繑?shù)據(jù)。W(1)W(2)是網(wǎng)絡(luò)的矩陣參數(shù)。

兩層神經(jīng)網(wǎng)絡(luò)-向量表示

計(jì)算公式為:
g(W(1) a(1)) = a(2)
g(W(2) a(2)) = z

至今為止,我們對(duì)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)圖的討論中都沒有提到偏置節(jié)點(diǎn)(bias unit)。事實(shí)上,這些節(jié)點(diǎn)是默認(rèn)存在的。它本質(zhì)上是一個(gè)只含有存儲(chǔ)功能,且存儲(chǔ)值永遠(yuǎn)為1的單元。在神經(jīng)網(wǎng)絡(luò)的每個(gè)層次中,除了輸出層以外,都會(huì)含有這樣一個(gè)偏置單元。正如線性回歸模型與邏輯回歸模型中的一樣。偏置單元與后一層的所有節(jié)點(diǎn)都有連接,我們設(shè)這些參數(shù)值為向量b,稱之為偏置。如下圖。

Paste_Image.png

有些神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)圖中會(huì)把偏置節(jié)點(diǎn)明顯畫出來,有些不會(huì)。一般情況下,我們都不會(huì)明確畫出偏置節(jié)點(diǎn)。 在考慮了偏置以后的一個(gè)神經(jīng)網(wǎng)絡(luò)的矩陣運(yùn)算如下:
g(W(1) a(1) + b(1)) = a(2)
g(W(2) a(2) + b(2)) = z

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

事實(shí)上,神經(jīng)網(wǎng)絡(luò)的本質(zhì)就是通過參數(shù)與激活函數(shù)來擬合特征與目標(biāo)之間的真實(shí)函數(shù)關(guān)系。初學(xué)者可能認(rèn)為畫神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)圖是為了在程序中實(shí)現(xiàn)這些圓圈與線,但在一個(gè)神經(jīng)網(wǎng)絡(luò)的程序中,既沒有“線”這個(gè)對(duì)象,也沒有“單元”這個(gè)對(duì)象。實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò)最需要的是線性代數(shù)庫。

分類效果

與單層神經(jīng)網(wǎng)絡(luò)不同。理論證明,兩層神經(jīng)網(wǎng)絡(luò)可以無限逼近任意連續(xù)函數(shù)。這是什么意思呢?也就是說,面對(duì)復(fù)雜的非線性分類任務(wù),兩層(帶一個(gè)隱藏層)神經(jīng)網(wǎng)絡(luò)可以分類的很好。下面就是一個(gè)例子(此兩圖來自colah的博客),紅色的線與藍(lán)色的線代表數(shù)據(jù)。而紅色區(qū)域和藍(lán)色區(qū)域代表由神經(jīng)網(wǎng)絡(luò)劃開的區(qū)域,兩者的分界線就是決策分界。

兩層神經(jīng)網(wǎng)絡(luò)-決策分類

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

兩層神經(jīng)網(wǎng)絡(luò)-空間變換

可以看到,輸出層的決策分界仍然是直線。關(guān)鍵就是,從輸入層到隱藏層時(shí),數(shù)據(jù)發(fā)生了空間變換。也就是說,兩層神經(jīng)網(wǎng)絡(luò)中,隱藏層對(duì)原始的數(shù)據(jù)進(jìn)行了一個(gè)空間變換,使其可以被線性分類,然后輸出層的決策分界劃出了一個(gè)線性分類分界線,對(duì)其進(jìn)行分類。
這樣就導(dǎo)出了兩層神經(jīng)網(wǎng)絡(luò)可以做非線性分類的關(guān)鍵--隱藏層。聯(lián)想到我們一開始推導(dǎo)出的矩陣公式,我們知道,矩陣和向量相乘,本質(zhì)上就是對(duì)向量的坐標(biāo)空間進(jìn)行一個(gè)變換。因此,隱藏層的參數(shù)矩陣的作用就是使得數(shù)據(jù)的原始坐標(biāo)空間從線性不可分,轉(zhuǎn)換成了線性可分。
兩層神經(jīng)網(wǎng)絡(luò)通過兩層的線性模型模擬了數(shù)據(jù)內(nèi)真實(shí)的非線性函數(shù)。因此,多層的神經(jīng)網(wǎng)絡(luò)的本質(zhì)就是復(fù)雜函數(shù)擬合。

神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)與訓(xùn)練

在設(shè)計(jì)一個(gè)神經(jīng)網(wǎng)絡(luò)時(shí),輸入層的節(jié)點(diǎn)數(shù)需要與特征的維度匹配,輸出層的節(jié)點(diǎn)數(shù)要與目標(biāo)的維度匹配。而中間層的節(jié)點(diǎn)數(shù),卻是由設(shè)計(jì)者指定的。因此,“自由”把握在設(shè)計(jì)者的手中。但是,節(jié)點(diǎn)數(shù)設(shè)置的多少,卻會(huì)影響到整個(gè)模型的效果。如何決定這個(gè)自由層的節(jié)點(diǎn)數(shù)呢?目前業(yè)界沒有完善的理論來指導(dǎo)這個(gè)決策。一般是根據(jù)經(jīng)驗(yàn)來設(shè)置。較好的方法就是預(yù)先設(shè)定幾個(gè)可選值,通過切換這幾個(gè)值來看整個(gè)模型的預(yù)測效果,選擇效果最好的值作為最終選擇。這種方法又叫做Grid Search(明明就是瞎猜法)。

機(jī)器學(xué)習(xí)的訓(xùn)練,機(jī)器學(xué)習(xí)模型訓(xùn)練的目的,就是使得參數(shù)盡可能的與真實(shí)的模型逼近。具體做法是這樣的。首先給所有參數(shù)賦上隨機(jī)值。我們使用這些隨機(jī)生成的參數(shù)值,來預(yù)測訓(xùn)練數(shù)據(jù)中的樣本。樣本的預(yù)測目標(biāo)為h(x)
,真實(shí)目標(biāo)為y。那么,定義一個(gè)值cost,計(jì)算公式如下:
cost = (h(x) - y)2
我們的目標(biāo)就是使對(duì)所有訓(xùn)練數(shù)據(jù)的損失和(cost)盡可能的小。如果將先前的神經(jīng)網(wǎng)絡(luò)預(yù)測的矩陣公式帶入到h(x)中(z=h(x)),那么我們可以把cost寫為關(guān)于參數(shù)(parameter)的函數(shù),這個(gè)函數(shù)稱之為損失函數(shù)(cost function)。下面的問題就是求:如何優(yōu)化參數(shù),能夠讓損失函數(shù)的值最小。cost function一般用![](http://chart.googleapis.com/chart?cht=tx&chl= J(\theta))來表示。
在線性回歸中,cost function可以表示為

線性回歸中cost function

但是在logistic回歸中,cost function 就不一樣了。

Paste_Image.png

此時(shí)這個(gè)問題就被轉(zhuǎn)化為一個(gè)優(yōu)化問題,一個(gè)常用的方法就是高等數(shù)學(xué)中的求導(dǎo),但是這里的問題是由于參數(shù)不止一個(gè),求導(dǎo)后計(jì)算導(dǎo)數(shù)等于0的運(yùn)算量很大,所以一般來說解決這個(gè)優(yōu)化問題使用的是梯度下降算法。梯度下降算法每次計(jì)算參數(shù)(權(quán)重矩陣w中的每一個(gè)值)在當(dāng)前的梯度(偏導(dǎo)數(shù)),然后讓參數(shù)向著梯度的反方向前進(jìn)一段距離,不斷重復(fù),直到梯度接近0。一般這個(gè)時(shí)候,所有的參數(shù)恰好達(dá)到使損失函數(shù)達(dá)到最低值的狀態(tài)。還有一種在多元回歸中用的標(biāo)準(zhǔn)公式法。都能夠計(jì)算出使cost function達(dá)到最小值的參數(shù)矩陣。

在神經(jīng)網(wǎng)絡(luò)模型中,由于結(jié)構(gòu)復(fù)雜,每次計(jì)算梯度的代價(jià)很大。因此還需要使用反向傳播算法。反向傳播算法是利用了神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)進(jìn)行的計(jì)算。不一次計(jì)算所有參數(shù)的梯度,而是從后往前。首先計(jì)算輸出層的梯度,然后是第二個(gè)參數(shù)矩陣的梯度,接著是中間層的梯度,再然后是第一個(gè)參數(shù)矩陣的梯度,最后是輸入層的梯度。計(jì)算結(jié)束以后,所要的兩個(gè)參數(shù)矩陣的梯度就都有了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容