טרנספורמרים = סוף הלמידה העמוקה?

שריפת כסף מובילה למודלים טובים.
הגדלת טרנספורמרים אכן עובדת.
אבל מה לגבי מציאת ארכיטקטורה טובה יותר במקום?
ספוילר: לצערי.. אטנשן הוא באמת כל מה שאתם צריכים..
טרנספורמרים = סוף הלמידה העמוקה?
———-
חברים, היה תענוג. נהנתי.
אבל זה הסוף, אנחנו לא נחוצים.
בשנת 2023, אין כמעט אף דרך יציבה לשפר טרנספורמרים.
כמעט כל המודלים עדיין באותו המבנה משנת 2017.
עם שיפורים מזעריים לכל היותר..
טרנספורמרים פשוט חזקים הרבה יותר מידי כמו שהם.
———-
הרשו לי להדגים..
נתחיל מההתחלה: כמה כוח חישוב נדרש כדי לאמן בבית מודל שפה גדול?
להלן זמני האימון של כמה ממודלי הבסיס המפורסמים ביותר:
- מודל BERT – אומן במשך 11 ימים על 8 V100s.
- ואחיו הגדול BERT-large – אומן במשך 47 דקות על 1472 V100s.
- מודל מקודד ומפענח T5-base – אומן במשך יום אחד על 16 TPUv3s.
- והגרסה ה"רזה" squeezeBERT – אומן במשך 4 ימים על 8 Titan RTXs.
- מודל הT5 המשופר (והיעיל יותר) – אומן במשך 1.75 ימים על 16 TPUv3s.
- מודל T5-small-L16 הקטן (והקל יותר) – אומן במשך 11.2 שעות על 16 TPUv3s.
- באימון לצורך שחזור מאמר BERT – אומן במשך יום אחד על 8 V100s.
- מודל RoBERTa-base – אומן במשך 1.25 ימים על 1024 V100s.
- מודל PaLM – אומן במשך 50 ימים על 6144 TPUv4s. (עלות אימון: 27 מיליון דולר)
- מודל GPT-4 – אומן כמה חודשים על גבי ~20,000 GPUs. (ג'יזס)
- מודל LLaMA – אומן במשך כחודש על גבי 2048 A100 (עלות אימון: כ4 מיליון דולר)
———-
איפה כל זה פוגש אותנו?
נניח שאתם רוצה לאמן LLM בבית.
אבל לא כמו כל ה"יש לי מחשוב אינסופי!" מהמודלים למעלה.
אתם רוצים לאמן בבית-בבית. הבית שלכם. על גבי החומרה שיש אצלכם: ה-GPU האחד ה"סבבה כזה" שיש לכם. וזהו.
יש לכם סיכוי לקבל מודל "טוב"?
- האם אפשר אולי לשפר מודלי בסיס ואז לאמן את גרסתם החזקה יותר?
- איזה טריקים אפשר לשלב במודלי הבסיס כדי לחזק אותם כך שנקבל מודל "טוב" שגם קטן וגם מאומן על סט נתונים קטן?
בואו נסתכל על כמה מהשיפורים הידועים לארכיטקטורת הטרנספורמר ונראה ביחד אם הם באמת שימושיים!
———-
מודל T5 1.1 – שיפורים בארכיטקטורה מאחיו הקטן "T5"
מאמר: https://arxiv.org/pdf/2002.08910.pdf
- אקטיבצית GEGLU בשכבות הFF (במקום ReLU) (https://arxiv.org/abs/2002.05202)
- ביטול Dropout.
- ביטול שיתוף הפרמטרים בין שכבת האמבדינגס לאנ-אמבדינגס.
בחיים לא ראיתי ניסוי שזה שיפר בו תוצאות.. ניסיתי כמה פעמים..
- היפרפרמטרים שונים: d_model גדול יותר, מספר ראשים ו-d_ff קטנים יותר.
———-
גרסה הבאה: T5 LM-Adaptation
מאמר: https://arxiv.org/abs/2104.08691
- שדרוג לוס: עבר אימון למטרת יצירת טקסט.
———-
גרסה הבאה: T5 Talking Heads
מאמר: https://arxiv.org/abs/2003.02436
- הוספת שכבות לינאריות במימד ראשי האטנשן נראה שמשפרת ביצועים. (השכבות לפני ואחרי ה-softmax)
———-
האם כל זה עובד?
מהסתכלות בכל מאמרים אלו אפשר לראות בבירור שכל השיפורים מזעריים ולא יותר.
בנוסף: חלק ממאמרים אלו שוחררו כבר לפני כשנתיים, עצם העובדה שלא נעשה בהם שימוש נוסף מצביעה על שמישות השיטות..
———-
היפרפרמטרים? עובדים?
מסתבר שההיפרפרמטרים האופטימליים משתנים מאוד עבור מודלים בגדלים שונים.
- ניתן לראות זאת בקלות במודל "T5 – "FirstNarrow שאוחד לתוך המודל T5 1.1 המוזכר למעלה.
- במודל זה 30% השכבות הראשונות במודל בגודל חצי מרוחב 70% השכבות הבאות (d_ff ו-num_heads).
במאמר מצוין ששינוי זה משפר במיוחד את מודלי השפה! זה טוב!
.
.
…רק שמודלי השפה במאמר קטנים במיוחד: במציאות שינוי זה משפר מאוד מודלים קטנים אבל פוגע מאוד במודלים גדולים.
רחוק מאופטימלי.
אני אבל כן חושב ששווה לבדוק מודלים גדולים מאוד עם "שכבות ראשונות צרות" פשוט כי "שכבות ראשונות צרות" עובדו מאז ומעולם ברשתות קונבולוציה.
———-
אבל "חוקי הScale"
כן.. בקשר לזה..
במאמרי GPT-3 וצ'ינצ'ילה נמצאו "חוקי הScale".
אותם "חוקי טבע" מנבאים עבור תקציב חישוב מסויים, מה גודל המודל האופטימלי וגודל הדאטה האופטימלי המנצלים את כוח החישוב על הצד הטוב ביותר.
אפשר לחזות בעזרתם את:
- גודל המודל האופטימלי.
- אבל לא (!!) את הביצועים האופטימליים של מודל בגודל זה.
***
זו נקודה מבלבלת!
חוקי הScale לא אומרים שום דבר מעניין ל"אנשים ממוצעים" שרק רוצים לאמן את "המודל הכי טוב" שהם יכולים באמצעות החומרה שיש ברשותם.
אי אפשר להשתמש בהם כדי "לאמן מודל בגודל 6 מיליארד פרמטרים ככה שיצא הכי טוב!" למשל.
———-
חוקי הSCALE מספרים רק חצי מהסיפור: חוקי הSCALE הם "חוקי הSCALE-UP" – הם בנויים להגדלת כוח החישוב.
אבל יש הבדל עצום בין הגדלת כוח החישוב להקטנת כוח החישוב. והאדם הממוצע מתעניין בהקטנה ("מה יכול להכנס אצלי במחשב?")
בניגוד לדעה הרווחת, בהקטנת כוח החישוב: ביצועי המודל דווקא מ-מ-ש כן תלויים בארכיטקטורת המודל.
לא רק בגודל המודל.
מקור נוסף: Tay et al – https://openreview.net/pdf?id=f2OYVDyfIB
———-
מטריקות שונות מניבות חוקי SCALE אחרים
- חוקי הScale הנפוצים הם "חוקי הScale של Perplexity", מטריקות אחרות מניבות באופן לא מפתיע "חוקי Scale" אחרים וכמובן שגם מודלים אופטימליים אחרים בהתאמה.
———-
טווחי חישובים שונים מניבים חוקי SCALE שונים
- המגמה הכללית באקסטרפולציה לגדלי GPT-3 מפלצתיים אמנם מוכרת אבל כשמסתכלים אזורי כוח החישוב של "האדם הממוצע" ברזולוציה גבוהה חוקי הScale מתנהגים אחרת לחלוטין.
משמעות נוספת רעה מאוד: דברים שעובדים עבור מודלים קטנים לא תמיד עובדים במודלים גדולים.
———-
על מה כולם עבדו?
איפה כל השיפורים מ5 שנות המחקר שעברו מאז שחרור הטרנספורמר הראשון?
***
בואו נבדוק!
נתבונן במדגם חלקי של בודדים ממאות המאמרי הטרנספורמרים.
כמה מאמרים בולטים:
———-
ארכיטקטורה
- טרנספורמרים עם אורך אינסופי: Transformer-XL (Dai et al., 2019); ∞-former (Martins et al., 2022b)
- טרנספורמרים מהירים יותר: Reformer (Kitaev et al., 2020); Performer (Choromanski et al., 2021)
- טרנספורמרים דלילים: Switch Transformer. (Fedus et al., 2022b); SparseTransformer (Treviso et al., 2022)
- טרנספורמרים יעילים חישובית: ALBERT (Lan et al., 2019); Perceiver (Jaegle et al., 2021); kNN-LM (Khandelwal et al., 2020); RETRO (Borgeud et al., 2022)
———-
אימון מקדים
- מפענחים בלבד: GPT-3 (Brown et al., 2020); PaLM (Chowdhery et al., 2022)
- מקודדים בלבד: BERT (Devlin et al., 2019); ELECTRA (Clark et al., 2020)
- מקודד-מפענח: T5 (Raffel et al., 2020); BART (Lewis et al., 2020a)
———-
ננסה לפרק את תרומות המאמרים
התרומה בפועל של כל אחת מעבודות אלו צריכה להבדק בקוד משותף על בעיה מוגדרת על מנת שנדע האם תרומה זו שימושית גם היום.
מאמר מעניין [4] בדק בדיוק את זה: במאמר נבדקו אילו הצעות שיפורי טרנספורמרים אכן ניתנות לשילוב עתידי.
המאמר גילה ש:
- טריקים של טרנספורמרים תלויים מאוד במימוש – "שיפורים" רבים אינם פועלים בתוך קוד של "שיפורים" אחרים
מה שהופך את שניהם לבלתי אפשריים לשילוב בעולם האמיתי..
- "שיפורים" רבים אינם עובדים במשימות אחרות.
זה לא כל כך מפתיע..
- טריקים אחרים שאמנם אכן כן עובדים.. רק שחיפוש היפר-פרמטרים פשוט מתעלה עליהם..
מה שהופך אותם לסתם סיבוך חסר תועלת..
- ישנם כל מיני טריקים כל כך מסובכים למימוש שאף פעם אי אפשר לדעת אם מימשנו אותם לא נכון או שהם פשוט לא עובדים.
בשפה יפה: רוב הטריקים לא עובדים.
———-
הנה טריקים שכן עובדים!
- נרמול ואתחול: נורמת RMS
- שיתוף משקולות: אמבדינגס ואנ-אמבדינגס קשורים
- הטלה לינארית אחרונה: שימוש בMixture סופטמקס
אטנשן:
- שימוש בסינתיסייזר (הוספת אלפא לשכבות לינארות)
- שימוש ברשתות מומחים (Mixture Of Experts)
- שימוש בSwitch Transformer
הנה טריקים שלא עובדים..
אקטיבציות:
– אקטיבציה: GeLU
– אקטיבציה: ELU
– אקטיבציה: GLU
– אקטיבציה: GeGLU
– אקטיבציה: ReGLU
– אקטיבציה: SeLU
– אקטיבציה: SwiGLU
– אקטיבציה: LiGLU
– אקטיבציה: סיגמואיד (בשום מקום ברשת)
– אקטיבציה: Softplus
נרמול ואתחול:
– משקולות ספציפיות המאותחות מאפס
– אתחלול + נרמול Rezero + LayerNorm
– אתחול + נרמול Rezero + RMS Norm
שיתוף משקולות:
– שיתוף בלוקים + אמבדינגס נפרד
– שיתוף בלוקים + אמבדינגס ממשותף
– שיתוף רק במקודד
– שיתוף רק במעפנח
הפסקתי באמצע. הבנתם את הרעיון. יש עוד רשימה ארוכה שמכילה טריקים שונים ומשונים, לאמבדינגס, לשכבה הלינארית האחרונה, הצעות להחליף את הSoftmax בסוף הרשת ועוד ה-מ-ו-ן טריקים בשכבת האטנשן עצמה..
טריקים בולטים ומעניינים שגם שוחזרו:
- החלפת אופטימייזר יכולה לפעמים לעבוד (עוזרת באפסילון) אבל… בדרך כלל לא. [2]
- שימוש בקונבולוציות יכולות להפחית חישובים במודלים קטנים (אבל לא סקיילאביליות למודלים גדולים..) [3]
- לשינויים קלים בהיפרהפרמטרים ובPositional אמבדינגס יכולה להיות השפעה זעירה. [7]
מה בסוף לגבי היפר-פרמטרים?
מניסויים בהיפר-הפרמטרים השונים של ארכיטקטורת הטרנספורמר המקורית, למשל:
- שמוש בPooling כמו בFunnel Transformer [16]
- עומק אחר: שימוש במספר שונה של שכבות
- שימוש ב DeepNarrow [1] (מלמעלה)
- מודל צר (H=512)
- מודל רחב (H=1024)
- מימד נסתר שונה
- שכבות FFN רק כל 2 שכבות או רק כל 4 שכבות
- בלי שכבות FNN [17]
- הוספת שכבות RNN [18] באמצע הרשת
- אימון המודל עם BPTT [19] לאורך זמן
כולם כולם מניבים את אותה תוצאה.
ביצועי המודל הסופיים תלויים בעיקר בכמות הפרמטרים באופן מובהק ולא באף אחד מהטריקים למעלה במיוחד.
אפשר להגיע לגודל המודל דרך איזה פרמטר שתרצו, שנו את הערך שנראה לכם הכי מגניב עד שיתקבל מודל עם מספר פרמטרים גדול: מודל זה יתפקד בערך כמו כל מודל אחר בגודל זהה.
גם אם תגיעו אליו דרך פרמטר אחר..
———-
שיפורים לשכבת האטנשן עצמה
כשמדובר בשכבה האטנשן עצמה ישנם כמה טריקים שכן עובדים!
- ביטול כל הbiasים בשכבות ה KQV. [21]
רציתם חוקי Scale? הטריק הזה עובד בגלל שהוא מעיף פרמטרים מהמודל ואז המודל מתאמן יותר מהר. כן! חוקי הScale פועלים גם הפוך! אימון יותר מהיר עובר על יותר דאטה -> להעיף "קצת" פרמטרים מהמודל: משפר את המודל!
- שינוי מספר הראשים. [22][23][24][25]
אין לי כלל אצבע אם יותר או פחות..
- לא לגעת ב-softmax של האטנשן. אף פעם לא עובד. [26]
- אם יש לכם רצפים ארוכים, השתמש ב-Flash Attention. אבל אם לא זה לא משנה כלום וחבל על המאמץ. [27]
- אטנשן פורייה נשמע מגניב ולא עובד. אין מה לנסות. [28]
- אטנשן Rotery כן עובד אבל השיפור זעיר. [29]
———-
מאמר Primer
שיפורים ממאמר PRIMER לשכבות האטנשן: [47]
מאמר Primer מנסה להשמיד את בעית חיפוש הארכיטקטורה בברוט-פורס.
במאמר זה הכותבים מאפטמים את ארכיטקטורת האטנשן באמצעות תכנות גנטי ומצליחים לסיים את החיפוש עם שני שיפורים קלים בלבד שאותם אפשר להעביר בקלות לכל מודל אחר:
- שימוש בשכבות קונבולוציה לעומק DepthwiseConv (3×1) לאחר כל אחת מהשכבות הלינאריות בKQV.
- שימוש באקטיבציה ReLU בריבוע (זה בדיוק מה שאתם חושבים שזה).
אין אינטואיציה.. תרקדו!
———-
שיפורים לשכבות הFeedForward
- סידור מחדש של הבלוק הפנימי כ GRU מוסיף שיפור קטנטן. [30]
- בניגוד לכל מיני מאמרים: אין באמת צורך ב"שכבה רחבה יותר" בFeedForward חבל על זמן החישוב [31]
———-
שיפורים למבנה בלוק האטנשן
- נרמול מוקדם עם LayerNorm מועיל יותר מ LayerNorm מאוחר. [32][33]
- אין סיבה לנסות עוד קומבינציות כי גוגל כבר ניסו את כל האופציות האפשריות על 16 בעיות שונות במקביל. [34]
- החלפת הנרמול של השכבות בנרמול RMS לפעמים עובד קצת אבל גם אם כן השיפור קטנטן. [35]
- העברת הLayerNorm לתחילת הבלוק מועילה בעיקר לייצוב האימון ושימוש בקצב למידה גדול יותר.
- ביטול רנדומלי של שכבות בזמן האימון (Stochastic Depth) לא תורם למודל יותר מידי.
———-
שכבה אחרונה במודל
- חיזוי טוקנים דליל (Sparse Tokens Prediction) עוזר להקטנת צריכת הזכרון ואינו פוגע במודל. [36]
- הוספת נרמול גם בשכבה האחרונה מייצבת אפילו עוד יותר את האימון.
———-
אופטימייזר
- היצמדו ל-AdamW.
- שום דבר [37][38][39][40][41] אחר.
———-
שימוש ב LR Scheduler
המלצה: One-Cycle – עולה למעלה ואז למטה, חצי וחצי לאורך האימון. [42][43]
———-
גודל באצ'
קטן.
כמה שיותר קטן. תסמכו עלי.
גודל הבאצ' האופטימלי ברשתות בדרך כלל הרבה הרבה יותר קטן ממה שאנשים חושבים.
———-
שימוש בScheduler לגודל הבאצ'?
מה?
כן! אם אתם יכולים להגדיל את גודל הבאצ' לאורך האימון תוכלו לסחוט עוד קצת ביצועים נוספים מהמודל. התחילו קטן והגדילו.
דרך אגב: זה עובד גם עם כמעט כל רשת אחרת על כל בעיה. ואם אתם מוגבלים בזכרון אז השתמשו בGradient Accumulation במקום גודל הבאצ'.
———-
רגולריזציה בזמן האימון
כלום. לא צריך.
- הסירו את כל הDropout מהמודל במידה וקיים. [46]
- לא להשתמש בCurriculum Learning באימונים קטנים. [45]
- לא להשתמש בDropTokens בזמן האימון כשהמודלים קטנים. [44]
מה זה אוברפיטינג?
- לא תראו שינוי משמעותי בביצועים גם באמצעות BPE [11], או SentencePiece [12] וגם לא עם Unigrams [13].
———-
הטוקנייזר
- לגבי מספר הטוקנים במילון, מסתבר שגדלי אוצר מילים קטנים מביאים לביצועים גרועים יותר.
- אבל שגם אוצר מילים גדול יותר אינו מוצלח יותר באופן מוהבק..
אנחנו לא יודעים שום דבר מעניין על גודל אוצר המילים.. פחות או יותר.. השתמשו בדיפולט..
- בנוסף, הוספת טוקנים מיוחדים משלכם כמו <sep> או <cls> כמעט ואינה משפיעה על הביצועים הסופיים באימונים קטנים.
———-
כמה אפוקים?
אם נסתכל על מודלים מפורסמים אחרים, נראה ש:
- המודל GPT-1 אומן ב100 אפוקים.
- מודל BERT המקורי – אומן ב40 אפוקים.
- המודל בMesh Transformer אומן ב10 אפוקים.
- המודל של GPT-2 אומן ב20 עד 100 אפוקים.
לא יודעים במדויק..
- המודל Sparse Transformer (עליו מבוסס GPT-3) אומן ב70 – 120 אפוקים.
מה אפשר להבין מכל זה? כמה אפוקים עלינו לאמן?
- אחד. רק אחד. [15]
אם אתם יכולים להגדיל את סט הנתונים שלכם: עשו זאת במקום.
הסיבה לכך פשוטה: תקבלו מודל הרבה יותר טוב תוך שימוש באותו זמן חישוב.
בדרך כלל במודלים כאלו לא קשה להגדיל את סט הנתונים כשכוח החישוב מוגבל..
———-
השפעה על אוברפיטינג
אין יותר אוברפיטינג: לא קיים במצב שכל באצ' יחודי.
במידה ואין כפילויות בדאטה, כן?
לכן לא צריך רגולריזציה. אני לא צחקתי.
תזכורת: הסירו את הDropout.
לאימון באפוק אחד יש גם יתרון נוסף: אנו יודעים שנתונים כפולים הורסים את המודל מבפנים בצורה קטסטרופלית באופן לא פרופורציונלי לתדירות הופעתם בזמן האימון.
לכן, אפילו כמות זעירה של דגימות כפולות מזיקה במיוחד למודל ויכולה לפגוע בביצועיו פי 2 או אפילו 4. [14]
אישית שרפתי הרבה מאוד זמן בוויכוחים עם GPT-4 ו-ChatGPT בניסיונות לשכנע אותם להפריך את מה שאמרתי עכשיו ולמצוא חורים בהיגיון. אמנם נשמע הגיוני אבל אימון בלי רגולריזציה פשוט "מרגיש לא בסדר".
———-
מה לגבי דיוק הFloating Point?
מסתבר שה-Mixed Precision של Pytorch פשוט עובד הכי טוב עבור "האדם הממוצע". יותר טוב מ-Full float-32 [8], scaled float-16 [9], bfloat16 [10] ו-offloading [8].
מקורות וניסויים בסוף הפוסט.
עם זאת, ראוי להזכיר ששיטות מסוימות (ספציפית: DeepSpeed ו-Zero כן עובדות ממש טוב עבור האדם ה"קצת יותר" מהממוצע כשמדובר בגישה לכוח עיבוד)
———-
כמות הפרמטרים.
כן. גודל המודל חשוב מאוד לביצועי המודל.
אבל זה לא שמודלים גדולים יותר הם "טובים יותר בכללי": מודלים גדולים יעילים יותר ביחס לכמות הדאטה -> ערך הלוס קטן בצעדים גדולים יותר בכל צעד עדכון.
אבל! באותה הנשימה: אנחנו גם כמעט ואף פעם לא מגיעים לקצה גבול היכולת של הטרנספורמרים שלנו, מלוא הפוטנציאל של רוב המודלים המפורסמים עדיין לא ידוע. אפשר לראות זאת בבירור במאמר של LLaMA – כל המודלים במאמר בUnderfitting כבד. תיאורטית, צוקרברג יכול פשוט להמשיך את האימון ולקבל כנראה מודל המכפיל את ביצועי המודל כרגע מבלי להשקיע עבודה אנושית נוספת.
———-
מאיפה מגיע כוחם של הטרנספורמרים?
זהו? נגמר?
כוחם האמיתי של הטרנספורמרים אינו נובע מהעובדה שהם חזקים, כוחם נובע מהעובדה שהם גם חזקים וגם אלגנטיים ופשוטים.
כוח הטרנספורמרים מגיע בעיקרו מפעולת חישוב אחת: מכפלת הוקטורים שיוצרת את מטריצת האטנשן.
על פניו, חישוב זה נראה מוזר מאוד: אנו מכפילים שני וקטורים הנוצרו מאותו המקור. (K, Q)
***
מה ההבדל ביניהם?
ההבדל הוא שאחד מוקטורים אלו עובר שחלוף (Transpose) לפני ההכפלה. זהו.
ולכן, שני וקטורים אלו לומדים פעולות הפוכות אחד מהשני:
- בקשת מידע: הKey משמש את הטוקנים "בבקשת מידע" מהטוקנים האחרים.
"אני מילת פועל. העבירו אלי בבקשה את כל מילות הפועל האחרות במשפט"
- שליחת מידע: הQuery משמש את הטוקנים "לשליחת מידע" לטוקנים האחרים.
"הודיעו בבקשה למילים הראשונות במשפט שאני מילת שם עצם" (מבלי לחכות לבקשה מהן)
אחרי הכפלה זו אנו מקבלים מטריצת ניתוב המכילה את כל הזוגות האפשריים בין הטוקנים, מטריצה זו מייצגת "כמה מידע יש להעביר" בין אותו זוג טוקנים.
***
ומידע זה הוא "Value" – את ערך זה אנו מנתבים בין הזוגות השונים.
———-
נשמע שזה נגמר..
מה אפשר בכלל לשפר עוד יותר בכזו ארכיטקטורה פשוטה וגאונית?
..
..
..
פאקינג דיברטה (DeBERTa).
המודל החזק ביותר על פני כדור הארץ! [48]
חוץ מהמודל "אלוהים-יודע-מה-יש-ל" של OpenAI, כמובן.
אמ;לק: מודל זה מאפשר לכל טוקן:
- לבקש מידע באופן יחסי:
"מי הן המילים שנמצאות ליידי?"
- לשלוח מידע באופן יחסי:
"שלח הודעה זו למילה הבאה אחריי: המשמעות שלי היא לבטל אותה."
[שימו לב: אין אזכור למיקום המילים במשפט. הכל "ביחס אלי"]
***
תקציר קצר: איך הגענו לפה?
- בתקופה הפרא-היסטורית של 2017 היה את BERT – הטרנספורמר הראשון.
- תקופה קצרה לאחר שחרורו, הגיעו אנשי פייסבוק והפכו אותו להרבה הרבה (הרבה!) יותר טוב. הם קראו לגרסתם החדשה: "RoBERTa".
- אבל גם רוברטה לא היה מודל מושלם..
———-
איך לדבג טרנספורמרים?
לטרנספורמרים תופעת לוואי שימושית, אנו יכולים לראות "על מה הם מסתכלים" בזמן הפעלתם.
מתברר שניתן לראות בקלות רבה שבכל גרסאות רוברטה ישנן "עמודות" במיקומים ספציפיים עליהן המודל "מסתכל חזק" ללא קשר לטקסט אותו המודל קיבל.
ולמי שלא הבין עד כמה זה חמור:
- "היי מה נשמע?"
- " היי מה נשמע?"
טקסטים אלו שונים מאוד בעיניי המודל!
איך תופסים את זה? במודלים של Huggingface יש ארגומנט "return_attention" שמחזיר לכם את המטריצות הללו. בשימוש הplot הפשוט ביותר עמודות אלו בולטות לעין במיוחד. נסו זאת, זה קל מאוד ומלמד מאוד. ספציפית את תופעה זו רואים במטריצה כעמודה אחת חזקה מאוד שנמצאת תמיד תמיד באותו האינדקס. ומיותר לציין שזה לא אמור לקרות באופן טבעי..
———-
גרסה ראשונה – DeBERTa – V1
על מנת לטפל בבעיה זו פיתחו מיקרוסופט שכלול לטרנספורמר המקורי: "Disentangled Attention".
מטרתו היא הפרדת מיקום המילים ממשמעות המילים.
כשזה מגיע ללמידת מיקומים, בנקודה זו בזמן היו:
- קידוד מיקום יחסי (Transformer-XL)
אמ;לק: אטנשן שגם "רואה" מרחקים מכל טוקן לכל טוקן וגם לוקח בחשבון מרחקים אלו בזמן ניתוב המידע.
- קידוד מיקום נלמד (GPT-2)
אמ;לק: במקום "sin + cos" המקוריים, במודל זה נלמדת שכבת אמבדינגס נוספת על גבי רצף המסמן את מיקומי הטוקנים (ממש int המכיל את האינדקס ונכנס לשכבת אמבדינגס – אין קסם).
הרעיון המרכזי של דיברטה הוא לשלב בין רעיונות אלו:
- יצוג מיקום שגם נלמד (+) וגם יחסי.
אמ;לק: האמבדינגס נלמדים על פני מטריצת intים המכילה את מרחקי כל הטוקנים לכל הטוקנים.
כך מופרדת משמעות מיקום הטוקנים ממשמעות המילים עצמן.
אותה המילה יכולה להופיע במקומות שונים ונלמדת בצורה טבעית ואינטואיטיבית.
אגב: רוברטה לא עושה שימוש באף אחד מיצוגי מיקום אלו. הם הומצאו מאוחר יותר.
———-
הם לא נרגעים שם במיקרוסופט
במקום ללכת הביתה: הם המשיכו לשפר את המודל!
תודה!
בשלב זה יש בתוך המודל שני "ענפים" שונים: האחד לומד את משמעות המילים ואחר לומד את משמעות המרחקים בין המילים.
כשבכל בלוק ובלוק ייצוג המיקומים היחסיים מוזן שוב ושוב, זאת על מנת לחזק את הסינגל ולאפשר למודל להשתמש במידע היחסי בין הטוקנים לכל עומקו.
אך גם לשיטה זו יש מגבלות.
אטנשן יחסי אמנם רב עוצמה אבל לא מספר את הסיפור המלא. גם למשמעות האבסולוטית של חלק מהמילים יש חשיבות רבה.
לשם כך נוספה לדיברטה גם שכבת אמבדינגס נלמדת למיקומים האבסולוטים.
רצף 1, 2, 3.. (אין קסם) כמו GPT-2.
אותה השכבה מתווספת ממש לפני ה-softmax הסופי.
צויין במאמר שניסו גם להזין אותה בכל אחד מהבלוקים והתוצאה נפגעה.
———-
ניתוב מידע במודל החדש
תזכורת: מטרתינו העיקרית היא להביא את הטוקנים למצב שיוכלו לבצע פעולות כמו:
***
טוקן: "אני מילה {X}.."
***
- "מה הן כל מילות הפועל במשפט?"
- "מה הן המילים הצמודות אלי?"
- "העבר לכל המילים: אני שולל את כל משמעות המשפט! הכל הפוך!"
***
לשם כך, ניצור מטריצות ניתוב נוספות על ידי כך שנשתמש במשמעות המילים (Q_content) בשילוב עם המרחקים היחסיים (K_position).
תזכורת: יצוג המרחקים מפורד מיצוג המילים – "ענף" נפרד במודל.
ואז באמצעות קומבינציות מעורבות אלו (תוכן מענף אחד x אטנשן בענף אחר) אנו מאפשרים לראשונה ליצוג המילים ללמוד לבצע פעולות עשירות במיוחד שלא יכלו לבצע קודם לכן.
- ניתוב "תוכן -> למיקום":
"מה הן המילים הצמודות אלי?" | Q_content x K_position
- ניתוב "מיקום -> לתוכן":
"העבר לכל מילה שנמצאת אחריי – אני שולל את משמעותה." | Q_position x K_content
ולבסוף כמו במודל BERT הראשון מ2017..
- ניתוב "תוכן -> לתוכן":
"מה הם כל הפעלים במשפט?" (ללא קשר למיקום) | Q_content x K_content
***
על מנת להשתמש בכל המטריצות, אנו פשוט מחברים אותן.
———-
גרסה 2: DeBERTa V2
הערה: כל המוצג בגרסה 2 מעולם לא נמדד או שוחרר במאמר. שיפורים אלו "פשוט הופיעו" יום אחד בקוד – לא ברור עד כמה כל אחד מהם נחוץ.
- קידוד קלט עם שכבת קונבולוציה nGiE(nGram Induced Input) ב-DeBERTa V2 נוספה שכבת קונבולציה בשכבת הטרנספורמר הראשונה, זאת על מנת ללכוד באופן מדויק את התלות המקומית של טוקני הקלט.
- שיתוף משקולות: שיתוף מטריצת המיקום עם מטריצת הקרנת הValue בשכבת האטנשן, חוסך הרבה פרמטרים ואינו משפיע על הביצועים.
- שימוש בBucketים במיקומים היחסיים (כמו בT5): Bucketים של מיקומי הטוקנים משתמשים לקידוד המיקום ב-T5. (המאמר נמצא בסוף הפוסט)
———-
יש כמובן גם גרסה שלישית אך השיפורים בה אינם בארכיטקטורת הטרנספורמר ולכן לא נכללה בפוסט זה.
———-
האם טרנספורמרים הם "הסוף"
האם אין מה לשפר יותר בארכיטקטורת הטרנספורמרים?
לא. בדיברטה ראינו שיש הרבה "טריקים קטנים" שיכולים לשפר טרנספורמרים. חשוב לציין שטריקים אלו הם בין הבודדים שעבדו.
מתוך אלפים.
רוב הטריקים חלקם מובילים לשיפור וחלקם לא אבל כמעט כולם אינם מובילים לשיפור משמעותי לאחר מיליארד הטוקנים הראשונים באימון. הלוסים מתכנסים לאותם הערכים.
מה שהופך את כל הרעיון של "חיפוש" למעצבן במיוחד.
טרנספורמרים חזקים מאוד כמו שהם ולכן קשה מאוד לשפר אותם.
אני מניח ששיפורים גדולים עתידיים יגיעו מניסוי ארכיטקטורות חדשות לחלוטין או ערבוב טרנספורמרים עם ארכיטקטורות אחרות.
———-
בנקודת הזמן הזו..
אטנשן הוא כל מה שאתם צריכים..
לצערי..
———-
רפרנסים:
[1] – מאמר: Scale Efficiently: Insights from pre-training and fine-tuning transformers
[2] – מאמר: How to Train BERT with an Academic Budget: https://aclanthology.org/2021.emnlp-main.831.pdf
[3] – מאמר: SqueezeBERT: What can computer vision teach NLP about efficient neural networks? https://arxiv.org/pdf/2006.11316.pdf
[4] – מאמר: Efficient Methods for Natural Language Processing: A Survey – https://arxiv.org/pdf/2209.00099.pdf
[5] – מאמר: Do Transformer Modifications Transfer Across Implementations and Applications? https://aclanthology.org/2021.emnlp-main.465.pdf
[6] – מאמר: Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer https://arxiv.org/abs/1910.10683
[7] – מאמר: Training a Language Model on a Single GPU in One Day – https://arxiv.org/pdf/2212.14034.pdf
[8] – מאמר: DeepSpeed: System Optimizations Enable Training Deep Learning Models with Over 100 Billion Parameters. Rasley. et al.
[9] – מאמר: BFloat16: The secret to high performance on Cloud TPU. Wang. et al.
[10] – מאמר: {ZeRO-Offload}: Democratizing {Billion-Scale} Model Training. Ren. et al. https://www.usenix.org/conference/atc21/presentation/ren-jie
[11] – מאמר: Neural Machine Translation of Rare Words with Subword Units. https://aclanthology.org/P16-1162
[12] – מאמר: Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidates. https://aclanthology.org/P18-1007
[13] – מאמר: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing. https://openreview.net/forum?id=S1EyQGf_bH
[14] – מאמר: Scaling Laws and Interpretability of Learning from Repeated Data –https://arxiv.org/pdf/2205.10487.pdf
[15] – מאמר: One Epoch Is All You Need – https://arxiv.org/abs/1906.06669
[16] – מאמר: Funnel-Transformer: Filtering out Sequential Redundancy for Efficient Language Processing. https://papers.nips.cc/…/2cd2915e69546904e4e5d4a2ac9e16…
[17] – מאמר: Hierarchical Transformers Are More Efficient Language Models. http://arxiv.org/abs/2110.13711
[18] – מאמר: TrimBERT: Tailoring BERT for Trade-offs. http://arxiv.org/abs/2202.12411
[19] – מאמר: ALBERT: A Lite BERT for Self-supervised Learning of Language Representations. https://openreview.net/forum?id=H1eA7AEtvS
[20] – מאמר: Easy-To-Hard. https://github.com/aks2203/easy-to-hard
[21] – מאמר: DALL·E Mini, July 2021.
[22] – מאמר: Single Headed Attention RNN: Stop Thinking With Your Head. http://arxiv.org/abs/1911.11423
[23] – מאמר: Optimizing Transformer for Low-Resource Neural Machine Translation. https://aclanthology.org/2020.coling-main.304
[24] – מאמר: Multi-head or Single-head? An Empirical Comparison for Transformer Training. http://arxiv.org/abs/2106.09650
[25] – מאמר: LiteTransformerSearch: Training-free On-device Search for Efficient Autoregressive Language Models. http://arxiv.org/abs/2203.02094
[26] – מאמר: Normalized Attention Without Probability Cage. http://arxiv.org/abs/2005.09561
[27] – מאמר: Transformer Quality in Linear Time. (Flash Attention) https://proceedings.mlr.press/v162/hua22a.html
[28] – מאמר: FNet: Mixing Tokens with Fourier Transforms. https://arxiv.org/abs/2105.03824v3
[29] – מאמר: RoFormer: Enhanced Transformer with Rotary Position Embedding. RoFormer: Enhanced Transformer with Rotary Position Embedding
[30] – מאמר: Language Modeling with Gated Convolutional Networks. https://proceedings.mlr.press/v70/dauphin17a.html
[31] – מאמר: GPT-NeoX-20B: An Open-Source Autoregressive Language Model.
[32] – מאמר: Adaptive Input Representations for Neural Language Modeling. https://openreview.net/forum?id=ByxZX20qFQ
[33] – מאמר: On Layer Normalization in the Transformer Architecture. http://arxiv.org/abs/2002.04745
[34] – מאמר: Understanding the Difficulty of Training Transformers. https://aclanthology.org/2020.emnlp-main.463
[35] – מאמר: NormFormer: Improved Transformer Pretraining with Extra Normalization.
[36] – מאמר: RoBERTa: A Robustly Optimized BERT Pretraining Approach. http://arxiv.org/abs/1907.11692
[37] – מאמר: Scalable Second Order Optimization for Deep Learning. http://arxiv.org/abs/2002.09018
[38] – מאמר: Making L-BFGS Work with Industrial-Strength Nets. http://arxiv.org/abs/1906.08237
[39] – מאמר: On the Variance of the Adaptive Learning Rate and Beyond. https://openreview.net/forum?id=rkgz2aEKDr
[40] – מאמר: Adafactor: Adaptive Learning Rates with Sublinear Memory Cost. http://arxiv.org/abs/1804.04235
[41] – מאמר: Decoupled Weight Decay Regularization. http://arxiv.org/abs/1711.05101
[42] – מאמר: How to Train BERT with an Academic Budget. https://aclanthology.org/2021.emnlp-main.831
[43] – מאמר: Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates. http://arxiv.org/abs/1708.07120
[44] – מאמר: Token Dropping for Efficient BERT Pretraining. http://arxiv.org/abs/2203.13240
[45] – מאמר: Curriculum Learning: A Regularization Method for Efficient and Stable Billion-Scale GPT Model Pre-Training.
[46] – מאמר: Language Models are Few-Shot Learners. http://arxiv.org/abs/2005.14165
[47] – מאמר: Primer: Searching for Efficient Transformers for Language Modeling. https://arxiv.org/pdf/2109.08668v2.pdf
[48] – מאמר: [דיברטה גרסה 1]: https://arxiv.org/abs/2006.03654
[49] – מאמר: [דיברטה גרסה 3]: https://arxiv.org/abs/2111.09543
- מפלצת.
- המודל הראשון שניצח את תוצאת בני האדם בSuperGLUE.
- גרסה 3 ניצחה כל תחרות NLP בקאגל מאז ששוחררה.
שבע תחרויות לפי ספירה שלי.
- גם המודל הקטן ביותר (DeBERTa V3 XSmall) מנצח את רוברטה (הגדול ממנו פי כמה).
- מעל הכל: המודל יעיל כל כך שגם הגרסאות הקטנות שזולות לאימון ולהרצה – מצויינות.
- המודל תומך באורך טקסט אינסופי באופן טבעי.
- ישנה אפילו גרסה שדוברת עברית!
מאומנת Multilingual: דוברת הרבה שפות.