30行JavaScript代碼,教你分分鐘創(chuàng)建神經(jīng)網(wǎng)絡
自己搭建神經(jīng)網(wǎng)絡太復雜?
別怕!
今天我們將手把手教你如何用30行代碼輕松創(chuàng)建一個神經(jīng)網(wǎng)絡
。在本篇文章中,你將學到:
如何使用Synaptic.js(https://synaptic.juancazala.com/#/)創(chuàng)建和訓練神經(jīng)網(wǎng)絡。
利用這款工具,我們可以在瀏覽器中用Node.js進行深度學習。
今天我們要講的例子是一個非常簡單的神經(jīng)網(wǎng)絡,我們將用它來學習邏輯異或方程(XOR equation)。
同時,我也在Scrimba上創(chuàng)建了一個交互式屏幕錄像。你也可以通過觀看視頻來學習本教程。(https://scrimba.com/casts/cast-1980)
在開始編程之前,讓我們先快速瀏覽神經(jīng)網(wǎng)絡的一些基本概念。
神經(jīng)元和突觸
神經(jīng)網(wǎng)絡的***個模塊,是神經(jīng)元。
神經(jīng)元類似一個函數(shù),你輸入一些值,它就會輸出返回值。
神經(jīng)元有各種不同的類型。我們的神經(jīng)網(wǎng)絡將用到sigmoid神經(jīng)元(https://en.wikipedia.org/wiki/Sigmoid_function),將任何輸入的給定值,壓縮到0到1之間。
下圖中的圓圈就代表一個sigmoid神經(jīng)元。它的輸入值是5,輸出值是1。箭頭則代表的是神經(jīng)元的突觸,用來連接神經(jīng)網(wǎng)絡中其它層的神經(jīng)元。
為什么會有一個紅色的數(shù)字5呢?它是連接到神經(jīng)元的三個突觸(左邊3個箭頭)的值之和。
在最左邊,我們看到有兩個值與所謂的偏差值進行了加法運算。數(shù)值1和0是綠色的,而偏差值-2是棕色的。
首先,兩個輸入值與他們的權重分別相乘,權重就是藍色數(shù)字7和3。
然后,我們把他們和偏差值加起來,所得的結果是5,對應紅色數(shù)字。這個紅色數(shù)字就是我們?nèi)斯ど窠?jīng)元的輸入值。
由于我們的神經(jīng)元是sigmoid神經(jīng)元,它會將任何值壓縮到0到1的區(qū)間范圍內(nèi),所以輸出值被壓縮到1。
如果將這些神經(jīng)元的網(wǎng)絡連接起來,就形成了一個神經(jīng)網(wǎng)絡。通過神經(jīng)元間的突觸連接,從輸入到輸出進行正向傳播。如下圖所示:
神經(jīng)網(wǎng)絡的目標是訓練其泛化能力,例如識別手寫的數(shù)字或者垃圾郵件。做到好的泛化重要的是通過神經(jīng)網(wǎng)絡找到合適的權重和偏差值。如上述例子中的藍色和棕色數(shù)字。
當訓練神經(jīng)網(wǎng)絡時,我們只需要加載大量示例數(shù)據(jù),如手寫的數(shù)字,然后讓神經(jīng)網(wǎng)絡來預測正確的數(shù)字。
在每次預測后,你需要計算預測的偏差程度,然后調整權重和偏差值使得神經(jīng)網(wǎng)絡在下一次運算中可以預測的更加準確。這種學習過程被稱為反向傳播。如此重復上千次,你的神經(jīng)網(wǎng)絡很快會精于泛化。
本教程不包括反向傳播的工作原理介紹,但是我找到了3個好的教程幫助大家理解:
- 分步介紹反向傳播案例(https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/) – 作者:Matt Mazur
- 神經(jīng)網(wǎng)路駭客指南(http://karpathy.github.io/neuralnets/) – 作者:Andrej Karpathy
- 神經(jīng)網(wǎng)絡和深度學習(http://neuralnetworksanddeeplearning.com/chap1.html) – 作者:Michael Nielsen
用代碼搭建神經(jīng)網(wǎng)絡
現(xiàn)在,你應該已經(jīng)對神經(jīng)網(wǎng)絡有了基礎概念,那就讓我們進入代碼部分吧。
1.創(chuàng)建神經(jīng)網(wǎng)絡層
在synaptic中我們使用new layer()函數(shù)來創(chuàng)建。函數(shù)中傳遞的數(shù)字表示的是每一層會有多少個神經(jīng)元。
接下來我們將這些層進行連接并實例化一個神經(jīng)網(wǎng)絡,代碼如下,
這是一個2-3-1結構的神經(jīng)網(wǎng)絡,可視化表示如下:
2.訓練神經(jīng)網(wǎng)絡
我們共進行了20,000次的訓練,每一次都進行四次正向傳播和反向傳播運算,分別傳遞四個可能的輸入到神經(jīng)網(wǎng)絡:[0,0] [0,1] [1,0] [1,1] 。
我們從myNetwork.activate([0,0])激活函數(shù)開始,[0,0]是神經(jīng)網(wǎng)絡的輸入值,這個過程是正向傳播,也被稱為激活網(wǎng)絡。在每一次正向傳播后我們需要做一次反向傳播,從而更新神經(jīng)網(wǎng)絡的權重和偏差值。
反向傳播通過下面這行代碼實現(xiàn)
- myNetwork.propagate(learningRate, [0])
learningRate是一個常數(shù),用來告訴神經(jīng)網(wǎng)絡每次應該對權重值進行多大程度的調整。第二個參數(shù)0表示的是當輸入為[0,0]時,正確的輸出參數(shù)是0.
然后,神經(jīng)網(wǎng)絡將預測值和真實值進行對比,來判斷預測是否正確。
它將比較的結果作為調整權重和偏差值的基礎,以便下次的預測可以更加準確。
在執(zhí)行這個過程20,000次后,我們可以通過傳遞四個可能的輸入到激活網(wǎng)絡,從而判斷目前神經(jīng)網(wǎng)絡的預測情況:
如果我們將這些值四舍五入到最近的整數(shù),就將得到異或方程的正確結果。萬歲!
以上就是教程的全部內(nèi)容了。
雖然我們只了解了神經(jīng)網(wǎng)絡的皮毛,但這已經(jīng)足夠支持你開始使用Synaptic,并繼續(xù)學習。另外,Synaptic的wiki中有很多好的教程,你可以點擊以下鏈接瀏覽(https://github.com/cazala/synaptic/wiki)。