Reinforcement Learning

אתגר רפאל–פתרון בלמידת חיזוקים End-to-End

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי binyamin manela

הקדמה על האתגר:

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

המטרה במשחק היא להגן על שתי ערים מרקטות המשוגרות אליהן בעזרת משגר יירוט (ראה Figure 1).

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

בכל צעד ניתן לבצע אחת מ4 פעולות:

  1. לא לעשות כלום
  2. להזיז קצת את המיירט עם כיוון השעון
  3. להזיז קצת את המיירט נגד כיוון השעון
  4. לירות טיל יירוט

הניקוד במשחק הוא כדלקמן: בעת פגיעת רקטה בעיר יורדות 15 נקודות. בעת פגיעת רקטה בשטח פתוח יורדת נקודה אחת. יירוט מוצלח של רקטה מעניק ארבע נקודותובכל ירי של טיל יירוט יורדת נקודה אחת. לאחר כל צעד הסביבה מחזירה את סך הניקוד שנצבר עד כה (score).

המשחק מכיל מספר אתגרים מרכזיים:

  1. הdynamics של המשחק מורכבים לאלגוריתם hand-coded
  2. ה state space של המשחק לא קבוע– כמות הרקטות וטילי היירוט משתנה כל הזמן.
  3. Sparse reward– הסיכוי לירי מוצלח קטן משמעותית מהסיכוי לפספס. כלומר, סביר שהסוכן ילמד מהר שעדיף להימנע מירי.
  4. Reward assigning– גם במקרה והסוכן ירה נכון, התגמול על ירי מוצלח מגיע רק בדיעבד ויהיה לסוכן קשה להבין מה גרם לאותו משוב חיובי. בנוסף, פגיעה של רקטה בעיר גוררת תגמול שלילי גדול באופן מידי, ותגרום לסוכן לחשוב שהוא עשה משהו רע בצעד שלפני הפגיעה (פצצה עוינת=רקטה, טיל כיפת ברזל=טיל).

פתרון Model Free

בכדי להימנע מהגדרות מדוייקות של המערכת, החלטתי לאמן את הסוכן ע”י reinforcement learning. לצורך כך, השתמשתי באלגוריתם PPO עם מימוש הזה. הגדרתי סבב של למידה (cycle) כ10 episodes (10000 תצפיות) ואז למידה עליהם של 10 epochs. לצורך נוחות, בניתי wrapper למשחק כך שהסביבה תתפקד כמו סביבת RL סטנדרטית. את התגמול הגדרתי להיות השינוי בscore. לצורך האימון יצרתי שתי סביבות:Train env ו Test_env.

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

ייצוג רקטות וטילים

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

חשוב לשים לב שהסוכן צריך לרכוש ידע דומה גם עבור הרקטות וגם עבור הטילים.

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

של 40X100 פיקסלים (כל פיקסל מתאר גודל של 100X100 מטר) ומתארת את המצב הנוכחי של המערכת מבחינת רקטות / טילים בהתאמה (ראה figure 2).

בכל רגע נתון החזקתי את שלושת המפות האחרונות של הסביבה (כל מפה בchannel אחר) על מנת לאפשר הבנה של המהירות והתאוצה. כלומר, המצב של הרקטות והטילים תואר על ידי שני tensors בגודל של 40X100X3. מעכשיו אקרא לטנזוריםהאלה ‘תמונת רקטות’ ו’תמונת טילים’. כפי שציינתי, הניתוח של שתי התמונות דומה מבחינת כישורים שהרשת צריכה לפתח. לפיכך, בניתי רשת CNNאחת אליה הזנתי את תמונת הרקטות ותמונת הטילים בנפרד.

לאחר העיבוד של התמונות עם רשת הCNN, הכנסתי את הפלט של שתי התמונות לשכבת Dense עם אקטיבצייתtanh שאמורה להוציא עיבוד מוכן של מיקומי הרקטות והטילים ולפלט זה הצמדתי גם את שאר הקלט. מאחר והממדים של שאר הקלטים קבועים (מיקום הערים, זווית המיירט והמשתנה שמודיע האם ניתן לירות), אין בעיה להכניס אותו ללא עיבוד (מלבד נרמול של הערכים לטווח [1,1-]). את כל הקלט המעובד העברתי בשכבת Dense אחת. הפלט של השכבה מתאר את המצב הכולל של המערכת ואותו הזנתי לרשתות הactorוהcritic-. היתרון של שיטה זו היא שבעקבות שיתוף המשקלים (ומאחר ורשת הCNN צריכה לעשות עבודה דומה עבור שתי התמונות), הרשתות אמורות ללמוד מהר יותר. את הגרפים של רשת הActor וה-CNN ניתן לראות בfigure3.

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

החלטתי להימנע משילוב של רשת CNN באלגוריתם הRL. הבעיה קשה מספיק גם ככה, הלמידה של הייצוג כנראה “שברה” את הסוכן. החלטתי להשתמש בvariational auto-encoder(VAE) ללמוד ייצוג יעיל של המפות (תזכורת – מפה היא המצב הנוכחי של הטילים/רקטות). אימנתי את הVAE על 150K מפות של הסביבה (75K מפות של רקטות ו 75K של טילים) והגדרתי את המימד של ווקטור הייצוג להיות בגודל 100. כלומר, הVAE צריך היה ללמוד לייצג תמונה של 40X100X1 כווקטור עם 100 מימדים ולשחזר ממנו את התמונה המקורית. הניסיון הראשון לא הצליח. מאחר והרוב מוחלט של הפיקסלים הם 0, הVAE התכנס לאופטימום לוקאלי בו הוא פשוט מחזיר תמונה ריקה ונמנע לחלוטין מלנסות ולהגדיר איפה יש טילים. בכדי לתקן זאת, החלטתי לייצג את המצב כheat-map סביב הטילים והרקטות. גם כאן, יצרתי מפה נפרדת לטילים ולרקטות (ראה figure 4).

בכדי ליצור את ה heat-maps פשוט הרצתי את המפות המקוריות שיצרתי דרך קונבולוציה עם פילטרים קבועים של מטריצת אחדות בגדלים [7,5,3,1] וstrides=1, וסכמתי את התוצאות. כל קונבולוציה כזו יוצרת ריבוע של אחדות סביב הטיל בגודל מתאים וסכימה שלהם יוצרת פירמידה

סביב הטיל. כעת, לאחר אימון, הVAE הצליח לייצר ייצוג לא רע של הטילים (ראה Figure 4,5).

אחרי שאימנתי את הVAE, החלפתי את שכבות הCNN בשכבת Dense פשוטה. שכבה זו מקבלת מקבץ של שלושה ווקטורים באורך 100 (שוב, הייצוג של המערכת לאורך 3 [1]timesteps) ומצמצמת אותם לווקטור של 128 מימדים. השתמשתי בשכבה זו עבור הרקטות והטילים בנפרד. את הפלט איחדתי לווקטור של 256 מימדים, והזנתי לעוד שכבת Dense עם אקטיבצייתtanh ופלט של 128 מימדים שמתאר את כל המצב של המערכת מבחינת רקטות וטילים. שאר הרשתות נשארו כמקודם (איור 2). גם כעת הביצועים לא היו מדהימים, אבל לפחות יש לי מסגרת לריצות. כעת הגיע הזמן לחשוב קצת יותר במונחים של למידת חיזוקים ואיך להקל על הסוכן.

Sparse Rewards

הסיכוי שירי של הסוכן יוביל למשוב חיובי הוא די נמוך. לפיכך, הסוכן לומד בשלב מוקדם שירי זו פעולה לא משתלמת, ונמנע ממנה לחלוטין. על מנת לתקן את הרושם הזה, החלטתי להשתמש בשיטה של Curriculum learning. בסביבה שסופקה על ידי רפאל יש פרמטר בשם prox_radius (פרמטר זה מגדיר את המרחק הנדרש בין הטיל לרקטה על מנת שהרקטה תתפוצץ כשהערך המקורי עומד על 150 מטר). על ידי שינוי של ערך זה, אני יכול להקל או להקשות על הסוכן. על מנת ללמד את הסוכן שירי זה דבר חיובי, אני מתחיל את האימון עם prox_radius=2000. רדיוס כל כך גדול מלמד את הסוכן שלירות זה דבר חיובי, אך לא מלמד אותו לכוון. על מנת לתקן את זה, כל פעם שהסוכן מגיע לרמת ביצועים מסויימת (אני הגדרתי את הגבול להיות score ממוצע גדול מ0 על פני 10 episodes) אני מכפיל את הרדיוס בפאקטור דעיכה (0.9) עד שהרדיוס יגיע חזרה ל150. שינוי כזה הוא חוקי כי לאחר הלמידה, הסוכן יכול לשחק בסביבה המקורית ללא שינוי.

Reward Assigning

פונקציית התגמול הישירה (השינוי בscore) לא כל כך יעילה, כי מאוד קשה לסוכן לדעת איזו פעולה אחראית לכל תגמול (גם חיובי וגם שלילי), מאחר והתגמול על ירי מוצלח מגיע רק לאחר מספר צעדים ומוצמד לפעולה שלא השפיעה עליו כלל. בנוסף, גם העונש על פגיעה בעיר הוא לא אינפורמטיבי, מאחר והוא מוצמד לפעולה שלא יכלה למנוע אותה. לפיכך, החלטתי לעצב פונקציית תגמול משלי (גם זה שינוי חוקי, מאחר ובמהלך הtest אין כלל התייחסות לתגמול). הוספתי לאובייקט world רשימה בשם reward שנבנתה במהלך הפרק ובסוף (לאחר 1000 צעדים) הוחזרה לסוכן. השינוי הראשון והבסיסי ביותר היה להכניס את התגמול על יירוט מוצלח לreward של הstep בו הטיל נורה. בכדי לעשות זאת, הוספתי לכל טיל שדה נוסף בו שמרתי את הצעד בו הוא נורה ובמידה והיה יירוט, עידכנתי את רשימת הrewards בindex המתאים.

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

בעיה נוספת שהיתה היא המגבלות על הירי. הסוכן יכול לירות רקטה רק אחת לכל 8 צעדים (הטעינה לוקחת 3 שניות). מאחר ואין לסוכן שום אינדיקציה מתי הוא יכול לירות ומתי לא, זה מוסיף variance לvalue שהסוכן מנסה ללמוד. ההגדרה במשחק היא מאוד מדוייקת ואין שום סיבה למנוע את הידע הזה מהסוכן. לצורך כך הגדרתי קלט נוסף –can_shoot, ששווה 1 אם הסוכן יכול לירות (עברו 7 צעדים מאז הירי האחרון) ו0 אחרת. היתרון של קלט כזה הוא שהוא מוריד את האקראיות מבחינת הסוכן ומאפשר אומדן מדוייק יותר של התוצאה של פעולות.

[1]על מנת להגביר את ההבדל בין הווקטורים, החלטתי לא להשתמש במצבים עוקבים, אלא בקפיצות של 3 time-steps. כלומר, הזנתי את הווקטור של המצב הנוכחי, לפני 3 צעדים ולפני 6 צעדים.

_______________________________

[1]על מנת להגביר את ההבדל בין הווקטורים, החלטתי לא להשתמש במצבים עוקבים, אלא בקפיצות של 3 time-steps. כלומר, הזנתי את הווקטור של המצב הנוכחי, לפני 3 צעדים ולפני 6 צעדים.

עם זאת, עדיין הסוכן לא למד מספיק טוב. הסוכן תמיד קיבל ציון גבוה באזור ה300 בשני הסבבים הראשונים של אימון בהם רדיוס הפגיעה עמד על 2000 ו 1800 (אחרי הכל, הוא יירט כמעט את כל הרקטות), אבל אחרי בערך שני סבבי למידה הוא ירד באופן מידי לאזור ה-500. הפעלתי את הrender וגיליתי שהסוכן פשוט מחליט משום מה להימנע לחלוטין מירי. אחרי כמה ניסויים גיליתי שאם אני הופך את הloss של הactor ואומר לו למזער את ה advantage, הסוכן דווקא מצליח לא רע בכלל ומגיע עד לרדיוס של בערך 400 עם ציונים גבוהים (50-100 ומעלה) ואז מתחיל להיכשל. פה חשדתי.

אחרי בערך 45 דקות של בהייה בתקרה, חשיבה ב over-clocking ודמיון אישי מודרך בו אני מנסה לראות את העולם מנקודת מבטו של הסוכן, הגעתי להארה!

 

PPO לא אוהב Curriculum Learning!!!!!

כן, אני יודע, זה קצת הלם, אבל תכלס זה הגיוני. אם רוצים לעבוד עם PPO (ולצורך העניין, כל אלגוריתם שמבוסס על Advantage) ביחד עם Curriculum learning, צריך לעשות את זה מאוד בזהירות. אני אסביר – הactor מחליט אילו פעולות לתעדף על ידי השאלה האם הם הניבו תוצאה טובה מהמצופה או לא. אם הcritic התאמן בעולם פשוט יותר בו קל יותר לקבל משוב גבוה (כמו עולם בו הרדיוס של הטילים גדול יותר וקל לפגוע ברקטות), הוא יגיד לactor שהצפי גדול יותר ממה שהוא אמור להיות, ולפיכך נקבל שהadvantageעל ירי יהיה כמעט תמיד שלילי. ככל שפעולה היתה מתגמלת יותר בעולם הקודם, כך צפויה לcritic אכזבה חמורה יותר. הcritic התאכזב מאוד מהתוצאה של ירי וגרם לactor להימנע ממנו לחלוטין. כשחושבים על זה, זה לא כל כך מפתיע. כמו שאומרים, “כגודל הצפייה, כך גודל האכזבה” ולכן גם נרמול של הAdvantage  לא עזר כאן (האכזבה מירי היתה גדולה מהאכזבה מהימנעות מירי).

שני הפתרונות היחידים שעזרו היו לאפס את שכבת הoutput של הcritic כל פעם שמורידים את הרדיוס (פעולה מעט אגרסיבית שעדיף להימנע ממנה) או להוריד מאוד את קצב השינוי של הסביבה, כדי שלcritic יהיה זמן להתאקלם. לאחר שינוי קצב הדעיכה של הרדיוס מ0.9 ל 0.98, נראה היה שהעניין הסתדר.

עם זאת, הסוכן עדיין התקשה להגיע לרדיוס האמיתי (150) של הבעיה ונתקע באזור ה200.

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

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

אם היה לי עוד כמה ימים, השיפורים העיקריים שהייתי בודק היו:

  1. כמובן, חיפוש מימוש אחר.
  2. שיפור של הרפרזנטציה. אולי אימון נוסף של הVAE על יותר נתונים עם פחות תלות בניהם. הכנסתי לסט שלי רק תמונה אחת כל 50 timesteps מפוצלת ל3 מפות), אבל בדיעבד קלטתי שתמונת המצב מכילה 3 מפות עוקבות, מה שיצר סטים מאוד דומים אחד לשני. הייתי מתקן את זה ומכניס רק את המצב הנוכחי של המערכת במקום את 3 המצבים האחרונים.

בנוסף, אני חושב שבעתיד אבחן 2 כיוונים נוספים “בשביל הספורט”. דבר ראשון, הייתי רוצה להחליף את הרפרזנטציה בשכבה של Deep sets. כלומר, להכניס כל אחד מהטילים לרשת קטנה (שכבה או שתיים) עם output של נניח 50 נוירונים ואז לאחד את הפלט של כל הטילים בעזרת max pooling (או משהו בסגנון) על כל אחד מהממדים.

כיוון נוסף הוא לעזוב את הפתרון של end2end. יכול להיות מעניין לפצל את הבעיה ל2 סוכנים שונים:

  1. בחירת טיל לירוט – סוכן זה מקבל את כל הטילים באוויר ובוחר באיזו רקטה להתמקד עכשיו. כנראה הייתי מנסה לקמבן פה איזו ווריאציה של attention.
  2. יירוט הטיל – לאחר בחירת הרקטה, הייתי מעביר את נתוני הרקטה הבודדת הזו לסוכן שאחראי על היירוט והוא היה בוחר את רצף הפעולות עד לשחרור טיל היירוט. את הסוכן הזה הייתי מאמן בעזרת האלגוריתם HER או עם curriculum פשוט על גדלי הטילים כך שילמד לכוון ולירות כמו שצריך.

חוץ מזה, אני חושב הגיע הזמן לעבור לPytorch. חוץ ממימוש הbaselines שבלתי אפשרי לעבוד איתו, כמעט וכל המימושים הטובים הם בPytorch.

לסיכום, היה לא קל, מתסכל ואפילו מייאש לעיתים, אבל כחוק, RL זה פשוט תענוג!

 

אם מישהו מעוניין בפרטים נוספים / קוד, שידבר איתי בפרטי 😊  0526429005

Posted by binyamin manela in deep

אלגוריתם Reinforce – Vanilla Policy Gradients

מיועד ל- מטיבי לכת (כתבה מאוד טכנית)

נכתב על ידי תמיר נווה

כשמתפרסם מאמר ב Science  בתחום שלי (Machine Leaning) זה משהו מיוחד כי זה לא קורה כל יום.

אתם מוזמנים לקרוא על איך OpenAI  מביאים מודל לשחק את המשחק הרב משתתפים “תפוס את הדגל” ברמת מיומנות אנושית ואולי יותר מעניין מזה איך מאמנים מודל לגרום לסוכנים שמשחקים מחבואים לשתף בינהם פעולה באופן יצירתי:

בימים אלו אני בונה קורס חדש (Reinforcement Learning), והחלטתי גם לסדר את החומרים לפוסט שיאמלק לכם את הבסיס האלגוריתמי לחידושים אלו.

לא הצלחתי למצוא תירגום טוב למונח: גראדיאנטים של מדיניות (אשמח לעזרה…)

אבל Policy Gradient הינה גישה אלגוריתמית לפתירת בעיות Reinforcement Learning שנגזרו ממנה אלגוריתמים רבים כגון: Actor Critic, A2C, A3C, TRPO, PPO, SAC ועוד ועוד…

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

רקע קצר על למידה באמצעות חיזוקים (Reinforcement Learning)

יש סוכן (Agent) שחי בסביבה דינאמית (Environment) ויש לו סט של פעולות (Actions) שהוא יכול לעשות בסביבה. הפעולות שלו עשויות לשנות את המצב (State) של הסביבה, ועל כל פעולה שלו הוא עשוי לקבל פידבק מהסביבה שנקרא תגמול (Reward) שיכול להיות חיובי או שלילי. מטרתינו למצוא את המדיניות (Policy) שהינו אלגוריתם שמחליט בעבור הסוכן איך לפעול בסביבה (איזו פעולה לבחור בכל רגע) באופן כזה שיביא למקסימום ההחזר (Return) שזה סך כל התגמולים שמקבל הסוכן.

השפה המתמטית לתיאור בעיה זו היא תהליך החלטות מרקובי MDP=Markov Decision Process:

מקור: https://he.wikipedia.org/wiki/%D7%AA%D7%94%D7%9C%D7%99%D7%9A_%D7%94%D7%97%D7%9C%D7%98%D7%94_%D7%9E%D7%A8%D7%A7%D7%95%D7%91%D7%99

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

עידן הלמידה העמוקה חולל מהפיכה גם בתחום ה Reinforcement Learning במובן הזה שרשת נוירונים עמוקה מהווה את המדיניות (Policy), ז”א מקבל כקלט את ה State ומחזירה את הפעולה (Action) הרצוייה.

כעת חלק הכיפי,

פורמליזם מתמטי לתיאור הבעיה

בכל נקודת זמן t יש לנו מצב, פעולה ותגמול:

ומאחורי הקלעים קיימת פונקציית הסתברות המעברים בין המצבים:

שמשמעותה: מה ההסתברות שאם התחלנו במצב St והסוכן בחר לבצע פעולה At הסביבה עברה למצב St+1.

למשל אם הסוכן שלנו הוא רכב, המצב שלנו הוא מיקומו במרחב (x,y) והפעולה היא לקחת הגה ימינה, מה ההסתברות שהרכב יעבור למצב (x+5,y). אז בהסתברות גבוהה זה יקרה. אבל לא תמיד זה יקרה כי אולי יש שמן על הכביש והפעולה הביאה את הרכב למצב אחר (x+500,y).

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

מסלול (Trajectory) סופי הינו וקטור של השלשות הבאות:

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

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

ההסתברות לקבל מסלול 𝜏 היא מכפלת ההסתברות להיות במצב הראשון S1 כפול

 ההסתברות לבחור פעולה A1 כפול ההסתברות לעבור למצב S2 כפול ההסתברות לבחור פעולה A2 וכו’…

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

פונקציית המטרה שלנו J שאותה נאפטם (ז”א נשאף למצוא לה מקסימום) הינה התוחלת של סכום התגמולים:

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

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

נשים לב ש  כולל בתוכו למעשה גם את  על אף שהסימון אינו מייצג זאת.

מדוע לא פשוט לאמן מודל עם פונקציית מטרה?

התחום Reinforcement Learning אומנם יושב תחת המטריה הרחבה של עולם ה Machine Learning אבל הוא אינו Supervised Learning וגם אינו Unsupervised Learning כי זה לא שיש לנו Ground Truth של אילו החלטות היה הסוכן אמור לבחור בכל צעד שלו, אבל מצד שני גם לא יהיה נכון לומר שלא קיים ברשותינו מידע לגבי מה נכון ומה לא כי יש לנו את התגמולים. ולכן זה מן תחום כלאיים בין Supervised לבין Unsupervised.

אם באימון של מודלי Machine Learning אחרים נזין בכל איטרציית אימון סט של דוגמאות (וב Supervised גם סט תואם של Labels) בבעיות Reinforcement Learning ניתן לסוכן לפעול (בין אם באופן אקראי בהתחלה ובין אם בדרך אחרת) ונשמור בזכרון מסלולים (Trajectories) שעשה. באמצעות כל מסלול (הכולל סדרה של מצב, פעולה, תגמול) נוכל לבצע איטרציית אימון למודל רשת נוירונים שלנו, כזה שימקסם את פונקציית המטרה שהגדרנו.

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

כידוע בלמידה עמוקה משתמשים ב Gradient Descent (או בשיכלולים שלו) כדי לאמן את המודל:

אם כן ננסה לגזור את פונקציית המטרה שהגדרנו מקודם לפי משקלי המודל:

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

אז מה עושים בכל זאת ?

מכיוון שלכל f(x) מתקיים:

נוכל להשתמש בזה לטובתינו:

ולקבל:

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

נשים לב שההסתברות לקבלת מסלול   תלויה ב θ אבל סך התגמולים  אינו תלוי ב θ עבור מסלול מסויים 𝜏.

הטריק הזה שהוסיף לנו log עזר לנו להמנע מנגזרת של מכפלות.

נזכור שההסתברות לקבל מסלול היא מכפלת ההסתברויות של המעברים בתוך המסלול:

וכשמפעילים על מכפלות אלו לוג זה הופך לסכומי הסתברויות:

ואז הגרדיאנט שלנו לפי θ נהיה פשוט יותר כי כל מה שלא תלוי בו מתאפס:

 

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

 

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

 

כאשר i רץ על פני כל ה trajectories שהקלטנו ו t הוא האינדקס בכל trajectory.

 

פירוש לתוצאה:

המרכיב השמאלי בביטוי הוא ה Maximum Likelihood של ההסתברות  ז”א הוא מבטא איך לעדכן את המשקולות כדי שבסבירות גבוהה יותר הסוכן יעבור את המסלולים שאגרנו.

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

צעד אחרון לפני מימוש

אז אפילו שיש נוסחה שימושית מפורשת לקח לי לא מעט זמן להבין קודים לדוגמא המממשים Vanilla Policy Gradient (אלגוריתם Reinforce), ורק בזכות הקורס של ברקלי הבנתי שאם מניחים התפלגות נורמלית למדיניות ומשתמשים בפרדיקציה של הרשת  fלהיות וקטור התוחלות:

אז עידכון המשקולות נהיה בפועל:

 

הלוג ביטל את האקספוננט של הגאוסיאן ונשארים עם הביטוי לטובת עידכון המשקולות של הרשת:

 

לשם הפשטות נתעלם ממטריצת הקוואריאנס ומהחצי המופיע בביטוי. (נניח שמטריצת הקוואריאנס הינה מטריצת היחידה וממילא החצי נבלע ב Learning Rate):

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

וכעת כשמסתכלים על מימושים הכל נראה ברור יותר… לא כך ?

מקורות

Posted by תמיר נווה in deep

סיכום מיטאפ – Reinforcement Learning

בשבוע שעבר ערכנו מיטאפ וירטואלי של AI-ML מבית IsraelClouds ו-Ai-Blog, כאשר התמקדנו בנושא: Taxi Navigation with Q-Learning.

במהלך האירוע הועברו שתי הרצאות מקצועיות, כאשר ההרצאה הראשונה היוותה תיאוריה ומבוא ל-Q-Learning, וההרצאה השנייה הייתה Live Hands-On דמו עם דגש מעשי, עבור יישום של Q-Learning ב-Jupyter.

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

מילות פתיחה  ע”י צוות IsraelClouds והצגת ה-Moderator, איילת ספירשטיין

הרצאה 1: Q-Learning for Beginners

תמיר נווה, Algorithms Expert, Ai-Blog הסביר על התאוריה של Reinforcement Learning.

הרצאה 2: Teach a Taxi to navigate with Watson Studio

טל נאמן, Developer Advocate, IBM Center, העביר דמו ב-Live על יישום של Reinforcement Q-Learning תוך שימוש ב – Jupyter Notebook וב- OpenAI Gym toolkit.

מאת: מערכת Ai-Blog

Posted by Stav Altfiru in כנסים

על החוויה שלי ב Amazon DeepRacer

לפני חצי שנה קיבלתי בשורה משמחת: המנהל שלי בחברת אוטודסק החליט לשלוח אותי לאירוע TECHX העולמי השנתי של החברה. מדובר באירוע שמיועד לכל אנשי התוכנה, חוויית המשתמש וה-IT של אוטודסק מכל רחבי העולם. מכיוון שאירועי החברה הגדולים מתקיימים כולם בארה”ב והסניף שאני עובד בו נמצא במלבורן, אוסטרליה, כמובן שאין תקציב לשלוח את כולם ולכן הרגשתי בר-מזל על ההזדמנות הנדירה.
לשמחה הוסיפה העובדה שהאירוע התקיים בניו-אורלינס, לואיזיאנה, שזו עיר שתמיד רציתי לבקר בה. מי לא ירצה בעצם? מדובר במולדת הבלוז והג’אז, עיר עם מורשת ספרדית, צרפתית, אפרו-אמריקאית, ילידית-אמריקאית ומה לא? אוכל עשיר, אדריכלות ייחודית, וכמובן עיר שבמרכזה זורם לו נהר המיסיסיפי רחב הידיים במלוא הדרו.


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

התחרות

עוד לפני שבכלל עליתי על מטוס, כשעוד הייתי עסוק בלהזמין מקום בבית המלון, נרשמתי לתחרות המדוברת. לא ממש ידעתי על מה מדובר אבל השילוב בין תכנות, למידת מכונה, אמאזון ומכוניות מירוץ נשמע קורץ במיוחד. עודדו אותנו לקרוא את המבוא ולתרגל את ה-TUTORIAL כדי שכשנגיע נוכל מיד להשתלב בתחרות. לפרטים: https://aws.amazon.com/deepracer/

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

בגדול, מדובר על מכונית מירוץ בגודל בינוני, שבתוכה מחשב קטן (את מי שמעניין המפרט הטכני, הוא מופיע פה). כמו כל מירוץ, המטרה היא לעבור מסלול שלם בזמן הקצר ביותר האפשרי. אבל כאן מגיע גם ה”טוויסט”: למכונית אין ממש שלט סטנדרטי שמאפשר להזיז אותה ימינה ושמאלה, להאץ או להאט. כל מה שיש זה ממשק WEB שמאפשר למשתמש ללמד את המכונית כיצד להתנהג על גבי המסלול. איך “מלמדים” מכונית משהו?

כאן בדיוק אנחנו אמורים לצלול עמוק למושג שצובר תאוצה בשנים האחרונות: למידה מתגמלת (או חיזוקית) :REINFORCEMENT LEARNING את מי שזה מעניין, הנה עמוד שמסביר בצורה לא רעה במה מדובר ולמעשה בבלוג הזה נכתבו כבר כמה כתבות בתחום (ביחרו מעלה את התגית Reinforcement Learning) ותראו את כולן.

קוד בקרה ולא קוד שליטה

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

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

איך מתגמלים? בערך כמו שמאלפים כלב: נותנים למכונית פקודה (סעי קדימה) ונותנים ניקוד לפי המצב שלה בכל פעם שמקבלים “אירוע” מהסנסורים. המכונית יצאה מהמסלול ולא נרשמה התקדמות משמעותית? מורידים נקודה. המכונית התקדמה אך שני גלגלים יצאו החוצה? מעניקים שתי נקודות. המכונית התקדמה משמעותית וכולה נמצאת בתוך המסלול? חמש נקודות!

לכל אחד ואחת יכולה להיות “טקטיקת אילוף” משלהם אך הרעיון הכללי תמיד נשמר: לעודד את המערכת לצבור כמה שיותר נקודות.

האימון

השלב הבא הוא “לאמן” את המכונית: מעלים את קטע הקוד לענן של אמאזון ונותנים למערכת להתאמן על גבי מסלול שדומה עד כמה שאפשר למסלול שעליו תתקיים התחרות. בשלב זה עוד לא צריך את המכונית עצמה. כל מה שהמערכת צריכה זה את קטע הקוד הקצר שכתבתם. היא כבר תדאג לבד להריץ סימולציות שונות, על פי פרמטרים שונים שתזינו לה: כמה סימולציות להריץ, מה תהיה המהירות ההתחלתית של המכונית? מה המהירות המקסימלית, אילו הגבלות נוספות להטיל על המערכת וכו’.

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

כל מה שנשאר בשלב זה היה לדבר עם קולגות שהתלהבו גם הם מהדוכן של אמאזון והתנסו במירוץ אמיתי עם מכונית DEEPRACER אמיתית, לקבל קצת טיפים (סע לאט! אל תעודד נהיגה מהירה מדי, הסנסורים לא מספיק רגישים כדי לקלוט המון מידע במהירות גבוהה) ולצפות במתמודדים שונים מנסים את מזלם, לפני שאני מביא את ה-USB DRIVE שלי כדי לעלות על המסלול.

למעשה ה-“קופסה השחורה” של המודל נוירונים מתאמן באופן וירטואלי על בסיס משטר הניקוד שתיכנתנו אותו ולבסוף הוא מוכן לנהג את המכונית במירוץ האמיתי (בעולם הפיסי).

לסיכום

התחרות עצמה בין באי הכנס היתה מוצלחת. כמאה משתתפים ניסו את מזלם בתחרות שנמשכה יומיים. הזוכה במקום הראשון עם התוצאה המרשימה של קצת מעל 6 שניות זכה במכונית DEEPRACER. יתר המשתתפים (ואני ביניהם) הסתפקו בחולצות, כובעים וקפוצ’ונים מעוטרים בלוגו המפורסם של AWS.

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

Posted by dudy margalit in כנסים

אסטרטגיה אבולוציונית

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי Nevo Agmon

הקדמה

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

מטרה

המטרה של אסטרטגיה אבולוציונית דומה לזו של למידה חיזוקית (Reinforcement Learning) ובאופן מדויק יותר לזו של Q-Learning. המטרה היא, בהינתן עולם וסוכן למצוא את המדיניות (Policy) שעל פיה הסוכן צריך לפעול כדי להצליח בצורה הטובה ביותר לעמוד ביעדים שניתנו לו. הסוכן יכול להיות למשל שחקן במשחק מחשב ,רובוט שמנקה את הבית או טייס של מטוס קרב והיעדים יכולים להיות לנצח במשחק בציון גבוהה ככל הניתן, לנקות את הבית כמה שיותר מהר בלי לפספס אף חלק או להפיל כמה שיותר מטוסי אוייב. כדי להבין את הכוונה ב״מדיניות״ אפשר לחשוב על מודל כזה:

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

אז איך זה עובד?

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

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

קצת יותר פרטים

עכשיו כשהבנו באופן בסיסי איך עובד האלגוריתם נתאר אותו בצורה קצת יותר מתמטית (אם לא בא לכם אפשר לקפוץ ישר לחלק הבא). נסמן ב -θ את המדיניות, F תהיה הפונקציה שמעריכה את ביצועי המדיניות על העולם, λ מייצגת את גודל האוכלוסיה ו -μ מייצגת את גודל המטא-אוכלוסיה. נאתחל את המדיניות בערכים רנדומליים ובכל שלב המוטציה תהיה הוספת דגימה אקראית מהסתברות נורמלית כפול גודל צעד הלימוד שנסמנו σ (ניתן לחשוב עליו כ Learning Rate). על מנת לחשב את מדיניות הבסיס החדשה עבור האיטרציה הבאה נבצע ממוצע משוכלל של μ הצאצאים הטובים ביותר, צעד זה מתבצע ע״י שימוש בפרמטר  wi שהוא סקלר המתפקד כמעיין נרמול. נכפיל את הממוצע בצעד  הלימוד σ ונחבר זאת למדיניות הבסיס של הצעד הנוכחי. כעת יש בידינו את כל החלקים הדרושים ע״מ להבין את האלגוריתם המלא:

https://arxiv.org/pdf/1802.08842.pdf

למה זה טוב?

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

1 – האלגוריתם אינו מוטה כמעט להשפעות המתכנת כך שיש לו חופש גדול יותר להתפתח.

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

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

דוגמא לביצועי האלגוריתם ניתן לראות בוידאו הבא:

בוידאו רואים שחקן של משחק המחשב Qbert שאומן למשך 5 שעות בלבד בשימוש באוכלוסיה בגודל 400 ופיתח שיטת משחק מעניינת מאוד .ראשית ניתן לראות ב 6:24 שהשחקן קופץ ממקום למקום ומחכה שהיריב יזוז  לכיוונו כדי שיוכל לנצח במשחק כלומר השחקן למד ״להטעות״ את היריב .ולאחר מכן ב 6:27 ניתן לראות באג שהשחקן גילה במשחק שלא היה ידוע עד כה שמאפשר לשחקן לקבל אינסוף נקודות במשחק.

קישורים

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

Posted by Nevo Agmon in deep

מיני-פרויקט בלמידה חיזוקית (Reinforcement Learning)

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

אז אחרי שבניתי את הרובוט הזה (ראו את התמונה בעמוד הראשי של כל הכתבות) אני רוצה להכניס לו קצת בינה ודעת…

מטרתי הייתה ללמוד ולהתנסות ב Reinforcement Learning כי זה תחום מאוד מסקרן, בטח אחרי כל משחקי האטארי המפוצחים ע”י אלגוריתם (חודשים של התמכרות כשהייתי בן שבע 🙂 מעניין איך המחשב משחק בזה ? ? ?)

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

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

קצת טרמינולוגית RL

תודה ל https://becominghuman.ai/the-very-basics-of-reinforcement-learning-154f28a79071

State = מצב בו נמצא הסוכן (סך המידע הגלוי לו על הסביבה שלו). אפשר שמצבים יחשבו כראשוניים או כסופיים (ז”א תחילת\סוף משחק). במקרה של המשחק המתואר, מצב הינו: מיקומו של הסוכן על לוח המשבצות, מיקומו של הכדור על לוח המשבצות, ומשתנה בינארי שמשמעותו אם הכדור מוחזק ע”י הסוכן או לא.

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

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

Reward = תגמול אותו מקבל הסוכן כתוצאה מצמד (פעולה, מצב קודם). במקרה של המשחק המתואר החלטתי לתת תגמול גבוה  במקרה של נצחון, תגמול נמוך במקרה של הגעה של הסוכן למיקום הכדור והרמתו. ערכי התגמולים הם פרמטרים איתם שיחקתי (למשל בקוד כפי שתוכלו לראות זה כרגע 20, 5). כמו כן שיחקתי עם אפשרות לתת תגמול שלילי (ז”א עונש) על כל תור שחולף. שיטה זו בעצם גורמת לסוכן להתאמן על לנצח מהר ולא סתם לנצח. כי בכל תור בו עשה פעולה מיותרת הוא משלם מחיר…

π=Policy = מדיניות לפיה מחליט הסוכן איזו פעולה לבחור בכל מצב. למעשה פונקציה המקבלת מצב ומחזירה פעולה. בקוד תוכלו לראות שתי גישות אותן ניסיתי (ε-Greedy או Softmax Action Selection).

Return=G = סכום התגמולים שנתקבלו החל מצמד (פעולה, מצב) ועד לסיומה של האפיזודה

Quality=Q = טבלת הערך לכל צמד (פעולה, מצב). מחושב למשל כממוצע של כל ה-G שנתקבלו עבור על צמד (פעולה, מצב). המשמעות הינה כמה מוצלחת הפעולה הזו בהינתן המצב הזה?

Value=V = טבלת הערך לכל מצב. (לעיתים משתמשים ב V ולעיתים ב Q) המשמעות הינה עד כמה כדאי להימצא במצב הזה ? (מבחינת אפשרויות לנצחון)

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

אילו יש בידינו (בידי הסוכן) את הערכים האופטימליים לכל מצב\פעולה אז ישנן מדינויות  (Policies) לפעול כמו ε-greedy או softmax action selection. הרחבה על נושא זה תמצאו בכתבה הזו.

בכתבה זו נעסוק במספר שיטות לעידכון פונקציות הערך Q או V.

שיטת מונטה קרלו

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

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

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

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

שיטת Q-Learning

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

הערך Q עבור בחירת פעולה מסויימת At במצב מסויים St (בזמן\תור t) הינו הערך שהיה ועוד קומבינציה לינארית בין התגמול שנתקבל מפעולה זו לבין הערך הגבוה ביותר שניתן לקבל בעבור המצב הבא. (ע”י השוואה בין כל הפעולות האפשריות מהמצב החדש)

ראו כתבה קודמת ממוקדת על שיטה זו.

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

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

שיטת Deep Q-Learning

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

גם כאן ניתן לפעול לפי מדיניות כלשהיא, למשל ε-Greedy או Softmax Action Selection או כל מדיניות אחרת שמשתמשת ב Q שהרשת מספקת לכל מצב. ואת הלימוד (back propagate) של הרשת מבצעים באופן דומה ל Q Learning, תוך כדי המשחק. התהליך כולו (עליו חוזרים לאורך אפיסודות\משחקים רבים) נראה כך:

  • מזינים את המצב הנוכחי לרשת ומקבלים וקטור q1 (ערך לכל פעולה אפשרית). הפעלת זו של הרשת הינה רק קדימה ז”א ללא אימון BackPropagation.
  • בוחרים פעולה ומשחקים אותה (או בעלת הערך הגבוה ממה שיצא ברשת או אקראי תלוי במדיניות)
  • מזינים את המצב הנוכחי (שהוא החדש) לרשת ומקבלים וקטור q2 (זו שוב הפעלת הרשת קדימה ז”א ללא אימון עדיין)
  • בונים וקטור פרדיקציה (שישמש לשלב האימון) באופן הבא:

לוקחים את הווקטור q1 כאשר מחליפים בו את האלמנט של הפעולה בה בחרנו ושמים שם ערך חדש לפי נוסחת ה- Q-Learning:

המשמעות הינה: היינו רוצים לאמן את הרשת להוציא ערך על הפעולה שבחרנו שהינו התגמול על הפעולה ועוד הערך המירבי של המצב הבא.

האינטואיציה לכך: מצב ייחשב מוצלח אם ניתן להגיע ממנו למצב מוצלח אחר. (כמו במשחק השחמט: אומרים “שח” כי זה מצב ממנו ניתן לנצח בתור הבא)

  • שלב האימון: מזינים (שוב) לרשת את המצב הקודם אך הפעם גם מריצים אחורה עם פונקציות מחיר של השוואה עם וקטור הפרדיקציה שחושב בשלב הקודם.

כשאימנתי לפי שיטה זו היו דרושים יותר משחקי אימון (מאשר בשיטת Q-Learning) כדי להגיע להצלחה, אני מניח שזה מכיוון שזה קצת overkill לבעיה. היתרון הגדול בשימוש ב CNN לבעיות כאלו הם כשהמצב (state) הינו תמונה (כמו במשחקי אטארי) ולא וקטור או מטריצה (תמציתית) המתארת את המצב הנוכחי במשחק. במקרים שהמצב הוא תמונה, לתחזק טבלת ערכים לכל מצב אינו ריאלי.

טיפים לניפוי הקוד

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

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

  • חישוב והצגה של גרף של כמות האיטרציות כפונקציה של מספר האפיזודות (המשחקים) אליהן אומן הסוכן אמור להיות גרף יורד. מדד זה סיפק לי מידע אם אני בכיוון הנכון בכל הרצה. במילים אחרות: ככל שהסוכן מתאמן יותר, הוא אמור לנצח יותר מהר במשחק.
  • להשוות ביצועים של סוכן שמתנהג בצורה אקראית לגמרי (כמה תורות בממוצע ינצח במשחק ?) לעומת מודל מאומן.
  • לייצר ויזואליזציה של המשחק (זה מומלץ בכל domain), לאפשר לי משחק אינטראקטיבי (ז”א שאוכל לשחק כנגדו) שיגרום לי להבין מה בכל זאת למד המודל. למשל למד אסטרטגיות כאלו שמביאות אותו לפעולות מחזוריות ולכן לתקיעות. בכל צעד שהמודל “משחק” להציג את השיקולים שלו (ז”א את ערכי ה Q  לאותו המצב)
  • להתחיל במקרה פשוט ולאט לאט לסבך אותו (זה גם מומלץ בכל domain). במקרה זה התחלתי בלוח פשוט ביותר של 2×2 כאשר מצב הפתיחה קבוע. ואז מצב פתיחה אקראי, ואז הגדלת גודל לוח המשחק, וכו’

הסבר על הקוד

את הקוד תמצאו ב GitHub שלי !

Solve_game.py זהו הקוד הראשי שפותר את המשחק לפי כל אחת מהשיטות (זה הקוד שיש להריץ).

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

interactive_play.py מאפשר למשתמש (אנושי) לשחק במשחק

policies.py מאפשר מדיניות משחק: אפסילון החמדן (Greedy Epsilon) או Softmax Selection. בפרט שליטה על דעיכת הפרמטר אפסילון (ε).

Deep_Q_learning.py מימוש שיטת Deep-Q Learning כמוסבר מעלה.

tabular_learning.py מימוש שיטות מונטה קרלו או Q-Learning כמוסבר מעלה.

לסיכום

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

ראו סרטון שמדגים את תהליך הלמידה: (בהתחלה משחק אקראי וככל שמתקדם האימון משחק יותר ויותר בהגיון):


השלב הבא של הפרויקט הוא לעבוד עם משתנה מצב תמונה (ז”א אוסף פיקסלים) ואז לבחון ביצועים. כמו כן לחפש דרכים איך להקטין את משך האימון ולממש Double Q-Learning.

אשמח לשאלות ופידבקים!

Posted by תמיר נווה in deep

בעיית הידיות הגונבות Multi-Armed Bandit

מיועד ל- כל אחד (כתבה לא טכנית)

נכתב על ידי תמיר נווה

אחת מנגזרות מהפכת הלמידה העמוקה היותר מעניינות התרחשה (ועדיין מתרחשת) בתחום הReinforcement Learning. הניצחון של אלגוריתם של DeepMind על אלוף העולם הסיני ב  GO ב 2016, והאלגוריתמים שלהם שלומדים לשחק משחקי אטארי ישנים מתוך התמונה שרואים על המסך (ללא הכנסת מודל כלשהוא אלא רק ע”י ניסוי וטעייה במשחק).

בעולם ה Reinforcement Learning (למידה חיזוקית) ישנו סוכן Agent שחי בסביבה כלשהיא Environment ויש לו אוסף כלשהוא של פעולות Actions שיכול לעשות בסביבה. הסוכן מקבל תגמול Reward מהסביבה בהתאם לפעולותיו ובכל רגע נתון הסוכן נמצא במצב State כלשהוא. מצב (state) הינו כל האינפורמציה הידועה לסוכן (זה שמקבל את ההחלטות בכל רגע).

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

בכתבה זו אסקור בעיה בסיסית ופשוטה Multi-Armed bandit (אם טעיתי בתרגום בכותרת אנא תקנו אותי…) עם מצב state בודד ומספר קטן של אפשרויות פעולה action בכל תור (כמספר הידיות).

איך להרוויח הכי מהר שאפשר בקזינו ?

תארו לעצמכם קזינו בו מכונות המזל עקביות בהתנהגותם הסטטיסטית אך אינן זהות זו לזו. במילים אחרות יש הרבה מכונות מזל (ידיות) שלכל אחת יש את המזל\נאחס הקבוע שלה. ז”א יש אחת שבממוצע תוציא לך 10$ ויש כאלו שיוציאו בממוצע 1$. (כשאומרים בממוצע מתכוונים שהמכונה תוציא בכל פעם סכום אחר, אך לאחר הרבה משחקים תשאף לערך ממוצע אחד). כמובן שלכל משחק גם יש עלות, נניח 5$ כך שההשקעה תחזור (אם בכלל) רק אחרי הרבה משחקים, וכדי לבחור באילו מכונות לשחק ובאילו לא.

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

בבעיית הידיות (הקזינו) יש מצב state יחיד כי בכל רגע נתון הסוכן יודע שיש את אותם האפשרויות לפעול ואין לו מידע חדש מהסביבה (לא כולל מידע שהוא צבר מניסיונותיו). בעיות עם ריבוי מצבים הינן למשל לשחק ב GO או רובוט שלומד לפתוח דלת על בסיס מה שרואה (ז”א מה שמתקבל ממצלמה שמותקנת עליו). באלו יש המון מצבים states כי האינפורמציה מהסביבה כל רגע\תור משתנית.

בעיית הפשרה בין מחקר ופיתוח

אז במה להשקיע את הניסיונות משחק שלך (שעולות לך 5$ לכל ניסיון) ?

בלשחק במכונה מוכרת או בלחקור ולהכיר עוד מכונות ? (נקראת דילמת ה –  exploration\exploitation)

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

2,5,3 אז הממוצע בינתיים הינו 3.333, ואם נשחק במכונה זו עוד הממוצע כנראה ישתנה, וככל שנשחק במכונה יותר כך “נאמין” לממוצע שיוצא לנו יותר (כי הרי אמרנו שהמכונות מכווננות על ממוצע מסוים)

הפתרון

אחד הפתרונות לבעיה זו נקרא ε-greedy (אפסילון התאב בצע J) שזה אומר, קבע ערך כלשהוא בין 0 ל 1 (אפסילון) ואז בכל פעם הגרל ערך אקראי בין אפס לאחד. אם גדול מאותו קבוע אפסילון אז שחק במכונה אקראית כלשהיא, אחרת שחק במכונה שעד עכשיו הממוצע שלה הכי טוב. בדרך זו מצד אחד תרוויח (כי לעיתים תשחק במכונה הכי רווחית למיטב ידיעותיך באותו הרגע) מצד שני תרחיב את הידע שלך (כי לעיתים תנסה מכונות אחרות).

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

Multi-Armed Bandit

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

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

Posted by תמיר נווה in deep

בטיחות ב AI – אימון סוכנים מבוקר אנשים

מיועד ל- כל אחד (כתבה לא טכנית)

נכתב על ידי תמיר נווה

1) לא יפגע רובוט לרעה בבן אדם, ולא יניח, במחדל, שאדם ייפגע.

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

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

 

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

 

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

 

OpenAI (אותו ארגון ללא כוונת רווח של אלון מאסק) בשיתוף עם DeepMind (החברה שפיתחה את האלגוריתם שניצח את אלוף העולם ב GO ונרכשה ע”י גוגל בחצי מיליארד דולר) פרסמו גישת אימון המשלבת פיקוח אנושי מינימליסטי שנועד לפתור בעיה זו.

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

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

באימון זה למשל נעזרו ב 900 החלטות אנושיות (דרש עבודה של שעת אדם בלבד) ולא השתמשו בתגמולים הקלאסיים הנהוגים ב Reinforcement Learning. באימון קלאסי התגמולים נקבעים לפי התכנות או הפרשנות של הסביבה של הסוכן\רובוט דבר שאומנם קורה אוטומטי אך לא תמיד מביא לתוצאות הרצויות.

למעשה OpenAI’s Safety Team היא שעומדת מאחורי מחקר זה כי כאמור אם נותנים מטרת על רחוקה ונותנים לתהליך האימון לרוץ לבד, קשה לנבא מה יקרה. שיטות אלו יותר מבוקרות, לעיתים יותר יעילות ועשויות למנוע אסונות.

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

במאמר הם מציגים גם אימון של סוכן המשחק במשחקי אטארי מגוונים:

אימון סוכן לשחק משחקי אטארי

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

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

Posted by תמיר נווה in deep

Q-Learning על רובוטים שיודעים לדחות סיפוקים

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

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

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

מה קורה כשיש דילמות ?

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

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

תודה ל Megajuice

את החישוב המתמטי של מה עדיף בדילמות הללו (פעולה עם תגמול מיידי או פעולה עם תגמול עתידי) בא לפתור אלגוריתם Q-Learning. האות “Q “מסמלת Quality במשמעות של מה הערך שבפעולה מסוימת, ז”א האם תביא לתגמול עתידי יותר או פחות.

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

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

מישוואה בסיסית של Q-Learning

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

ערך זה נקבע ע”י הערך הידוע עד כה שבלבצע פעולה ועוד הערך של הפעולה הבאה המשתלמת ביותר.

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

אלגוריתם Q-Learning הוצג לראשונה ב 1989 כעבודת הדוקטורט של Watkins תחת השם: “Learning from Delayed rewards” ז”א ללמוד מתגמולים דחויים.

ב 2014 הראו Google DeepMind שימוש ב Q-Learning עם CNN (ז”א עם למידה עמוקה) ויצרו אלגוריתמים שמשחקים משחקי אטארי ישנים ברמה של בני אדם. לזה קראו Deep Reinforcement Learning למידה חיזוקית עמוקה.

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

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

גם פה אפשר שיש פעולות שלא משתלמות בטווח המיידי אבל כן בטווח הארוך:

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

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

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

Posted by תמיר נווה in deep

אינטליגנציה מלאכותית גנרית או איך אלגוריתם מפתח אלגוריתם ?

מיועד ל- כל אחד (כתבה לא טכנית)

נכתב על ידי תמיר נווה

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

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

רשת נוירונים

 רשת נוירונים לדוגמא

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

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

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

הרי ראינו בעולם ההשקעות שגם אסטרטגיית הקוף (השקעות אקראיות במניות) לעיתים מצליחות יותר מתיקי השקעות של טובי המומחים. 

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

שתי גישות קיימות למחקר זה: אלגוריתמים גנטיים או אבולציוניים (evolutionary algorithms) ו- למידה חיזוקית (reinforcement learning). בשתי גישות אלו החוקרים מנסים למצוא דרך אוטומטית שתעצב ארכיטקטורת רשת שתפתור את בעיית סיווג התמונה בין השאר במאגר התמונות CIFAR. CIFAR הינו מאגר של 60,000 תמונות צבעוניות קטנות בגודל 32X32 פיקסלים עם 10 מחלקות שונות (CIFAR10) או עם 100 מחלקות שונות (CIFAR100), מאגר זה נועד לצרכי מחקר ופיתוח אלגוריתמי סיווג (classification) של תמונות.

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

רשת נוירונים שפותחה ע"י אלגוריתמם גנטי

רשתות נוירונים שפותחו ע”י אלגוריתמם גנטי תודה ל https://arxiv.org/pdf/1703.01041.pdf

בלמידה חיזוקית Reinforcement learning לעומת זאת, משתמשים בייצוג של ארכיטקטורת רשת כמחרוזת תווים באורך לא קבוע (מחרוזת שמכילה את כל המידע של הרשת: גדלי הפילטרים, ה strides, וכו’) ובאמצעות Recurrent neural network מייצרים מחרוזת טובה יותר ויותר על בסיס תגמול שנובע מביצועי הרשת על מאגר תמונות כלשהוא. האימון נעשה בשיטת Policy gradients ולבסוף מתקבלות ארכיטקטורות רשת שפותרות את הבעיות שרשתות שעוצבו ע”י בני אדם פותרות אותן ברמה לא פחות טובה (מבחינת דיוק ומהירות). ניתן למשל לראות בתרשים ארכיטקטורת רשת שאומנו על מאגר הטקסט Penn Treebank (מאגר המשמש לניתוח שפה) כאשר הרשת השמאלית פותחה ע”י חוקרים אנושיים והימנית פותחה ע”י למידה חיזוקית.

רשת נוירונים שפותחה ע"י בני אנוש או על ידי אלגוריתם

רשתות נוירונים שפותחו ע”י בני אנוש או על ידי אלגוריתם תודה ל https://arxiv.org/pdf/1611.01578.pdf

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

מעורר מחשבות על מהות הניסוי והטעייה האנושי של מציאת אלגוריתמיקה אופטימלית ועד כמה הוא “טכני”, הלא כן ?

Posted by תמיר נווה in deep

כמה זמן דרוש כדי לאלף אלגוריתם ?

מיועד ל- כל אחד (כתבה לא טכנית)

נכתב על ידי תמיר נווה

מתי נראה הרבה רובוטים שעובדים במפעלים, משרתים אותנו בבתי קפה, מנקים לנו את הבית ואת הרחוב או מחליפים הרבה בעלי מקצוע אחרים ? נראה שלא ממש בקרוב! אחד הקשיים הוא כמות הזמן שיש לאמן את הרובוטים על כל משימה. התחום המבטיח בהקשר זה הינו Reinforcment learning או בעברית למידה חיזוקית. תחום זה הינו ענף ב machine learning – למידת מכונה שקיבל השראה מפסיכולוגיה התנהגותית. בעולם זה יש סוכן (רובוט\מכונית\תוכנה) שפועל בסביבה כלשהיא ומקבל מידע או חש את סביבתו. למשל אם מדובר במכונית אוטונומית אזי היא מקבלת תמונות היקפיות, חיישני תאוצה ולעיתים תמונת מכ”ם והיא יכולה לפעול בסביבה (בכביש) שזה אומר ללחוץ על הגז או הברקס או לסובב את ההגה:
אם למשל מדובר באלגוריתם שמטרתו לשחק במשחק האטארי המפורסם Breakout (פריצה) אזי האלגוריתם מקבל את תמונת המסך והפעולות שיכול לעשות הינן להזיז ימינה או שמאלה את השולחן:
בגישת ה reinforcement learning  על כל פעולה שמבצע הסוכן הוא מקבל תגמול (שהינו ערך מספרי) שמייצג עד כמה הפעולה הייתה חיונית או לא חיונית להשגת המטרה ובהתאם לכך הסוכן מעדכן את המדיניות שלו עבור הפעולות הבאות. קצת כמו לאלף כלב… מהפיכת הלמידה העמוקה הראתה לעולם שאימון עמוק (ז”א מודלים גדולים במיוחד) עם database גדול במיוחד מצליח באופן מפתיע איפה שגישות קלאסיות נכשלות. על אף שתחום ה reinforcement learning ותיק, בגילגוליו הראשונים החל בשנות החמישים אך כמו הרבה תחומים, החיבור שלו עם הלמידה העמוקה (deep reinforcement learning) נראה מבטיח מאוד לחוקרים רבים. כמה זמן צריך להתאמן על דוגמאות צעצוע ? לפי המאמר של openAi משך הזמן שדרוש לאמן אלגוריתם Rainbow DQN  עד שמשחק במשחקי אטארי טוב לפחות כמו בן אדם הינו 83 שעות משחק. דוגמה אחרת הינה לאמן למשימות בסימולציה MuJoCo שם כמות האימונים נעה בין מאות אלפים לעשרות מיליוני צעדים. MuJoCo  הינו מנוע המדמה את חוקי הפיסיקה שנועד לעזור למחקר בתחום הרובוטיקה. זה בעצם חוסך ניסויים ברובוטים פיסיים באמצעות סימולציה וירטואלית. למשל משימות כגון לגרום לרובוט ללכת, לעלות במדרגות, לתמרן בין מכשולים וכו…
לפי המאמר של Deepmind נדרשו מעל 100 שעות אימון מקבילי כדי להגיע לביצועים שניתן לראות בסרטון. אלו דוגמאות יחסית פשוטות, כמה זמן צריך להתאמן על דוגמאות מהעולם הפיסי ? נראה שהתשובה לא ברורה לגמרי אבל מדובר בהרבה מאוד, אולי הרבה יותר נתונים ממה שסביר לאסוף. אם נסתכל על פעולות פיסיות פשוטות כמו פתיחת דלת, הרמת חפץ או הזזה של חפץ:
נראה שלמשל להרמת חפצים על הרובוט לבצע לפחות 800,000 חזרות (של ניסוי וטעייה) וזה יביא אותו רק לבשלות חלקית כי אם הסביבה קצת משתנה הוא פחות יצליח. ולגבי משימות קצת יותר מורכבות עם תנאי סביבה משתנים, כמו למשל נהיגה אוטונומית, עוד ב 2015 דיבר אלון מאסק מנכ”ל טסלה על בערך מיליון מיילים של נהיגה מבוקרת (נהג אוטומטי בפיקוח נהג אנושי) ליום שמתווספים לאינטליגנציה המשותפת של האלגוריתם נהיגה אוטונומי.  ב 2016 כבר דיברו צבירה של 780 מיליון מיילים של נהיגה וקצב אגירת המידע גדל למיליון מיילים כל עשר שעות. אז תקציבים לאימון אלגוריתמים של נהיגה אוטונומית לא חסרים בעולם וזה אכן מתקרב, אך פעולות אחרות אנחנו עוד לא רואים הרבה. לסיכום הרובוטים עדיין מתנהגים כמו כלבים קשים לאילוף, או שאנחנו עוד לא למדנו את אומנות האילוף היעיל!
Posted by תמיר נווה in deep

מהי למידה עמוקה

מיועד ל- כל אחד (כתבה לא טכנית)

נכתב על ידי תמיר נווה

“למידה עמוקה” (Deep Learning) הינו ענף ברשתות ניורונים שעשה מהפכה כמעט בכל תחומי האלגוריתמיקה.

המהפיכה התחילה בראייה ממוחשבת (computer vision) והמשיכה לנושאים שונים כמו עיבוד שפה טבעית (NLP), תרגום, עיבוד אות שמע (speech, voice), מכוניות אוטונומיות, רובוטיקה, התנהגות ברשת ועוד ועוד… רבים מכנים זאת (באופן שגוי) כבינה מלאכותית (AI=Artificial Intelligence) אך למעשה זה רק ענף של התחום.

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

כמו כן קיימים מגוון מוצרים ושירותים שכולנו משתמשים בהם, אשר מבוססים על למידה עמוקה כמו למשל siri, תירגום סימולטני בסקייפ, google photos, ועוד ועוד…

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

ידוע שבתחום למידת המכונה (machine learning) יש צורך בהרבה רקע מתמטי ויש הרבה משוואות מתמטיות “מפחידות”

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

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

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

Posted by תמיר נווה in deep