姓名:閆偉? 學號:15020150038
轉載自:https://zhuanlan.zhihu.com/p/49928060
【嵌牛導讀】:如今神經網絡已經深入到生活的許多方面,而最近幾年基于js的神經網絡也逐漸火了起來树瞭。
【嵌牛鼻子】:Synaptic.js? node.js 神經網絡
【嵌牛提問】:如何用js來搭建神經網絡
【嵌牛正文】:
我們先看看神經網絡的基本知識徽职。
神經元和突觸
搭建神經網絡的第一個部分就是神經元。神經元就像一個函數(shù),獲取一些輸入诡蜓,返回一個輸出。
神經元有很多種類型粟耻,我們本文搭建的神經網絡使用 Sigmoid 神經元垢乙,不管給它什么輸入锨咙,都會輸出 0-1 之間的值。
下圖的圓圈表示的就是一個 Sigmoid 神經元追逮,它的輸入是 5酪刀,輸出為 1粱侣。圖中的箭頭就是我們所說的“突觸”,它會將神經元和神經網絡中的其它層連接在一起蓖宦。
那么為什么是紅色數(shù)字 5?因為它是連接到神經元的 3 個突觸的總和油猫,即左側的 3 個箭頭稠茂。我們挨個解釋。
在最左側情妖,我們可以看到兩個值和一個偏差值相加睬关,綠色數(shù)字 1 和 0 為兩個值,棕色數(shù)字 -2 為偏差值毡证。
首先电爹,兩個輸入和它們的權重相乘,權重是藍色數(shù)字 7 和 3料睛。
最后丐箩,我們將它們相加后得到 5,即紅色數(shù)字恤煞。這就是我們的神經元的輸入屎勘。
因為是 Sigmoid 神經元,它會將任何輸入壓縮為 0 到 1 之間的數(shù)值居扒,所以輸出會被壓縮為 1.
如果你將這些神經元連接在一起概漱,就會得到一個神經網絡。通過這些由突觸相連的神經元喜喂,神經網絡從輸入到輸出來正向傳播瓤摧。如下圖所示:
神經網絡的目標是經過訓練后完成泛化工作,比如識別手寫字或垃圾郵件玉吁。神經網絡中具有合適的權重和偏差(就是前面所舉例子中的藍色和棕色數(shù)字)照弥,是它能否具有良好的泛化能力的關鍵。
在訓練神經網絡時进副,我們只需像它展示大量的數(shù)據(jù)樣本产喉,比如手寫字,讓神經網絡預測正確的答案敢会。
每次預測后曾沈,我們會計算預測的誤差,然后調整權重和偏差鸥昏,讓神經網絡下一次預測時更接近正確答案塞俱。這個學習過程就叫做“反向傳播”。這項操作經過幾千次后吏垮,神經網絡就會變得非常善于泛化障涯。
代碼
了解了基本的神經網絡知識后罐旗,我們開始編寫代碼。第一樣工作就是創(chuàng)建網絡層唯蝶,我們使用 Synaptic 中的 new layer() 函數(shù)完成這一步九秀。傳遞到函數(shù)中的數(shù)字表示每一層應該有多少個神經元。
const { Layer, Network } = window.synaptic;var inputLayer = new Layer(2);var hiddenLayer = new Layer(3);var outputLayer = new Layer(1);
接著我們將這些網絡層相連粘我,實例化一個新的神經網絡鼓蜒,像這樣:
inputLayer.project(hiddenLayer);hiddenLayer.project(outputLayer);var myNetwork = new Network({ input: inputLayer, hidden: [hiddenLayer], output: outputLayer});
那么這是一個 2-3-1 網絡,可視化后如下所示:
現(xiàn)在我們訓練神經網絡:
// train the network - learn XORvar learningRate = .3;for (var i = 0; i < 20000; i++) {? // 0,0 => 0? myNetwork.activate([0,0]);? myNetwork.propagate(learningRate, [0]);? // 0,1 => 1? myNetwork.activate([0,1]);? myNetwork.propagate(learningRate, [1]);? // 1,0 => 1? myNetwork.activate([1,0]);? myNetwork.propagate(learningRate, [1]);? // 1,1 => 0? myNetwork.activate([1,1]);? myNetwork.propagate(learningRate, [0]);}
這里我們將神經網絡運行 2 萬次征字,每次正向和反向傳播 4 次都弹,向神經網絡傳入 4 個可能值:[0,0] [0,1] [1,0] [1,1]。
我們首先執(zhí)行 myNetwork.activate([0,0])匙姜,其中 [0,0] 是我們發(fā)到神經網絡中的數(shù)據(jù)點畅厢。這就是正向傳播,也叫激活神經網絡氮昧。在每次正向傳播之后框杜,我們需要做一個反向傳播,其中神經網絡會更新它自身的權重和偏差袖肥。
反向傳播用這行代碼完成:myNetwork.propagate(learningRate, [0])霸琴,其中 learningRate 是一個常量,會告訴神經網絡每次調整權重的幅度昭伸。第二個參數(shù) 0 表示跟定輸入 [0,0] 的正確輸出梧乘。
然后神經網絡會將它自己的預測和正確標簽進行比較,得知它的預測是對還是錯庐杨。
神經網絡利用這種比較作為偏差來糾正它自己的權重和偏差值选调,這樣下一次它就能猜得更準確些。
將這個過程完成 2 萬次后灵份,我們就可以用全部 4 個可能輸入激活神經網絡仁堪,檢查它的學習效果:
console.log(myNetwork.activate([0,0])); -> [0.015020775950893527]console.log(myNetwork.activate([0,1]));->[0.9815816381088985]console.log(myNetwork.activate([1,0]));-> [0.9871822457132193]console.log(myNetwork.activate([1,1]));-> [0.012950087641929467]
如果我們將這些值四舍五入為最接近整數(shù)的值,就會得到 XOR 方程的正確答案填渠。
就是這些弦聂,雖然本文只談了些神經網絡的皮毛知識,但是應該能足以幫你開始用 JavaScript 搭建神經網絡氛什,探索機器學習莺葫。可以看看 Synaptic 的頁面枪眉,上面有很多不錯的教程.