
人工神經(jīng)網(wǎng)絡(luò)—【BP】反向傳播算法證明
第一步:前向傳播
【注】此BP算法的證明僅限sigmoid激活函數(shù)情況。本博文講道理是沒錯(cuò)的,畢竟最后還利用代碼還核對(duì)了一次理論證明結(jié)果。
簡單的三層網(wǎng)絡(luò)結(jié)構(gòu)如下
參數(shù)定義:
可見層定義為X,共有n個(gè)單元,下標(biāo)用 i表示
隱藏層定義為B,共有p個(gè)單元,下標(biāo)用 j 表示
輸出層定義為Y,共有q個(gè)單元,下標(biāo)用 k表示
可見層到隱藏層權(quán)重矩陣為W,大小為 p*n
隱藏層到輸出層權(quán)重矩陣為V,大小為q*p
① 計(jì)算隱藏層各神經(jīng)元激活值
代表所有可見層單元乘以連接到第j個(gè)隱單元的權(quán)重,再減去偏置或者閾值
②計(jì)算隱含層單元的輸出值
采用sigmoid函數(shù)即S型函數(shù)
③計(jì)算輸出層各神經(jīng)元激活值
④計(jì)算輸出層單元的輸出值
第二步:逆向傳播
校正是從后往前進(jìn)行的,所以稱為誤差逆?zhèn)鞑?,?jì)算是從輸出層到隱藏層,再從隱藏層到輸入層。更新的是權(quán)重和偏置,稱為模型參數(shù)
兩層的權(quán)重和偏置的更新是類似的,下面以輸出層到隱藏層的權(quán)重和偏置更新為例。
采用平方和誤差衡量期望輸出與實(shí)際輸出的差別:
輸出層→隱藏層的更新
先對(duì)權(quán)重求梯度:
【注】上式中最后一個(gè)等號(hào)左邊第二項(xiàng)求導(dǎo)利用對(duì)sigmoid函數(shù)求導(dǎo)
接下來對(duì)偏置求梯度
隱藏層→輸入層的更新
【注】建議這一層的更新,讀者認(rèn)真推導(dǎo),這樣會(huì)對(duì)BP的更新有更深刻的印象
第四步:模型參數(shù)校正
這一步就非常簡單啦,直接用原始的模型參數(shù),減去現(xiàn)在的模型參數(shù)就行啦,其中會(huì)加入一個(gè)學(xué)習(xí)率η,控制梯度下降速度
第五步:一般性推導(dǎo)
【注】以下純?yōu)閭€(gè)人理解,與網(wǎng)絡(luò)上那些復(fù)雜點(diǎn)的公式可能有出入,實(shí)際情況有待考證..............
上面只是三層BP神經(jīng)網(wǎng)絡(luò)的推導(dǎo),看著已經(jīng)很復(fù)雜了,這時(shí)候會(huì)產(chǎn)生一個(gè)想法:如果是很多層的BP神經(jīng)網(wǎng)絡(luò)該如何去推導(dǎo)?難道是每一層都得從最后一層挨個(gè)朝前推導(dǎo)一次?這時(shí)候就得考察我們的歸納能力。這里有一個(gè)題外話,何為歸納?何為演繹?簡單點(diǎn),歸納就是從特殊性到一般性,而演繹則是從一般到特殊。當(dāng)然內(nèi)中道理還有很多,就不說了。
如何去歸納,這里就得說到BP中經(jīng)常遇到的一個(gè)詞語:鏈?zhǔn)角髮?dǎo)。如果不知道具體定義也沒事,朝下看:
①從最后一個(gè)權(quán)重開始看:這個(gè)權(quán)重連接了中間隱層和最后的輸出層,求導(dǎo)過程是對(duì)輸出層的sigmoid激活函數(shù)求導(dǎo),然后進(jìn)一步得到的結(jié)果是:輸出誤差*輸出值*(1-輸出值)*(隱層值),換個(gè)方法說:權(quán)重右邊的輸出誤差*權(quán)重右邊的輸出*(1-權(quán)重右邊的輸出)*(權(quán)重左邊的輸出);——分割線——權(quán)重連接的右邊層的偏置更新就是去掉權(quán)重更新中乘以的權(quán)重左端值的那一參數(shù)(即權(quán)重連接的左層單元的值)。
②然后看倒數(shù)第二個(gè)權(quán)重:這個(gè)權(quán)重連接了原始輸出層和中間隱層,求導(dǎo)過程還是對(duì)輸出層的sigmoid激活函數(shù)求導(dǎo),只不過求導(dǎo)對(duì)象是第二個(gè)權(quán)重,而不是①中的權(quán)重。接下來發(fā)現(xiàn)不好求導(dǎo),需要按照求導(dǎo)法則變換,變成了最后的輸出層對(duì)隱層的輸出求導(dǎo)乘以隱層輸出對(duì)第二個(gè)權(quán)重的求導(dǎo),可以發(fā)現(xiàn)這兩個(gè)都好求,因?yàn)樗麄兌贾苯哟嬖谂c被求導(dǎo)的激活函數(shù)(也就是分母的表達(dá)式)中。然后發(fā)現(xiàn)輸出層關(guān)于第二層權(quán)重的導(dǎo)數(shù)變成了:權(quán)重右邊某種值*權(quán)重右邊的輸出*(1-權(quán)重右邊的輸出)*(權(quán)重左邊的輸出)。發(fā)現(xiàn)與①很相似,只不過第一項(xiàng)有差別,然后觀察何為“權(quán)重右邊某式”,發(fā)現(xiàn)就是此層權(quán)重的后一層權(quán)重連接的層的偏置更新乘以連接到后一層的權(quán)重。
這樣總結(jié)出一個(gè)規(guī)律:
建立的一個(gè)BP網(wǎng)絡(luò)如下,注意,最后的偽層只是第n層的副本,實(shí)際的BP是沒有這一層的,此處只是為了方便理解罷了,原因繼續(xù)看下去:
如圖所示,W左邊連接層A,右邊連接層B,B層的下一層是C,B和C的連接權(quán)重為V,C的偏置更新為△c,B的偏置更新為△b,則按照歸納的結(jié)論可以得到下式:
其實(shí)這里的V是被轉(zhuǎn)置了的,因?yàn)閂是從B到C的權(quán)重,那么從C的維度到B的維度,就必須通過轉(zhuǎn)置相乘。具體涉及到矩陣求導(dǎo)法則,后面有博客更新這一內(nèi)容。
【注】有時(shí)候面試會(huì)經(jīng)常問:權(quán)重可以初始化為零?為什么?直接看這兩個(gè)公式就能很清晰發(fā)現(xiàn)是不能的,因?yàn)檫@兩個(gè)公式的更新都與權(quán)重有關(guān),如果初始權(quán)重為0的時(shí)候,這兩個(gè)梯度就都是0了。
但是突然想到當(dāng)A是第n-1層的時(shí)候,并沒有對(duì)應(yīng)的"C"層去計(jì)算第n-1層到第n層的連接權(quán)重,也就是最后一層的權(quán)重, 那么怎么辦?
方法一:
我們建立了第n層數(shù)據(jù)的副本,稱為偽層,那么此時(shí)C就是偽層了,對(duì)應(yīng)的偽層偏置設(shè)置為:
對(duì)應(yīng)的第n層到偽層的連接權(quán)重為主對(duì)角線為1,其它值都為0的矩陣.
這樣一來,我們可以輕松發(fā)現(xiàn),BP的更新步驟可以用一個(gè)遞歸來解決:
步驟1:建立一個(gè)偽層副本,偽層偏置設(shè)置為△c,偽層與輸出層(第n層)的連接權(quán)重為V
步驟2:從偽層往前推,建立一個(gè)層數(shù)為3的滑動(dòng)窗口,從左到右依次稱為上面介紹過的A、B、C層
步驟3:套用上面ABC更新△W和△b的方法去計(jì)算權(quán)重與偏置梯度
步驟4:返回步驟2(即往前移動(dòng)一層)
步驟5:每一層的更新后參數(shù)就是
方法二:
忽視方法一種的偽層, 因?yàn)槲覀儼l(fā)現(xiàn)除了最后一層的所有的偏置都能用相同的公式解決,那么我們?cè)趺吹玫阶詈笠粚拥钠茫亢唵?,直接轱轆上一節(jié)看《輸出層→隱藏層的更新》這一節(jié), 記住最后一層,也就是輸出層的偏置更新, 然后再去套那個(gè)三層的通用公式就OK了
【注】最近看了一個(gè)關(guān)于殘差項(xiàng)的博文:https://zhuanlan.zhihu.com/p/27664917,感覺文章的殘差項(xiàng)其實(shí)就是這里的偏置變化量,然后在這個(gè)博客的基礎(chǔ)上繼續(xù)推導(dǎo)(每層輸出相對(duì)于激活函數(shù)的導(dǎo)數(shù))就能得到我們的式子咯。所以本博客的結(jié)論(ABC三層遞歸求解)是無問題的
關(guān)于從sigmoid激活的三層BP到任意激活函數(shù)的三層BP到任意激活函數(shù)任意層的BP的證明請(qǐng)移步這里
驗(yàn)證
說了這么多公式,還是一句話說得好: no can no bb, show me your code →__→
那么,就扒一扒matlab的deep learning toolbox里面的BP代碼,以sigmoid為例,對(duì)照第五步的那個(gè)三層遞推公式看:
偽層的建立其實(shí)就是鏈?zhǔn)角髮?dǎo)的開端,偽層的△c就是那個(gè)減法公式:
nn.e = y - nn.a{n};
然后推導(dǎo)出最后一層的△c:
switch nn.output
case 'sigm'
d{n} = - nn.e .* (nn.a{n} .* (1 - nn.a{n}));
case {'softmax','linear'}
d{n} = - nn.e;
end
然后從倒數(shù)第二層開始
for i = (n - 1) : -1 : 2
計(jì)算我們的ABC三層推導(dǎo)中的B(1-B):
switch nn.activation_function
case 'sigm'
d_act = nn.a{i} .* (1 - nn.a{i});
case 'tanh_opt'
d_act = 1.7159 * 2/3 * (1 - 1/(1.7159)^2 * nn.a{i}.^2);
end
隨后計(jì)算△c*V*B(1-B),也就是當(dāng)前層的偏置更新量△b:
if i+1==n % in this case in d{n} there is not the bias term to be removed
d{i} = (d{i + 1} * nn.W{i} + sparsityError) .* d_act; % Bishop (5.56)
else % in this case in d{i} the bias term has to be removed
d{i} = (d{i + 1}(:,2:end) * nn.W{i} + sparsityError) .* d_act;
end
至此上一層循環(huán)結(jié)束,計(jì)算得到了當(dāng)前層的偏置更新量。
對(duì)于權(quán)重,可以發(fā)現(xiàn)是△c*V*B(1-B)*A,其實(shí)就是△b乘以當(dāng)前層的上一層輸出就行了,直接在最后單獨(dú)開啟新的循環(huán)乘一下就行了:
for i = 1 : (n - 1)
if i+1==n
nn.dW{i} = (d{i + 1}' * nn.a{i}) / size(d{i + 1}, 1);
else
nn.dW{i} = (d{i + 1}(:,2:end)' * nn.a{i}) / size(d{i + 1}, 1);
end
end
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 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ù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(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ū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(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 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10