(廢)不打code,怎麼用Excel實作反向傳播神經網路 (Backpropagation)

陳劭傑
8 min readMar 20, 2019

--

LT,最近修課重學了最基礎的ML理論,在跟作業通靈之餘,開了Excel做了一個似乎沒甚麼用的小東西,這邊做個記錄一下。

循環參照的利用

用過Excel的人都知道,如果你打公式時用到自己這格,或是在A儲存格用了B,B儲存格用了A,就會發生循環參照:

循環參照(B5<->B1)
..??

而Excel事實上可以關閉這項檢查,只要開啟反覆運算功能,在Excel的選項中,以目前本人使用的2016版是在這(檔案->選項->公式->啟用反覆運算)

先設成這樣

回到工作表,我們在A1打下 "=A1+1",連按F9,神奇的事發生了,數字竟然一直累加

這就是開啟反覆運算之後的效果,當然若你想要一次累加好幾次,可以改變上面選項中的最高次數,然而這有甚麼用呢?你可以想成他完成了如程式語言中的 i=i+1 i++ 的效果,而這就是帶領Excel進入另外一個世界的鑰匙.

實作最簡單的神經網路

那有了上面的種種,我們就來train一個反向傳播的經典函數XOR吧,首先把他的dataset打出來,順便畫個圖

互斥或,相同為假,相異為真。

XOR為經典範例的原因實為他並不能以線性的方法做區分,如x-y>1, x-y<=1就分成兩群,這也是最早的Perceptron Model所被人詬病的原因,扯太多了,我們順便把網路的樣子畫出來以告訴別人我們真的知道他長怎樣,這裡用一個2-3-1的網路:

2–3–1的網路,下面的藍圈1作為bias使用

開始建立我們的環境,用一個儲存格作為我們的State,確認我們的狀態,訓練中還是要Reset,搭配表單控制項,窩們可以控制它的內容,方便起見,我們把它的名稱設成State

Based on上面的東西,我們在train狀態下實作了兩個循環的counter,一個做四筆測資的切換,取名稱為Idx,另一個控制Forward/Backward傳播,取名稱為FB,靠著反覆運算和IF輕鬆實作完成,最後搭配OFFSET()函數取出測資作為Input,把他排成行向量以供後續使用

然後把我們每個neural的weight準備好,排成行向量以便我們進行矩陣運算,此外,我們會在Stop狀態給予initial的weight值,根據一些理論,我們使用如下normal distribution的random會比較好:

例如中間那層有兩個input(不算bias),Excel可使用下列公式得到

=NORMINV(RAND(),0,1/sqrt(2))

前向傳播

使用矩陣運算算出中間三個neural的輸出,根據如下的函數,請注意在x的部份我們併了一項bias一起運算:

寫成Excel公式大概是這樣,記得矩陣結果要按Ctrl+Shift+Enter才能生效

=MMULT(TRANSPOSE(J16:L18),H16:H18)

而為了給予輸出非線性的結果,會使用一個叫Activation function的東西在output,有相當多種,這裡使用sigmoid函數

得到結果如下,而為了接上下一層,我們也要將結果併上一個1作為bias項

輸入到中間那層
中間到輸出,我懶得打內積直接土炮了

最後Ans一樣用OFFSET從測資拿,Loss使用MSE,輸出只有一項所以就是(Sig_O-Ans)²,這樣Forward的部分暫時完成了

反向傳播及更新權重

本次實作的重點來了,反向傳播的精神即為以最佳化的方式,使Loss減少,大名鼎鼎的gradient descent即用在這,想當然爾當然就是要算gradient,這邊就省略冗長的chain rule及其他過程,直接看結果:

在試算表中的結果

總而言之,我們可以算出中間層和輸出層的每個neural的一項delta值,在利用這個delta值去更新weight,更新的方式就是使他乘上其input,以及我們給定的一個步長,或叫做learning rate,來改變weight,以中間層最後層的第一個weight為例:

最後看一下weight的公式,實作上我們搭配State,Idx,FB等等狀態Counter,FB有三個狀態(Forward/Calc Delta/Backward),亦及整個反向傳播演算法要做的事,在FB=2(Backward)時,我們把算好的delta拿來更新,更新完之後Idx就會跳到下個,FB回到0(Forward),變成下個測資使用更新好的weight,繼續訓練。

整個過程的實作架構

訓練

一切都就緒之後我們就可以開train啦,我們在這邊把4個測資再forward一次來觀察結果,一開始的結果都在0.5上下,非常糟糕

為了不讓按著F9的手太酸,我們把反覆運算的次數設成40,讓我們不會等太久,按下F9之後:

約莫30秒後,LOSS逐漸下降,結果也接近原函數了!

視覺化觀察結果

然而我們並沒有滿足於此,我們想要觀察函數的變化,Excel有種圖表為曲面圖,我們把每個格點一樣forward進去,並把他排成正方形以利繪圖(手動..)

input打好久...
...排好
曲面圖出來長這樣

俯視角比較符合我們原問題的平面,所以改成下圖

現在我們可以知道我們學出來的函數中間有一個左上右下帶狀範圍為接近1的,而左上右下為接近0,以符合我們所給予的XOR測資,當然,我們也可以在訓練過程中觀察圖形變化:

訓練過程的函數變化

我沒有偷轉方向哦,只是由於initial weight 隨機值的不同,它學出了不同的樣子而已,這次中間一個是接近0的右上左下帶狀範圍,一樣是符合我們XOR測資的。

結語

以上,就是我們利用Excel反覆運算,沒有動用任何一行程式碼的反向傳播實作,而這個(2–3–2)層數大概對手動打公式的人已經很累人了,但其實它的LOSS並沒有辦法下降到很極限,另外,如果有興趣的盆u可以下載來看看(連結),但記得要開啟反覆運算不然不會跑哦,下次見ㄅㄅ。

Reference
[1]https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/
[2]http://terrence.logdown.com/posts/1132631-neural-networks-with-backpropagation-one-notes

就4我拉

--

--

陳劭傑
陳劭傑

Written by 陳劭傑

關關難過但關關不說

No responses yet