神经网络中的反向传播
介紹
我們在 Python 神經(jīng)網(wǎng)絡(luò)教程的前幾章中已經(jīng)寫過。我們運(yùn)行神經(jīng)網(wǎng)絡(luò)一章中的網(wǎng)絡(luò)缺乏學(xué)習(xí)能力。它們只能以隨機(jī)設(shè)置的權(quán)重值運(yùn)行。所以我們不能用它們解決任何分類問題。然而,在簡單神經(jīng)網(wǎng)絡(luò)一章中的網(wǎng)絡(luò)是能夠?qū)W習(xí)的,但我們只將線性網(wǎng)絡(luò)用于線性可分的類。
當(dāng)然,我們想寫通用的人工神經(jīng)網(wǎng)絡(luò),能夠?qū)W習(xí)。為此,我們必須了解反向傳播。反向傳播是訓(xùn)練人工神經(jīng)網(wǎng)絡(luò),尤其是深度神經(jīng)網(wǎng)絡(luò)的常用方法。需要反向傳播來計(jì)算梯度,我們需要調(diào)整權(quán)重矩陣的權(quán)重。我們網(wǎng)絡(luò)的神經(jīng)元(節(jié)點(diǎn))的權(quán)重是通過計(jì)算損失函數(shù)的梯度來調(diào)整的。為此,使用梯度下降優(yōu)化算法。它也稱為錯(cuò)誤的反向傳播。
人們經(jīng)常被其中使用的數(shù)學(xué)嚇倒。我們試圖用簡單的術(shù)語來解釋它。
許多關(guān)于山的文章或教程開始解釋梯度下降。想象一下,您在夜間或大霧中被直升機(jī)帶到一座山上,不一定是山頂。讓我們進(jìn)一步想象這座山在一個(gè)島上,你想要到達(dá)海平面。你必須下去,但你幾乎看不到任何東西,也許只有幾米。你的任務(wù)是找到下山的路,但你看不到路。您可以使用梯度下降的方法。這意味著您正在檢查當(dāng)前位置的陡度。您將朝下坡最陡的方向前進(jìn)。你只走了幾步,然后又停下來重新調(diào)整自己的方向。這意味著您正在再次應(yīng)用之前描述的程序,即您正在尋找最陡峭的下降。
下圖在二維空間中描述了此過程。
如此下去,您將到達(dá)一個(gè)位置,在那里不再下降。
每個(gè)方向都向上。你可能已經(jīng)達(dá)到了最深的層次——全球最低點(diǎn)——,但你還不如被困在一個(gè)盆地中。如果您從圖像右側(cè)的位置開始,一切正常,但從左側(cè)開始,您將陷入局部最小值。
反向傳播詳解
現(xiàn)在,我們必須深入細(xì)節(jié),即數(shù)學(xué)。
我們將從更簡單的情況開始。我們看一個(gè)線性網(wǎng)絡(luò)。線性神經(jīng)網(wǎng)絡(luò)是通過將所有加權(quán)輸入信號相加來創(chuàng)建輸出信號的網(wǎng)絡(luò)。沒有激活函數(shù)將應(yīng)用于這個(gè)總和,這是線性的原因。
將使用以下簡單網(wǎng)絡(luò)。
當(dāng)我們訓(xùn)練網(wǎng)絡(luò)時(shí),我們有樣本和相應(yīng)的標(biāo)簽。對于每個(gè)輸出值○一世?我們有一個(gè)標(biāo)簽?噸一世,這是目標(biāo)值或所需值。如果標(biāo)簽等于輸出,則結(jié)果是正確的,神經(jīng)網(wǎng)絡(luò)沒有出錯(cuò)。原則上,誤差是目標(biāo)和實(shí)際輸出之間的差異:
電子一世=噸一世-○一世
我們稍后將使用平方誤差函數(shù),因?yàn)樗鼘τ谒惴ň哂懈玫奶匦?#xff1a;
電子一世=12(噸一世-○一世)2
我們想通過以下帶有值的示例來闡明錯(cuò)誤的反向傳播方式:
我們來看看輸出值?○1,這取決于值?瓦11,?瓦12,?瓦13?和?瓦14.?讓我們假設(shè)計(jì)算值(○1) 是 0.92 和所需的值 (噸1) 是 1。在這種情況下,錯(cuò)誤是
電子1=噸1-○1=1-0.92=0.08
錯(cuò)誤?電子2?可以這樣計(jì)算:
電子2=噸2-○2=1-0.18=0.82
根據(jù)此錯(cuò)誤,我們必須相應(yīng)地更改傳入值的權(quán)重。我們有四個(gè)權(quán)重,所以我們可以平均分布誤差。然而,根據(jù)權(quán)重值按比例進(jìn)行更有意義。權(quán)重相對于其他權(quán)重越大,它對錯(cuò)誤的責(zé)任就越大。這意味著我們可以計(jì)算誤差的分?jǐn)?shù)電子1?在?瓦11?作為:
電子1?瓦11∑一世=14瓦1一世
這意味著在我們的示例中:
0.08?0.60.6+0.1+0.15+0.25=0.0343
隱藏層和輸出層之間權(quán)重矩陣的總誤差——我們在上一章中稱之為“誰”——看起來像這樣
電子瓦H○=[瓦11∑一世=14瓦1一世瓦21∑一世=14瓦2一世瓦31∑一世=14瓦3一世瓦12∑一世=14瓦1一世瓦22∑一世=14瓦2一世瓦32∑一世=14瓦3一世瓦13∑一世=14瓦1一世瓦23∑一世=14瓦2一世瓦33∑一世=14瓦3一世瓦14∑一世=14瓦1一世瓦24∑一世=14瓦2一世瓦34∑一世=14瓦3一世]?[電子1電子2電子3]
可以看到左邊矩陣的分母總是一樣的。它的作用類似于縮放因子。我們可以去掉它,這樣計(jì)算就簡單多了:
電子瓦H○=[瓦11瓦21瓦31瓦12瓦22瓦32瓦13瓦23瓦33瓦14瓦24瓦34]?[電子1電子2電子3]
如果將右側(cè)的矩陣與我們使用 Python 和 Numpy 的神經(jīng)元網(wǎng)絡(luò)一章中的“who”矩陣進(jìn)行比較,您會(huì)注意到它是“who”的轉(zhuǎn)置。
電子瓦H○=瓦H○.噸?電子
所以,這對于線性神經(jīng)網(wǎng)絡(luò)來說是最容易的部分。直到現(xiàn)在我們還沒有考慮激活函數(shù)。
激活功能
我們想用激活函數(shù)計(jì)算網(wǎng)絡(luò)中的誤差,即非線性網(wǎng)絡(luò)。誤差函數(shù)的推導(dǎo)描述了斜率。正如我們在本章開頭提到的,我們要下降。推導(dǎo)描述了錯(cuò)誤如何乙?隨著重量的變化?瓦克j?變化:
?乙?瓦克j
所有輸出節(jié)點(diǎn)上的誤差函數(shù) E?○一世?(一世=1,...n) 在哪里?n?是輸出節(jié)點(diǎn)的總數(shù):
乙=∑一世=1n12(噸一世-○一世)2
現(xiàn)在,我們可以將其插入到我們的推導(dǎo)中:
?乙?瓦克j=??瓦克j12∑一世=1n(噸一世-○一世)2
如果您查看我們的示例網(wǎng)絡(luò),您將看到一個(gè)輸出節(jié)點(diǎn)?○克?僅取決于使用權(quán)重創(chuàng)建的輸入信號?瓦克一世?和?一世=1,…米?和?米?隱藏節(jié)點(diǎn)的數(shù)量。
下圖進(jìn)一步說明了這一點(diǎn):
這意味著我們可以相互獨(dú)立地計(jì)算每個(gè)輸出節(jié)點(diǎn)的誤差。這意味著我們可以刪除所有表達(dá)式噸一世-○一世?和?一世≠克從我們的總結(jié)來看。因此,節(jié)點(diǎn) k 的誤差計(jì)算現(xiàn)在看起來要簡單得多:
?乙?瓦克j=??瓦克j12(噸克-○克)2
目標(biāo)值?噸克是一個(gè)常數(shù),因?yàn)樗灰蕾囉谌魏屋斎胄盘柣驒?quán)重。我們可以應(yīng)用鏈?zhǔn)椒▌t來區(qū)分上一項(xiàng)來簡化事情:
?乙?瓦克j=?乙?○克??○克?瓦克j
在我們教程的前一章中,我們使用了 sigmoid 函數(shù)作為激活函數(shù):
σ(X)=11+電子-X
輸出節(jié)點(diǎn)?○克通過將 sigmoid 函數(shù)應(yīng)用于加權(quán)輸入信號的總和來計(jì)算。這意味著我們可以通過替換來進(jìn)一步轉(zhuǎn)換我們的導(dǎo)數(shù)項(xiàng)○克?通過這個(gè)功能:
?乙?瓦克j=(噸克-○克)???瓦克jσ(∑一世=1米瓦克一世H一世)
在哪里?米?是隱藏節(jié)點(diǎn)的數(shù)量。
sigmoid 函數(shù)很容易區(qū)分:
?σ(X)?X=σ(X)?(1-σ(X))
完整的差異現(xiàn)在看起來像這樣:
?乙?瓦克j=(噸克-○克)?σ(∑一世=1米瓦克一世H一世)?(1-σ(∑一世=1米瓦克一世H一世))??瓦克j∑一世=1米瓦克一世H一世
最后一部分必須區(qū)別對待?瓦克j.?這意味著除項(xiàng)外所有乘積的導(dǎo)數(shù)將為 0瓦克jHj)?其中有導(dǎo)數(shù)?Hj?關(guān)于?瓦克j:
?乙?瓦克j=(噸克-○克)?σ(∑一世=1米瓦克一世H一世)?(1-σ(∑一世=1米瓦克一世H一世))?Hj
這就是我們在下一章中實(shí)現(xiàn) NeuralNetwork 類的方法“train”所需要的。
總結(jié)
以上是生活随笔為你收集整理的神经网络中的反向传播的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务计算 -- 搭建私有云
- 下一篇: opencv心得体会_OpenCV心得