用JavaScript也能玩機器學習:30行JS代碼搭建一個神經網絡

姓名:閆偉? 學號: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 的頁面枪眉,上面有很多不錯的教程.

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末捺檬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贸铜,更是在濱河造成了極大的恐慌堡纬,老刑警劉巖聂受,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烤镐,居然都是意外死亡蛋济,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門炮叶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碗旅,“玉大人,你說我怎么就攤上這事悴灵。” “怎么了骂蓖?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵积瞒,是天一觀的道長。 經常有香客問我登下,道長茫孔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任被芳,我火速辦了婚禮缰贝,結果婚禮上,老公的妹妹穿的比我還像新娘畔濒。我一直安慰自己剩晴,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布侵状。 她就那樣靜靜地躺著赞弥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趣兄。 梳的紋絲不亂的頭發(fā)上绽左,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音艇潭,去河邊找鬼拼窥。 笑死,一個胖子當著我的面吹牛蹋凝,可吹牛的內容都是我干的鲁纠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼鳍寂,長吁一口氣:“原來是場噩夢啊……” “哼房交!你這毒婦竟也來了?” 一聲冷哼從身側響起伐割,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤候味,失蹤者是張志新(化名)和其女友劉穎刃唤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體白群,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡尚胞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了帜慢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笼裳。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粱玲,靈堂內的尸體忽然破棺而出躬柬,到底是詐尸還是另有隱情,我是刑警寧澤抽减,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布允青,位于F島的核電站,受9級特大地震影響卵沉,放射性物質發(fā)生泄漏颠锉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一史汗、第九天 我趴在偏房一處隱蔽的房頂上張望琼掠。 院中可真熱鬧,春花似錦停撞、人聲如沸瓷蛙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽速挑。三九已至,卻和暖如春副硅,著一層夾襖步出監(jiān)牢的瞬間姥宝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工恐疲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腊满,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓培己,卻偏偏與公主長得像碳蛋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子省咨,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容