בתחילת השנה OpenAI הכריזה על GPT-2, מודל שפה שפיתחה שמסוגל לג׳נרט (לחולל) טקסט שנראה כאילו נכתב ע״י אנשים. בעוד שבדרך כלל הכרזות כאלה מלוות בשחרור של מודל מאומן, OpenAI בחרו שלא לפרסם את המודל שלהם בטענה שהמודל ״מסוכן מדי״ ועלול לשמש לייצור של פייק ניוז. המהלך גרר ביקורת בטענה שהמטרה הייתה יחצ״נות למודל (אכן, הרשת דיווחה על המודל בהגזמה, כפי שבדרך כלל קורה), אך גם עורר דיונים מעניינים באתיקה ובאחריות של המפתחים לשימוש לרעה במודל שפיתחו. המודל המלא שוחרר לבסוף רק לאחרונה, כחצי שנה לאחר הפרסום. ברשומה זו אדבר על ג׳נרוט אוטומטי (generation) של טקסטים באמצעות מודלי שפה – איך מודלים כאלה מאומנים, איך משתמשים בהם לג׳נרט טקסט, והאם הם באמת מסוכנים?
מה זה מודל שפה?
מודל שפה הוא פונקציה המקבלת כקלט טקסט ומחזירה את ההתפלגות למילה[1] הבאה עפ״י כל המילים במילון. השימוש הכי מוכר ואינטואיטיבי של מודל שפה הוא השלמה אוטומטית, שמציעה את המילה או המילים הכי סבירות בהינתן מה שהמשתמש הקליד עד כה. מודל שפה טוב יתן הסתברות גבוהה למשפטים תחביריים (״מה אתה _״ ייתן הסתברות גבוהה לפעלים) ולמשפטים יותר הגיוניים מבחינת משמעות (״אני עייפה, אני רוצה _״ ישלים ״לישון״ לעומת ״אני רעבה, אני רוצה _״ שישלים ״לאכול״).
למה כולם מדברים פתאום על מודלי שפה?
הסיבה שכולם מדברים בשנה האחרונה על מודלי שפה היא לאו דווקא בגלל השימוש בהם לייצור טקסט חדש, אלא בעיקר בגלל השימוש בהם לייצוג טקסט קיים. עד לא מזמן, היה מקובל להשתמש בווקטורי מילים מאומנים מראש כדי לייצג את המילים בטקסט, במקום ללמוד אותם מאפס רק מהדאטה (המועט יחסית) של המשימה הספציפית. בשנה האחרונה מספר קבוצות מחקר גדולות שחררו מודלי שפה שאומנו על הרבה מאוד טקסט והראו כי ניתן להשתמש בהם כדי לייצג טקסט בייצוג ווקטורי. בניגוד לווקטורי מילים סטטיים, מודלי שפה מחשבים ווקטור דינמי לכל מילה כפונקציה של ההקשר בו הוא מופיע, מה שמאפשר לתת ייצוג שונה למילים רבות משמעות בהקשרים שונים. שימוש במודלי השפה מאומנים מראש במקום בווקטורי מילים מאומנים מראש שיפר את הביצועים באופן דרמטי במשימות NLP רבות, ורוב מודלי ה-NLP (בעיקר לשפות עם הרבה דאטה, כמו אנגלית) מבוססים היום עליהם. ברשומה הזו אנחנו מתמקדים דווקא בג׳נרוט טקסט, וספציפית, ג׳נרוט טקסט פתוח שאינו ״תרגום״ של קלט כלשהו (כמו בתרגום בין שפות, תמצות אוטומטי, תמלול של אודיו, וכו׳). כדי להשפיע על הנושא של הטקסט שהמודל מייצר, בדרך כלל מתנים את הג׳נרוט במשפט או פסקה קצרה בנושא הזה.
איך מג׳נרטים טקסט?
בהנחה שיש ברשותנו מודל שפה מאומן, איך מג׳נרטים באמצעותו טקסט? נניח שנתון לנו טקסט התחלתי w1 … wn (הטקסט ההתחלתי לא הכרחי, לצורך העניין n יכול להיות אפס). תהליך הג׳נרוט מתבצע מילה-מילה: מייצרים את המילה ה-n+1 כתלות ב-n המילים הקודמות, ואז את המילה ה-n+2 כתלות ב-n+1 המילים הקודמות (הטקסט ההתחלתי והטקסט שהמודל ג׳נרט) וכן הלאה. איך ״מג׳נרטים״ מילה?
הדרך הכי פשוטה היא האלגוריתם החמדני שבוחר את המילה הכי סבירה בהינתן הטקסט שקדם לה, בדיוק כמו בהשלמה אוטומטית. הצרה היא שהטקסט שנוצר בשיטה הזו הוא משעמם ומכיל בעיקר מילים וביטויים נפוצים. בפרט, הוא שונה מטקסט שאנשים מייצרים: לפי עקרון שיתוף הפעולה של גרייס, אנשים דווקא נוטים לומר את הפחות מובן מאליו ואת מה שמוסיף אינפורמציה למאזין.
האלטרנטיבה היא לדגום את המילה הבאה באופן פרופורציונלי להתפלגות שמשרה הטקסט. בשיטה הזו הטקסט מגוון יותר, אבל נוטה לפעמים להיות ״מגוון מדי״ או במילים פחות עדינות לג׳נרט זבל. הסיבה שזה קורה היא שלכל מילה במילון, כולל המילים הנדירות ואלה שסתם לא מתאימות בהקשר, קיימת הסתברות כלשהי, לרוב גדולה מאפס (גם אם מאוד קטנה) להיבחר. ברגע שנבחרה מילה כזו, המילה הבאה תלויה בה וכך הטקסט מתדרדר.
הפתרון הפשוט הוא שילוב של שתי הגישות: ראשית בוחרים את k המילים הכי סבירות (עבור קבוע כלשהו k) ואז דוגמים מביניהן. k גדול יהיה דומה יותר לדגימה מכל ההתפלגות בעוד ש-k קטן יהיה קרוב יותר לאלגוריתם החמדני. לחילופין, אפשר לקחת את המילים הכי סבירות שמסת ההסתברות שלהם מסתכמת בלכל היותר p (עבור קבוע p בין 0 ל-1) ולדגום מהן. גם כאן p קטן דומה לאלגוריתם חמדני ו-p גדול לדגימה מכל ההתפלגות. השיטה הזו נותנת יותר גמישות בכך שמס׳ המילים מהן דוגמים משתנה לפי ההקשר. יש הקשרים שבהן מעט מאוד מילים מתאימות (״אני עייפה, אני רוצה _״) לעומת הקשרים הרבה יותר כלליים (״אני _״).
לקוראים הטכניים יותר, תוכלו להציץ על דוגמאות קוד של האלגוריתם החמדני, דגימה מכל ההתפלגות, ודגימה מ–k המילים הכי סבירות. תוכלו לנסות את הקוד בקלות עם דוגמת צעצוע למודל שפה.
איך מאמנים מודל שפה?
שימו לב שאנחנו מדברים ספציפית על מודל שפה מבוסס רשתות נוירונים. מודל שפה מאומן באופן עצמוני (״self-supervised״), והדאטה שהוא צריך עבור האימון הוא פשוט קורפוס טקסט (למשל, כל וויקיפדיה). בזמן האימון, עוברים על הקורפוס משפט-משפט. עבור משפט נתון w1 … wn, ועבור כל מילה במשפט wi, המודל מנסה לחזות את wi בהינתן ההקשר (במודל פשוט ההקשר יהיה התחילית w1 … wi-1) ומעדכנים את הפרמטרים של המודל בהתאם.[2]
לצורך החיזוי, התחילית מקודדת לייצוג ווקטורי. המקודד (encoder) מקבל כקלט ווקטורי מילים של רצף מילים ומחזיר ווקטור המייצג את הרצף. המקודד יכול להיות מבוסס רשתות נוירונים רקורסיביות (RNN), או Transformer שמתבסס רק על מנגנון ה-Attention. הווקטור המייצג את הרצף נכנס למסווג שמחזיר ווקטור באורך אוצר המילים (גודל המילון), המייצג את ההתפלגות על המילה הבאה. כך תיראה ארכיטקטורת רשת של מודל שפה מבוסס RNN:
ארכיטקטורות שונות
ישנן מודלי שפה שפונקציית העלות שלהם שונה. למשל, BERT של גוגל מאומן לחזות מילים רנדומליות מתוך המשפט שהוחלפו ב״מסכה״, והוא דו-כיווני, כלומר הוא מסתמך גם על מילים שהופיעו אחרי המסכה. עם זאת, בגלל הדרך שבה אומן, BERT לא מאפשר לג׳נרט טקסט אלא רק לייצג טקסט קיים. מאידך, קיימים מודלים אחרים לג׳נרוט טקסט שאינם מודלי שפה. דוגמה לכך היא מודלים מבוססי GAN, בהם ה-Generator מייצר טקסט ותפקידו של ה-Discriminator לזהות שמדובר בטקסט מיוצר ולא ״אמיתי״. על אף ההצלחה האדירה של GANים על תמונות ווידאו, ההצלחה שלו על טקסט נכון לעכשיו יחסית מוגבלת, כנראה בגלל שבניגוד לוידאו ותמונות, טקסט הוא בדיד. ספציפית, מודלים מבוססי GAN כרגע פחות מוצלחים בג׳נרוט טקסט מאשר מודלי שפה.
איך מודדים את האיכות של מודל לג׳נרוט טקסט?
במשימות סיווג ניתן להפיק מספר בודד שמודד את רמת ההצלחה של המודל (למשל הדיוק שלו על סט הבדיקה), ולהשוות בין המדדים של מודלים שונים. במקרה של ג׳נרוט טקסט אין לנו פלט צפוי, מה שהופך את האבלואציה של מודלים כאלה ליותר מורכבת. בעיקר כשמדובר על ג׳נרוט טקסט ״פתוח״ לעומת תרגום, סט הבדיקה הוא פשוט אוסף של טקסטים שהמודל לא התאמן עליהם. האינדיקציה היחידה שהמודל איכותי, חוץ מאבלואציה ידנית יקרה, היא שהוא מייצר טקסט דומה לטקסט בסט הבדיקה מבחינת הסגנון (בין היתר, שהוא למד את התחביר, ואולי גם את הנושא, אם קורפוס האימון בדומיין מסוים). המדד המקובל להערכת מודלים לג׳נרוט טקסט הוא perplexity, שמודד עד כמה סביר לג׳נרט את סט הבדיקה ע״י מודל השפה (ככל שהוא נמוך יותר, המודל טוב יותר). ההסתברות של סט הבדיקה מחושבת ע״י מעבר מילה-מילה וחישוב ההסתברות לג׳נרט כל מילה במודל השפה בהינתן המילים שקדמו לה. מודל שפה טוב יתן הסתברות גבוהה למילה ה״נכונה״ (המילה שהופיעה בפועל) והסתברות נמוכה למילים אחרות.
למרות השימוש הרווח ב-perplexity, המדד אינו חף מביקורת. בפועל, הוא לא מהווה אינדיקציה טובה להצלחה במשימות קצה. בנוסף, הוא מדד הסתברותי וככזה הוא יכול למדוד את האיכות רק של מודלים הסתברותיים (מודלים שהפלט שלהם הוא התפלגות).
אז… יש לנו ממה לחשוש?
בגדול, תמיד יש ממה לחשוש, אבל החשש שלי בדרך כלל מופנה לאנשים ולשימוש הרע שהם יכולים לעשות בכלים טכנולוגיים, ופחות להפחדות סטייל ״הרובוטים יפתחו מודעות ויהרסו את האנושות״. ספציפית בתחום ג׳נרוט טקסטים, החשש שהועלה בהכרזה של OpenAI בתחילת השנה היה מפני ייצור נרחב של פייק ניוז. אף על פי שזה לא לגמרי מופרך, כרגע ישנן מגבלות בג׳נרוט טקסט שמרחיקות את חלום הבלהות הזה.
למודלים אין אג׳נדה
כשאנשים מייצרים פייק ניוז, הם עושים את זה עם מטרה – בדר״כ לקדם תעמולה מסוימת או להכניס תעבורה לאתר שלהם כדי להרוויח מפרסום מקוון. בניגוד לאנשים, למודלי שפה אין אג׳נדה. רוב מודלי השפה היום נבנו כך שניתן לג׳נרט באמצעותם טקסט שנראה אמין ואנושי. מעט מאוד מודלים היום בכלל מסוגלים לג׳נרט טקסט מותנה בסגנון או שמצופה ממנו להגיע לאיזושהי פואנטה.
טקסט מג׳ונרט שונה מטקסט אנושי
אחד המודלים הבודדים שמסוגלים לג׳נרט טקסט מבוקר הוא גרובר, שנבנה לג׳נרוט של פייק ניוז מותנה בפרמטרים של תאריך, עיתון, עיתונאי, וכותרת. אמנם השימוש לרעה במודל די ברור מאליו, אך הג׳נרטור של גרובר פותח יחד עם מסווג שיודע להבדיל בדיוק של למעלה מ-90% בין חדשות אמיתיות למג׳ונרטות. הוא למד לזהות את ההבדלים הקטנים בסגנון שבין טקסט שנכתב ע״י אנשים וכזה שנכתב ע״י מכונה, והוא מצליח לזהות גם טקסט שג׳ונרט ע״י מודל גנרטיבי אחר (למשל GPT). וזוהי בדיוק החולשה השנייה של מודלי שפה כיום – הטקסט שהם מג׳נרטים הוא לא ממש אנושי, רק ליד.
נכון, טקסט מג׳ונרט היום הוא תחבירי ומצליח ברוב המקרים לא לסטות מהנושא, וזה כשלעצמו מרשים. אבל הוא לא מודע לעובדות (ראו מאמר עם השם המשעשע Barack‘s Wife Hillary), יש לו מעט מאוד הגיון וידע עולם, ולרוב נקרא קצת ״לא אנושי״ (גם אם אנחנו לא יודעים להסביר מה בדיוק הופך אותו לכזה). גם כשאנחנו נופלים בפח, ישנם מודלים שיכולים בדיוק גבוה מאוד לומר שהטקסט ג׳ונרט ולא נכתב ע״י אדם.
הפחד מדיסאינפורמציה הוא מוצדק, אבל לפחות כרגע, אני יותר מוטרדת מהאנשים המעורבים בדיסאינפורמציה: אלה שיוצרים אותה, אלה שמפיצים אותה בכוונה רעה, ובמיוחד אלה שמפיצים אותה מתוך בורות ונאיביות. אולי כדאי שבמקביל לפיתוח הטכנולוגיות בעלות המטרות המנוגדות של לייצר ולזהות דיסאינפורמציה, נתחיל גם ללמד אנשים לחשוב באופן יותר ביקורתי.
קריאה נוספת:
Text Generation (אותה הכתבה באנגלית, מהבלוג שלי)
[1] רוב מודלי השפה היום לא מבוססי מילה אלא תו או רצפי תווים (חלקי מילה). לצורך פשטות, ברשומה זו נעסוק במודל שפה מבוסס מילה.
[2] חדי האבחנה מביניכם בוודאי ישימו לב שבניגוד להרבה משימות סיווג אחרות, בשפה בדר״כ אין תשובה אחת נכונה וניתן להשלים את המשפט ביותר מדרך אחרת. כלומר, באופן אופטימלי לא היינו רוצים להעניש את המודל על שחזה מילה לא נכונה אם היא מתאימה בהקשר. אכן, ישנה עבודה על חיזוי של ווקטורי מילים במקום התפלגות על המילון.