איך (ב-א-מ-ת) אימנו את CHATGPT?
סיכום: שיטות אימון מודלי שפה גדולים.
הסערה, השקרים, גרסאות המודלים המבלבלות ואיך ב-א-מ-ת אימנו את ChatGPT.
סיכום כל ציר הזמן (וכל המודלים) בדרך למודל הסופי: ChatGPT.
להלן שרשרת האירועים והיחסים בין כל המודלים השונים של OpenAI לאורך הזמן:
(לפי המידע הכי טוב שיש לנו כרגע)
אימון מודלי שפה – שלב 1:
מאמר GPT-1 כאן: https://cdn.openai.com/…/language_understanding_paper.pdf
מאמר GPT-2 כאן: https://cdn.openai.com/…/language_models_are…
מאמר GPT-3 כאן: https://arxiv.org/abs/2005.14165
מודלי שפה מאומנים לבצע משימה אחת: "להזיז את הטקסט מילה אחת אחורה".
הקלט שלהם בזמן האימון הוא רצף טקסט והמטרה שלהם בזמן האימון היא אותו הטקסט "מוזז" אחורה.
מה שאנחנו קוראים לו "לייצר טקסט" הוא תופעת הלוואי של הזזת המשפט "אחורה" – אין מאיפה "להזיז" את המילה האחרונה: צריך "לנחש" אותה.
שאלה: אם הם מקבלים משפט שלם וצריכים להוציא את אותו המשפט בהיסט: למה הם בכלל לומדים משהו מכל המילים? הם לא היו אמורים פשוט ללמוד "להעתיק בלי להבין" את כל המילים אחורה וללמוד רק מהמילה האחרונה?
תשובה: הם לא יכולים בגלל המבנה הפנימי שלהם – יש Mask בכל הבלוקים במודל שלא מאפשר למידע לעבור "קדימה בזמן" בתוך המודל רק "אחורה בזמן" (כופלים במטריצת אפסים משולשית).
דעתי האישית: זו הגדולה האמיתית של GPT.
אנחנו עולים פה שלב במערכת היחסים! אפשר כבר להפסיק להסביר את האימון של GPT כ"ללמוד להשלים את המשך המשפט" כדי לפשט אותו לצורה שקל להבין מה הוא עושה.
במאמר הראשון של GPT הוצגה שיטה לאימון יעיל (מאד) לחיזוי סדרות זמן: אם פעם הינו רצים בלולאה לאורך הסדרה ובכל שלב מלמדים את הרשת לחזות את "העתיד" של אותו האינדקס בסדרה (חלון זז): כאן אנחנו דוחפים אל תוך הרשת בצעד אחד אינפורמציה שהינו מקבלים רק אחרי N צעדים בשיטה הקודמת (כשN – אורך סדרת הזמן).
במאמר של GPT פשוט הפעילו שיטה זו על סדרת זמן ספציפית: טקסט. והתחזית היתה גם היא: טקסט. אבל הרעיון תופס לכל סדרת זמן שהיא. (וזו גם אחת הסיבות שמודלי שפה קאוזלים מעניינים אותי לאחרונה למרות שאני מתעסק ביום יום בבעיות מסוג אחר בדרך כלל)
אני חושב שאנשים לא מספיק מעריכים את הרעיון הזה (והרבה אנשים אפילו לא מודעים לשיטה הזו).
על Promp Engineering
כשGPT-3 שוחרר הוא נתפס כ"צעצוע מגניב" או "טכנולוגיה עם פוטנציאל".
כדי להשתמש בו הינו צריכים "לעבוד עליו" עם פרומפטים מתוחכמים או כמה דוגמאות מתוייגות (בFew Shot).
הוא לא היה "שימושי מספיק" כדי להיות כלי אינטואיטיבי שהקהל הרחב יכל להשתמש בו ביום יום.
דרך אגב, אפילו היום עם ChatGPT יש אנשים (בדרך כלל יותר מבוגרים) שקשה להם לתפוס מה כל כך חדשני ומיוחד. שמעתי תגובה שהפתיעה אותי לגביChatGPT מאדם מבוגר לאחרונה: "כבר יש לנו את זה הרבה שנים. גוגל יודע למצוא מידע על כל דבר בעולם.."
אימון על קוד – שלב 2:
מאמר כאן: https://arxiv.org/abs/2107.03374
עם שחרור GPT-3 003 עודכן גם תיעוד כל גרסאות המודלים באתר OpenAI.
וזה לא עבר חלק. עוד על כך בהמשך.
אחד העדכונים המפתיעים ביותר הוא:
שGPT-3 002 נוצר מFine-tuning של מודל השלמת הקוד: Codex.
המודל GPT-3 002 נקרא גם בסלנג "InstructGPT" ונחשב לגרסה החזקה ביותר של GPT-3 לאורך כל 2022
למי שלא מכיר: Codex (אחת מגרסאותיו) הוא המודל שמפעיל את התוסף הפופולרי GitHub CoPilot – מודל להשלמת קוד.
על פי הכתוב במאמר המודל אומן על חלקים גדולים מGitHub וכל מטרתו היא להשלים קוד. המודל לא אומן לבצע הוראות בשפה אנושית ומתפקד רק כ"השלמה אוטומטית" חזקה ביותר.
עד לעדכון התיעוד באתר של OpenAI הדעה היתה שCodex הוא צאצא של GPT-3 ולא הפוך.
על פי OpenAI – במבחן תכנות: GPT-3 (המקורי) כמו שהוא לא הצליח לפתור אף אחת מבעיות התכנות בסט הבדיקות. כלומר: כמות הקוד הקטנה שGPT-3 ראה בזמן האימון בעקבות זליגות מידע לא הספיקה על מנת שממש ילמד "לתכנת".
לכן על מנת לאמן את Codex (כנראה מאפס) השתמשו בOpenAI בכמות עצומה של קטעי קוד על מנת לאמן את המודל. (סינון מינימלי: De Duplications)
משימת הפרוייקט אותו הגדירו החוקרים: כתיבת קוד פונ' על סמך תיעוד הפונ'.
תופעה מעניינת מאד: מודלי שפה שלומדים להשלים קוד – לומדים בעצמם לבצע הוראות פשוטות למרות שמעולם לא אומנו לעשות זאת. ככל הנראה הסיגנל הרועש המגיע מקטעי קוד ותיעוד הצמוד אליהם מלמד את המודל כיצד נראות "הוראות" בשפה אנושית ושיש "לענות" להן.
ביצועי Codex נבדקו בצורה יצירתית: נכתבו ידנית מספר גדול של תרגילי תכנות ואת הקוד שCodex יצר כפתרון פשוט הריצו דרך Unit Testים מוכנים שנכתבו.
הציון הסופי נקבע לפי כמות הפתרונות הנכונים (ועכשיו אפשר גם למדוד האם פתרון "נכון")
הבעיה היחידה: אימון מודלי שפה בעולם האמיתי הוא נורא ואיום.
זה לא עבד. לא קרוב.
כן, הוא הצליח יותר מGPT-3 שלא אומן להלשים קוד אבל הוא לא התקרב בכלל לרמה בה אפשר לקרוא לקוד שלו "שימושי".
ובטח שלא לבקש על השלמות אלו כסף בכל חודש.
להלן שיעור כואב שאני אישית למדתי בדרך הקשה:
-
באימון מודלי שפה לאיכות הדאטה חשיבות ה-ר-ב-ה יותר גדולה מכמות הדאטה.
-
והם זוכרים ה-כ-ל. כל שטות לא נכונה. כל קוד שבור וגרוע. כל "אנגלית שבורה".
-
מבחינתם כל אלו הן השלמות הגיוניות. ככה בני אדם מדברים -> ככה גם הם ידברו.
כדי לפתור זאת OpenAI יצרו עוד דאטהסט קטן ונקי במיוחד של תרגילי תכנות ופתרונות קוד צמודים אליהן:
-
פתרונות לתחרויות תכנות תחרותי: יחסית פשוט. הקוד בטוח יעבוד ובטוח יעיל וצמוד להוראות.
-
פרסור CI בגיטהאב וPyPI: על פי הכתוב במאמר, פרסרו את קונפיגורצית הCI בפרוייקטים פופולרים בקוד פתוח בGitHub וכך הצליחו לחלק על פי תיעוד החבילה צמדי הוראות-פונקציות באיכות גבוהה.
לפני סינון היו בדאטהסט זה רק 50,000 טקסטים (!!!). ולאחר סינון אפילו פחות.
מסקנה עיקרית: השיטה הנפוצה בתחום של "לדחוף כמה שיותר" לתוך המודל לא תמיד אופטימלית ולא תמיד נחוצה. דאטהסט קטן אבל איכותי ונקי מייצר מודלים איכותיים (שעדיין מכלילים למרות שזה מפחיד).
לאותה המסקנה בדיוק הגיעו הצוותים במטא במאמר של גלקטיקה (המודל שאומן לייצר מאמרים מדעים וממשקו הוסר מהאינטרנט בתוך פחות מיממה תוך כדי דרמה רצינית) – דאטה קטן ונקי עדיף על דאטה גדול ולא נקי.
אימון מודלי שפה עם Masking:
מכאן OpenAI ממשיכים ומאמנים את Codex כשיש Masking על ההוראות שיש לבצע (!!) כך המודל לא לומד לייצר הוראות חדשות אבל כן לומד איך לבצע את אותן ההוראות.
עוד טריק חשוב: הם מיישרים את כל הפתרונות לכל הבעיות כך שיתחילו מאותו האינדקס (בדיוק!) בתוך רצף הטקסט (ומרפדים משמאל). כך המודל לומד להתחיל לייצר את פתרון המשימה באותו המיקום בכל פעם ונחסך ממנו להבין שאותו הטקסט גם אם מופיע בכמה מקומות שונים ברצף: מדובר באותו הטקסט.
דעתי על אימון עם Mask: אני מתלבט לגבי הנקודה הזו ספציפית כבר מעל לחצי שנה. בניסוים עולות התוצאות הברורות: מודלים לומדים לבצע הוראות הרבה יותר "לעניין" עם הMask אבל (וזה אבל גדול) כשמאמנים אותם ללא Mask הם לומדים גם הרבה מידע מתוך השאלות (ותוצאות הולידציה על התשובות (בלבד) טובות בהרבה).
אימון על הדאטהסט הפצפון הקפיץ את תוצאות המודל ב37% (!!!) על פני המודל המקורי ומודל זה (Codex-s) ככל הנראה הוא המודל שמפעיל את GitHub CoPilot (לא קיבלנו על כך אישור רישמי מעולם).
השפעת גודל המודל:
הביצועים של Codex השתפרו באופן משמעותי כשהגדילו את המודל. ב-300 מיליון פרמטרים, Codex פתר 13.2 אחוז ממשימות הוולידציה ו-28.8 אחוזים עבור מודל בגודל 12 מיליארד פרמטרים. לא מוזכר שום דבר לגבי מודלים גדולים יותר במאמר שאומנו על דאטהסט זה ולכן אני מנחש כי גם GitHub CoPilot מודל בגודל 12 מיליארד פרמטרים ולא יותר – לצורך המענה המהיר שCoPilot מחזיר לנו תוך כדי עבודה רצופה. (Codex בAPI של OpenAI מגיע עד הגודל הגדול ביותר: 175 מיליארד וכנראה שלא אומן לCodex-s אליו אין גישה חופשית).
אימון GPT-3 – שלב 3:
מאמר GPT-3 כאן: https://arxiv.org/abs/2005.14165
על פי התיעוד הרישמי של OpenAI – מודל GPT-3 בגרסה 002 אומן לFine Tuning מCodex.
האם יש לכך הצדקה? קוד מספק תשתית טובה יותר לאימון שפה טבעית וכל מה שהגיע אחרי? אני לא יודע. דיון מעניין ויואב גולדברג דיבר על כך גם בטוויטר לאחרונה.
אבל לפני שנמשיך אני חייב להוסיף פה דעה אישית:
אני רוצה להאמין לOpenAI. באמת.
שימו את השקרים האחרים בצד כרגע.
זה לא מסתדר לי.
בשום צורה.
-
למודלים אורך קלט שונה: Codex 8192 ולGPT-3 בדיוק חצי: 4096. אז נניח שאנחנו חשופים רק לחצי מאורך הקלט של GPT-3 ואורך הקלט המלא הוא 8192: אפשר לנחש שאם זה המצב אז כל ההוראות נמצאות בחצי הראשון (אותו אנו מזינים למודל) וכל התשובות מתחילות בדיוק מאמצע המודל באותו האינדקס. וממשק המשתמש בנוי בכוונה בצורה מבלבלת.
-
למודלים טוקנים שונים: לGPT-3 ולCodex יש טוקנייזרים שונים. ישנה חפיפה אבל היא לגמרי לא מושלמת בניהם. לGPT-3 בגרסה 002 יש טוקנייזר ישן מאד המגיע כל הדרך מGPT-2. לCodex הוכנסו הרבה טוקנים נוספים וגם Special Tokens שנמצאים בתוך המודל ומעולם לא תועד לגביהם שום דבר.
-
הם פשוט לא מתנהגים אותו הדבר בשם צורה: לא ככה מרגיש Fine-Tuning. או שהאימון "הרס" לגמרי את יכולות Codex או שזה פשוט לא אותו המודל.
כך או כך – זה המידע.
אימון "מילוי באמצע" – שלב 4:
מאמר כאן: https://arxiv.org/abs/2207.14255
מודלי שפה גדולים טובים בלהשלים טקסטים אבל הם לא בנויים "להשלים באמצע הטקסט". בדיוק בגלל הMasking שדיברנו עליו בהתחלה. הוא חוסם את האינפורמציה אחורה ובכך לא מאפשר הכנסת טקסט במיקום ספציפי המותנה גם בקידומת וגם בסיומת.
ספציפית: ממשק ה"השלמה באמצע" הופיע יום אחד באתר של OpenAI בלי הסברים יותר מידי מפורטים וממשחק אישי שלי בו הבנתי מהר שהמודלים מאחוריו משמעותית חזקים יותר מהמודלים להשלמת טקסט פשוט. לכן מודלים אלו ומה הטריקים העומדים מאחוריהם עניינו אותי מאד.
או שלא? זה אותו המודל? במאמר כתוב שיש שינוי ארכיטקטורה וזה לא אותו המודל. מצד שאני אמרו שכן? אי אפשר לדעת למה להאמין יותר.
בנקודה זו אני חייב להתוודות: כשממשק ההשלמה באמצע הטקסט שוחרר חשבתי ה-ר-ב-ה איך לעזאזל הם עושים את זה. הגעתי לMasking שלא בנוי מ"מטריצה משולשית" הוא בנוי מ"מטריצת שעון חול" ועוד הרבה פתרונות מסובכים יתר על המידה.
הפתרון שלהם היה: להזיז את הטקסט.
וואו. כמה שאני מטומטם.
בכל צעד אימון לוקחים חלק טקסט רנדומלי מאמצע הטקסט ומזיזים אותו לסוף המסמך (כשיש טוקנים מיוחדים שמסמנים את התחלת הטקסט וסופו) ובכך מודל השפה שיודע רק להשלים את המילה הבאה בכל שלב – משלים את "המילה הבאה" להיות המילה שחסרה באמצע הטקסט.
הם ביצעו סדרת ניסויים ב"טריק" הזזת הטקסט ובדקו את ההשפעה על איכות המודל.
-
התוצאות מראות שהזזת הטקסט מגיעה ללא מחיר (!!): הם אימנו הרבה מודלים בגדלים שונים עם הזזה ובלי ההזזה גם על קוד וגם על שפה ומראים שתוצאות המודלים לא נפגעות.
-
הם חיפשו בכוח את כל אפשרויות ההיפרפרמטרים (כמו שצריך) הקשורים להזזת הטקסט – "כמה טקסט להזיז" "כמה להשאיר לפני" "כמה להשאיר אחרי".. כל התוצאות במאמר. עניין מעניין: הלוס בוולידציה אמנם זהה בין הרבה ערכי פרמטרים אבל דגימה עם טמפרטורה (כמו שעושים בהפעלת מודלים כאלו ידנית) יוצאת דרמטית שונה ומייצרת חוויה שונה למשתמש הסופי.
-
אימון Fine-tuning של מודל שלמד להשלים טקסט רגיל כדי שילמד להזיז טקסט: לא יותר טובה מאימון מאפס. מפתיע. אבל אפשרי.
כך CoPilot לומד להשלים אתכם באמצע הקוד על סמך דברים שנמצאים "אחרי" הסמן שלכם. דרך אגב.
בנוסף: במאמר מוזכר בכמה ימים שהאטנשן במודל הוחלף לאטנשן רלטיבי. כי אטנשן רלטיבי מוביל לSlightly Better Performance.
לא ברור כמה Slightly שיפור הביצועים (אולי זו הסיבה להבדל בכוח בין המודלים האלו למודלי ההשלמה הרגילה) אך אטנשן רלטיבי חזק ביותר ומקפיץ את התוצאות משמעותית.
מעניין באותו הנושא: בקאגל באחת מתחרויות הFeedBack שהסתיימו השנה, אחד מהצוותים המנצחים יצר דוגמאות סינתטיות ששיפרו באופן משמעותי את המודל שאומן עליהם. דוגמאות אלו נוצרו על ידי אימון מודל נוסף להשלמה באמצע כך שהשלים חלקים מסט האימון בצורה שונה. המודל עצמו קטן במיוחד (פחות ממיליארד פרמטרים) אך עבד בצורה מדהימה ועל פי הכותבים "לא הצלנו להבחין מה הדוגמאות האמיתיות בסוף". את כוחו של המודל למרות גודלו הקטן אפשר להסביר אולי בכך שהוא לא מודל קאוזלי – הוא מודל טקסט->טקסט. הם אימנו את T5-Large.
אימון שלב 5 – אימון ביצוע הוראות:
ההטעיה
בתחילת השנה שוחרר GPT-3 002. נקרא גם InstructGPT. מודל זה יודע למלא הוראות בשפה אנושית.
במקום "לעבוד עליו" כך שישלים את הטקסט להיות התשובה שנרצה, מודל זה פשוט "מבין" מה אנחנו רוצים לעשות.
זמן קצר לאחר שחרור המודל, שוחרר מאמר בנושא.
במאמר מתוארת שיטת למידה מחיזוקים למודלי שפה:
בשיטה זו, במקום לתת למודל טקסט ולאמן אותו להשלים את הטקסט.
ניתן למודל לייצר "כל מיני טקסטים" – נתייג באמצעות מתייגים אנושיים את הטקסט המועדף עלינו ונעדכן את המודל עם Reinforcement Learning (ספציפית PPO) להחזיר טקסטים היותר דומים לטקסט המועדף על בני האדם.
על מנת להעצים את יכולות בני האדם המתייגים את הדוגמאות – מאומן מודל סיווג "קטן" שתפקידו לנחש מה יהיה תיוג בני האדם על עשרות אלפי דוגמאות נוספות אחרות.
כך בני האדם מתייגים בפועל מספר דוגמאות יחסית קטן אך למודל מספר דוגמאות מספיק על מנת להתאמן בצורה יעילה.
חשוב לשים לב לפרט ספציפי: כאשר המתייגים האנושיים מתייגים דוגמה ספצפית. למעשה יש לנו דוגמה מתוייגת: האם אפשר פשוט להתאמן עליה בצורה הרגילה? צריך Reinforcement Learning?
במאמר התיחסו לאימון מסוג זה כ"עוד בייסליין" שבהשוואה אליו אימון למידה מחיזוקים מגיע לתוצאות משמעותית חזקות יותר.
כך עברה כמעט כל 2022..
נכתבו השנה עשרות מאמרים אקדמים על השפעת למידה מחיזוקים במודלי שפה וחלק לא קטן מהם התבסס על GPT-3 כמודל מאומן בRL.
הפרט שלא פורסם עד עכשיו: GPT-3 002 בכלל לא אומן עם RL. הוא אומן כמו הבייסליין הפשוט על סמך הדוגמאות המתוייגות.
מיותר לציין: אותם הכותבים של אותם המאמרים לא היו מרוצים שעליהם להגיש Retraction..
על שיטות האימון
-
מהניסיון שלי: לא הצלחתי לגרום לRL להשפיע על מודל שפה בצורה כזו שהטקסט הסופי יכיל מידע "נכון יותר" או "מעניין יותר". כן הצלחתי יחסית בקלות לגרום למודל ללמוד "סטייל כתיבה" שונה על ידי RL. ההבדל הוא אורך הטקסט: נראה שכשהטקסט קצר יותר: RL יעיל מספיק ומצליח לדחוף את המודל תוך זמן סביר לכיוון הנכון. יכול להיות שאם היתי משאיר את המודל על האש במשך כמה חודשים – הוא היה עובד. לא ניסיתי.
-
מהניסיון שלי: השיטה החלשה: תיוג כמה דוגמאות -> אימון מודל צדדי לצורך תיוג סט גדול מאד של דוגמאות -> אימון רגיל על הדוגמאות המתוייגות. עובדת מצוין! ממש תוך כמה איטרציות המודל לומד את התופעה המבוקשת בצורה מספיק טובה כך שיהיה אפשר לראות אותה בפלט המודל.
-
חסרון בשיטה: המודל לומד רק על סמך הידע שכבר נמצא בתוך אותו המודל (הוא לומד על טקסט שהוא יצר) ולכן אם לא בוצע אימון מספיק איכותי לפני הפעלת השיטה: המודל לא יצליח.
-
חסרון בשיטה: יש לכולנו העדפות שלא תופסות בסקייל גדול כאשר הן מועצמות להרבה מאד דוגמאות. לדוגמה: טקסט ארוך ומסודר נראה "מקצועי" אבל יכול להכיל בדיוק את אותן השטויות. המודל לומד בקלות "לחפור סתם" כמו שChatGPT למד לחפור סתם. מבחינתו בני אדם אוהבים הרבה טקסט (וזה לא נכון).
-
חסרון בשיטה: שתי השיטות רגישות מאד למודל הקטן המתייג את הדאטהסט הגדול: במידה והוא טועה, המודל הגדול ילמד להעצים את הטעויות הללו ונקבל טקסט שבור שמכיל מילים ספציפיות לאחר כמה איטרציות בודדות. (רק דיברטה. רק גרסה 3. רק הכי גדול.)
שחרור ChatGPT – שלב 6
על פי OpenAI המודל בChatGPT הוא המודל החזק יותר המוזכר במאמר שבאמת אומן באמצעות Reinforcement Learning (ומכאן התוצאות החזקות שכולנו רואים).
על פי אותו המידע: המודל הוא המשך האימון.
חשוב להוסיף: בתיעוד ChatGPT כתוב שהמודל אומן Similar לאימון במאמר. כך שיכול להיות שהוא אומן בכל צורה שהי עם כל טריק אפשרי שלא מצוין בשום מקום.
אז מה באמת קרה?
יותר ממה שפירטתי פה: אנחנו עדיין לא יודעים.
מי יודע אם בעוד כמה חודשים נקבל עדכון נוסף שישפוך עוד אור על מודלי השפה של OpenAI..