מדריך: איך לאמן מודל שפה ש"מבין" ולא "משנן"

כולם רואים את ChatGPT עושה טריקים וזורם עם שטויות – בטח כיף לאמן מודלים כאלו!
הם כל כך מתקדמים שאימונם הוא "כמו משחק" – אפשר לאמן אותם לכל מיני שטויות ומשחקים, נראה כיף! נכון?
לא. זה נורא ואיום.
ככל שמודלים הולכים וגדלים, הם משתפרים – וזו בדיוק הבעיה.
אם פעם אימון מודלים על טקסט כלשהו אפשר להם ללכוד את התבניות החוזרות על עצמן בסט האימון מתוך הטקסט – היום מודלים אלו חזקים כל כך שהם לוכדים גם הרבה חלקים מהטקסט שהינו מעדיפים שלא יהיו שם מלכתחילה.
איסוף דאטהסטים לאימון מאסיבי
מודלי ענק עובדים כל כך טוב (בין היתר) בגלל גודלם ובגלל גודל סט האימון עליו הם מאומנים: האימון בדרך כלל מתבצע על דאטהסטים עצומים מה שמאפשר למודלים לפתח הבנה רחבה ועמוקה יותר מאשר מודלים קטנים יותר שאומנו על דאטהסטים קטנים יותר.
הרעיון הכללי הוא "כמה שיותר דאטה = יותר טוב".
דאטהסטים פופולרים מודרנים כוללים לדוגמה: C4 , The Pile , The Bigsicence Roots Corpus ו- OpenWebText הגיעו מרחבי האינטרנט נוקו סודרו ואורגנו על מנת לאפשר אימון נקי ומסודר של מודלי ענק.
מעבר ידני על דאטהסטים עצומים הוא כמעט בלתי אפשרי.
כמה טרהבייט טקסט קראתם במהלך כל החיים?
בשל בעיה זו רבים מדאטהסטים אלו מגיעים עם בעיות איכות ולכך יש השלכות רבות שלפעמים אינן מתבטעות במדדים הסטנדרטים (כמו לוס או Perplexity) מכיוון שמדדים אלו מודדים את איכות המודל על אותן הטעויות בדאטה.
אנחנו לא מסכימים מה היא טעות
אם כל זה אינו מספיק: אנו לא מסכימים מה היא "טעות".
חיפוש קצר באינטרנט בימים האחרונים יראה כי העדכון האחרון שבוצע לChatGPT הכיל גם עדכון לBias המובנה במודל ויש היגידו "קצת יותר מידי". יתרה מזאת: ישנן כמה קבוצות באינטרנט המחפשות אקטיבית חולשות בChatGPT כל הזמן, חולשות אלו נראה שלא רק כי "מבטלות את ההגנה" של המודל – הן הופכות אותו למסוכן במיוחד.
אני חייב לאמר שאני לא מבין למה המלחמה הזו בכלל צריכה להתרחש: אם איננו רוצים שמודל מסוים ידע איך לכתוב מדריך ליצור פצצות (לדוגמה), במקום לנסות בכל בכוח לשכנע אותו שאסור לכתוב מדריך כזה (רק כדי שמיד לאחר שחרור המודל יתרסק מול התחכום האנושי הפשוט ביותר) אפשר פשוט מעולם לא לאמן אותו מידע מסוג זה.
אישית, אם ישאלו את המודל שלי "איך לייצר פצצות?" אשמח שבמקום לאמר "יצור פצצות הוא אסור ולכן.." יאמר: "מה זה פצצות?".
אין לנו הבנה כמותית ואיכותית של מה שהולך בדאטהסטים הללו. אם באימון מודלים קלאסי סט נתוני האימון וסט נתוני הוולידציה היו דומים או לפחות מאותו הסוג. במודלי שפה גדולים נתוני האימון הם "סתם טקסט" והבדל זה פותח אתגרים בנוגע לחלוקה נכונה לסט אימון וולידציה וכמו כן גם בניקוי הדאטה לאחר החלוקה.
שלבים בניקוי נתוני טקסט:
- מציאה וטיפול ברעש וזבל
- מחיקת כפילויות
- מחיקת מילים רעילות
- מחיקת מזהים אישיים
- בנית Promptים
נתוני זבל
טקסט הנאסף מהאינטרנט אוטומטי יגיע אלינו כשהוא מכיל גם הרבה זבל ומידע לא מעניין כמו תגיות html שטויות כמו Lorem ipsum או אפילו עמודים רצופים של "\" (בלי לנקוב בשמות)
איסוף טקסט מהאינטרנט היא פעולה קשה ומאתגרת (במיוחד בשפות שאינן אנגלית) ובמקרים רבים תוצאת האיסוף היא טקסט רועש מאד המכיל גם זבל.
ישנם היום כלים [1][2] לאיסוף וניקוי טקסט אוטומטי מהאינטרנט אך גם הם עדיין פועלים בהיוריסטיקות פשוטות שאינן מספיקות לצורך סינון רעש איכותי.
לפני ניקוי ידני ישנן שיטות פשוטות לסינון טקסט שבנויות על שימוש במשמעות הטקסט עצמו – באיסוף טקסט מרדיט נוכל למשל להשתמש בUpvotes כמדד לאיכות הטקסט עצמו ולסנן את המידע בהתאם לפופולריות הפוסט. היוריסטיות פשוטות אלו עוזרות להפחית את כמות הרעש אך אינן מספיקות בדרך כלל ונדרש לעבור על הנתונים עצמם ידנית. כמו כן, באותו הרעיון: הסרת מסמכים קצרים מאוד יכולה לסייע בהסרת רעש ואימון מודל איכותי יותר.
גילוי וסינון טקסטים שנוצרו על ידי מודלים אחרים
מטרת האימון היא ללכוד את הדרך בה בני אדם מתקשרים. אם נאמן את המודל על טקסט שנוצר ממודל אחר, לא עשינו יותר מידי.
בעיה זו הולכת ומחמירה מיום ליום ולא צריך להרחיב מדוע.
איסוף אוטומטי מהאינטרנט ממקומות מסוימים יכיל טקסט רב הנוצר על ידי מודלי שפה, למשל: טקסט מ-patents.google.com הנמצא בחלק גדול מקורפוס C4. נעשה שימוש בתרגום אוטומטי על מנת לתרגם פטנטים ממשרדי פטנטים ברחבי העולם לאנגלית. כמו כן, באימון מודלי שפה על ספרים קיימת בעיה דומה: מערכות התמלול של ספרים אלו מבוססות על מודלי OCR. ומערכות אלו מייצרות טקסט המתפלג שונה מאנגלית אנושית ולעיתים קרובות מערכות אלו טועות בדרכים צפויות למשל שגיאות כתיב או מילים שלמות שהתפספסו.
ישנם היום כמה כלים לזיהוי אוטומטי של טקסט הנוצר על ידי מכונה אך באופן מפתיע נראה כי הבעיה פשוטה במיוחד והמודלים הפשוטים ביותר לזיהוי טקסט לא אנושי מגיעים לדיוק רב ללא יותר מידי מאמץ.
מחיקת כפילויות
בעיה זו היא הבעיה העיקרית בניקוי טקסט, כפילויות קשות מאד לגילוי בטקסט חופשי בגלל סיבוכיות החיפוש ובמקרים רבים "כמעט כפילויות" מצליחות להתחמק ולהכנס לסט הנתונים.
דאטהסטים חופשיים הנאספו מהאינטרנט מכילים בדרך כלל גם רצפי טקסט החוזרים על עצמם פעמים רבות, במאמרים בנושא [3] גילו למשל שישנו רצף טקסט באורך 50 מילים החוזר על עצמו 60,000 פעם בדאטהסט C4.
למקרה ולא קראתם את הפוסט על מאמרי אנטרופיק: טקסט משוכפל הורס לחלוטין את המודל. לא מכיוון שהמודל לומד לחזור על הטקסט עצמו – טקסט משוכפל משנה את היצוג אותו לומדות משקולות המודל וגורם להן ללמוד "לשנן" את הטקסט הספציפי, פעולת שינון זו "מבזבזת" משקולות משמעותית יותר מלימוד מאפייני הטקסט אותו לומדות המשקולות באימון איכותי.
יתרה מזאת, טקסט משוכפל במהלך האימון משפיע על הטקסט הנוצר מהמודל באופן סופרלינארי [4] – במאמר בנושא גילו החוקרים כי טקסט המשוכפל 10 פעמים בסט האימון מופיע פי 1000 יותר פעמים בטקסט אותו יותר המודל לאחר האימון.
איך מוחקים טקסט משוכפל?
השאלה היא באיזו רזולוצית שכפול אתם לבדוק לעבוד? אפשר למחוק רצפי מילים באורך מסוים, אפשר למחוק רצפי "כמעט מילים" אפשר למחוק אפילו משפטים בעלי ניסוח שונה ובעלי אותה המשמעות (חיפוש אמבדינגס). ישנם כלים [5][6] שונים לעשות זאת והבחירה היא שלכם.
מדידת הסקת המסקנות של המודל
על זליגת נתונים לסט הוולידציה
כולם מבינים שזליגת נתונים לסט הולידציה היא אסון בכל תחומי למידת המכונה. כל דוגמה הקשורה "יותר מידי" לסט האימון הורסת דרמטית את המודל הסופי.
בהפרדת נתונים קלאסית – הבעיה אמנם לא תמיד קלה אך גם לא תמיד יותר מידי קשה. במקרים רבים חלוקה פשוטה מספיקה.
אנו מעוניינים לבדוק את יכולת הסקת המסקנות וההבנה העמוקה של המודל אותו אנו מאמנים, למשל עבור שאלות ותשובות נרצה לשאול את המודל שאלות שאינן ראה בסט האימון ולראות כיצד עונה עליהן וכשמדובר בטקסט – המצב הרבה יותר קשה, משמעות הטקסט משנה – לא ניסוח הטקסט או מאיפה הגיע.
שאלות דומות בניסוח שונה (אותן קשה מאד למצוא מראש) יטו את תוצאות המודל לטובה ויגרמו לאשליה לפיה המודל מוצלח במיוחד כשבמציאות המודל פשוט למד להעתיק ולשנן חלקים מתשובות אחרות ולא להסיק מסקנות "ולהבין" את הטקסט.
על מילים רעילות והטיות
למרות שאנו לא מסכימים על "הדעות" אותן מודלי שפה צריכים ללמוד, רובנו כנראה מסכימים שטכניקות זיהוי "דעות" או "מילים מסוימות" (בדרך כלל מילים רעילות) חשובות במיוחד ללא קשר למטרת האימון הסופית אליה אתם מנסים להגיע.
דעתי האישית: אנשים יעשו מה שהם רוצים ללא קשר לדעתנו על פעולותיהם: בעתיד הקרוב (מאוד) כנראה שאימון מודלים חכמים במיוחד יהפוך להיות נפוץ ונגיש הרבה יותר. ואם למישהו עדיין לא ברור עד כמה באמת יכולות אלו נגישות, להלן עובדה: עוד באוגוסט (הרבה לפני שחרור ChatGPT) אומנו מודלים בגודל 11 מיליארד פרמטרים בפורומים העוסקים ביצירת תוכן אוטומטי באינטרנט ומודלים אלו הם רק המודלים שאנו יודעים עליהם.
בפלטפורמות בהן המשתמשים יכולים לכתוב הכל. הם יכתבו הכל.
דאטהסטים הנאספים מהאינטרנט מלאים בתוכן רעיל, מוטה או פשוט לא קשור לנושא.
מילים רעילות לא קשות למציאה: ישנם קבצי טקסט מוכנים באינטרנט המכילים את כל המילים הרעילות באנגלית שרק אפשר לדמיין ומעבר עליהם בדרך כלל מספר פתרון לא רע בכלל לבעית המילים הרעילות בטקסט.
שלבי סינון כאלה חייבים להתבצע בזהירות רבה תוך מתן תשומת לב למשימה עבורה מאומן המודל, שכן יש סבירות גבוהה שסינון יתר יוביל את המודל למצב בו הוא מסרב להגיב לנושאים רבים (כמו שאנחנו רואים בChatGPT – בסיכום אנטרופיק יש מאמר שמטרתו לתקן זאת).
מחיקת מידע אישי
כמו שהרבה כבר ניסו לבדוק בעבר: GPT-3 יתן לכם בשמחה ססמאות פרטיות לארנקי קריפטו פעילים של אנשים מסכנים שססמאותיהם נמצאו באינטרנט ונכנסו לתוך סט נתוני אימון המודל.
מיותר לציין מדוע הדבר בעיתי. סיסמאות ונתונים אישיים מזהים נמצאים באינטרנט, לפעמים בכוונה אך במקרים רבים בטעות.
מעבר לכך שמדובר בעניין לא חוקי ולא מוסרי נתונים אלו אינם רלוונטים בכלל לצורך משימת אימון המודל ומקשים על הכללת המודל למשימה אותה הוא מאומן לבצע (הם יחודיים ובדרך כלל לא מכילים אינפורמציה הרלוונטית למשימה)
מציאת שמות אוטומטית ניתן לבצע על ידי חיפוש שמות פופולרים באמצעות מילון או תיוג POS של הטקסט. (או Model in the loop ותיוג אנושי)
אימון עם Proptים
מודלי שפה גדולים מבצעים אינטרפולציה לטקסט במרחב הנסתר – הם "עוברים בין טקסטים" שראו הזמן האימון על מנת להחזיר טקסט המתאים ביותר בזמן הפעלתם.
ולכן הם אמנם מאומנים על "סתם טקסט" אך הוספת פרומפטים ודאטה "מתויג" לסט אימוני המודל יגרום לכך שהמודל ידע להגיב נכונה לאותם הפרופמטים עבור מידע אחר (במידה והמודל חזק מספיק).
כלומר, "ישלב בין הטקסטים" במרחב הנסתר. מומלץ הוסיף פרומפטים ומשימות שונות ומשונות (כמה שיותר סוגים יותר טוב, כמה שיותר ניסוחים יותר טוב) בזמן אימון המודל.
רפרנסים:
[1] – כלים לאיסוף וניקוי טקסט אוטומטי מהאינטרנט: https://github.com/miso-belica/jusText
[2] – כלים לאיסוף וניקוי טקסט אוטומטי מהאינטרנט: https://github.com/adbar/trafilatura
[3] – גילוי טקסט משוכפל בנתוני אימון מודל שפה: https://aclanthology.org/2022.acl-long.577/
[4] – טקסט משוכפל הורס מודלי שפה: https://proceedings.mlr.press/v162/kandpal22a.html
[5] – כלים לניקוי טקסט משוכפל: https://github.com/google-research/deduplicate-text-datasets
[6] – כלים לניקוי טקסט משוכפל: https://github.com/ekzhu/datasketch