צריך בכלל למידה מחיזוקים באימון GPT?
אדם: איך מחממים פיצה קפואה? איך מחממים פיצה קפואה?
- Χ מודל: "מגהץ יכול לעזור לחמם פיצה קפואה"
- Χ מודל: "יש להשרות את הפיצה במים חמים"
- Χ מודל: "יש להניח את הפיצה בשמש למשך כ-6 שעות"
- √ מודל: "הכנס את הפיצה אל התנור למשך 20 דקות"
יישור קו: כך מאמנים מודלי שפה ממשוב אנושי.
***
מודלי שפה כמו ChatGPT מאומנים בשני שלבים.
- בשלב הראשון: מאומנים לנחש את המילה הבאה במשפט: בהנתן טקסט גדול: עבור מילה, מילה: נחש את המילה הבאה על סמך כל המילים הקודמות.
- בשלב השני: למידה מחיזוקים [בדרך כלל גם ממשוב אנושי]: לכל טקסט וטקסט שכותב המודל מקבל המודל ציון מסוים.
אלגוריתם אימון מחיזוקים:
- שואלים אותם שאלה.
- מקבלים חזרה כמה תשובות אפשריות.
- בוחרים את התשובה המעודפת עלינו.
- *קסם RL כלשהו*
*קסם RL כלשהו = בדרך כלל PPO
———
באמת צריך את כל הכאב ראש הזה?
בשביל מה?
רק רגע! אם מודלי שפה מסוגלים ללמוד..
- לשחזר טקסט מילה במילה (לנחש את המילה הבאה בכל פעם)
- ממשוב אנושי (לייצר טקסט -> כן טוב\לא טוב -> לייצר טקסט אחר..)
אי אפשר פשוט לאמן אותם לשחזר את התשובה הנכונה וזהו?
נאמן אותם על טקסט בו כתוב לא להפשיר פיצות במייבשי כביסה
***
ביומיים האחרונים הרשת גועשת סביב הרצאה אותה העביר ראש צוות RL בOpenAI בה חשף פרטים נוספים על תהליך האימון ממשוב אנושי בו משתמשים OpenAI על מנת לאמן את ChatGPT ואת GPT-4.
הרצאה: https://www.youtube.com/watch?v=hhiLw5Q_UFg…
פוסט מצוין של יואב גולדברג בנושא: https://gist.github.com/…/6bff0fecd65950898eba1bb321cfbd81
עם שחרור ChatGPT החלו דיונים רבים על חשיבות הלמידה מחיזוקים ממשוב אנושי (RLHF), אם יש בידינו מידע על "התשובה הנכונה" אז שום דבר לא מונע מאיתנו פשוט ללמד את המודל לנחש את המילה הבאה של התשובה הנכונה במקום ללמד אותו מחיזוקים.
.
גם ככה זו הדרך בה המודל לומד בשלב ההתחלתי, עבור טקסט גדול מאוד: המודל לומד לנחש את המילה הבאה על סמך כל המילים שהגיעו לפניה בטקסט, לאחר תהליך זה, המודל מסוגל לייצר משפטים וטקסטים ארוכים.
הבעיה היא שבני אדם ביום ביום אינם מנחשים את המילה הבאה כאשר הם מדברים [1], הם פשוט מדברים.
לכן על מנת להשתמש במודלי השפה, נאלצנו לעבוד עליהם. למשל, כדי לגרום למודל לענות על שאלה מסויימת הינו כותבים "שאלה: <השאלה>. תשובה:" והמודל היה "ממשיך את הטקסט" עם התשובה הנכונה.
> [1] ויכוחים במערכות יחסים. et al.
- לבעיה זו פתרון פשוט: נאמן את המודל על שיחות אנושיות אחד-על-אחד: כל ילמד המודל "לענות" כש"פונים אליו". אבל אפילו יותר: באמצעות יכולת זו נוכל לאמן את המודל לאמר כל מה שנרצה!
***
עוד פעם: למה צריך למידה מחיזוקים בכלל?
בלמידה מחיזוקים אנו מספקים למודל הוראות אך לא את התשובות הנכונות שנכתבו על ידי בני אדם (ואותן יש לשנן)
- במקום, המודל יוצר תשובות משלו.
- מקבל עליהן ציון
- מטרת המודל באימון "מה שיצא טוב" -> "לעשות ממנו יותר!"
.
אז אמנם נכון שמשוב אנושי איטי, יקר, רועש (לכל אחד יש דעות משלו) ולא אינפורמטיבי מידי [ביט אחד: כן \ לא? לטקסט ארוך].
אבל..
- אבל אנו איננו יודעים איזו מילה מתוך המילים במשפט היא "הטעות"
- מכיוון שהתגמול ניתן במצטבר על המשפט כולו: נדרש תגמול גדול יותר על מנת לייצר טקסט "טוב יותר". תגמול מצטבר אינו ניתן באימון פשוט.
- אימון מחיזוקים מלמד את המודל להשוות (לדרג). וזה מוביל אותנו ל..
***
לענות "נכון": בכלל לא מה שרצינו לפתור.
בהרצאה שהעברתי בPyCon ישראל לפני כמה חודשים, חשפתי בוט בטוויטר ששחררתי לחופשי בפברואר 2022.
פרטים מעניינים ולא רלוונטים: הבוט הוצהר במפורש. אומן לאמר שהוא בוט וגם בBio נכתב מפורש. למתעניינים: אימנתי אותו בעצמי, 9 מיליארד פרמטרים מאומן על כל השרשורים ברדיט.
הבוט פעל במשך כמה שבועות בהם רכש לעצמו כמה אלפי עוקבים ששמחו להטריל אותו בכל מיני דרכים שונות ומשונות.
על מנת להמחיש איך ניתן לשלוט בבוטים מסוג זה, הראתי באותה ההרצאה בוט שאומן על ציוציו של אילון מאסק ולאחר מכן אומן להחזיק ב"דעה" מסויימת:
- דעה: "אתה שונא את Doge Coin"
באימון מסוג זה: אי אפשר לאמן את הבוט לשחזר טקסט, כי אין טקסט. אין תשובה נכונה.
- אנחנו רוצים "דעה": שהמודל ידבר בכללי על כל מיני נושאים. אבל כשעולה הנושא של Doge Coin, שהמודל תמיד ישנא את Doge Coin.
אפשר כמובן לנסות ולהרכיב בכוח כל מיני טקסטים שמדגימים "איך מישהו שהיה שונא את DogeCoin" היה מדבר. אולי אפילו לעשות עליהם קצת Overfitting אבל אנחנו מעוניינים לאמן ל"דעה". כל "דעה". מחר זו יכולה להיות דעה אחרת. לא רק שזה אינו פתרון לבעיה זו – זה לא יעבוד במציאות גם ככה, פשוט כי במציאות כנראה ונתקל גם בטקסטים אחרים עבורם יתקשה המודל לשנוא את Doge Coin מספיק.
מיותר לציין: אין דוגמאות עם סנטימנט שלילי על DOGE COIN בטוויטר של אילון מאסק.
***
איך מאמנים מודל להחזיק ב"דעה" מסוימת?
בכל טקסט שלא יהיה..
משתמשים במודל אחר שתפקידו להחליט האם "הדעה נכונה" – בדוגמה שלנו: האם הטקסט בעל סנטימנט שלילי או חיובי.
והאינטרנט שורץ במודלים מאומנים מראש לזיהוי סנטימנט.
כמו כל הבעיות במדעי המחשב: הרבה יותר קל לאמר האם פתרון הוא נכון מאשר להמציא את אותו הפתרון.
באותו המודל נשתמש כמורה שתפקידו להנחות את המודל "המדבר" שלנו, "לדבר נכון" -> לאמר דברים שליליים על Doge Coin.
האלגוריתם:
- מודל.בלבל_את_המוח()
- אם דיבורי המודל מכילים Doge Coin
2.1 אם דיבורי המודל שליליים -> זה טוב! (משוב חיובי)
2.2 אם דיבורי המודל חיוביים -> זה רע! (משוב שלילי)
באופן זה ניתן לאמן כל מודל להחזיק בכל דעה שלא נרצה: ללא כל קשר למשמעות הטקסט.
וזה גם יותר קל, כן? בסוף לכל טקסט שנמציא: יגיע איזה מתחכם בטוויטר שימצא דרך לעקוף את הגנות המודל. בני אדם הרבה הרבה יותר מתוחכמים ממודלים..
- לסיכום: כשאנו מלמדים את המודל "לשחזר טקסט" אנו מלמדים אותו את התשובה המדויקת – להחזור מילה במילה על התשובה הנכונה, בעוד שבמציאות במקרים מסויימים אנו מעוניינים ללמד את המודל תכונה מופשטת הרבה יותר.
לפיכך, בסיטואציה אחרת בקונטקסט אחר – לא מובטח לנו שהמודל ימשיך "להחזיק בדעה" אליה ייעדנו את אותו המודל – גם אם ננסה בכל הכוח "למלא את כל החורים".
כלומר: על מנת לפתור בעיה זו -> אנו זקוקים לפונ' ציון.
לא כי לא ניתן "לשחזר את כל הטקסטים האפשריים" [זה נקרא "להכליל": עובד מצוין], כי אנו בכלל לא מעוניינים לעשות זאת: זו לא המשימה, זה הורס את הידע בתוך המודל, קשה, איטי ובמציאות גם לא עובד כל כך טוב.. [דוגמה: כל המודלים הפתוחים, הם לא וואו..]
———
טעויות נגררות
הבעיה העיקרית במודלי השפה המודרנים היא Teacher Forcing – אנו מאמנים את המודל לנחש את המילה הבאה על סמך כל המילים הקודמות בכל שלב ושלב (ומניחים שהטקסט נכון ומדויק) רק שבמציאות כשהמודל כותב את הטקסט, המודל מנחש כל מילה על סמך כל המילים הקודמות שהוא כתב, ואותו הטקסט אינו בהכרח נכון או מדויק.
.
מצב זה מעוות את התפלגות הטקסט באופן משמעותי: בזמן כתיבת הטקסט המודל "נבחן" על טקסט שונה מאוד מהטקסט עליו התאמן.
.
ישנם פתרונות ביניים לבעיה זו (כמו BPTT) אך בשורה התחתונה, עלינו לחשוף את המודל בשלב האימון לטקסט שהוא עצמו יצר: רק כך מובטח לנו שהמודל יתפקד כמצופה במציאות.
רק רגע! נשאלת השאלה "נגיד ויש פונ' ציון", "נגיד ויש גם פונ' שיערוך לציון שמגיעה עם PPO".. הכל גזיר! למה לא פשוט נמקסם את המודל ישירות בשלב זה? בלי RL! או בעברית: אפשר לאמן GAN וזהו? זה בערך מה שאנחנו כבר עושים פה. תשובה 1: כן. ניסיתי, לא הכי יציב אבל עובד. תשובה 2: פרט מעניין: יש כבר הרבה במשותף בין Actor Critic (וPPO בניהם) לבין גאנים [לא אחד לאחד, כמובן].
***
המודל מעולם לא רואה "מה לא לעשות"
אימון "שחזור טקסט" מלמד את המודל איזה טקסט אנו כן רוצים לראות -> ולא איזה טקסט אנו לא רוצים לראות.
ניסוי מעניין שהרצתי פעם: "שלילת טקסט" עם מודל שפה נוסף (T5: טקסט->טקסט) ואז הוספת אותן הדוגמאות לנתוני האימון ואימון עם לוס שלילי. זה עובד מצוין.
***
לאמן את המודל לאמר "אני לא יודע"
באימון פשוט, במידה והמודל אינו יודע פרט מידע מסוים: הינו רוצים שפשוט יגיב "אני לא יודע".
כמובן שכשמטרת האימון היא לנחש את המילה הבאה בכל שלב – לומד המודל.. לנחש את המילה הבאה.. לנחש את התשובה.
מה קורה אם מוסיפים לאוסף הנתונים "אני לא יודע": המודל לומד להסתיר מידע (שהוא כן יודע) ולהשיב "אני לא יודע" גם כשלא צריך. מכיוון שאימון מסוג פשוט אינו מלמד את המודל להסתכל על מוצא ההסתברויות שלו עצמו (ולהסיק "עד כמה אני יודע את התשובה?"). [ספויילר: למידה מחיזוקים כן!]
חוץ מאימונים מיוחדים בהם מאומן המודל על תחום ידע צר כשכל שאלה לא בנושא מתוייגת כ"אני לא יודע" – במצב זה יכול המודל ללמוד כמו שצריך. פשוט כי קל ללמוד "האם טקסט בנושא A?".
משמעוית קשות:
❯ אימון פשוט, איכותי ככל שיהיה תמיד יאמן את המודל לשקר או להמר כשאינו יודע.
❯ אימון רגיל רק מחמיר את חירטוטי המודל
❯ אימון רגיל גם על טקסטים מתוך המודל עצמו ש"נבחרו להיות הכי נכונים" אינו יכול להבטיח שילמד המודל לא לשקר.
———
איך נדע מתי המודל לא יודע?
מכיוון שאנחנו לא יודעים מה המודל יודע נוכל להשתמש במודל עצמו מספר פעמים רב ומתוך תשובות המודל לבחור את התשובה הנכונה.
במידה ואין אחת כזו -> נתייג "ענה: אני לא יודע".
גם אם המודל מנחש כמה תשובות נכונה ולומד בטעות לחרטט, מכיוון שלמודל ישנה גישה ליצוגו הפנימי (ובכך למוצא ההסתברויות שלו עצמו) בטווח הארוך משוב שלילי על תשובות מומצאות (חוסר בטחון) ילמד את המודל לא לחרטט או להמר.
זה הוא אחד ההבדלים הגדולים ביותר בין ChatGPT לGPT-3 המקורי – וזה גם ניכר בכמות החירטוטים.
***
גניבת מודלים
יואב גולדברג כתב על כך, אבל אשמח להוסיף כמה פרטים חשובים.
כולם בקבוצה כבר יודעים [1] שפרוייקטים פתוחים רבים מנסים לאמן מודלים לענות "מה שChatGPT" היה עונה במטרה "לגנוב את הChatGPT".
מהכתוב למעלה אנו יכולים להסיק שאימון בצורה זו לעולם אינו יוביל למודל בעל יכולות הזהות למודל המקורי – מודל הסטודנט לעולם ימשיך לחרטט.
וזו בדיוק הסיבה שOpenAI אינם מאפשרים לבקש הסתברויות או אמבדיגנס מChatGPT או GPT-4 דרך הAPI כי דווקא אפשר מאוד לגנוב את המודלים דרך הAPI במידה ואלו היו זמינים.
[1] – תודות למישהו פה
***
אימונים יצירתיים ממשוב
כולנו מבינים שאימון ממשוב אנושי יקר: עלות בני האדם המתייגים יקרה.
אם קראתם עד לפה, כנראה שאתם גם מבינים שאימון ממשוב שאינו כולל בני אדם: "דעה" בנושא מסוים, "אישיות" מסויימת.. אינו יקר כלל: כל עוד ניתן לאמן מודל מורה מספיק טוב: ניתן להשתמש בו להנחות את מודל התלמיד.
ומכאן אפשר להתחיל להשתגע עם הדימיון:
- להשתמש במודל נוסף על מנת ליצור שאלות ותשובות
- לשאול מודל נוסף האם תשובה נכונה
- לבקש ממודל עם גישה אינטרנטית (בינג) לבדוק עובדות
- לשאול מודל גדול שאלות להשוואה בין אפשרויות טקסט שונות "אילו מבין הטקסטים הבאים נשמע יותר מקצועי?"
כל אלו אינם אפשריים באמצעות למידה פשוטה.
אבל התשובה הכי טובה: זה פשוט עובד טוב.