בחירת סופטמקס (Softmax Selection) היא שיטת קבלת החלטות שבה לא בוחרים תמיד באפשרות שנראית כרגע הטובה ביותר, אלא מגרילים בין כל האפשרויות, כאשר לכל אפשרות יש סיכוי להיבחר שגדל ככל שהיא נראית טובה יותר. אפשרות שקיבלה ציון גבוה תיבחר לרוב, אפשרות בינונית תיבחר מדי פעם, ואפשרות גרועה תיבחר רק לעתים רחוקות, אבל אף אפשרות לא נפסלת לחלוטין מראש. אפשר לתאר את זה כדרך לקבל החלטה שהיא בעיקר חכמה, אבל לא צפויה לגמרי.
הכי קל להבין את זה דרך דוגמה יומיומית. נניח שאתם מדרגים ארבע מסעדות לפי החוויה שלכם עד היום, בציונים 9, 8, 6 ו-4. בחירה של "תמיד הכי טוב" תשלח אתכם כל ערב לאותה מסעדה בדיוק. בחירה אקראית לגמרי תשלח אתכם לכל אחת מהן בסיכוי של 25 אחוז, כולל לזו שכבר אכזבה פעמיים. בחירת סופטמקס עושה משהו באמצע: היא מתרגמת את הציונים להסתברויות, ואז מגרילה לפיהן. בהגדרה מסוימת של השיטה תקבלו 52 אחוז למובילה, 32 אחוז לשנייה, 12 אחוז לשלישית וארבעה אחוזים לאחרונה. אתם עדיין הולכים בעיקר למקום הטוב, אבל משאירים פתח לגלות שהמסעדה שדירגתם 6 החליפה שף.
המרכיב שהופך את השיטה לשימושית באמת הוא פרמטר יחיד שנקרא טמפרטורה, ומאפשר לכוונן ברציפות את מידת ההרפתקנות: מ"תמיד הכי טוב" ועד "אקראי לחלוטין", ובכל נקודה שביניהם. בזכות הפרמטר הזה בחירת סופטמקס היא אחת הדרכים הנפוצות ביותר לאזן בין ניצול הידע הקיים לבין המשך החיפוש, והיא מופיעה בלמידת מכונה, בבינה מלאכותית של משחקי מחשב, במודלי שפה גדולים, במחקר בפסיכולוגיה קוגניטיבית ובכלכלה התנהגותית.
הבעיה שהשיטה באה לפתור: ניצול מול חקירה
בכל מצב שבו צריך לבחור שוב ושוב מתוך אותן אפשרויות, ולומד מהתוצאות, נוצרת התנגשות בין שתי מטרות. מצד אחד כדאי לנצל את מה שכבר ידוע ולבחור באפשרות עם ההערכה הגבוהה ביותר, כי זה מה שמביא את התוצאה הטובה ביותר כאן ועכשיו. מצד שני כדאי לחקור ולנסות אפשרויות אחרות, כי ההערכות מבוססות על מדגם קטן ועלולות להיות שגויות, ובלי ניסיון נוסף לעולם לא נגלה את הטעות. זו הדילמה המפורסמת של ניצול מול חקירה, והיא מוכרת בספרות במיוחד דרך בעיית "שודד רב זרועות", שבה שחקן מול שורה של מכונות מזל צריך להחליט על איזו ידית למשוך.
הפתרון הפשוט ביותר לדילמה נקרא אפסילון חמדני: ברוב המקרים בוחרים בהערכה הגבוהה ביותר, ובאחוז קטן מהמקרים בוחרים אפשרות אקראית לגמרי. השיטה עובדת, אבל יש בה פגם בולט: כשהיא מחליטה לחקור, היא מתייחסת לכל האפשרויות שאינן המובילה בדיוק אותו הדבר. אפשרות שקיבלה ציון 8, קרוב מאוד למובילה, מקבלת בדיוק אותו סיכוי כמו אפשרות שקיבלה ציון 1 ונבדקה כבר עשרות פעמים. זה בזבוז ניסיונות. בחירת סופטמקס נולדה בדיוק מהתובנה הזו: החקירה צריכה להיות מדורגת, כך שאפשרויות שכמעט מובילות ייבדקו הרבה, ואפשרויות שנראות גרועות ייבדקו מעט.
איך זה עובד: שלושה שלבים
המנגנון מקבל רשימה של ציונים, בדרך כלל הערכות של התועלת הצפויה מכל אפשרות, ומחזיר רשימה של הסתברויות שסכומן אחד. זה נעשה בשלושה שלבים. ראשית, מחלקים כל ציון בטמפרטורה. שנית, מעלים את הקבוע e בחזקת התוצאה. שלישית, מחלקים כל ערך בסכום הכולל, כדי שהכל יסתכם ב-100 אחוז. הנוסחה המלאה, שבה \(P(a)\) היא ההסתברות לבחור באפשרות \(a\), \(Q(a)\) היא ההערכה שלה ו-\(\tau\) היא הטמפרטורה:
\[ P(a) = \frac{e^{Q(a)/\tau}}{\sum_{b} e^{Q(b)/\tau}} \]
למה דווקא פונקציית האקספוננט? מפני שהיא עונה על שלוש דרישות בבת אחת. היא תמיד מחזירה מספר חיובי, גם כשהציון עצמו שלילי, וכך אין סכנה של הסתברות שלילית. היא עולה בהתמדה, ולכן ציון גבוה יותר תמיד מקבל סיכוי גדול יותר. והחשוב מכל, היא הופכת הפרשים בין ציונים ליחסים בין הסתברויות. המשמעות המעשית היא שהוספת אותו מספר לכל הציונים לא משנה דבר בתוצאה: ציונים של 1 ו-2 מייצרים בדיוק את אותן הסתברויות כמו ציונים של 101 ו-102. רק הפער חשוב, לא הערך המוחלט.
הטמפרטורה: כפתור אחד ששולט בהכול
הטמפרטורה היא מספר חיובי שמחלק את כל הציונים לפני שהם נכנסים לאקספוננט, ולכן היא בעצם קובעת כמה הפרש נחשב הפרש גדול. כשהיא נמוכה, ההפרשים מתנפחים והבחירה נעשית נחרצת. כשהיא גבוהה, ההפרשים מתקהים והבחירה נעשית מעורפלת. שני הקצוות מוכרים היטב: כאשר הטמפרטורה שואפת לאפס, השיטה מתכנסת לבחירה של הערך המרבי, כלומר "תמיד הכי טוב"; כאשר היא שואפת לאינסוף, כל האפשרויות מקבלות סיכוי שווה, כלומר הגרלה עיוורת. כל הערכים שביניהם הם הרצף המעניין.
הנה איך זה נראה על אותן ארבע מסעדות עם הציונים 9, 8, 6 ו-4:
| טמפרטורה | ציון 9 | ציון 8 | ציון 6 | ציון 4 |
|---|---|---|---|---|
| 0.5 | 87.9% | 11.9% | 0.2% | 0.0% |
| 1 | 70.2% | 25.8% | 3.5% | 0.5% |
| 2 | 52.3% | 31.7% | 11.7% | 4.3% |
| 5 | 36.6% | 29.9% | 20.1% | 13.4% |
| 20 | 27.8% | 26.5% | 24.0% | 21.7% |
השם "טמפרטורה" אינו מטאפורה שרירותית. הנוסחה זהה לחלוטין להתפלגות בולצמן מהפיזיקה הסטטיסטית, שמתארת באיזו הסתברות חלקיק יימצא במצב אנרגיה מסוים בטמפרטורה נתונה. חומר חם רוטט וקופץ בין מצבים, חומר קר מתייצב במצב היציב ביותר. מכאן גם הפרקטיקה הנפוצה של הורדת הטמפרטורה בהדרגה במהלך אימון, בהשראת תהליך הליבון של מתכת: מתחילים חם וסקרנים כשעוד לא יודעים כלום, ומתקררים לכיוון החלטיות ככל שההערכות מתייצבות. השיטה נקראת לעתים "חקירת בולצמן" בדיוק בגלל הקשר הזה.
לשחק עם זה בעצמכם
הכלי הבא ממחיש את הכל במקום להסביר. שנו את הציונים, הזיזו את הטמפרטורה, ואז לחצו על הרצת 200 בחירות כדי לראות שהחלוקה בפועל אכן מתכנסת להסתברויות המחושבות:
איך זה נראה בקוד
המימוש קצר להפליא, וזו אחת הסיבות לפופולריות שלו. הנה גרסה בפייתון:
import numpy as np
def softmax_select(q_values, temperature=1.0):
q = np.asarray(q_values, dtype=float) / temperature
q -= q.max() # ייצוב נומרי, ראו הסבר למטה
probs = np.exp(q)
probs /= probs.sum()
return np.random.choice(len(probs), p=probs), probs
choice, probs = softmax_select([9.0, 8.0, 6.0, 4.0], temperature=2.0)
print(np.round(probs, 3)) # [0.523 0.317 0.117 0.043]
print("נבחרה אפשרות מספר", choice)
השורה שמחסירה את המקסימום היא הפרט שמפריד בין מימוש תקין למימוש שקורס. בטמפרטורה נמוכה, ציון של 9 מחולק ב-0.05 נותן 180, ו-e בחזקת 180 הוא מספר גדול מכדי להיות מיוצג במחשב, מה שמייצר אינסוף ואז חלוקה לא מוגדרת. מכיוון שהוספת קבוע לכל הציונים אינה משנה את התוצאה, כפי שהוסבר קודם, אפשר פשוט להחסיר את הציון הגבוה ביותר מכולם. התוצאה זהה מתמטית, אבל כל האקספוננטים נמצאים עכשיו בין אפס לאחד. זהו טריק סטנדרטי שמופיע בכל ספרייה רצינית.
איפה פוגשים את זה בפועל
במודלי שפה. זהו כנראה המפגש הנפוץ ביותר של אנשים עם השיטה, גם אם בלי לדעת. מודל שפה מייצר בכל צעד ציון לכל מילה אפשרית, ואז בוחר את המילה הבאה בדיוק בשיטה הזו. הפרמטר "טמפרטורה" שמופיע בממשקי המפתחים של מודלים כמו קלוד או GPT הוא בדיוק ה-\(\tau\) שבנוסחה: טמפרטורה נמוכה מייצרת תשובות עקביות וצפויות שמתאימות לקוד ולעובדות, וטמפרטורה גבוהה מייצרת טקסט מגוון ויצירתי יותר, במחיר של סיכון גבוה יותר לשטויות.
במשחקי מחשב. יריב ממוחשב שבוחר תמיד את המהלך האופטימלי הוא לא רק קשה, הוא גם משעמם וניתן לשינון. הרבה מנועי משחק בוחרים את מהלך הנגד בהגרלה משוקללת בין המהלכים הטובים, וכך היריב נשאר חזק אבל בלתי צפוי. זה גם מנגנון נוח לדרגות קושי: אותו מנוע בדיוק, בטמפרטורה גבוהה יותר, מייצר יריב חלש וטועה יותר, בלי לכתוב שורת לוגיקה נוספת. אותו רעיון עומד מאחורי בחירת המהלכים במערכות שיחקו נגד עצמן וכך למדו, כמו AlphaGo ויורשיה, שם הטמפרטורה מוגדרת גבוהה בפתיחת המשחק כדי לייצר גיוון בפרטיות האימון, ויורדת כמעט לאפס בהמשך כדי לשחק ברצינות.
בלמידת חיזוקים ורובוטיקה. סוכן שלומד לבצע משימה חייב לנסות פעולות שאינן הטובות ביותר לפי הידע הנוכחי שלו, אחרת ייתקע במדיניות בינונית שנראתה מוצלחת בהתחלה. סופטמקס מספק את החקירה הזו בצורה מדורגת ורציפה, ובניגוד לחלופות פשוטות יותר הוא גם גזיר, כלומר אפשר לגזור אותו מתמטית. זה מה שמאפשר לשיטות מסוימות ללמוד ישירות את ההסתברויות עצמן ולא רק את הציונים.
במודלים של התנהגות אנושית. חוקרים בפסיכולוגיה ובכלכלה משתמשים בנוסחה כמודל תיאורי של אנשים אמיתיים. כשמתאימים אותה לנתוני בחירה של נבדקים, הטמפרטורה שמתקבלת נקראת פרמטר העקביות, והיא מודדת עד כמה הנבדק דבק באפשרות שהוא מעריך כטובה ביותר. פרמטר גבוה מתאר אדם אימפולסיבי או מתלבט, ופרמטר נמוך מתאר אדם נוקשה. בכלכלה, אותו מבנה מתמטי מוכר כמודל הלוגיט, שמשמש לניתוח בחירות של צרכנים בין מוצרים או בין אמצעי תחבורה.
קצת היסטוריה
הנוסחה עצמה עתיקה בהרבה מהמחשבים. לודוויג בולצמן וג'וסיה גיבס פיתחו אותה בסוף המאה התשע עשרה כדי לתאר התפלגות של מצבי אנרגיה בפיזיקה סטטיסטית. באמצע המאה העשרים היא הופיעה שוב מכיוון אחר לגמרי: הפסיכולוג דנקן לוס ניסח ב-1959 אקסיומת בחירה שממנה נגזרת אותה צורה בדיוק, כתיאור של האופן שבו אנשים בוחרים בין אפשרויות. בשנות השבעים דניאל מקפאדן פיתח מהרעיון את מודל הלוגיט המותנה לניתוח בחירות כלכליות, עבודה שזיכתה אותו בפרס נובל בכלכלה בשנת 2000.
המונח "סופטמקס" עצמו צעיר יותר, ומיוחס בדרך כלל לג'ון ברידל, שהשתמש בו בסוף שנות השמונים בהקשר של רשתות נוירונים. השם מתאר את מה שהפונקציה עושה: היא גרסה "רכה" של פעולת המקסימום. במקום להצביע בנחרצות על הזוכה, היא מחלקת את ההצבעה בין המועמדים לפי חוזקם. ההטמעה של הרעיון כשיטת בחירה סטנדרטית בלמידת חיזוקים באה בעיקר מספר הלימוד הקלאסי של ריצ'רד סאטון ואנדרו בארטו משנת 1998, שבו היא מוצגת לצד אפסילון חמדני כאחת משתי שיטות החקירה הבסיסיות.
שתי משמעויות שכדאי לא לבלבל
המילה סופטמקס מופיעה בשני תפקידים שונים, וזה מקור נפוץ לבלבול. פונקציית הסופטמקס היא כלי מתמטי שממיר רשימת מספרים לרשימת הסתברויות, והיא מופיעה בשכבה האחרונה של כמעט כל רשת נוירונים שמסווגת קלט לקטגוריות. שם היא לא בוחרת כלום, אלא רק מנסחת את הביטחון של המודל: 92 אחוז חתול, שבעה אחוזים כלב, אחוז אחד שועל. בחירת סופטמקס היא השימוש בפונקציה הזו כדי לבצע הגרלה בפועל לפי ההסתברויות שהתקבלו. הראשונה היא תרגום, השנייה היא החלטה. השיטה שתוארה כאן היא השנייה, והיא בנויה על הראשונה.
יתרונות, חסרונות וחלופות
היתרונות ברורים: השיטה פשוטה, מהירה, דורשת פרמטר אחד בלבד, ומחלקת את מאמץ החקירה בצורה הגיונית לפי איכות האפשרויות. אבל יש לה גם חולשה אמיתית, והיא רגישות לסקאלה. הטמפרטורה נמדדת באותן יחידות כמו הציונים, ולכן ערך שעובד מצוין כשהתגמולים נעים בין 0 ל-10 יהיה חסר תועלת לגמרי כשהם נעים בין 0 ל-10,000. בשיטת אפסילון חמדני, לעומת זאת, פרמטר של חמישה אחוזי חקירה מתנהג אותו הדבר בכל סקאלה. המשמעות היא שכל שינוי במבנה התגמולים של המערכת מחייב כיול מחדש של הטמפרטורה.
חולשה שנייה היא שהשיטה מסתכלת רק על ההערכה הנוכחית ומתעלמת ממידת הביטחון בה. אפשרות שנוסתה פעם אחת בלבד ואפשרות שנוסתה אלף פעמים ומיצתה את עצמה מקבלות אותו יחס אם הציון שלהן זהה, למרות שבמצב הראשון יש הרבה יותר מה ללמוד. שיטות כמו UCB, שמוסיפה בונוס לאפשרויות שנוסו מעט, או דגימת תומפסון, שמגרילה מתוך התפלגות האמונה על כל אפשרות, מטפלות בדיוק בפער הזה ולעתים קרובות משיגות תוצאות טובות יותר. עם זאת, בחירת סופטמקס נשארת ברירת מחדל נפוצה מאוד, פשוט מפני שהיא מספיק טובה, קלה מאוד ליישום, ומשתלבת בטבעיות בכל מערכת שממילא מייצרת ציונים מספריים.
לסיכום
בחירת סופטמקס היא הפתרון האלגנטי לשאלה "איך לבחור בעיקר טוב, אבל לא תמיד אותו דבר". היא לוקחת ציונים, מעבירה אותם דרך אקספוננט ומנרמלת אותם להסתברויות, ומאפשרת לשלוט במידת ההרפתקנות באמצעות פרמטר אחד. אותה נוסחה בדיוק מתארת חלקיקים בגז, מסבירה בחירות של צרכנים, מאמנת רובוטים, ומחליטה מה תהיה המילה הבאה בתשובה שאתם קוראים ממודל שפה. לא רע לנוסחה שכתובה בשורה אחת.