הגדר פרויקט סיכום טקסט עם מחבקי פנים רובוטריקים: חלק 1

צומת המקור: 1236281

מתי OpenAI הוציאו את הדור השלישי של מודל למידת המכונה שלהם (ML) שמתמחה ביצירת טקסט ביולי 2020, ידעתי שמשהו שונה. הדגם הזה פגע בעצב שכמוהו לא בא לפניו. פתאום שמעתי חברים ועמיתים, שאולי מתעניינים בטכנולוגיה אבל בדרך כלל לא אכפת להם הרבה מההתקדמות העדכנית ביותר בתחום ה-AI/ML, מדברים על זה. אפילו הגרדיאן כתב מאמר בנוגע לזה. או, ליתר דיוק, ה מודל כתב את המאמר והגרדיאן ערך ופרסם אותו. אי אפשר היה להכחיש את זה - GPT-3 היה מחליף משחק.

לאחר שהדגם שוחרר, אנשים התחילו מיד להמציא יישומים פוטנציאליים עבורו. בתוך שבועות נוצרו הדגמות מרשימות רבות, אותן ניתן למצוא ב- אתר GPT-3. יישום אחד מסוים שמשך את עיני היה סיכום טקסט - היכולת של מחשב לקרוא טקסט נתון ולסכם את תוכנו. זוהי אחת המשימות הקשות ביותר למחשב מכיוון שהיא משלבת שני תחומים בתחום עיבוד השפה הטבעית (NLP): הבנת הנקרא ויצירת טקסט. וזו הסיבה שכל כך התרשמתי מהדגמות של GPT-3 לסיכום טקסט.

אתה יכול לנסות אותם על אתר חיבוק פייס ספייס. האהוב עלי כרגע הוא an יישום שיוצר סיכומים של מאמרי חדשות עם כתובת האתר של המאמר כקלט בלבד.

בסדרה זו בת שני חלקים, אני מציעה מדריך מעשי לארגונים כדי שתוכל להעריך את האיכות של מודלים לסיכום טקסט עבור התחום שלך.

סקירת הדרכה

לארגונים רבים שאני עובד איתם (ארגוני צדקה, חברות, ארגונים לא ממשלתיים) יש כמויות עצומות של טקסטים שהם צריכים לקרוא ולסכם - דוחות כספיים או מאמרי חדשות, מאמרי מחקר מדעיים, בקשות לפטנטים, חוזים משפטיים ועוד. מטבע הדברים, ארגונים אלו מעוניינים לבצע אוטומציה של משימות אלו באמצעות טכנולוגיית NLP. כדי להדגים את אמנות האפשרי, אני מרבה להשתמש בהדגמות של סיכום טקסט, שכמעט אף פעם לא מצליחות להרשים.

אבל עכשיו מה?

האתגר של ארגונים אלה הוא שהם רוצים להעריך מודלים של סיכום טקסט על סמך סיכומים עבור הרבה מאוד מסמכים - לא אחד בכל פעם. הם לא רוצים להעסיק מתמחה שתפקידו היחיד הוא לפתוח את הבקשה, להדביק מסמך, להקיש על לסכם לחצן, לחכות לפלט, להעריך אם הסיכום טוב, ולעשות זאת שוב עבור אלפי מסמכים.

כתבתי את המדריך הזה עם האני העבר שלי מלפני ארבעה שבועות בראש - זה המדריך שהלוואי שהיה לי אז כשהתחלתי במסע הזה. במובן זה, קהל היעד של המדריך הזה הוא מישהו שמכיר את AI/ML והשתמש בעבר במודלים של Transformer, אך נמצא בתחילת מסע סיכום הטקסט שלו ורוצה לצלול לתוכו עמוק יותר. מכיוון שהוא נכתב על ידי "מתחיל" ולמתחילים, אני רוצה להדגיש את העובדה שהמדריך הזה הוא a מדריך מעשי - לא מה היא מדריך מעשי. בבקשה תתייחס לזה כאילו ג'ורג' EP Box אמר:

במונחים של כמה ידע טכני נדרש במדריך הזה: זה אמנם כרוך בקידוד מסוים ב-Python, אבל רוב הזמן אנחנו פשוט משתמשים בקוד כדי לקרוא לממשקי API, כך שגם לא נדרש ידע בקידוד עמוק. זה מועיל להכיר מושגים מסוימים של ML, כמו מה זה אומר רכבת ו לפרוס מודל, המושגים של הַדְרָכָה, אימות, ו מערכי נתונים לבדיקה, וכולי. גם לאחר התעסקות עם ספריית רובוטריקים לפני עשוי להיות שימושי, מכיוון שאנו משתמשים בספרייה זו באופן נרחב לאורך המדריך הזה. אני כולל גם קישורים שימושיים לקריאה נוספת עבור מושגים אלה.

מכיוון שהמדריך הזה נכתב על ידי מתחיל, אני לא מצפה שמומחי NLP ומתרגלי למידה עמוקה מתקדמים יקבלו הרבה מהמדריך הזה. לפחות לא מנקודת מבט טכנית - אולי אתה עדיין תהנה מהקריאה, אז בבקשה אל תעזוב עדיין! אבל תצטרכו להתאזר בסבלנות לגבי הפשטות שלי - ניסיתי לחיות לפי הרעיון להפוך את הכל במדריך הזה לפשוט ככל האפשר, אבל לא יותר פשוט.

מבנה הדרכה זו

סדרה זו משתרעת על פני ארבעה חלקים המחולקים לשני פוסטים, בהם אנו עוברים שלבים שונים של פרויקט סיכום טקסט. בפוסט הראשון (סעיף 1), אנו מתחילים בהכנסת מדד למשימות סיכום טקסט – מדד ביצועים המאפשר לנו להעריך האם סיכום טוב או רע. אנו מציגים גם את מערך הנתונים שאנו רוצים לסכם וליצור קו בסיס באמצעות מודל ללא ML - אנו משתמשים ביוריסטיקה פשוטה כדי ליצור סיכום מטקסט נתון. יצירת קו הבסיס הזה הוא שלב חשוב ביותר בכל פרויקט ML מכיוון שהוא מאפשר לנו לכמת את מידת ההתקדמות שאנו עושים באמצעות שימוש בבינה מלאכותית קדימה. זה מאפשר לנו לענות על השאלה "האם באמת כדאי להשקיע בטכנולוגיית AI?"

בפוסט השני, אנו משתמשים במודל שכבר הוכשר מראש להפקת סיכומים (סעיף 2). זה אפשרי עם גישה מודרנית ב-ML שנקראת העברת למידה. זה עוד שלב שימושי כי אנחנו בעצם לוקחים מודל מדף ובודקים אותו במערך הנתונים שלנו. זה מאפשר לנו ליצור קו בסיס נוסף, שעוזר לנו לראות מה קורה כאשר אנו מאמנים בפועל את המודל במערך הנתונים שלנו. הגישה נקראת סיכום זריקת אפס, מכיוון שלמודל הייתה חשיפה אפסית למערך הנתונים שלנו.

לאחר מכן, הגיע הזמן להשתמש במודל שהוכשר מראש ולאמן אותו במערך הנתונים שלנו (סעיף 3). זה נקרא גם כוונון עדין. זה מאפשר למודל ללמוד מהדפוסים והאידיוסינקרטיות של הנתונים שלנו ולהסתגל אליהם לאט. לאחר שנכשיר את המודל, אנו משתמשים בו ליצירת סיכומים (סעיף 4).

לסיכום:

  • חלק 1:
    • סעיף 1: השתמש במודל ללא ML כדי לקבוע קו בסיס
  • חלק 2:
    • סעיף 2: צור סיכומים עם מודל של זריקת אפס
    • סעיף 3: אימון מודל סיכום
    • סעיף 4: הערך את המודל המאומן

הקוד המלא של הדרכה זו זמין בהמשך GitHub ריפו.

מה נשיג עד סוף המדריך הזה?

בסוף המדריך הזה, אנחנו לא יש מודל סיכום טקסט שניתן להשתמש בו בייצור. אפילו לא יהיה לנו א טוב מודל סיכום (הכנס כאן אימוג'י צעקה)!

מה שיהיה לנו במקום זאת נקודת התחלה לשלב הבא של הפרויקט, שהוא שלב הניסויים. כאן נכנס לתמונה ה"מדע" במדעי הנתונים, כי עכשיו הכל עניין של התנסות במודלים שונים ובהגדרות שונות כדי להבין האם ניתן לאמן מודל סיכום טוב מספיק עם נתוני האימון הזמינים.

וכדי להיות שקוף לחלוטין, יש סיכוי טוב שהמסקנה תהיה שהטכנולוגיה פשוט לא בשלה עדיין ושהפרויקט לא ייצא לפועל. ואתה צריך להכין את בעלי העניין העסקיים שלך לאפשרות הזו. אבל זה נושא לפוסט אחר.

סעיף 1: השתמש במודל ללא ML כדי לקבוע קו בסיס

זהו החלק הראשון של המדריך שלנו על הקמת פרויקט סיכום טקסט. בחלק זה, אנו קובעים קו בסיס באמצעות מודל פשוט מאוד, מבלי להשתמש בפועל ב-ML. זהו שלב חשוב מאוד בכל פרויקט ML, מכיוון שהוא מאפשר לנו להבין כמה ערך מוסף ML לאורך זמן הפרויקט והאם כדאי להשקיע בו.

את הקוד להדרכה ניתן למצוא בהמשך GitHub ריפו.

נתונים, נתונים, נתונים

כל פרויקט ML מתחיל בנתונים! במידת האפשר, עלינו תמיד להשתמש בנתונים הקשורים למה שאנו רוצים להשיג עם פרויקט סיכום טקסט. לדוגמה, אם המטרה שלנו היא לסכם בקשות פטנט, עלינו להשתמש גם בבקשות פטנט כדי להכשיר את המודל. אזהרה גדולה עבור פרויקט ML היא שבדרך כלל יש צורך לתייג את נתוני ההדרכה. בהקשר של סיכום טקסט, זה אומר שעלינו לספק את הטקסט שיש לסכם כמו גם את הסיכום (התווית). רק על ידי מתן שניהם יכול המודל ללמוד איך נראה סיכום טוב.

במדריך זה, אנו משתמשים במערך נתונים זמין לציבור, אך השלבים והקוד נשארים זהים לחלוטין אם אנו משתמשים במערך נתונים מותאם אישית או פרטי. ושוב, אם יש לך מטרה למודל סיכום הטקסט שלך ויש לך נתונים מתאימים, אנא השתמש בנתונים שלך במקום זאת כדי להפיק את המרב מזה.

הנתונים שבהם אנו משתמשים הם מערך הנתונים של arXiv, המכיל תקצירים של מאמרי arXiv וכן את הכותרות שלהם. לענייננו, אנו משתמשים בתקציר כטקסט שאנו רוצים לסכם ובכותרת כתקציר ההתייחסות. כל שלבי ההורדה והעיבוד המקדים של הנתונים זמינים בהמשך מחברה. אנו דורשים א AWS זהות וניהול גישה תפקיד (IAM) המאפשר טעינת נתונים אל וממנו שירות אחסון פשוט של אמזון (Amazon S3) על מנת להפעיל את המחברת הזו בהצלחה. מערך הנתונים פותח כחלק מהמאמר על השימוש ב-ArXiv כמערך נתונים והוא מורשה תחת ה Creative Commons CC0 1.0 הקדשה לתחום ציבורי אוניברסלי.

הנתונים מחולקים לשלושה מערכי נתונים: הדרכה, אימות ונתוני בדיקה. אם אתה רוצה להשתמש בנתונים שלך, ודא שזה גם המקרה. התרשים הבא ממחיש כיצד אנו משתמשים במערך הנתונים השונים.

באופן טבעי, שאלה נפוצה בשלב זה היא: כמה נתונים אנחנו צריכים? כפי שאתם בטח כבר יכולים לנחש, התשובה היא: זה תלוי. זה תלוי עד כמה התחום מתמחה (סיכום בקשות לפטנט שונה לגמרי מסיכום כתבות חדשותיות), עד כמה המודל צריך להיות מדויק כדי להיות שימושי, כמה צריכה לעלות ההכשרה של המודל וכו'. אנו חוזרים לשאלה זו בשלב מאוחר יותר כאשר אנו מאמנים את המודל בפועל, אך הקצר הוא שעלינו לנסות גדלי נתונים שונים כאשר אנו בשלב הניסוי של הפרויקט.

מה עושה דוגמנית טובה?

בפרויקטים רבים של ML, זה די פשוט למדוד את הביצועים של מודל. הסיבה לכך היא שבדרך כלל יש מעט אי בהירות אם התוצאה של המודל נכונה. התוויות במערך הנתונים הן לרוב בינאריות (True/False, Yes/No) או קטגוריות. בכל מקרה, קל בתרחיש זה להשוות את הפלט של הדגם לתווית ולסמן אותו כנכון או לא נכון.

בעת יצירת טקסט, זה הופך למאתגר יותר. הסיכומים (התוויות) שאנו מספקים במערך הנתונים שלנו הם רק דרך אחת לסכם טקסט. אבל יש הרבה אפשרויות לסכם טקסט נתון. לכן, גם אם הדגם אינו תואם את התווית שלנו 1:1, הפלט עדיין עשוי להיות סיכום חוקי ושימושי. אז איך נשווה את סיכום המודל לזה שאנו מספקים? המדד המשמש לרוב בסיכום טקסט כדי למדוד את האיכות של מודל הוא ציון ROUGE. כדי להבין את המכניקה של מדד זה, עיין ב מדד הביצועים האולטימטיבי ב-NLP. לסיכום, ציון ROUGE מודד את החפיפה של n- גרם (רצף רציף של n פריטים) בין סיכום המודל (סיכום מועמד) לבין סיכום ההתייחסות (התווית שאנו מספקים במערך הנתונים שלנו). אבל, כמובן, זה לא מדד מושלם. כדי להבין את המגבלות שלו, בדוק ROUGE או לא ROUGE?

אז איך אנחנו מחשבים את ציון ROUGE? יש שם לא מעט חבילות Python לחישוב המדד הזה. כדי להבטיח עקביות, עלינו להשתמש באותה שיטה לאורך כל הפרויקט שלנו. מכיוון שבשלב מאוחר יותר במדריך זה, נשתמש בסקריפט הדרכה מספריית הרובוטריקים במקום לכתוב משלנו, נוכל פשוט להציץ לתוך קוד מקור של הסקריפט והעתק את הקוד שמחשב את ציון ROUGE:

from datasets import load_metric
metric = load_metric("rouge") def calc_rouge_scores(candidates, references): result = metric.compute(predictions=candidates, references=references, use_stemmer=True) result = {key: round(value.mid.fmeasure * 100, 1) for key, value in result.items()} return result

על ידי שימוש בשיטה זו לחישוב הציון, אנו מבטיחים שתמיד נשווה בין תפוחים לתפוחים לאורך כל הפרויקט.

פונקציה זו מחשבת מספר ציוני ROUGE: rouge1, rouge2, rougeL, ו rougeLsum. ה"סכום" ב rougeLsum מתייחס לעובדה שמדד זה מחושב על פני סיכום שלם, ואילו rougeL מחושב כממוצע על פני משפטים בודדים. אז באיזה ציון ROUGE עלינו להשתמש עבור הפרויקט שלנו? שוב, עלינו לנסות גישות שונות בשלב הניסויים. בשביל מה שזה שווה, ה נייר ROUGE מקורי קובע כי "ROUGE-2 ו-ROUGE-L עבדו היטב במשימות סיכום מסמך בודד" בעוד "ROUGE-1 ו-ROUGE-L מבצעים ביצועים מצוינים בהערכת סיכומים קצרים."

צור את קו הבסיס

בשלב הבא אנחנו רוצים ליצור את קו הבסיס על ידי שימוש במודל פשוט ללא ML. מה זה אומר? בתחום סיכום הטקסט, מחקרים רבים משתמשים בגישה פשוטה מאוד: הם נוקטים בראשונה n משפטים של הטקסט ולהכריז עליו כסיכום המועמד. לאחר מכן הם משווים את סיכום המועמד עם סיכום ההתייחסות ומחשבים את הציון ROUGE. זוהי גישה פשוטה אך רבת עוצמה שאנו יכולים ליישם בכמה שורות קוד (הקוד כולו עבור חלק זה נמצא בחלק הבא מחברה):

import re ref_summaries = list(df_test['summary']) for i in range (3): candidate_summaries = list(df_test['text'].apply(lambda x: ' '.join(re.split(r'(?<=[.:;])s', x)[:i+1]))) print(f"First {i+1} senctences: Scores {calc_rouge_scores(candidate_summaries, ref_summaries)}")

אנו משתמשים במערך הנתונים של הבדיקה לצורך הערכה זו. זה הגיוני מכיוון שאחרי שאנו מאמנים את המודל, אנו משתמשים גם באותו מערך נתונים לבדיקה עבור ההערכה הסופית. אנחנו גם מנסים מספרים שונים עבור n: מתחילים רק במשפט הראשון בתור סיכום המועמד, לאחר מכן בשני המשפטים הראשונים, ולבסוף בשלושת המשפטים הראשונים.

צילום המסך הבא מציג את התוצאות עבור הדגם הראשון שלנו.

ציוני ROUGE הם הגבוהים ביותר, כאשר רק המשפט הראשון הוא סיכום המועמד. משמעות הדבר היא שלקיחת יותר ממשפט אחד הופכת את הסיכום למילולי מדי ומובילה לציון נמוך יותר. אז זה אומר שנשתמש בציונים עבור סיכומים של משפט אחד בתור הבסיס שלנו.

חשוב לציין שעבור גישה כל כך פשוטה, המספרים האלה הם למעשה די טובים, במיוחד עבור ה rouge1 ציון. כדי לשים את המספרים האלה בהקשר, אנחנו יכולים להתייחס אליהם דגמי פגסוס, המציג את הציונים של מודל חדיש עבור מערכי נתונים שונים.

מסקנה ומה הלאה

בחלק 1 של הסדרה שלנו, הצגנו את מערך הנתונים בו אנו משתמשים במהלך פרויקט הסיכום וכן מדד להערכת סיכומים. לאחר מכן יצרנו את קו הבסיס הבא עם מודל פשוט ללא ML.

ב הפוסט הבא, אנו משתמשים במודל זריקת אפס - ספציפית, מודל שעבר הכשרה ספציפית לסיכום טקסט על מאמרי חדשות ציבוריים. עם זאת, מודל זה לא יאומן כלל במערך הנתונים שלנו (ומכאן השם "זריקת אפס").

אני משאיר לכם כשיעורי בית לנחש כיצד יתפקד דגם ה-XNUMX-shot הזה בהשוואה לקו הבסיס המאוד פשוט שלנו. מצד אחד, זה יהיה מודל הרבה יותר מתוחכם (זו בעצם רשת עצבית). מצד שני, הוא משמש רק לסיכום מאמרי חדשות, כך שהוא עלול להיאבק בדפוסים הטבועים במערך הנתונים של arXiv.


על המחבר

הייקו הוץ הוא ארכיטקט פתרונות בכיר עבור AI ולמידת מכונה ומוביל את קהילת עיבוד השפה הטבעית (NLP) בתוך AWS. לפני תפקיד זה, הוא היה ראש מדעי הנתונים של שירות הלקוחות של אמזון באיחוד האירופי. Heiko עוזרת ללקוחותינו להצליח במסע AI/ML שלהם ב-AWS ועבדה עם ארגונים בתעשיות רבות, כולל ביטוח, שירותים פיננסיים, מדיה ובידור, שירותי בריאות, שירותים וייצור. בזמנו הפנוי הייקו נוסע כמה שיותר.

בול זמן:

עוד מ למידת מכונות AWS