倒傳遞類神經網路(neural network backpropagation) 筆記

類神經網路筆記

一.前言

小編看了很多的書籍介紹類神經的,發現這本講的最淺顯易懂而且還附有程式碼,我認為電腦科學與其他物理學、電磁學…等最不同的點在於他是可以看出效果的,是感覺的到的,就算不太懂他的數學原理,反覆地去看程式碼再回來對照公式很快就可以更深入的了解,但是類似電磁學那種理論,即使你經由公式算出了電場是多少,電荷是多少,我依然沒有什麼感覺因為他看不到也摸不到,但電腦科學就不同了,你可以經由寫程式透過軟體去驗證你的理論正不正確,下面就帶各位一步一步地進入類神經的科學理論以及用個實際的例子說明這理論要如何使用。

類神經網路與模糊控制理論入門與應用(附範例程式光碟片)

二.類神經生物模型

當今最神秘的器官不外乎就是我們人類的大腦,就算在21世紀的今日我們還是對大腦還是有許多不解的地方,因此許多科學家就想解開大腦的奧秘,當中一些電腦科學家就想把腦神經的運作原理透過數學的方式推導出一套可行的演算法出來,因此第一代類神經就這樣產生了。

  • 下圖為一個典型的類神經圖解,人的腦神經系統分為下面幾個構造:

圖 1‑1

圖1中繪有兩個神經細胞,每個神經細胞主要由:(1)神經細胞核(Soma)、(2)神經軸(Axon)、(3)神經樹(Dendrites)、(4)神經節(Synapses)等四部分構成。底下,我們依序介紹此四部份。

  • 神經細胞核(Soma)

它是神經細胞的中心體,它的作用,目前並沒有完全徹底的了解,大概是將神經樹收集到的信號,在此作加總後再作一次非線性轉換,再由神經軸將信號傳送到其它的神經細胞中。

  • 神經軸(Axon)

連接在神經細胞核上,用來傳送由神經細胞核產生的信號至其它的神經細胞中。

  • 神經樹(Dendrites)

神經樹分為兩種:輸入神經樹及輸出神經樹。在圖1中左邊接到神經核的神經樹是用來接收其他神經細胞傳來的信號,稱為輸入神經樹。而在圖1右側接到神經軸的神經樹是用來傳送信號至其它神經細胞,稱為輸出神經樹。所以我們可以說:神經樹是神經細胞呈樹枝狀的輸出入機構。

  • 神經節(Synapse)

輸入神經樹和輸出神經樹相連接的點稱為神經節,如圖1中以小圓圈框起來的接點即是。每個神經細胞大約有1000個神經節。神經節是神經網路上的記憶體,它表示兩個神經細胞間的聯結強度,我們將此聯結強度以一個數值來表示,並稱之為加權值(weight)。

一般言之,當神經網路在進行學習時,外界刺激神經細胞所產生的電流會去改變神經節上的加權值,在學習過程中,外界刺激所產生的電流反覆在神經網路上流動,神經節上的加權值也反覆地改變,最後會慢慢的趨向穩定,此時即表示學習已告完成。若神經網路是處於認知或辨識的過程中,由外界刺激所產生的電流,在進入神經網路後,會與貯存在神經節上的加權值作簡單的運算處理,若處理後的信號為可辨識的信號,則外界事物便是神經網路可認知或辨識的的事物了。

三.類神經人工神經元模型

了解了生物神經細胞模型後,我們將介紹如何以人工神經元來模仿生物神經細胞。

讓我們再把相關的知識作個簡單的陳述,請參考圖1,當神經細胞透過輸入神經樹由其它神經細胞輸入脈波訊號後,經過神經細胞核的處理,其處理大約是將收集到的訊號作加總,再作一次非線性轉換後,產生一個新的脈波信號,如果這個訊號夠強,則新的脈波信號會由神經軸傳送到輸出神經樹,再透過神經節將此訊號傳給其它神經細胞。值得注意的是:當訊號經過神經節後,由於神經節加權值的影響,其訊號大小值會改變。經由上述的說明,我們提出人工神經元的模型如圖2所示。

圖 2‑1

在圖2中,每一個人工神經元皆有多個輸入χ1, χ2, …, χn及一個輸出y,輸入值與輸出值的關係式,一般可用輸入值的加權乘積和的函數來表示,即

y(t)=f[ni=1WiXi(t)θ]y(t)=f[∑i=1nWi∗Xi(t)−θ]

其中

wi  = 模仿生物神經細胞的神經節加權值。

θ  = 模仿生物神經細胞的細胞核偏權值(bias),即輸入訊號的加權乘積和必須要大

於偏權值後,才能被傳輸至其它人工神經元中。

f(θ) = 模仿生物神經細胞的細胞核非線性轉換函數。

t = 時間。

n = 人工神經元輸入數目。

常用的非線性轉換函數

Sigmoid

圖 3‑1

Tanh

圖 3‑2

ReLU

圖 3‑3

Leaky ReLU

圖 3‑4

四.單層感知機(perceptron)

此種類神經網路是經由F.Rosenblatt在1957年所提出,為最簡單形式的前饋神經網路,是一種二元線性分類器,當初他之所以會提出此種網路,是希望以此網路來模仿動物的大腦及視覺系統。雖然最初被認為有著良好的發展潛能,但感知機最終被證明不能處理諸多的模式識別問題。1969年,人工智慧支父Marvin Minsky和Seymour Papert在《Perceptrons》書中,仔細分析了以感知機為代表的單層神經網絡系統的功能及局限,證明感知機不能解決簡單的XOR等線性不可分問題。

圖 4‑1

單層感知機的數學模型如圖4-1所示,其中ai表示網路的輸入信號,Wi表示網路的加權值,θ 為網路的偏權值,而其輸出方程式為:

Y={1,ifiaiWiθ0,ifiaiWi<θ Y={1,if∑iaiWi≥θ0,if∑iaiWi<θ 

因此轉換函數為Step function

圖 4‑2

單層感知機早期應用在印刷字體的識別,如果輸入樣本是線性可分的,那麼單層感知機便可以成功地做分類,如以下例子。底下我們實現一個AND邏輯閘的單層感知機,我們將網路加權值設為 W1=1,W2=1,θ=1.5。

圖 4‑3

我們簡單的套用真質表來檢視這組參數,首先測試第一組X1=0,X2=0,代入公式後呈現

X1W1 + X2W2 − θ = −1.5 < 0

Fstep(−1.5)=0

繼續測試第二組 X1=1,X2=1,代入公式後呈現

X1W1 + X2W2 − θ = 0.5 > 0

Fstep(0.5)=1

各位可以繼續的測試其他兩樣,做出來也都是同樣符合真質表的描述,如果以X軸當資料X1,Y軸當作資料X2畫圖出來的話,可以發現我們所設的參數所描述的就是一條直線方程式,所以只要是畫在平面圖上且資料呈現線性可分特性,用感知機就能學出來。

圖 4‑4

讓我們再來看一個例子,我們來找可以使得感知機可以解決Xor邏輯閘的參數。

根據第一組資料,我們可以推導出式子如下,因此θ > 0

X1 = 0, X2 = 0 → X1W1 + X2W2 = 0 < θ ( 3-4‑1)

再根據第二組資料,推出W2 > θ

X1 = 0, X2 = 1 → X1W1 + X2W2 = W2 > θ ( 4‑2)

繼續第三組資料,推出W1 > θ

X1 = 1, X2 = 0 → X1W1 + X2W2 = W1 > θ ( 4‑3)

最後一組推出 W1 + W2 < θ

X1 = 1, X2 = 1 → X1W1 + X2W2 = W1 + W2 < θ ( 4‑4)

由( 3-4‑2) ( 4‑2) ( 4‑3) 我們得知 W1 + W2 > θ ,但是( 4‑4)卻推出W1 + W2 < θ ,因此我們無法找到一組解使得單層感知機解決 Xor 問題,所以從此第一代類神經走入第一個寒冬中,因為它連Xor這麼簡單的問題都解決不了。

圖 4‑5 圖 4‑6

加入隱藏層的感知機

雖然單層感知機無法解決Xor問題,但是有科學家後續發現加入一個隱藏單元就可以順利排除這困難,原因是加入一個隱藏單元及等於是增加了一維變數,它會形成類似如圖4-5的橢圓曲線來做分類。一個可行的網路架構如圖5-1所示,它的輸出方程式為

y={1,    if X1+X2>1.50,   if X1+X2<1.5 y′={1,    if X1+X2>1.50,   if X1+X2<1.5 

y={1,   if X1+X22y>0.5 0,   if X1+X22y0.5 y={1,   if X1+X2−2y′>0.5 0,   if X1+X2−2y′≤0.5 

我們仿造剛剛的運算,繼續將第一組數據帶入驗證測試,第一科神經元為

X1 = 0, X2 = 0 → X1W11 + X2W21 − θ1 = −1.5 < 0 → y′ = 0

X1W12 + X2W22 − 2y′ − θ2 = −0.5 < 0 → y = 0

第二組數據為X1 = 0, X2 = 1,第一二科神經元為

X1 = 0, X2 = 1 → X1W11 + X2W21 − θ1 = −0.5 < 0 → y′ = 0

X1W12 + X2W22 − 2y′ − θ2 = 0.5 > 0 → y = 1

第三組

X1 = 1, X2 = 0 → X1W11 + X2W21 − θ1 = −0.5 < 0 → y′ = 0

X1W12 + X2W22 − 2y′ − θ2 = 0.5 > 0 → y = 1

第四組

X1 = 1, X2 = 1 → X1W11 + X2W21 − θ1 = 0.5 > 0 → y′ = 1

X1W1 + X22W22 − 2y′ − θ2 = −0.5 < 0 → y = 0

圖 5‑1

我們可以將上列方程式簡單的用 Matlab 跑圖驗證一下,可以發現產生如圖5-2 的效果,紅色代表輸出為1,藍色代表輸出為0,多加了一顆隱藏神經元就會產生另一條直線來畫分。

圖 5‑2

後續的研究人員重複著類似的實驗,並把神經元做多項的變化,比較加一層以及加兩層神經元的效果圖,可以統計出一張圖表如下(摘自書中),他們發現神經元加越多層或是神經元加越多顆,所能區分的圖形就更複雜、圖形就更佳多樣化。

圖 5‑3

五.倒傳遞神經網路

倒傳遞神經網路(Back-propagation Neural Network) 是一種具有學習能力的多層前授型網路。此網路是由 Rumelhart、Mcclelland在1985年所提出的,當初他們之所以會提出此種網路,是希望提出一種平行分布訊息的處理方法來探索人類認知的微結構。

圖 6‑1

  • 簡單手算版

我找尋許多資料發現大多數講解倒傳遞類神經模型時都是用一堆數學公式,的確,類神經是經由精巧的微積分並運用微積分的連鎖律,一層一層地從後面傳遞誤差回去,因此我們就可以求出神經元權重的改變量,但直接看公式的話會很容易陷入迷思,因此我在網路上找到一份手算倒傳遞網路的資料 [6],我把它翻譯成中文,相信經過這個例子的說明後再去看公式會容易許多。

圖 6‑2

我們先從簡單的模型開始講起,倒傳遞網路的連接方式與perceptron不同,它是採取全部神經元互相連接的方式,但是只有層與層的神經元互相連結,層之間的神經元不做溝通,旁邊的數字代表參數的初始值為了等一下方便計算,這裡的b就是相當於剛剛所講的θ,事實上,大部分類神經書籍文獻都用b表示,只是書中為了與人腦神經元模型相呼應因此改成θ,在這裡我們將b命名為 bias,並將以前的公式改為如下

y(t)=f[ni=1WiXi(t)+b]y(t)=f[∑i=1nWi∗Xi(t)+b]

假如我們這裡選的函數f是sigmoid函數,因此,這裡h1的輸出值就為

yh1=f(w1i1+w2i2+b1)=f(0.150.05+0.20.1+0.35)=f(0.3825)yh1=f(w1∗i1+w2∗i2+b1)=f(0.15∗0.05+0.2∗0.1+0.35)=f(0.3825)

=11+e0.3825=0.6=11+e−0.3825=0.6

用同樣的算法我們可以得出yh2 = 0.596884378

接下來以同樣的方法計算出o1, o2

outo1 = f(h1w5+h2w6+b2) = 0.75

outo2 = f(h1w7+h2w8+b2) = 0.773

這裡要注意的是作者似乎把bias項目簡化了,事實上每科神經元都各自有一個bias,但這裡作者為了計算方便將兩顆神經元的bias都設為一樣。

接下來我們要定義總體誤差為

Etotal=Σ12(targetoutput)2 Etotal=Σ12(target−output)2 

其中target就是我們所想得到的值,整個演算法運作的目的就是想讓我的輸出越接近target越好,平方是為了消除正負號所帶來的影響,0.5是為了後面微分方便,加總是指,假如輸出神經元有N個,那就是代表要將N科神經元的誤差都加總起來,所以類神經訓練到最後Etotal會越來越小,代表神經元的輸出已經和我的樣本資料幾乎一模一樣了。

這裡輸出神經元有兩個,因此

Etotal=Eo1+Eo2=12(targeto1outo1)2+12(targeto2outo2)2Etotal=Eo1+Eo2=12(targeto1−outo1)2+12(targeto2−outo2)2

=12(0.010.75)2+12(0.990.773)2=0.3=12(0.01−0.75)2+12(0.99−0.773)2=0.3

再來我們要用微積分的連鎖律求出Etotal和w5的關係式,我們想要知道w5該如何調整能使我的Etotal變得更小,因此我們可以求出Etotalw5∂Etotal∂w5
找出微分關係式後就可以套用底下公式找出調整w5的方向,其中α稱作學習率。

w5new=w5oldαEtotalw5w5new=w5old−α∂Etotal∂w5

根據微積分連鎖率我們可以得知

Etotalw5=Etotalouto1ou< span class="MJXc-TeX-math-I mjx-char" style="--tw-border-opacity:1; --tw-ring-color:rgba(59, 130, 246, 0.5); --tw-ring-inset:var(--tw-empty, ); --tw-ring-offset-color:#fff; --tw-ring-offset-shadow:0 0 #0000; --tw-ring-offset-width:0px; --tw-ring-shadow:0 0 #0000; --tw-shadow:0 0 #0000; border-color:rgba(231, 231, 231, var(--tw-border-opacity)); box-sizing:content-box !important; display:block; font-family:mjxc-tex-math-i,mjxc-tex-math-ix,mjxc-tex-math-iw; padding-bottom:0.279em; padding-top:0.39em; text-align:left; white-space:pre">to1neto1neto1w5∂Etotal∂w5=∂Etotal∂outo1∗∂outo1∂neto1∗∂neto1∂w5

其中neto1指的是f函式中裡面的加總式子,也就是說

neto1 = h1 * w5 + h2 * w6 + b2

接下來就是分別算出各項偏微分,然後再將它們組合起來就可以得到Etotalw5∂Etotal∂w5

首先算出第一項Etotalouto1∂Etotal∂outo1,回想起剛剛定義的Etotal為

Etotal=12(targeto1outo1)2+12(targeto2outo2)2Etotal=12(targeto1−outo1)2+12(targeto2−outo2)2

因此

Etotalouto1=122(targeto1outo1)1+0=(0.010.75)=0.74∂Etotal∂outo1=12∗2∗(targeto1−outo1)∗−1+0=−(0.01−0.75)=0.74

再來計算第二項outo1neto1∂outo1∂neto1,回想起剛剛解釋的neto1,因此

outo1= f(neto1)=11+eneto1outo1= f(neto1)=11+e−neto1

所以

outo1neto1= outo1(1outo1)=0.75(10.75)=0.186∂outo1∂neto1= outo1∗(1−outo1)=0.75∗(1−0.75)=0.186

最後一項neto1w5∂neto1∂w5,因為neto1 = h1 * w5 + h2 * w6 + b2,所以

neto1w5=h1=0.6∂neto1∂w5=h1=0.6

全部組裝再一起可以得到

Etotalw5=0.740.1860.6=0.082∂Etotal∂w5=0.74∗0.186∗0.6=0.082

假設學習率為0.5,因此我們就可以得知

w5new=w5oldαEtotalw5=0.40.50.082=0.359w5new=w5old−α∗∂Etotal∂w5=0.4−0.5∗0.082=0.359

圖6-3為作者所畫的流程圖,這就是為什麼網路稱為倒傳遞神經網路的原因,從最後一層的Error項傳遞誤差到outo1,然後再到neto1,一直層層傳遞到w5。

圖 6‑3

我們可以用同樣的方法算出其他科神經元

w6new = 0.4

w7new = 0.51

w8new = 0.56

圖 6‑4

再來我們要將Error繼續傳遞到 w1,因此我們要算出Etotalw1∂Etotal∂w1

我們一樣套用連鎖率概念可以得知

Etotalw1=Etotalouth1outh1neth1neth1w1∂Etotal∂w1=∂Etotal∂outh1∗∂outh1∂neth1∗∂neth1∂w1

其中Etotalouth1∂Etotal∂outh1     為如下,因為改變outh1對後面每一項的誤差皆有影響,因此必須把它們加總起來

Etotalouth1=Eo1outh1+Eo2outh1∂Etotal∂outh1=∂Eo1∂outh1+∂Eo2∂outh1

我們開始像剛剛一樣逐個計算偏微分項目,從Eo1outh1∂Eo1∂outh1開始,我們可以套用剛剛已經求得的項目

Eo1outh1=Eo1neto1neto1outh1=Eo1outo1outo1neto1neto1outh1=0.740.18neto1outh1∂Eo1∂outh1=∂Eo1∂neto1∗∂neto1∂outh1=∂Eo1∂outo1∗∂outo1∂neto1∗∂neto1∂outh1=0.74∗0.18∗∂neto1∂outh1

因為 neto1 = w5 * outh1 + w6 * outh2 + b2 * 1,所以

neto1outh1=w5=0.4∂neto1∂outh1=w5=0.4

組合起來就得到

Eo1outh1=0.740.180.4=0.0554∂Eo1∂outh1=0.74∗0.18∗0.4=0.0554

同樣的程序我們可以得到

Eo2outh1=0.02∂Eo2∂outh1=−0.02

因此

Etotalouth1=0.05540.02=0.0354∂Etotal∂outh1=0.0554−0.02=0.0354

再來繼續算第二項outh1neth1∂outh1∂neth1

outh1=11+eneth1outh1=11+e−neth1          ∴outh1neth1=\ outh1(1outh1)=0.6(10.6)=0.24∂outh1∂neth1=\ outh1∗(1−outh1)=0.6∗(1−0.6)=0.24

最後一項neth1w1∂neth1∂w1

∵neth1 = w1 * i1 + w2 * i2 + b1 * 1 ∴neth1w1=i1=0.05∂neth1∂w1=i1=0.05(也就是前一層的輸出)

全部組裝再一起可以得到

Etotalw1=Etotalouth1outh1neth1neth1w1=0.03540.240.05=0.0004248∂Etotal∂w1=∂Etotal∂outh1∗∂outh1∂neth1∗∂neth1∂w1=0.0354∗0.24∗0.05=0.0004248

因此

w1new=w1oldαEtotalw1=0.150.50.0004248=0.1497876w1new=w1old−α∂Etotal∂w1=0.15−0.5∗0.0004248=0.1497876

同樣的也可以找出隱藏層的其他weight出來

w2new = 0.19956143

w3new = 0.24975114

w4new = 0.29950229

有了前面的例子作簡介後,接下來我們要代入公式版的backpropagation推導,如果在公式版的有哪個地方看不懂,請反覆去回顧剛剛講的簡介,如此來回推敲多次相信很快就能理解的。

  • 複雜公式版

圖 6‑5

alj=f(kwljkal1k+blj)=f(zlj)ajl=f(∑kwjklakl−1+bjl)=f(zjl) ( 6-2‑1)

首先我們先定義各項參數,ajl代表在第l層中,第j科神經元的輸出,wjkl代表在模型中第l層和l-1層中的權重值,bjl代表在模型中第l層和l-1層中的偏權值,k代表l-1層的神經元索引值。

E=12n[yjaLj]2E=12∑n[yj−ajL]2 ( 6-2‑2)

其中,L代表最後一層,ajL代表在輸出層中第j科神經元的輸出,yj是代表第j個輸出的樣本,n代表最後一層神經元個數,我們將輸出層所有神經元誤差都加總起來,並加上平方項目以消除正負號所帶來的影響,最後除以2來當作整個神經網路的總體誤差。

我們首先求得總體誤差對輸出層權重質的微分,根據微積分的交換率我們可以改寫如以下公式( 6-2‑3),我們分別對各個篇微分項做運算得到( 6-2‑4) ( 6-2‑5) ( 6-2‑6)

EwLjk=EaLjaLjzLjzLjwLjk∂E∂wjkL=∂E∂ajL∗∂ajL∂zjL∗∂zjLwjkL ( 6-2‑3)

EaLj=(yjaLj)∂E∂ajL=−(yj−ajL) ( 6-2‑4)

aLjzLj=f(zLj)zLj=f(zLj)∂ajL∂zjL=∂f(zjL)∂zjL=f′(zjL) ( 6-2‑5)

zLjwLjk=kwLjkaL1k+bLjwLjk=aL1k∂zjL∂wjkL=∂∑kwjkLakL−1+bjL∂wjkL=akL−1 ( 6-2‑6)

將( 6-2‑4) ( 6-2‑5) ( 6-2‑6)組裝再一起我們可以得到( 6-2‑8),其中δjL稱作在L層第j顆神經元的敏感度,式子如( 6-2‑9)所示。

EwLjk=aL1k(aLjyj)f(zLj)=aL1kδLj∂E∂wjkL=akL−1(ajL−yj)f′(zjL)=akL−1δjL ( 6-2‑8)

δjL = (ajL−yj)f′(zjL) ( 6-2‑9)

再來我們求得總體誤差對隱藏層權重值的偏導數,我們一樣可以按照連鎖律將式子拆成如( 6-2‑10)所示,依照剛剛的方法分別運算可以求得式子( 6-2‑11) ( 6-2‑12) ( 6-2‑13)

EwL1ki=EaL1kaL1kzL1kzL1kwL1ki∂E∂wkiL−1=∂E∂akL−1∗∂akL−1∂zkL−1∗∂zkL−1wkiL−1 ( 6-2‑10)

EaL1k=jEaLjaLjzLjzLjaL1k∂E∂akL−1=∑j∂E∂ajL∗∂ajL∂zjL∗∂zjL∂akL−1 ( 6-2‑11)

aL1kzL1k=f(zL1k)∂akL−1∂zkL−1=f′(zkL−1) ( 6-2‑12)

zL1kwL1ki=aL2i∂zkL−1wkiL−1=aiL−2 ( 6-2‑13)

其中( 6-2‑11-1) 為式子( 6-2‑11)中的子項目,( 6-2‑11-1-1)為( 6-2‑11-1)的子項目,( 6-2‑12) ( 6-2‑13)與( 6-2‑5) ( 6-2‑6)算法一樣只是代號變了。

EaL1k=jEaLjaLjzLjzLjaL1k =j(aLjyj)f(zLj)wLjk∂E∂akL−1=∑j∂E∂ajL∂ajL∂zjL∂zjL∂akL−1 =∑j(ajL−yj)f′(zjL)wjkL ( 6-2‑11-1)

zLjaL1k=kwLjkaL1k+bLjaL1k=wLjk∂zjL∂akL−1=∂∑kwjkLakL−1+bjL∂akL−1=wjkL ( 6-2‑11-1-1)

因此我們可以將其組裝再一起寫做( 6-2‑14),我們可以將後面的項目取代成式子( 6-2‑15),其中δkL − 1稱做在L-1層中第K個神經元的敏感度。

EwL1ki=aL2if(zL1k)jEaLjaLjzLjzLjaL1k∂E∂wkiL−1=aiL−2∗f′(zkL−1)∗∑j∂E∂ajL∗∂ajL∂zjL∗∂zjL∂akL−1 ( 6-2‑14)

EwL1ki=aL2iδL1k∂E∂wkiL−1=aiL−2δkL−1 ( 6-2‑15)

因此δkL − 1如公式( 6-2‑16)所示,我們可以將( 6-2‑9)代入公式( 6-2‑16)得到( 6-2‑17),這是類神經中很重要的公式,代表前一層的敏感度是後面一層敏感度與權重的加總,然後再對前一層的神經元做輸出函數的微分,不論類神經模型還是深度學習模型都是靠這行重要的公式反覆的把誤差由後面往前傳做運算以求出總體誤差對權重值的偏導量,以得知權重值的改變方向而使得模型中樣本輸出與最後一層神經元輸出值的差距越來越小,進而使的模型具有擬合任意非線性方程式的意義。

δL1k=f(zL1k)j(aLjyj)f(zLj)wLjkδkL−1=f′(zkL−1)∗∑j(ajL−yj)∗f′(zjL)∗wjkL ( 6-2‑16)

=f(zL1k)jδLjwLjk=f′(zkL−1)∗∑jδjLwjkL ( 6-2‑17)

我們接著繼續求總體誤差對偏權值的偏導項( 6-2‑18),其中前面兩項式子( 6-2‑4) ( 6-2‑5)就已經求過,而最後一項對偏權值的微分項為1,因此可以寫成式子( 6-2‑19),表示總體誤差對偏權值的微分剛好等於該層神經元的敏感度。

EbL
j
=EaLjaLjzLjzLjbLj
∂E∂bjL=∂E∂ajL∗∂ajL∂zjL∗∂zjL∂bjL
 ( 6-2‑18)

EbLj=(aLjyj)f(zLj)=δLj∂E∂bjL=(ajL−yj)f′(zjL)=δjL ( 6-2‑19)

自此,四大公式已全數求出,分別為如下,我將表示最後一層L的代號用任意層l取代,藉以表達出類神經模型中的通用函式:

δlj=EaLj f(zlj)δjl=∂E∂ajL f′(zjl) (Equation 1)

δl1k=f(zl1k)jδljwljkδkl−1=f′(zkl−1)∗∑jδjlwjkl (Equation 2)

Ewljk=al1kδl
j
∂E∂wjkl=akl−1δjl
 (Equation 3)

Eblj=δlj∂E∂bjl=δjl (Equation 4)

常見的表示式如下

六.參考資料

類神經網路與模糊控制理論 入門與應用 王進德 編著

http://neuron.csie.ntust.edu.tw/homework/93/NN/homework2/M9304302/welcome.htm

http://iamtrask.github.io/2015/07/12/basic-python-network/

https://en.wikipedia.org/wiki/Hadamard_product_(matrices)

http://neuralnetworksanddeeplearning.com/chap2.html

https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

http://cs231n.github.io/optimization-2/

0 0 votes
Article Rating
Subscribe
Notify of
guest

22 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
MagicJackTing
8 years ago

Word 轉部落格的方法:
1. 現成的轉檔工具好像都無法完成, 因為轉檔工具不知道圖片檔上傳之後的 ID (URL 的一部份).
2. 有試過把文章貼在 Windows Live Writer 上, 再上傳: 圖片檔是可以上傳的, 不過有些東西的格式會跑掉, 例如:有合併儲格的表格. 所以, 如果妳的文章轉貼 (copy-paste) 到 WLW 上看起來是 OK 的話, 可以用 WLW. 雖然操作上麻煩一些.
3. Pixnet 有提供 API 可以上傳圖片檔, API 格式中 的圖片ID 是可以自行指定的. 所以也許可以利用 PandDoc 轉檔, 再寫一個小程式找出所有圖片檔的 ID, 並使用該 ID 把圖片上傳 (當然, 本文檔也可以一併完成).
版主回覆:(01/16/2017 01:19:04 PM)
找出圖片ID基本上pandoc就有內建了,他抽取出圖片時就會自動按照順序命名圖片,但問題是我需要前面的網址都不變只有後面名稱改變,這樣我就可以很容易地從html代換程式碼更改,但找很久都找不到這種圖床。請問API名稱是? 或許這個可以試看看^.^

MagicJackTing
8 years ago

Word 2007 (含) 以後的版本改經把 WLW 的功能包含在內了.
以 Word 2010 為例:
1. Menu Bar 檔案–>新增–> 部落格文章.
2. Menu Bar 部落格文章–>管理帳戶.
3. 選 "新增", 部落格供應者 選擇 "WordPress", "下一步"
4. 部落格文章 URL 修改為 "http://api.pixnet.cc/blog/xmlrpc&quot;
5. 使用者名稱/密碼, 自己在 pixnet 的帳號/密碼.
6. 圖片選項, 選 "我的部落格提供者".
7. 完成.
這樣就可以直接在 word 編修 部落格文章了 (舊貼文也可以拉回來改)
版主回覆:(01/16/2017 01:17:20 PM)
謝謝~~但這方法我測試過了,不包含公式可行,公式轉換會全部變空白

Renton
7 years ago

妳好,我昰一個機器學習的初學者
在查找資料時看見妳寫的部落格,真的很驚訝南部有這樣的高手,也有些問題想要請教
我過去昰3D的特效師,沒有任何數學背景,對數學的記憶大概只停留在國中的簡單代數
而當我開始學習機器學習最大的問題大概就在於如何看懂複雜的數學符號
例如妳上面所列出的公式:
δL−1k=f′(zL−1k)∗Σj(aLj−yj)∗f′(zLj)∗wLjkδkL−1=f′(zkL−1)∗Σj(ajL−yj)∗f′(zjL)∗wjkL
( 6-2‑16)
我就完全看不懂這公式的含意
目前我挑的ML書籍多昰宣稱不用太多數學基礎的,但是我想一邊準備必要的數學知識以在未來進入深一步的領域時能夠準備好
若以看懂ML數學為前提的話,妳可以給我一些建議或是書單嗎?
非常謝謝!
版主回覆:(09/22/2017 01:56:16 PM)
您好喔,謝謝您的讚美,我也是初學者阿∼跟國外那些大牛比起來 小編只是一介小民,那個解釋我在6.2.15的下文有提到喔,是敏感度,基本上只要會微積分基本概念就可以從無到有學會囉,我標題列的那本書就很棒囉 他有程式代 慢慢看一定能懂的

Renton
7 years ago

謝謝,下次發問我會記得 XD
我沒有數學基礎只好從代數開始複習
版主回覆:(02/11/2017 10:59:27 AM)
恩恩 有問題隨時問我喔 ^.^
其實呢只要搞懂代號的意義,代數其實很簡單的,不要被符號嚇到了
我可以舉一個很簡單的例子說明代數
法學院的女生比男生多,在下學期的數學期末考試中,法學院不及格的學生超過了一半。由此可見

女學生不及格的比男生及格的多。
你看的出來嗎? 至少我是看不出來拉
但是你把它寫成代數後就可以推出來了
假設pb:及格男生 pg:及格女生 fb:不及格男生 fg:不及格女生
根據題目定義可以得到
pg+fg>pb+fb
fg+fb>pg+pb
因為a>b,c>d
所以a-d>b-c
套用上去
pg+fg-pg-pb>pb+fb-fg-fb
相同的削去後可以得到
fg-pb>pb-fg
所以 fg>pb
代數的功用呢是要讓我們運用數學技巧找出隱藏在數學式中的關係式
這題運用的技巧只是不等式數學技巧,而類神經推導的是運用微積分技巧,如此罷了 ^.^

大玩家闖天涯
7 years ago

NN簡介重點整理很清楚,
加上中文翻譯讓更多台灣人有機會學習,
而不是中文網站關於深度學習大都是大陸博客,謝謝分享!
我也在做deep learning影像相關研究,
FCN和RNN、LSTM架構不是很模糊不清,
應該是說要親自實作比較會有感覺,
但前期在架設caffe時就遇到不少問題,
tensorflow也是未來會接觸的部分,
希望不吝賜教有問題會多多向您請教,多討論多交流!
p.s. 想不到你也有使用希平方學習平台,哈哈
版主回覆:(02/14/2017 03:57:52 PM)
恩恩 你的部落格也很棒啊XD
我對RNN也很有興趣
改天應該也會去探索研究
不敢當不敢當~~~有問題可以隨時討論 ^.^

鈞
7 years ago

您好 我想請問一下關於sigmoid函數的微分
不是應該為y(x)= 1/(1+e^(-x))
dy/dx=(1+e^(-x))^(-2)*e^(-x)
這樣才對嗎?
為什麼在上面簡單版的變成
dy/dx =y*(1-y)@@?
是我微分算錯嗎?

鈞
7 years ago


將y疊代回去就是我算的沒錯XD
一時轉不過來
不好意思
版主回覆:(04/26/2017 12:12:50 AM)
恩恩 對對~~XD
沒關係~~有問題可以再討論喔~~

alanyuwenche
alanyuwenche
7 years ago

感謝大大的分享.
圖6.2下方,yh1的計算值似乎有誤, 應為
yh1 = f(0.15*0.05+0.25*0.1+0.35) = f(0.3825)
我是在檢查程式時發現這個問題.
版主回覆:(08/19/2017 10:10:46 PM)
喔喔 好喔 ~謝謝 ~~

playhigh(From CoCo)
playhigh(From CoCo)
7 years ago

拜讀大大這篇筆記,簡要而清晰。有助讀者豁然領略奧妙。
在這裡 (http://www.coco-in.net/forum.php?mod=viewthread&tid=53517&page=1#pid741583) 有一文關於用BPN 做預測的實務上的疑問,盼望大大瀏覽,敬請指教。
版主回覆:(01/27/2022 12:36:25 PM)
關於用類神經網路做預測的問題我想應該早就有前人做過了
類似的技術不只侷限於股票預測
且近年來深度學習技術蓬勃發展
用CNN LSTM做預測的也大有人在
從理論上來說都確實是可實現的

a9115022
a9115022
7 years ago

Hi,
請問 i1 and i2 default 值 0.05 and 0.1, 是從頭到尾都用這組值去 train? 都不需要輸入新的值? 有些人說要越多資料樣本不是越準?
版主回覆:(11/23/2017 03:02:54 PM)
這個只是用簡單的例子解說喔
目的只是幫助理解神經網路的運算原理
真正在應用的時候是以這個為基礎再擴展的
是的,真正在算的時候i會有很多顆,取決於input的大小

無名小子
無名小子
7 years ago

淺顯易懂,獲益良多。很希望筆者能多寫一些這種細詳說明數學公式的AI相關課程。讓我們這種數學邊緣人能邊看公式邊看文字說明,了解AI的內部構造。萬分感謝您~~
版主回覆:(11/25/2017 07:41:30 PM)
不會~~很高興幫助到您XD

fatman
fatman
6 years ago

謝謝你,這個分享是我看過目前最棒的,淺顯易懂阿
版主回覆:(04/25/2018 05:47:19 PM)
您過獎了XD

紅月
紅月
6 years ago

您好,關於簡單算法那段的Sigmoid函數
yh1=f(w1∗i1+w2∗i2+b1)=f(0.15∗0.05+0.2∗0.1+0.35)=f(0.3825)
=1/(1+e^(-0.3775))=0.6 想請問為何(-x)的部份是-0.3775而不是-0.3825呢?因為我去看Sigmoid的公式似乎是f(x)=1/(1+e^(-x)) 是我漏掉了什麼嗎QQ數學不是很好,最近在學這個,看到大大寫的很完整,但是對於有些地方還是不太懂所以想發問一下~~~
版主回覆:(06/17/2018 05:57:44 PM)
應該是筆誤拉XD
抱歉抱歉 已經改過來了

訪客
訪客
6 years ago

你好, 有个小问题:
这篇文章的这里
"最後一組推出 W1 + W2 < θ
X1 = 1, X2 = 1 → X1W1 + X2W2 = W1 + W2 < θ ( 4‑4)
由( 3-4‑2) ( 4‑2) ( 4‑3) 我們得知 W1 + W2 > θ ,但是( 4‑4)卻推出W1 + W2 < θ
" 为什么 W1 + W2 < θ ?
版主回覆:(09/09/2018 08:26:28 PM)
因為這是在推導Xor-gate喔,
Xor gate 當 X1=1 X2=1 的時候,輸出的Y是0
因此才會敘述 W1 + W2 < θ
四個推導的結論都是根據 Xor 的真質表來的喔
都是獨立的推導

Giki Lin
Giki Lin
6 years ago

小編 你好,
有機會找到如此詳細說明有關BP的文章
這裡有問題想請教:
在式子 6-2-13 中 的 a_i^(L-2)
這裡的 L-2 式何意?是否指的是第二層?
謝謝你!
版主回覆:(01/02/2019 08:07:23 PM)
這裡的L-1,L-2,L 都只是代表當前是哪層Layer的概念
而會有數字的出現只是為了表達相對關係
L-2 是指 L-1的前一層
若不懂公式版的可以自己仔細推敲一次手算版的
再來看公式版的會清楚許多
過來人的建議~ ^.^

Giki Lin
Giki Lin
6 years ago

謝謝你的回應,我再詳細的研讀一次.
若是有不清楚的地方也請不吝的指教.

Giki Lin
Giki Lin
6 years ago

小編你好
有個問題請教
在文章式子中,定義總體誤差為何要 1/2 呢 ?
謝謝!
版主回覆:(01/08/2019 01:43:16 AM)
那個是為了微分的方便喔,因為整項是取平方
所以微分後剛好可以與它削掉
這裡的誤差函數只是給個概念
實際上的總體誤差可以隨任務不同而定義的
只要是可微的就好 ^.^

Kenny
5 years ago

看了你的文章,真的超感動的,光是這篇文章應該花掉你不少心血了吧。居然有人那麼用心,從詳細的基礎說明並舉例引入學習,這種方式真的是太棒了~~!!
給你一千個讚。
我已經推薦了很多自己的朋友來看你的AI介紹文章。
請問可以推薦到FB嗎??
版主回覆:(03/10/2019 08:27:14 PM)
OKOK~~
我寫文章的目的就是為了要推廣AI
使AI更平易近人~~
這篇文章的確是我花最久時間寫的 哈哈

Kenny
5 years ago

跟小編請問一下,有沒有推薦關於Python撰寫AI(智能爬蟲 or 智能資料分析)方面的書籍呢?
版主回覆:(03/10/2019 08:39:38 PM)
精通Python網絡爬蟲: 這本我覺得蠻不錯的,介紹爬蟲的基本知識以及伪裝技巧
Python數據分析與挖掘實戰: 這本我覺得在分析資料方面講得很好,帶有基礎知識建立以及實際案例
以上兩本書提供給你參考參考~~^.^

Pjs
Pjs
5 years ago

請教個數學問題,第二部分的偏微分outo1/neto1那邊的運算可以詳細講解一下嗎
exp的微分忘記了QQ
版主回覆:(05/06/2019 01:19:37 PM)
上面第七個問問題的人就有推導囉
你可以參考一下:
dy/dx=(1+e^(-x))^(-2)*e^(-x) =y*(1-y)

ken
ken
5 years ago

謝謝小編的分享讓我學到很多
有一個問題想要請教
就在修改權重值的地方是將[舊的權重值-(學習率*修改數值)]w5new=w5old−α∂Etotal∂w5
但我在其他地方有看到是[舊的權重值+(學習率*修改數值)]w5new=w5old+α∂Etotal∂w5
想請問哪一個才是正確的呢?
版主回覆:(06/27/2019 11:38:03 PM)
基本上兩個都是正確的喔,因為只差一個符號而已
這符號可以由修改數值那邊去彌補喔
舉例來說若用上面的式子算出修改數值是負的話
那麼同樣的資料用下面的式子去算
修改值就會變成正的喔

Peter
Peter
5 years ago


公式變成亂碼了
請問有辦法修正嗎?
謝謝
版主回覆:(03/19/2022 03:02:49 PM)
Hi 匹克幫不知怎麼的 letex公式全亂了
這是我用octpress新建的網站
參考看看 ^.^
https://darren1231.github.io/blog/2020/02/01/backpropagation/