一步一步教你反向傳播的例子

背景

反向傳播(Backpropagation)是訓練神經網絡最通用的方法之一,網上有許多文章嘗試解釋反向傳播是如何工作的,但是很少有包括真實數字的例子,這篇博文嘗試通過離散的數據解釋它是怎樣工作的。

Python實現的反向傳播

你能使用Python來實現反向傳播,我曾經在this Github repo上實現了反向傳播算法。

反向傳播的可視化

顯示神經網絡學習時相互作用的可視化,檢查我的Neural Network visualization

另外的資源

如果你發現這個教程對你有用並且想繼續學習神經網絡以及它的應用,我強烈建議你看Adrian Rosebrock優秀的教程 Getting Started with Deep Learning and Python

概述

對於這個教程,我們將使用2個輸入神經元、2個隱含層神經元以及2個輸出層神經元組成一個神經網絡,另外,隱含層和輸出層神經元各包含一個偏差。
這是基本結構:
這裏寫圖片描述

目的讓神經網絡工作,我們對權重偏差和訓練的輸入/輸出設置一個初始值:
這裏寫圖片描述

反向傳播的目的是優化權重,以便於讓神經網絡學習怎樣正確的把任意的輸入映射到輸出中。

這篇教程的剩餘部分我們將要和單一的訓練集工作:輸入0.05和0.10,我們想要神經網絡輸出0.01和0.99。

前向反饋

爲了開始,當前給定權重和偏差以及輸入值0.05和0.10,神經網絡預測結果是什麼,我們需要把輸入值向前傳給網絡。

我們知道全部的輸入值傳到每個隱含層神經元中,使用激活函數擠壓全部的輸入值(在這裏,我們使用logistic函數),對輸出層神經元重複這一過程。

計算h1 的輸入:
這裏寫圖片描述

然後我們利用logistic函數把neth1 擠壓到h1 的輸出:
這裏寫圖片描述

h2 進行相同的操作:
outh2=0.596884378

對輸出層神經元重複操作,使用隱含層神經元的輸出作爲輸出層神經元的輸入。

這是o1 的輸出:
這裏寫圖片描述

o2 進行相同操作:
outo2=0.772928465

計算整體誤差

利用平方和誤差,我們能計算每個輸出層神經元的誤差:
這裏寫圖片描述

例如,目標輸出o1 是0.01,但是神經網絡輸出是0.75136507,因此誤差是:
這裏寫圖片描述

o2 重複這個過程:
Eo2=0.023560026

神經網絡整體誤差:
這裏寫圖片描述

反向傳播

反向傳播的目的是更新網絡中每個權重,以便他們真實的輸出值是接近目標輸出,從而最小化輸出層神經元的誤差。

輸出層

考慮w5 ,我們想要知道w5 怎樣影響整體誤差,即αEtotalαw5

應用鏈式規則:
這裏寫圖片描述

可視化我們正在做的:
這裏寫圖片描述

我們需要理解這個公式的每一步。

首先,output怎樣改變整體誤差?
這裏寫圖片描述

下一步,net input怎樣改變o1 輸出?
logistic函數的偏導數是輸出乘以1減輸出:
這裏寫圖片描述

最後,w5 怎樣改變o1 的net input?
這裏寫圖片描述

把它們結合起來:
這裏寫圖片描述

你常常能看到delta rule的結合形式:
這裏寫圖片描述
我們利用αEtotalαouto1αouto1αneto1 來重寫αEtotalαneto1 ,我們使用這個重新上面的表達式:
這裏寫圖片描述

因此:
這裏寫圖片描述

爲了減少誤差,我們從當前權重減去這個值(乘以一個學習率,設置成0.5):
這裏寫圖片描述

我們能重複這個過程得到新的權重w6w7w8
這裏寫圖片描述

當我們繼續下面的反向傳輸算法時,我們使用初始權重,而不是更新過的權重。

隱含層

下一步,我們將繼續向後計算w1w2w3w4 新值,這是我們需要理解的:
這裏寫圖片描述

可視化:
這裏寫圖片描述

我們將要對隱含層神經元使用相似的過程,但是稍微不同的是,每個隱含層神經元的輸出貢獻到多個輸出層神經元中。我們知道outh1 影響outo1outo2 ,因此αEtotalαouth1 需要考慮兩個輸出層神經元的影響:

αEtotalαouth1=αEo1αouth1+αEo2αouth1

先計算αEo1αouth1 :

αEo1αouth1=αEo1αneto1αneto1αouth1

使用稍早前計算的值來計算αEo1αneto1

αEo1αneto1=αEo1αouto1αouto1αneto1=0.741365070.186815602

αneto1αouth1 等於w5 :

neto1=w5outh1+w6outh2+b21

αneto1αouth1=w5=0.40

合在一起:
αEo1αouth1=αEo1αneto1αneto1αouth1=0.1384985620.40=0.055399425

αEo2αouto1 做相同的處理:

αEo2αouth1=0.019049119

因此:

這裏寫圖片描述

現在我們有αEtotalαouth1 ,我們還需要計算αouth1αneth1 ,然後對每個權重計算αneth1αw

這裏寫圖片描述

我們計算h1w1 的偏導數:

這裏寫圖片描述

把它們結合起來:
這裏寫圖片描述

你也可以如下寫:

這裏寫圖片描述

現在我們能更新w1

這裏寫圖片描述

w2w3w4 重複上面過程:

這裏寫圖片描述

最後,我們更新所有權重,當我們把輸入0.05和0.1向前反饋,神經網絡的誤差爲0.298371109,在一次反向傳播後,整體誤差降到0.291027924,它看似不多,但是重複10000次之後,誤差大幅下降到0.000035085,在這之後,我們把輸入0.05和0.1向前反饋,那麼輸出的2個神經元生成0.015912196(vs 目標0.01)和0.984065734(vs 目標0.99)。

原文鏈接:A Step by Step Backpropagation Example

發佈了27 篇原創文章 · 獲贊 26 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章