למידה חיזוקית (RL) נחשבת לאחד מהפרדיגמות הבסיסיות של למידת מכונה, לצד למידה מונחית ולמידה בלתי מונחית. בעוד שבלמידה מונחית אנו מסתמכים על מערך נתונים עם תוצאות ידועות, RL מבוססת על למידה מתוך עשייה. לדוגמה, כשאנו רואים לראשונה משחק מחשב, אנו מתחילים לשחק, גם בלי לדעת את החוקים, ובמהרה אנו מצליחים לשפר את הכישורים שלנו רק דרך תהליך המשחק והתאמת ההתנהגות שלנו.
כדי לבצע RL, אנו צריכים:
- סביבה או סימולטור שמגדיר את חוקי המשחק. עלינו להיות מסוגלים להריץ ניסויים בסימולטור ולצפות בתוצאות.
- פונקציית תגמול, שמצביעה על מידת ההצלחה של הניסוי שלנו. במקרה של למידה לשחק משחק מחשב, התגמול יהיה הניקוד הסופי שלנו.
בהתבסס על פונקציית התגמול, אנו צריכים להיות מסוגלים להתאים את ההתנהגות שלנו ולשפר את הכישורים שלנו, כך שבפעם הבאה נשחק טוב יותר. ההבדל המרכזי בין סוגי למידת מכונה אחרים לבין RL הוא שב-RL בדרך כלל איננו יודעים אם ניצחנו או הפסדנו עד לסיום המשחק. לכן, איננו יכולים לומר אם מהלך מסוים בפני עצמו הוא טוב או לא - אנו מקבלים תגמול רק בסוף המשחק.
במהלך RL, אנו בדרך כלל מבצעים ניסויים רבים. בכל ניסוי, עלינו לאזן בין שימוש באסטרטגיה האופטימלית שלמדנו עד כה (ניצול) לבין חקר מצבים חדשים אפשריים (חקר).
כלי מצוין ל-RL הוא OpenAI Gym - סביבת סימולציה, שיכולה לדמות סביבות רבות ושונות, החל ממשחקי Atari ועד פיזיקה של איזון מוט. זו אחת מסביבות הסימולציה הפופולריות ביותר לאימון אלגוריתמים של למידה חיזוקית, והיא מתוחזקת על ידי OpenAI.
Note: ניתן לראות את כל הסביבות הזמינות ב-OpenAI Gym כאן.
כנראה שכולכם ראיתם מכשירי איזון מודרניים כמו Segway או Gyroscooters. הם מסוגלים להתאזן אוטומטית על ידי התאמת הגלגלים שלהם בתגובה לאות ממאיץ או גירוסקופ. בחלק זה, נלמד כיצד לפתור בעיה דומה - איזון מוט. זה דומה למצב שבו אמן קרקס צריך לאזן מוט על ידו - אך איזון המוט כאן מתרחש רק בממד אחד.
גרסה פשוטה של איזון זו ידועה כבעיה של CartPole. בעולם ה-CartPole, יש לנו מחוון אופקי שיכול לזוז שמאלה או ימינה, והמטרה היא לאזן מוט אנכי על גבי המחוון בזמן שהוא זז.
כדי ליצור ולהשתמש בסביבה זו, אנו צריכים כמה שורות קוד ב-Python:
import gym
env = gym.make("CartPole-v1")
env.reset()
done = False
total_reward = 0
while not done:
env.render()
action = env.action_space.sample()
observaton, reward, done, info = env.step(action)
total_reward += reward
print(f"Total reward: {total_reward}")כל סביבה נגישה בדיוק באותו אופן:
env.resetמתחיל ניסוי חדשenv.stepמבצע צעד סימולציה. הוא מקבל פעולה מתוך מרחב הפעולות, ומחזיר תצפית (ממרחב התצפיות), וכן תגמול ודגל סיום.
בדוגמה לעיל אנו מבצעים פעולה אקראית בכל צעד, ולכן אורך החיים של הניסוי קצר מאוד:
המטרה של אלגוריתם RL היא לאמן מודל - מה שנקרא מדיניות π - שיחזיר את הפעולה בתגובה למצב נתון. ניתן גם להתייחס למדיניות כאל הסתברותית, כלומר עבור כל מצב s ופעולה a היא תחזיר את ההסתברות π(a|s) שעלינו לבצע את a במצב s.
הדרך הברורה ביותר למודל מדיניות היא על ידי יצירת רשת עצבית שתיקח מצבים כקלט ותחזיר פעולות מתאימות (או ליתר דיוק את ההסתברויות של כל הפעולות). במובן מסוים, זה יהיה דומה למשימת סיווג רגילה, עם הבדל מרכזי - איננו יודעים מראש אילו פעולות עלינו לבצע בכל אחד מהצעדים.
הרעיון כאן הוא להעריך את ההסתברויות הללו. אנו בונים וקטור של תגמולים מצטברים שמראה את התגמול הכולל שלנו בכל צעד של הניסוי. אנו גם מיישמים הנחתת תגמול על ידי הכפלת תגמולים מוקדמים יותר במקדם מסוים γ=0.99, כדי להקטין את השפעתם של תגמולים מוקדמים. לאחר מכן, אנו מחזקים את הצעדים לאורך מסלול הניסוי שמניבים תגמולים גדולים יותר.
למדו עוד על אלגוריתם Policy Gradient וצפו בו בפעולה ב-מחברת הדוגמה.
גרסה משופרת של גישת Policy Gradients נקראת Actor-Critic. הרעיון המרכזי מאחוריה הוא שהרשת העצבית תתאמנה להחזיר שני דברים:
- המדיניות, שקובעת איזו פעולה לבצע. חלק זה נקרא actor
- הערכה של התגמול הכולל שאנו יכולים לצפות לקבל במצב זה - חלק זה נקרא critic.
במובן מסוים, הארכיטקטורה הזו מזכירה GAN, שבה יש לנו שתי רשתות שמתאמנות אחת נגד השנייה. במודל Actor-Critic, ה-actor מציע את הפעולה שעלינו לבצע, וה-critic מנסה להיות ביקורתי ולהעריך את התוצאה. עם זאת, המטרה שלנו היא לאמן את הרשתות הללו בהרמוניה.
מכיוון שאנו יודעים גם את התגמולים המצטברים האמיתיים וגם את התוצאות שה-critic מחזיר במהלך הניסוי, קל יחסית לבנות פונקציית הפסד שתמזער את ההבדל ביניהם. זה ייתן לנו critic loss. אנו יכולים לחשב actor loss באמצעות אותה גישה כמו באלגוריתם Policy Gradient.
לאחר הרצת אחד מהאלגוריתמים הללו, אנו יכולים לצפות שה-CartPole שלנו יתנהג כך:
המשיכו ללמוד במחברות הבאות:
למידה חיזוקית כיום היא תחום מחקר שצומח במהירות. כמה דוגמאות מעניינות ללמידה חיזוקית הן:
- לימוד מחשב לשחק משחקי Atari. החלק המאתגר בבעיה זו הוא שאין לנו מצב פשוט שמיוצג כווקטור, אלא צילום מסך - ואנו צריכים להשתמש ב-CNN כדי להמיר את תמונת המסך לווקטור תכונות או לחלץ מידע על תגמול. משחקי Atari זמינים ב-Gym.
- לימוד מחשב לשחק משחקי לוח, כמו שחמט וגו. לאחרונה תוכניות מתקדמות כמו Alpha Zero אומנו מאפס על ידי שני סוכנים ששיחקו אחד נגד השני ושיפרו את עצמם בכל צעד.
- בתעשייה, RL משמש ליצירת מערכות בקרה מסימולציה. שירות בשם Bonsai מיועד במיוחד לכך.
כעת למדנו כיצד לאמן סוכנים להשיג תוצאות טובות רק על ידי מתן פונקציית תגמול שמגדירה את מצב המשחק הרצוי, ועל ידי מתן הזדמנות לחקור את מרחב החיפוש בצורה חכמה. ניסינו בהצלחה שני אלגוריתמים, והשגנו תוצאה טובה בפרק זמן יחסית קצר. עם זאת, זהו רק תחילתו של המסע שלכם לתוך RL, וכדאי לכם לשקול לקחת קורס נפרד אם אתם רוצים להעמיק.
חקור את היישומים המפורטים בסעיף 'משימות RL אחרות' ונסה ליישם אחד מהם!
למדו עוד על למידה חיזוקית קלאסית בתוכנית הלימודים שלנו Machine Learning for Beginners.
צפו ב-סרטון נהדר זה שמדבר על איך מחשב יכול ללמוד לשחק סופר מריו.
משימה: אמן מכונית הרים
המטרה שלכם במשימה זו תהיה לאמן סביבה אחרת ב-Gym - Mountain Car.


