ללמד מחשב ללמוד כמו שאנחנו לומדים – על פי מה שלמדתי – חלק א'

ללמד מחשב ללמוד כמו שאנחנו לומדים – על פי מה שלמדתי – חלק א'

Print Friendly, PDF & Email

“People worry that computers will get too smart and take over the world, but the real problem is that they're too stupid and they've already taken over the world.”  ― Pedro Domingos

 

חשבתם פעם מה המוח שלכם עושה כשאתם חושבים או כשאתם מחשבים? אם כן – מתברר שאתם לא לבד. לאחר שקראתי בפעם המי יודע כמה את סיפרו המעולה של Jeff Hawkins ו-Saundra Blakeslee "על האינטליגנציה" ושמעתי כמעט בלופ אינסופי את הרצאותיו המאלפות של Matt Taylor באתר ה-HTM School של חברת Numenta חשבתי שכדאי לשתף אתכם בסיכום הדברים שהכנתי במתכונת פוסט בבלוג זה.

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

ובכן, Jeff Hawkins מספר כי מאז ומתמיד ריתקו אותו מוחות וכיצד הם עובדים, במהלך שנות הקריירה שלו (שכללה בין השאר את המצאת מחשבי הכף יד – Palm למי שזוכר) הוא עסק רבות באיסוף וניתוח מידע ממדעי המוח ובשילובו עם מדע מתחומי מדעי המחשב וניסה ליצור תיאוריה אחת אחידה שמסבירה את כל פעילות הניאוקורטקס שהוא למעשה החלק החדש ביותר (במונחים אבולוציוניים) והגדול ביותר שדחוס לכולנו בין האוזניים ואחראי למעשה לכל פעולה שאתם מכנים חשיבה, יצירתיות, מחשבות, רעיונות ולמעשה – כל מה שהופך אתכם למי שאתם. חלקים מסויימים מהתיאוריה הזו לא ניתנים כיום להוכחה אמיתית בשל הצורך בבדיקות חודרניות למוחות חיים שכמובן אינה אתית, אבל עם זאת, התיאוריה הזו שאותה אפרט בהמשך המאמר, כפי שתראו מיד "עושה שכל" ובהחלט מספקת את הסחורה. בנוסף, כדאי אולי להזכיר גם כי ג'ף הוקינס, הקים חברה אשר פיתחה מוצר קוד סגור לניטור מערכות IT אשר מיישמת בפועל את התיאוריה הזו ובנוסף, גם פרויקט קוד פתוח אשר מאפשר ואיפשר את הקמתן של מערכות חדשות רבות אשר מיישמות את התיאוריה הזו שעליה ארחיב מיד. חשבתי שכדאי לציין זאת בכדי שתוכלו לשים לב כי מדובר בתיאוריה שלא נשארה רק במסדרונות האקדמיה אלא גם ממומשת הלכה למעשה בכלים שונים ואף כבר הפיקה תוצאות שהיו באחוזים ניכרים (כ-30% למיטב זכרוני) מדוייקים יותר מכל מערכת בינה מלאכותית הקיימת כיום.

 

היות והתיאוריה של ג'ף הוקינס מחקה באופן מאד מדוייק את המוח שלנו אולי כדאי שנכיר אותו טיפה יותר לעומק וקצת יותר מקרוב. המוח שלנו מורכב משכבות בדומה לתל ארכאולוגי – שכבות נמוכות יותר דומות במבניהן למוחותיהם של יצורים פשוטים יותר – יונקים באופן כללי, זוחלים וכו'. השכבה העליונה ביותר במוח היא שכבת ה-Neocortex והיא גם השכבה שאותה מסבירה התיאוריה של ג'ף הוקינס שכן היא השכבה האחראית על הסקה לוגית, על חשיבה ולמעשה על כל הדברים שאותם אנו מכנים בשם "אני". מה אין בה? תפקודים אוטומטיים, רגשות ודברים דומים. שכבת ה-Neocortex דחוסה לנו בגולגולת כמו מפית דחוסה בתוך כוס יין אבל אם נפרוש את שכבת ה-Neocortex על שולחן נקבל משהו בגודל של בערך מפית שולחן ובעובי של כארבעה מילימטר וכאן מגיע החלק הבאמת מעניין… אם ניקח פיסה מה"מפית" הזו ונבחן אותה תחת עדשת המיקרוסקופ וזה לא משנה אם לקחנו את הפיסה הזו מהאזור שמטפל בשמיעה, ראייה, שפה או כל דבר אחר ב-Neocortex היא תיראה זהה כמעט לחלוטין לכל פיסה אחרת על ה-Neocortex. זה למעשה מרמז על כך שהמוח שלנו מבצע את אותו האלגוריתם ללא תלות בקלט שעליו הוא עובד. מהו אותו אלגוריתם קסום? שאלה טובה… עד סוף המאמר הזה מניח שתדע/י…

 

אחד הדברים הראשונים שחשוב לדעת על המוח שלנו הוא שהמוח שלנו הוא לא מכונת חישוב אלא מכונת זיכרון. ניתן להדגים את זה די בקלות: מה יהיה לכם יותר קל? לדקלם את ה-ABC או לדקלם אותו הפוך מהסוף להתחלה? כל תוכניתן מתחיל יכול לבנות מערך של האותיות פעם אחת ואז "לרוץ" עליו בלולאה מהסוף להתחלה או מההתחלה לסוף וזמן הריצה לא ישתנה. המוח שלנו מאחסן את הכל כתבניות המקושרות זו לזו. אבל לפני שאסביר כיצד, חשוב לשים לב כי למוח שלנו, מגיעים בכל רגע מיליוני אותות מכל החושים השונים ומאזורים שונים בתוך המוח דרך סיבי העצבים השונים אשר מאותתים אם אותו תא עצב פעיל או לא. למוח שלנו אין ידע מוקדם כלשהו שמסביר לו איזה סיב מגיע מאיפה או מה משמעות האותות שאותם הוא מעביר לכן, הוא חייב "לעשות סדר" בבאלגן הזה. הדרך בה המוח עושה זאת היא על ידי שימוש בפורמט מיוחד של נתונים אשר מכונה על ידי ג'ף הוקינס SDR או Sparse Distributed Representation. במחשב רגיל, בדרך כלל, אותיות כגון למשל האות A מיוצגת על ידי 8 הסיביות 01000001 אשר מייצגות את הערך העשרוני 65. לעצם העובדה שהסיבית השנייה משמאל דלוקה (1) והראשונה לא (0) אין ממש משמעות. גם לעובדה שהמספר שמייצג את האות A הוא 65 אין ממש משמעות – פשוט החלטה שרירותית של מישהו. במוח שלנו נשמרים כל הזמן שלושה עקרונות:
1. כמות הסיביות היא עצומה – במערך הקטן ביותר ב-HTM (שמה של התאוריה של ג'ף הוקינס) כמות הסיביות היא 2048.
2. אחוז הסיביות הפעילות (1) במערך – הוא קטן מאד, בערך 2% בלבד בכל רגע נתון עבור כל נתון שהוא.
3. לכל סיבית פעילה ב-SDR יש משמעות סמנטית – כל סיבית מציינת משהו לגבי האובייקט שאותו ה-SDR מייצג. לדוגמה: ביט אחד יכול לציין האם מדובר באות, אחד אחר יכול לציין האם היא עיצור או תנועה, אחד אחר יכול לציין אם היא מתחרזת עם משהו וכו'.
בעזרת הייצוג הזה, המוח שלנו מסוגל להשיג כמה יתרונות בולטים: מבנה כזה דחיס מאד שכן אין באמת צורך לשמור את כל הביטים הריקים אלא רק לשמור את המיקום של אותם 40 ביטים (כ-2%) שדולקים בלבד. בנוסף, כמות הפריטים שניתן לייצג באמצעות מבנה כזה אפילו במערך קטן של 2048 ביטים הוא עצום: 2,371,778,511,645,360,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ואם גם זה לא מספיק, בשל גודל המערך, הסיכוי לכך שבאופן אקראי בשני מערכים כאלו אותו ביט יהיה דולק הוא קטן באופן אסטרונומי ולכן, אם ישנו צורך להשוות בין מערך כזה למערכים אחרים, ניתן להשוות רק חלק ממנו ולמעשה הסבירות לטעות היא קטנה מאד וגם אם תתרחש טעות ואכן שני מערכים כאלו יהיו דומים, בשל המשמעות הסמנטית שיש לכל ביט, המשמעות לשוויון שכזה היא ששני המערכים בכל זאת מייצגים ערכים דומים מאד גם במובן הסמנטי של המילה. במבנה הזה המוח שלנו משתמש לייצג למעשה כל דבר. גם הרעיונות המופשטים ביותר וגם הפקודות לתנועה של השרירים השונים מאוחסנים כ-SDR, אשר למעשה מקושרים זה לזה ולכן רעיונות נפרשים ל-SDR-ים פשוטים יותר ויותר עד לפקודות השונות לשרירים השונים.

 

אחד המאפיינים המעניינים במבנה המוח הוא האופן בו תאי העצב מחוברים זה לזה. התאים מחוברים זה לזה באופן היררכי כך שלמעשה, המוח שלנו כל הזמן מבצע חיזוי (פרדיקציה) של מה שצפוי להגיע דרך סיבי העצב השונים וכאשר התחזית שלו מתממשת היא מתחזקת יותר. ניתן לשים לב לאפקט הזה כאשר שומעים שיר מתוך אלבום מוכר ומיד לאחר שהשיר מסתיים מתחילים לזמזם את השיר הבא. כאשר מגיע קלט לא צפוי הוא עולה במעלה ההיררכיה עד ששכבה כלשהי מצליחה להחליט מה לעשות בנוגע לקלט הזה. למעשה, כל קלט שמגיע למוח שלנו הוא קלט משתנה על ציר הזמן וכך המוח יכול לצפות מהו הקלט שסביר שיגיע כעת. הדבר מובן למדי כשמדובר על קלט שמיעתי (שיר למשל) אבל בקלט חזותי הנושא הזה לא תמיד כל כך ברור שכן זה נראה לנו שאנו רואים תמונה יציבה של האובייקט שלפנינו אבל למעשה לא כך הדבר, מומחים יודעים כבר זמן רב כי גם כאשר אנו מסתכלים על אובייקט שנמצא ישר מולנו, תמונה למשל, האישון שלנו מבצע תזוזות קטנות מהירות ממקום למקום. על פי תאוריית ה-HTM נראה כי המוח למעשה מזיז את האישון וצופה שאם הוא יזוז קצת שמאלה הוא יראה תמונה מסויימת ואם תחזית זו מתממשת הוא מנסה תחזית נוספת וכן הלאה. זו גם הסיבה לכך שאל ה-Neocortex מגיעים אותות הן מהחושים השונים אבל גם עותק של הפקודות שנשלחו לשרירים השונים וכך המוח יודע שעל אף שאנו זזים ולמעשה רואים את אותו אובייקט מאינספור זוויות שונות לפי התנועה שלנו, אנחנו עדיין מביטים על אותו אובייקט על סמך התחזיות שלו.

 

נסכם את מה שהיה עד כאן:
1. אלגוריתם ה-HTM מחקה במדוייק ככל האפשר את פעולתה של שכבת ה-Neocortex במוח האנושי
2. שכבת ה-Neocortex בנוייה מתאי עצב המחוברים זה לזה באופן היררכי ואשר מרכיבים יריעת תאים בגודל של מפית שולחן בעובי של כ-4 מ"מ
3. כל החומר שמגיע במוח או יוצא ממנו לשרירים מטופל כמערכי SDR בגדלים משתנים אשר כל ביט בתוכם הוא בעל משמעות סמנטית לגבי האובייקט שאותו הוא מייצג
4. כל חומר שמגיע למוח מטופל מיד עם הגיעו לאיזור הרלוונטי – או במילים אחרות – Realtime Machine Learning
5. כל אות שמגיע לאיזור כלשהו מטופל על ידו כאשר מועבר משוב לשאר השכבות בהיררכיה אלא אם כן אותו אזור אינו מסוגל עפ"י מה שלמד, לטפל בקלט המדובר, במקרה כזה – הקלט יועבר מעלה בשכבות ההיררכיה עד לאזור שמסוגל לטפל בו.

 

כפי שרמזתי קודם לכן, היות והאזורים השונים מחוברים היררכית זה לזה, ישנם אזורים שמטפלים בקלטים של מערכי SDR גדולים, וישנם אזורים שמטפלים בקלטים של מערכי SDR קטנים ולכן, למוח יש בעיה נוספת, היות והקלטים מגיעים בגדלים שונים, יהיה קשה להשוות ביניהם באופן סמנטי. המוח פותר את זה על ידי תהליך ש-Numenta מכנה Spatial Pooling. תהליך זה אחראי לקבל מערכי SDR בגדלים שונים ולייצר מערכי SDR חדשים המבוססים על אלו שנתקבלו ולמידת מכונה. העקרונות החשובים המנחים את התהליך הזה הם שה-Spatial Pooler צריך לייצר מערכי SDR עם אחוז ביטים דולקים פחות או יותר קבוע. עקרון נוסף הוא שה-Spatial Pooler צריך לשמר את הדימיון או השונות בין מערכי ה-SDR השונים המגיעים אליו, כך שאם הוא מקבל שני מערכי SDR שונים מאד זה מזה הוא ייצר שני מערכי SDR מאד שונים זה מזה ואם הוא מקבל שני מערכי SDR דומים מאד זה לזה הוא ייצר שני מערכי SDR מאד דומים זה לזה.

 

במודל שפותח בחברת Numenta קיים סט של רכיבים המכונה Encoders, רכיבים אלו מבצעים למעשה את תפקידם של החושים השונים שלנו. הם קולטים מידע מהעולם האמיתי (או מעולם התוכן שבו נרצה להשתמש באלגוריתם של חברת Numenta) ומייצרים ממנו מערכי SDR מתאימים. לצורך ההדגמה אני אדגים את אופן פעולתם של שני Encoders: זה שמטפל במספרים – Scalar Encoder וזה שמטפל בתאריך Date Encoder ולאחר מכן אוכל להדגים את האופן שבו האלגוריתם של HTM עובד כדי לצפות את הופעתן של תבניות שונות על בסיס התבניות שהופיעו עד כה.

 

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

אנו נציג אותו כך:

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

 

כעת, אפשר להמשיך ולהסביר כיצד ה-Scalar encoder וה-Date encoder פועלים כדי לייצג תאריכים ומספרים. כפי שהובהר עד כה, הייצוג במוח באמצעות מבנה ה-SDR משמר מאפיינים סמנטיים לגבי הקלט כך שלמשל יום ראשון בשבוע יהיה "דומה" ליום שני אבל מאד "שונה" מיום חמישי, המספר 1 יהיה "דומה" ל-2 אבל מאד "שונה" מ-1,000.

בתור התחלה, ננסה להסביר כיצד עובד ה-Scalar Encoder: באפשרותו של המשתמש במודול ה-NuPic (המודול של חברת Numenta שמוצע כקוד פתוח) לקבוע, הן את גודל ה-SDR שמוחזר על ידי ה-Encoder והן את כמות הביטים שתשמש לייצוג הערך בתוך ה-SDR (וכך בעצם לשלוט על מידת הצפיפות Sparsity במערך ה-SDR) ובנוסף, המשתמש חייב להגדיר את ערכי המקסימום והמינימום אשר יוכלו להיות מיוצגים באמצעות ה-Encoder. לאחר שהוגדרו ההגדרות הללו ניתן יהיה לייצג למשל את המספר 50 במערך SDR בן 400 ביטים כאשר בכל רגע נתון 21 ביטים בלבד דולקים וערך המינימום הוא 0 והמקסימום הוא 100 בדיוק כך:

 

 

 

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

בפוסט הבא, אנסה להסביר כיצד ניתן להשתמש ב-Date Encoder בכדי לקודד חותמות זמן (Timestamps) למערכי SDR. לאחר מכן כבר יהיה אפשרי להדגים (ככל הנראה גם כן בפוסט הקרוב) כיצד ניתן להשתמש ב-HTM (בעזרת NuPic) על מנת לזהות אנומליות ולבצע פרדיקציות על נתונים תלויי זמן. בפוסטים הבאים אשתדל להרחיב עוד יותר על Encoders נוספים ועל רכיב מסתורי (לעת עתה…) אשר אמור לעשות סדר בבלאגן של המידע הנקלט ל-HTM ומכין אותו ללימוד מכונה "אמיתי".

 

כרגיל – אשמח לקרוא כל הערה או הארה או הצעה שיש לכם – כאן בתגובות או בפייס.