כיצד לאמן דגם BERT מאפס

צומת המקור: 1013329

כיצד לאמן דגם BERT מאפס

הכירו את בן דודו האיטלקי של BERT, FiliBERTo.


By ג'יימס בריגס, מדען נתונים



BERT, אבל באיטליה - תמונה מאת מחבר

 

רבים מהמאמרים שלי התמקדו ב-BERT - המודל שהגיע ושלט בעולם עיבוד השפה הטבעית (NLP) וסימן עידן חדש למודלים של שפה.

לאלו מכם שאולי לא השתמשו בדגמי שנאים (למשל מה זה BERT), התהליך נראה קצת כך:

  • pip install transformers
  • אתחול מודל שנאים מיומן מראש - from_pretrained.
  • בדוק את זה על כמה נתונים.
  • אולי כוונן את הדגם (לאמן אותו עוד קצת).

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

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



כמה הערות על דגמי BERT שאינם אנגלים

 

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

סקירה

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

  • קבלת הנתונים
  • בניית אסימון
  • יצירת צינור קלט
  • הכשרת המודל

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

קבלת הנתונים

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



הדרכה וידאו להורדת מערך הנתונים של OSCAR באמצעות ספריית מערכי הנתונים של HuggingFace

 

ואם יש דבר אחד שיש לנו הרבה באינטרנט - זה נתוני טקסט לא מובנים.

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

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

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

אז כדי להוריד את הקטע האיטלקי של מערך הנתונים של OSCAR נשתמש ב- HuggingFace datasets ספרייה - איתה נוכל להתקין pip install datasets. לאחר מכן אנו מורידים את OSCAR_IT עם:

בואו נסתכל על dataset אובייקט.

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

אצלנו data/text/oscar_it ספרייה נמצא:


צילום מסך המציג חלון סייר Windows מלא בקבצי .txt — מייצג את נתוני OSCAR בטקסט רגיל
הספרייה המכילה את קובצי OSCAR בטקסט רגיל

 

בניית טוקנייזר

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



הדרכה וידאו לבניית הטוקנייזר המותאם אישית שלנו

 

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

כעת, האסימונים המיוחדים של רוברטה נראים כך:

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

הטוקנייזר שלנו מוכן כעת, ואנחנו יכולים לשמור את הקובץ שלו לשימוש מאוחר יותר:

עכשיו יש לנו שני קבצים שמגדירים את החדש שלנו FiliBERTo אסימון:

  • merges.txt - מבצע את המיפוי הראשוני של טקסט לאסימונים
  • vocab.json - ממפה את האסימונים למזהי אסימון

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

אתחול הטוקנייזר

 
 
תחילה אנו מאתחלים את הטוקנייזר באמצעות שני הקבצים שבנינו קודם - באמצעות פשוט from_pretrained:

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

מאובייקט הקידוד tokens אנחנו נחלץ את input_ids ו attention_mask טנסורים לשימוש עם FiliBERTo.

יצירת צינור הקלט

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



הדרכה בווידאו של צינור הקלט של MLM

 

הכנת הנתונים

 
 
נתחיל עם דוגמה בודדת ונעבוד על היגיון ההכנה.

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

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

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

  • input_ids - שלנו token_ids עם ~15% מהאסימונים מוסווים באמצעות אסימון המסכה <mask>.
  • מסיכת_תשומת לב - טנסור של 1ים ו 0s, סימון המיקום של אסימונים / אסימוני ריפוד 'אמיתיים' - משמש בחישובי קשב.
  • תוויות - שלנו token_ids עם לא מִסוּך.

אם אינך מכיר את MLM, הסברתי זאת כאן.

את העתיד attention_mask ו labels טנסורים פשוט מופקים מהנושאים שלנו batch. ה input_ids טנסורים דורשים יותר תשומת לב, עם זאת, עבור טנזור זה אנו מסווים ~15% מהאסימונים - מקצה להם את מזהה האסימון 3.

בפלט הסופי, אנו יכולים לראות חלק מקודד input_ids מוֹתֵחַ. מזהה האסימון הראשון הוא 1 - [CLS] אֲסִימוֹן. מנוקד סביב הטנזור יש לנו כמה 3 מזהי אסימון - אלה הם החדשים שנוספו [MASK] אסימונים.

בניית ה-DataLoader

 
 
לאחר מכן, נגדיר את שלנו Dataset class - שבה אנו משתמשים כדי לאתחל את שלושת הטנסורים המקודדים שלנו בתור PyTorch torch.utils.data.Dataset חפצים.

לבסוף, שלנו dataset נטען לתוך PyTorch DataLoader אובייקט - שבו אנו משתמשים כדי לטעון את הנתונים שלנו למודל שלנו במהלך האימון.

הכשרת המודל

 
 
אנחנו צריכים שני דברים לאימון, שלנו DataLoader ודגם. ה DataLoader יש לנו - אבל אין דגם.



אתחול המודל

 
 
לאימון, אנחנו צריכים גלם (לא מאומן מראש) BERTLMHeadModel. כדי ליצור את זה, ראשית עלינו ליצור אובייקט תצורה של RoBERTa כדי לתאר את הפרמטרים שאיתם נרצה לאתחל את FiliBERTo.

לאחר מכן, אנו מייבאים ומאתחלים את מודל ה-RoBERTa שלנו עם ראש מודל שפה (LM).

הכנה לאימון

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

הדרכה

 
 
סוף סוף - זמן אימון! אנו מתאמנים בדיוק כפי שאנו מתאמנים בדרך כלל כאשר אנו מתאמנים באמצעות PyTorch.

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



אובדן / זמן - מספר מפגשי אימון הושוו יחד בתרשים זה

 

המבחן האמיתי

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



ראשית אנו מאתחלים את א pipeline אובייקט, באמצעות ה 'fill-mask' טַעֲנָה. ואז התחל לבדוק את המודל שלנו כך:

"צ'או איך va?" היא התשובה הנכונה! זה מתקדם ככל האיטלקית שלי - אז בוא נמסור את זה ללורה.

אנחנו מתחילים עם "בוונגיורנו, בוא וא?" - או "יום טוב מה שלומך?":

התשובה הראשונה, "בוונגיורנו, צ'י ווה?" פירושו "יום טוב, מי שם?" - למשל שטות. אבל, התשובה השנייה שלנו נכונה!

בשלב הבא, ביטוי קצת יותר קשה, "ciao, dove ci incontriamo oggi pomeriggio?" - או "היי, איפה אנחנו הולכים להיפגש אחר הצהריים?":

ואנחנו מחזירים עוד כמה תוצאות חיוביות:

✅ "hi, where do we see each other this afternoon?"
✅ "hi, where do we meet this afternoon?"
❌ "hi, where here we are this afternoon?"
✅ "hi, where are we meeting this afternoon?"
✅ "hi, where do we meet this afternoon?"

לבסוף, עוד משפט אחד, קשה יותר, "cosa sarebbe successo se avessimo scelto un altro giorno?" - או "מה היה קורה אם היינו בוחרים ביום אחר?":

אנו מחזירים כאן עוד כמה תשובות טובות:

✅ "what would have happened if we had chosen another day?"
✅ "what would have happened if I had chosen another day?"
✅ "what would have happened if they had chosen another day?"
✅ "what would have happened if you had chosen another day?"
❌ "what would have happened if another day was chosen?"

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

זה הכל בשביל ההדרכה הזו של הכשרת מודל BERT מאפס!

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

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

תודה על הקריאה!

 

70% הנחה! עיבוד שפה טבעית: NLP עם רובוטריקים ב-Python

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

*כל התמונות הן של המחבר למעט היכן שצוין אחרת

 
Bio you ג'יימס בריגס הוא מדעני נתונים המתמחה בעיבוד שפות טבעיות ופועל בתחום הפיננסים, הממוקם בלונדון, בריטניה. הוא גם מנטור עצמאי, סופר ויוצר תוכן. ניתן להגיע למחבר באמצעות דוא"ל (jamescalam94@gmail.com).

מְקוֹרִי. פורסם מחדש באישור.

מידע נוסף:

מקור: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

בול זמן:

עוד מ KDnuggets