
數(shù)據(jù)挖掘系列BP神經(jīng)網(wǎng)絡(luò)算法與實(shí)踐
神經(jīng)網(wǎng)絡(luò)曾經(jīng)很火,有過(guò)一段低迷期,現(xiàn)在因?yàn)?a href='/map/shenduxuexi/' style='color:#000;font-size:inherit;'>深度學(xué)習(xí)的原因繼續(xù)火起來(lái)了。神經(jīng)網(wǎng)絡(luò)有很多種:前向傳輸網(wǎng)絡(luò)、反向傳輸網(wǎng)絡(luò)、遞歸神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)等。本文介紹基本的反向傳輸神經(jīng)網(wǎng)絡(luò)(Backpropagation 簡(jiǎn)稱BP),主要講述算法的基本流程和自己在訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)的一些經(jīng)驗(yàn)。
BP神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)
神經(jīng)網(wǎng)絡(luò)就是模擬人的大腦的神經(jīng)單元的工作方式,但進(jìn)行了很大的簡(jiǎn)化,神經(jīng)網(wǎng)絡(luò)由很多神經(jīng)網(wǎng)絡(luò)層構(gòu)成,而每一層又由許多單元組成,第一層叫輸入層,最后一層叫輸出層,中間的各層叫隱藏層,在BP神經(jīng)網(wǎng)絡(luò)中,只有相鄰的神經(jīng)層的各個(gè)單元之間有聯(lián)系,除了輸出層外,每一層都有一個(gè)偏置結(jié)點(diǎn):
雖然圖中隱藏層只畫了一層,但其層數(shù)并沒(méi)有限制,傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)經(jīng)驗(yàn)認(rèn)為一層就足夠好,而最近的深度學(xué)習(xí)不這么認(rèn)為。偏置結(jié)點(diǎn)是為了描述訓(xùn)練數(shù)據(jù)中沒(méi)有的特征,偏置結(jié)點(diǎn)對(duì)于下一層的每一個(gè)結(jié)點(diǎn)的權(quán)重的不同而生產(chǎn)不同的偏置,于是可以認(rèn)為偏置是每一個(gè)結(jié)點(diǎn)(除輸入層外)的屬性。我們偏置結(jié)點(diǎn)在圖中省略掉:
在描述BP神經(jīng)網(wǎng)絡(luò)的訓(xùn)練之前,我們先來(lái)看看神經(jīng)網(wǎng)絡(luò)各層都有哪些屬性:
訓(xùn)練一個(gè)BP神經(jīng)網(wǎng)絡(luò),實(shí)際上就是調(diào)整網(wǎng)絡(luò)的權(quán)重和偏置這兩個(gè)參數(shù),BP神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程分兩部分:
我們先來(lái)看前向傳輸。
前向傳輸(Feed-Forward前向反饋)
在訓(xùn)練網(wǎng)絡(luò)之前,我們需要隨機(jī)初始化權(quán)重和偏置,對(duì)每一個(gè)權(quán)重取[-1,1]的一個(gè)隨機(jī)實(shí)數(shù),每一個(gè)偏置取[0,1]的一個(gè)隨機(jī)實(shí)數(shù),之后就開(kāi)始進(jìn)行前向傳輸。
神經(jīng)網(wǎng)絡(luò)的訓(xùn)練是由多趟迭代完成的,每一趟迭代都使用訓(xùn)練集的所有記錄,而每一次訓(xùn)練網(wǎng)絡(luò)只使用一條記錄,抽象的描述如下:
首先設(shè)置輸入層的輸出值,假設(shè)屬性的個(gè)數(shù)為100,那我們就設(shè)置輸入層的神經(jīng)單元個(gè)數(shù)為100,輸入層的結(jié)點(diǎn)Ni為記錄第i維上的屬性值xi。對(duì)輸入層的操作就這么簡(jiǎn)單,之后的每層就要復(fù)雜一些了,除輸入層外,其他各層的輸入值是上一層輸入值按權(quán)重累加的結(jié)果值加上偏置,每個(gè)結(jié)點(diǎn)的輸出值等該結(jié)點(diǎn)的輸入值作變換
前向傳輸?shù)妮敵鰧拥挠?jì)算過(guò)程公式如下:
Ij=∑iWijOi+θj
Oj=11+e?Il
對(duì)隱藏層和輸出層的每一個(gè)結(jié)點(diǎn)都按照如上圖的方式計(jì)算輸出值,就完成前向傳播的過(guò)程,緊接著是進(jìn)行逆向反饋。
逆向反饋(Backpropagation)
逆向反饋從最后一層即輸出層開(kāi)始,我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)作分類的目的往往是希望最后一層的輸出能夠描述數(shù)據(jù)記錄的類別,比如對(duì)于一個(gè)二分類的問(wèn)題,我們常常用兩個(gè)神經(jīng)單元作為輸出層,如果輸出層的第一個(gè)神經(jīng)單元的輸出值比第二個(gè)神經(jīng)單元大,我們認(rèn)為這個(gè)數(shù)據(jù)記錄屬于第一類,否則屬于第二類。
還記得我們第一次前向反饋時(shí),整個(gè)網(wǎng)絡(luò)的權(quán)重和偏置都是我們隨機(jī)取,因此網(wǎng)絡(luò)的輸出肯定還不能描述記錄的類別,因此需要調(diào)整網(wǎng)絡(luò)的參數(shù),即權(quán)重值和偏置值,而調(diào)整的依據(jù)就是網(wǎng)絡(luò)的輸出層的輸出值與類別之間的差異,通過(guò)調(diào)整參數(shù)來(lái)縮小這個(gè)差異,這就是神經(jīng)網(wǎng)絡(luò)的優(yōu)化目標(biāo)。對(duì)于輸出層:
Ej=Oj(1?Oj)(Tj?Oj)
其中Ej表示第j個(gè)結(jié)點(diǎn)的誤差值,Oj表示第j個(gè)結(jié)點(diǎn)的輸出值,Tj記錄輸出值,比如對(duì)于2分類問(wèn)題,我們用01表示類標(biāo)1,10表示類別2,如果一個(gè)記錄屬于類別1,那么其T1=0,T2=1。
中間的隱藏層并不直接與數(shù)據(jù)記錄的類別打交道,而是通過(guò)下一層的所有結(jié)點(diǎn)誤差按權(quán)重累加,計(jì)算公式如下:
Ej=Oj(1?Oj)∑kEkWjk
其中Wjk表示當(dāng)前層的結(jié)點(diǎn)j到下一層的結(jié)點(diǎn)k的權(quán)重值,Ek下一層的結(jié)點(diǎn)k的誤差率。
計(jì)算完誤差率后,就可以利用誤差率對(duì)權(quán)重和偏置進(jìn)行更新,首先看權(quán)重的更新:
ΔWij=λEjOi
Wij=Wij+ΔWij
其中λ表示表示學(xué)習(xí)速率,取值為0到1,學(xué)習(xí)速率設(shè)置得大,訓(xùn)練收斂更快,但容易陷入局部最優(yōu)解,學(xué)習(xí)速率設(shè)置得比較小的話,收斂速度較慢,但能一步步逼近全局最優(yōu)解。
更新完權(quán)重后,還有最后一項(xiàng)參數(shù)需要更新,即偏置:
Δθj=λEj
θj=θj+Δθj
至此,我們完成了一次神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程,通過(guò)不斷的使用所有數(shù)據(jù)記錄進(jìn)行訓(xùn)練,從而得到一個(gè)分類模型。不斷地迭代,不可能無(wú)休止的下去,總歸有個(gè)終止條件
訓(xùn)練終止條件
每一輪訓(xùn)練都使用數(shù)據(jù)集的所有記錄,但什么時(shí)候停止,停止條件有下面兩種:
使用BP神經(jīng)網(wǎng)絡(luò)分類
我自己寫了一個(gè)BP神經(jīng)網(wǎng)絡(luò),在數(shù)字手寫體識(shí)別數(shù)據(jù)集MINIST上測(cè)試了一下,MINIST數(shù)據(jù)集中訓(xùn)練圖片有12000個(gè),測(cè)試圖片20000個(gè),每張圖片是28*28的灰度圖像,我對(duì)圖像進(jìn)行了二值化處理,神經(jīng)網(wǎng)絡(luò)的參數(shù)設(shè)置如下:
訓(xùn)練經(jīng)過(guò)約50次左右迭代,在訓(xùn)練集上已經(jīng)能達(dá)到99%的正確率,在測(cè)試集上的正確率為90.03%,單純的BP神經(jīng)網(wǎng)絡(luò)能夠提升的空間不大了,但kaggle上已經(jīng)有人有卷積神經(jīng)網(wǎng)絡(luò)在測(cè)試集達(dá)到了99.3%的準(zhǔn)確率。代碼是去年用C++寫的,濃濃的JAVA的味道,代碼價(jià)值不大,但注釋比較詳細(xì),可以查看這里,最近寫了一個(gè)Java多線程的BP神經(jīng)網(wǎng)絡(luò),但現(xiàn)在還不方便拿出來(lái),如果項(xiàng)目黃了,再放上來(lái)吧。
訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)的一些經(jīng)驗(yàn)
講一下自己訓(xùn)練神經(jīng)網(wǎng)絡(luò)的一點(diǎn)經(jīng)驗(yàn):
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
訓(xùn)練與驗(yàn)證損失驟升:機(jī)器學(xué)習(xí)訓(xùn)練中的異常診斷與解決方案 在機(jī)器學(xué)習(xí)模型訓(xùn)練過(guò)程中,“損失曲線” 是反映模型學(xué)習(xí)狀態(tài)的核心指 ...
2025-09-19解析 DataHub 與 Kafka:數(shù)據(jù)生態(tài)中兩類核心工具的差異與協(xié)同 在數(shù)字化轉(zhuǎn)型加速的今天,企業(yè)對(duì)數(shù)據(jù)的需求已從 “存儲(chǔ)” 轉(zhuǎn)向 “ ...
2025-09-19CDA 數(shù)據(jù)分析師:讓統(tǒng)計(jì)基本概念成為業(yè)務(wù)決策的底層邏輯 統(tǒng)計(jì)基本概念是商業(yè)數(shù)據(jù)分析的 “基礎(chǔ)語(yǔ)言”—— 從描述數(shù)據(jù)分布的 “均 ...
2025-09-19CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-19SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開(kāi)的話題。 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11