30 行 JavaScript 代碼搭建神經(jīng)網(wǎng)絡(luò)

簡評:本文中身堡,原文作者 Scrimba 的創(chuàng)始人 Per Harald Borgen 將會展示如何利用 Synaptic.js 來創(chuàng)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)昌屉,從而使我們可以在 Node.js 和瀏覽器中進(jìn)行深度學(xué)習(xí)。

題圖:一幅由 Google Dream 神經(jīng)網(wǎng)絡(luò)創(chuàng)建的光怪陸離

我們將嘗試搭建最簡單的神經(jīng)網(wǎng)絡(luò)之一 —— 一個用于解決 XOR方程 的神經(jīng)網(wǎng)絡(luò)句占。

看代碼之前呢,我們先溫習(xí)一下神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)知識:

神經(jīng)元和突觸

構(gòu)建神經(jīng)網(wǎng)絡(luò)的第一個塊是神經(jīng)元。神經(jīng)元就像一個函數(shù)冗尤,它需要輸入,然后返回輸出胀溺。

有許多不同類型的神經(jīng)元裂七。我們的網(wǎng)絡(luò)將使用 sigmoid 神經(jīng)元,不管給定任何輸入仓坞,都會輸出 0 或者 1背零。

下圖是一個 Sigmoid 函數(shù),輸入 5 輸出 1无埃。箭頭稱為突觸徙瓶,將神經(jīng)元連接到網(wǎng)絡(luò)中的其他層。

那么嫉称,會什么左邊的輸入是 5 呢侦镇?因?yàn)樗沁B接到到神經(jīng)元的三個突觸的總和。

輸入乘以它們的權(quán)重就是人造神經(jīng)元的總輸入织阅。

由于這是一個 Sigmoid 神經(jīng)元壳繁,它能將任何值壓縮在 0 和 1 之間。

如果將這些神經(jīng)元的網(wǎng)絡(luò)連接在一起,那么一個神經(jīng)網(wǎng)絡(luò)就誕生了闹炉。神經(jīng)元通過突觸相互連接蒿赢,從輸入到輸出:


這個神經(jīng)網(wǎng)絡(luò)的目標(biāo)是訓(xùn)練它來進(jìn)行事件概括,例如識別手寫數(shù)字或垃圾郵件渣触。你只需要用大量例子來訓(xùn)練網(wǎng)絡(luò)羡棵,之后就能讓網(wǎng)絡(luò)預(yù)測正確的答案。

在每次預(yù)測之后昵观,根據(jù)預(yù)測的錯誤晾腔,調(diào)整權(quán)重和偏差值,以便網(wǎng)絡(luò)在下一次會更準(zhǔn)確地猜測啊犬。這種學(xué)習(xí)過程稱為 backpropagation(反向傳播)灼擂,做幾千次就差不多了。

backpropagation 技術(shù)就不展開了觉至,感興趣的話可以查看以下資料:

代碼

有了基本概念后剔应,現(xiàn)在我們開始 coding。

第一件事就是創(chuàng)建圖層语御。我們使用 new Layer() 來實(shí)現(xiàn)峻贮。傳遞給函數(shù)的數(shù)字決定了每層應(yīng)該有多少個神經(jīng)元:

const { Layer, Network } = window.synaptic;

var inputLayer = new Layer(2);
var hiddenLayer = new Layer(3);
var outputLayer = new Layer(1);

接下來,我們將這些層連接在一起并實(shí)例化一個新的網(wǎng)絡(luò)应闯,如下所示:

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

var myNetwork = new Network({
 input: inputLayer,
 hidden: [hiddenLayer],
 output: outputLayer
});

這是一個 2-3-1 網(wǎng)絡(luò)纤控,可以像這樣可視化:

現(xiàn)在我們來訓(xùn)練網(wǎng)絡(luò):

// train the network - learn XOR

var 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]);
}

這里我們運(yùn)行 20000 次,每次我們都向前和向后四次碉纺,傳遞可能的四個輸入:[0,0] [0,1] [1,0] [1,1] 船万。

我們從 myNetwork.activate([0,0]) 開始。數(shù)據(jù) [0,0] 是正向傳播骨田,也稱為激活網(wǎng)絡(luò)耿导。在每次向前傳播之后,我們需要進(jìn)行反向傳播态贤,網(wǎng)絡(luò)會更新權(quán)重和偏差舱呻。

反向傳播是用這一行代碼完成的:

myNetwork.propagate(learningRate, [0])

learningRate 是一個常數(shù),告訴網(wǎng)絡(luò)每次應(yīng)該調(diào)整多少權(quán)重悠汽。參數(shù) 0 表示當(dāng)輸入 [0,0] 時正確的輸出箱吕。

之后網(wǎng)絡(luò)將自己的預(yù)測與正確的標(biāo)簽進(jìn)行比較,然后就知道什么是對的了柿冲。

這個比較將作為校正權(quán)重和偏差值的基礎(chǔ)殖氏,以便下次猜測會更準(zhǔn)確一些。

完成 20000 次學(xué)習(xí)后姻采,我們就可以檢查下網(wǎng)絡(luò)的學(xué)習(xí)情況:

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 方程的正確答案爵憎。

這是個很初級的神經(jīng)網(wǎng)絡(luò),不過也足夠自己開始玩 Synaptic 了婚瓜,感興趣的話還可以看這個 wiki宝鼓,里面有很多很好的教程。

原文鏈接:How to create a Neural Network in JavaScript in only 30 lines of code
推薦閱讀:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巴刻,一起剝皮案震驚了整個濱河市愚铡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胡陪,老刑警劉巖沥寥,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異柠座,居然都是意外死亡邑雅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門妈经,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淮野,“玉大人,你說我怎么就攤上這事吹泡≈栊牵” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵爆哑,是天一觀的道長洞难。 經(jīng)常有香客問我,道長揭朝,這世上最難降的妖魔是什么队贱? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮萝勤,結(jié)果婚禮上露筒,老公的妹妹穿的比我還像新娘呐伞。我一直安慰自己敌卓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布伶氢。 她就那樣靜靜地躺著趟径,像睡著了一般。 火紅的嫁衣襯著肌膚如雪癣防。 梳的紋絲不亂的頭發(fā)上蜗巧,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音蕾盯,去河邊找鬼幕屹。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的望拖。 我是一名探鬼主播渺尘,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼说敏!你這毒婦竟也來了鸥跟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤盔沫,失蹤者是張志新(化名)和其女友劉穎医咨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體架诞,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拟淮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侈贷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惩歉。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俏蛮,靈堂內(nèi)的尸體忽然破棺而出撑蚌,到底是詐尸還是另有隱情,我是刑警寧澤搏屑,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布争涌,位于F島的核電站,受9級特大地震影響辣恋,放射性物質(zhì)發(fā)生泄漏亮垫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一伟骨、第九天 我趴在偏房一處隱蔽的房頂上張望饮潦。 院中可真熱鬧,春花似錦携狭、人聲如沸继蜡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稀并。三九已至,卻和暖如春单默,著一層夾襖步出監(jiān)牢的瞬間碘举,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工搁廓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留引颈,地道東北人耕皮。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像蝙场,于是被迫代替她去往敵國和親明场。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 滿足他所需達(dá)成我所求
    010ed0d5a362閱讀 254評論 0 0
  • 臨暮的溫度中充滿潮濕李丰,蕭瑟苦锨。街燈閃爍,如同飄忽不定的思緒趴泌≈凼妫或許是生活,或許是情感嗜憔,總有那么多的或許……終歸是要從頭開始秃励。
    善惑閱讀 232評論 0 1
  • 凝于夜半翠紅間, 燦若珍珠粒粒圓吉捶。 玉潤晶瑩心通透夺鲜, 一生苦短有誰憐?
    落英舞黃昏123閱讀 379評論 0 1