由Python算法編程來實現(xiàn)神經(jīng)網(wǎng)絡(luò)設(shè)計理論
多層前向神經(jīng)網(wǎng)絡(luò)由三部分組成:輸出層、隱藏層、輸出層,每層由單元組成;
輸入層由訓(xùn)練集的實例特征向量傳入,經(jīng)過連接結(jié)點的權(quán)重傳入下一層,前一層的輸出是下一層的輸入;隱藏層的個數(shù)是任意的,輸入層只有一層,輸出層也只有一層;
除去輸入層之外,隱藏層和輸出層的層數(shù)和為n,則該神經(jīng)網(wǎng)絡(luò)稱為n層神經(jīng)網(wǎng)絡(luò),如下圖為2層的神經(jīng)網(wǎng)絡(luò);
一層中加權(quán)求和,根據(jù)非線性方程進行轉(zhuǎn)化輸出;理論上,如果有足夠多的隱藏層和足夠大的訓(xùn)練集,可以模擬出任何方程;
二、設(shè)計神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
使用神經(jīng)網(wǎng)絡(luò)之前,必須要確定神經(jīng)網(wǎng)絡(luò)的層數(shù),以及每層單元的個數(shù);
為了加速學(xué)習(xí)過程,特征向量在傳入輸入層前,通常需要標準化到0和1之間;
離散型變量可以被編碼成每一個輸入單元對應(yīng)一個特征值可能賦的值
比如:特征值A(chǔ)可能去三個值(a0,a1,a2),那么可以使用3個輸入單元來代表A
如果A=a0,則代表a0的單元值取1,其余取0;
如果A=a1,則代表a1的單元值取1,其余取0;
如果A=a2,則代表a2的單元值取1,其余取0;
神經(jīng)網(wǎng)絡(luò)既解決分類(classificaTIon)問題,也可以解決回歸(regression)問題。對于分類問題,如果是兩類,則可以用一個輸出單元(0和1)分別表示兩類;如果多余兩類,則每一個類別用一個輸出單元表示,所以輸出層的單元數(shù)量通常等一類別的數(shù)量。
沒有明確的規(guī)則來設(shè)計最佳個數(shù)的隱藏層,一般根據(jù)實驗測試誤差和準確率來改進實驗。
如何計算準確率?最簡單的方法是通過一組訓(xùn)練集和測試集,訓(xùn)練集通過訓(xùn)練得到模型,將測試集輸入模型得到測試結(jié)果,將測試結(jié)果和測試集的真實標簽進行比較,得到準確率。
在機器學(xué)習(xí)領(lǐng)域一個常用的方法是交叉驗證方法。一組數(shù)據(jù)不分成2份,可能分為10份,
第1次:第1份作為測試集,剩余9份作為訓(xùn)練集;
第2次:第2份作為測試集,剩余9份作為訓(xùn)練集;
......
這樣經(jīng)過10次訓(xùn)練,得到10組準確率,將這10組數(shù)據(jù)求平均值得到平均準確率的結(jié)果。這里10是特例。一般意義上將數(shù)據(jù)分為k份,稱該算法為K-fold cross validaTIon,即每一次選擇k份中的一份作為測試集,剩余k-1份作為訓(xùn)練集,重復(fù)k次,最終得到平均準確率,是一種比較科學(xué)準確的方法。
四、BP算法
通過迭代來處理訓(xùn)練集中的實例;
對比經(jīng)過神經(jīng)網(wǎng)絡(luò)后預(yù)測值與真實值之間的差;
反方向(從輸出層=>隱藏層=>輸入層)來最小化誤差,來更新每個連接的權(quán)重;
4.1、算法詳細介紹
輸入:數(shù)據(jù)集、學(xué)習(xí)率、一個多層神經(jīng)網(wǎng)絡(luò)構(gòu)架;
輸出:一個訓(xùn)練好的神經(jīng)網(wǎng)絡(luò);
初始化權(quán)重和偏向:隨機初始化在-1到1之間(或者其他),每個單元有一個偏向;對于每一個訓(xùn)練實例X,執(zhí)行以下步驟:
1、由輸入層向前傳送:
結(jié)合神經(jīng)網(wǎng)絡(luò)示意圖進行分析:
由輸入層到隱藏層:
由隱藏層到輸出層:
將兩個公式進行總結(jié),可以得到:
Ij為當前層單元值,Oi為上一層的單元值,wij為兩層之間,連接兩個單元值的權(quán)重值,sitaj為每一層的偏向值。我們要對每一層的輸出進行非線性的轉(zhuǎn)換,示意圖如下: