כיצד ליצור רשת עצבית ב- JavaScript רק ב- 30 שורות קוד

במאמר זה אראה לך כיצד ליצור ולהכשיר רשת עצבית באמצעות Synaptic.js, המאפשרת לך ללמוד למידה עמוקה ב- Node.js ובדפדפן.

ניצור רשת עצבית הכי פשוטה שאפשר: רשת שמצליחה לפתור את משוואת ה- XOR.

יצרתי גם מדריך Scrimba אינטראקטיבי בדוגמה זו, אז בדוק גם את זה:

במדריך Scrimba תוכלו לשחק עם הקוד מתי שתרצו.

לחלופין, אם אתה מעוניין בקורס מלא ברשתות עצביות ב- JavaScript, אנא עיין בקורס חינם שלנו ב- Brain.js ב- Scrimba.

לחץ על התמונה כדי להגיע לקורס

אבל לפני שנסתכל על הקוד, בואו נעבור את היסודות של רשתות עצביות.

נוירונים וסינפסות

אבן הבניין הראשונה של רשת עצבית היא, ובכן, נוירונים.

נוירון הוא כמו פונקציה, הוא לוקח כמה תשומות ומחזיר פלט.

ישנם סוגים רבים ושונים של נוירונים. הרשת שלנו תשתמש בנוירונים זיגמואידים, שלוקחים כל מספר נתון ומועכים אותו לערך בין 0לבין 1.

המעגל למטה ממחיש נוירון סיגמואידי. הקלט שלו הוא 5והפלט שלו 1. החצים נקראים סינפסות, המחברים את הנוירון לשכבות אחרות ברשת.

אז למה המספר האדום 5? מכיוון שזה סכום שלושת הסינפסות שמתחברות לנוירון כפי שמוצג על ידי שלושת החצים משמאל. בואו נפרק את זה.

בצד שמאל, אנו רואים שני ערכים בתוספת מה שמכונה ערך הטיה . הערכים הם 1ומהם 0המספרים הירוקים. ערך ההטיה הוא -2שהוא המספר החום.

ראשית, שתי הקלטות מוכפלות במשקולות שלהן , 7והן 3כפי שמוצג על ידי המספרים הכחולים.

לבסוף, אנו מוסיפים זאת עם ההטיה ובסופו של דבר עם 5המספר האדום. זה הקלט לנוירון המלאכותי שלנו.

מכיוון שמדובר בנוירון סיגמואי המועך כל ערך בין 0 ל -1, התפוקה נלחצת 1.

אם אתה מחבר רשת של נוירונים אלה יחד, יש לך רשת עצבית. זה מתפשט קדימה מקלט לפלט, באמצעות נוירונים המחוברים זה לזה באמצעות סינפסות. כמו בתמונה למטה:

המטרה של רשת עצבית היא לאמן אותה לבצע הכללות, כמו זיהוי ספרות בכתב יד או דואר זבל. ולהיות טוב הכללה הוא עניין של בעל זכות המשקולות ו הטיה ערכי ברחבי הרשת. כמו במספרים הכחולים והחומים בדוגמה שלנו לעיל.

כשאתה מאמן את הרשת אתה פשוט מראה לה המון דוגמאות כגון ספרות בכתב יד ומביא את הרשת לחזות את התשובה הנכונה.

לאחר כל חיזוי תחשב עד כמה  החיזוי היה שגוי , והתאם את המשקולות וערכי ההטיה כך שהרשת תנחש קצת יותר נכון בפעם הבאה. תהליך למידה זה נקרא backpropagation. עשו זאת במשך אלפי פעמים והרשת שלכם תהפוך בקרוב לטובת הכללה.

אופן הפעולה של backpropagation מבחינה טכנית נמצא מחוץ להיקף של הדרכה זו, אך להלן שלושת המקורות הטובים ביותר שמצאתי להבנתו:

  • דוגמה לצעדים אחוריים שלב אחר שלב - מאת מאט מזור
  • מדריך האקרים לרשתות עצביות - מאת אנדריי קרפתי
  • NeuralNetworksAndDeepLarning - מאת מייקל נילסן

הקוד

עכשיו שקיבלתם מבוא בסיסי, בואו נקפוץ לקוד. הדבר הראשון שעלינו לעשות הוא ליצור את השכבות. אנו עושים זאת עם new Layer()הפונקציה בסינפטית. המספר שהועבר לפונקציה מכתיב כמה נוירונים לכל שכבה צריכים להיות.

אם אתה מבולבל לגבי מהי שכבה , עיין בתוכנית המסך שלמעלה.

const {Layer, Network} = window.synaptic;

var inputLayer = שכבה חדשה (2);

var hiddenLayer = שכבה חדשה (3);

var outputLayer = שכבה חדשה (1);

בהמשך נחבר את השכבות הללו יחד ונקים רשת חדשה, כך:

inputLayer.project (hiddenLayer);

hiddenLayer.project (outputLayer);

var myNetwork = רשת חדשה ({

קלט: inputLayer,

מוסתר: [hiddenLayer],

פלט: outputLayer

});

אז זו רשת 2–3–1, שניתן לדמיין כך:

עכשיו בואו נכשיר את הרשת:

// train the network - learn XOR var learningRate = .3; for (var i = 0; i  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]); } 

כאן אנו מפעילים את הרשת 20,000 פעמים. בכל פעם שאנחנו להפיץ קדימה ואחורה ארבע פעמים, עוברת בארבע התשומות האפשריות עבור רשת זו: [0,0] [0,1] [1,0] [1,1].

אנו מתחילים לעשות myNetwork.activate([0,0]), היכן [0,0]נקודת הנתונים שאנו שולחים לרשת. זהו התפשטות קדימה, הנקראת גם הפעלת  הרשת. אחרי כל התפשטות קדימה, עלינו לבצע הפצה אחורית, שבה הרשת מעדכנת את המשקולות וההטיות שלה.

ההחלפה האחורית מתבצעת עם שורת קוד זו:, myNetwork.propagate(learningRate, [0])כאשר learningRateהקבוע הוא קבוע שאומר לרשת כמה עליה להתאים את משקולותיה בכל פעם. הפרמטר השני 0מייצג את הפלט הנכון בהתחשב בקלט [0,0].

לאחר מכן משווה הרשת את החיזוי שלה לתווית הנכונה. זה אומר כמה זה היה נכון או לא נכון.

היא משתמשת בהשוואה כבסיס לתיקון משקליה וערכי הטיה משלה, כך שהיא תנחש קצת יותר נכונה בפעם הבאה.

לאחר שהיא עשתה תהליך זה 20,000 פעמים, נוכל לבדוק עד כמה הרשת שלנו למדה על ידי הפעלת הרשת עם כל ארבע התשומות האפשריות:

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] 

אם נעגל את הערכים הללו למספר השלם הקרוב ביותר, נקבל את התשובות הנכונות למשוואת XOR. הורא!

וזה בערך. למרות שזה עתה גירדנו את פני השטח של רשתות עצביות, זה אמור לתת לך מספיק להתחיל לשחק עם Synaptic בעצמך ולהמשיך ללמוד בעצמך. הוויקי שלהם מכיל הרבה מדריכים טובים.

לסיום, דאגו לשתף את הידע שלכם על ידי יצירת מסך Scrimba או כתיבת מאמר כשאתם לומדים משהו חדש! :)

נ.ב: יש לנו יותר קורסים בחינם בשבילך!

אם אתה מחפש את האתגר הבא שלך, יש לנו עוד כמה קורסים בחינם שתוכל לבדוק ב Scrimba.com. להלן שלוש עשויות להיות רלוונטיות עבורך:

  • רשתות עצביות ב- JavaScript
  • מבוא ל- ES6 +
  • למד D3 JS

קידוד שמח!