על הכוח הלא הגיוני של דיברטה (DEBERTA)
וכמה שיותר גדול – יותר טוב. (DeBERTa – microsoft/deberta-v3-large)
רקע נחוץ על טרנספורמרים
ל-מ-ה אטנשן עובד?
ולמי שמתעניין בא-י-ך אטנשן עובד, יכול למצוא סיכום שלי כאן [4].
-
כל מילה עוברת סדרה של טרנספורמציות נלמדות.
-
כל שורה במטריצה (לכל עומק המודל) נוצרה ממילת מקור מתאימה על ידי סדרה של טרנספורמציות: קידוד מילה, קידוד מיקום ושכבה לינארית.
-
הצעד הראשון בתוך הוא כפל מטריצה בין מטריצת השאילתה (Q) לבין מטריצת המפתחות (K).
-
אנו מקבלים מטריצה (מטריצת ביניים) שכל תא בה הוא תוצאה של כפל מטריצות בין שתי מילים שונות. לדוגמה, כל עמודה בשורה הרביעית תואמת לתוצאת הכפל בין מילת השאילתה הרביעית ל-כ-ל מילות מפתח.
-
ציון האטנשן תוצאת חישוב בין המפתחות ו"הערך": כפל מטריצה בין מטריצת הביניים לבין מטריצת "הערך" (V) ונקבל את תוצאת האטנשן. נזכור מאיפה כל שורה הגיעה: למשל השורה הרביעית מגיעה מטריצת השאילתה הרביעית כפולה עם כל שאר מילות המפתח והערך.
-
שורות במטריצת השאילתה (Q): המילה (w) עבורה נרצה לחשב את האטנשן.
-
שורות במטריצת המפתח (K): עד כמה המילה הזו (לא w) רלוונטית למילה שעבורה נרצה לחשב את האטנשן (w).
-
שורות במטריצת הערך (V): משמעות המילה הזו "בנפרד" מהמילה שעבורה נרצה לחשב את האטנשן (w).
-
ושורות V – "משמעות כל מילה" (V) ממושקלות לפי רלוונטיות המחושבת לכל מילה על פי "משמעות" אותה המילה (Q) בשילוב עם "משמעות" כל אחת מהמילים האחרות (K) (שגם הן נלמדות בנפרד לכל מילה).
-
רצינו שכל מילה "תשלח" יצוג למילים האחרות? נכפיל בK Transpose במקום K.
-
רצינו שיצוג V "ישוקלל" לפי חשיבות? ננרמל הכפלת QK^T.
-
החישוב בין השאילתה למפתח לומד את הרלוונטיות בין כל זוג מילים.
-
רלוונטיות הזו משמשת עבור סכום משוקלל של כל מילות הערך. הסכום המשוקלל הזה הוא ציון האטנשן.
-
טרנספורמרים לומדים יצגוים כך שמילים רלוונטיות אחת לשנייה דומות יותר.
-
זו הסיבה להפרדה המשולשת באטנשן: עבור כל מילה נלמד את – "היצוג שלי". "היצוג שאני שולח למילים האחרות". "היצוג שאני מקבל מהמילים האחרות". בנפרד.
שעד היום הוא אחד הטרנספורמרים החזקים ביותר אי פעם.
מדריך: לאמן טרנספורמרים זה איום ונורא
-
המשפט: "היי, מה נשמע?"
-
והמשפט: " היי, מה נשמע?"
קל לשחק עם זה כדי להבין בעצמכם במודלים ליצור תמונות: "קוביה אדומה מעל קוביה כחולה" יבלבל הרבה מודלים ליצור תמונות.
בניגוד ל "אותה תמונה של קיפוד כמה פעמים" ש(כן כן! תנסו!)בחלק מהמקרים יעבוד.
שיפורים לPositional Encoding:
-
אמבדינגס נלמד, הגיע עם GPT: במקום להוסיף sin/cos. פשוט נלמד בשכבת אמבדינגס נפרדת יצוג לכל אחד מתאי האינדקס (ממש range(len(x)) תסתכלו להם בקוד). זה אמנם משפר משמעותית את תוצאות המודל אבל המודל עדיין יתבלבל מ"ה י י מ ה , ק ו ר ה ?".
-
אמבדינגס רלטיבי, הגיע עם TransformerXL: לכל מילה, נלמד את יצוג המילה כך שבחישוב האינטרקציה עם כל אחת משאר המילים נוסיף יצוג נלמד נוסף של המרחק (ממש ממש המרחק באינדקסים שלמים. הכי פשוט שאתם יכולים לדמיין) בין המילים.
חוץ מOpenAI. הם כן שמו לב.
בשקט בשקט בחלק מהגרסאות הכי חדשות של GPT3 הם שילבו את האטנשן של TransformerXL במקום האטנשן של GPT.
וזה עובד כל כך הרבה יותר טוב שכמה חודשים טובים חשדתי שחלק מגרסאות GPT3 הרבה הרבה יותר חזקות מהאחרות. רק על פי הטקסטים.
השינוי מוזכר כהערת שוליים שולית ולא חשובה באחד מהמאמרים. הסיבה: Slightly better performance.
בפעם האחרונה שאני בדקתי כמה Slightly התוצאות של אטנשן רלטיבי טובות יותר קיבלתי 0.01~ בלוס. מעניין כמה Slightly השיפור אצלם.
טרנספורמרים שמכלילים בין אורכי רצפים
גרסה ראשונה – DeBERTa V1
-
פתרון לבעיות הPositional Encoding שהוצעו במאמר
-
וגם האינטרקציה בין הטוקנים השונים מחושבת קצת אחרת
-
אינטרקצית "תוכן לתוכן" הלומדת לחשב את מעבר האינפורמציה בין משמעויות המילים השונות.
-
אינטרקצית "תוכן למיקום" הלומדת לחשב את השפעת משמעות המילים על משמעות המיקומים במשפט.
-
אינטרקצית "מיקום לתוכן" הלומדת לחשב את השפעת המיקום על משמעות המילים.
בערך כלום. מכונה אחת מספיקה.
-
החלפת האטנשן באטנשן רלטיבי (כמו בTransformerXL). אפס מאמץ. שיפור ענקי בביצועים.
-
הוספת יצוג מיקום "הפוך" הלומד את המרחק מסוף המשפט ולא רק מתחילת המשפט. כך היצוגים יכולים ללמוד רק היכן הם במשפט. גם כמה המשפט ארוך.
-
עוד שיפור קטן בביצועים (כנראה שלא שווה את כוח החישוב) תקבלו מלהוסיף אמבדינגס שסופר גם לאמצע המשפט ולא רק לסוף וההתחלה.
-
שיפור ענק בביצועים גם תקבלו אם תוסיפו את כל הטריקים שיש באטנשן של LongT5. לא אכנס לפרטים אבל הוא תוצאה של "כל הטריקים האפשריים" ועוד שיפורים למאמרים אחרים שמנסים ללמוד יצוגי טקסט ארוך.
ולמי שלא מכיר את המשימות בSuperGLUEs: זה חולני.
גרסה 2 – DeBERTaV2
-
טוקניזר
דרך אגב: כך למשל המודלים של AI21 עוקפים את GPT3 כמעט בהכל. (כמעט בהכל: 16 מתוך 19 דאטהסטים)
-
קונבולוציות
כן. לא צריך לשאול. ניסיתי להוסיף קונבולוציות בכל הבלוקים. השיפור בביצועים היה זניח וכוח החישוב לא היה זניח בכלל.
-
שיתוף משקולות
-
אטנשן רלטיבי בגרסת T5
השיפור הסודי ולא מתועד: "גרסה 2.5"
אמרתי לכם שכדאי לכם לעבור על הקוד
בהצלחה עם לנסות לתלוש class ספציפי מתוך חבילה-פופולרית-ידידותית-מאד-למשתמש-בלי-כפל-קוד-בכלל בלי לתלוש את כל שאר החבילה אתכם.
גרסה 3 – DeBERTaV3
-
במקום מילים קחו רצפים באורך N (היפרפרמטר), במקום להשלים מילה ספציפית על המודל להשלים חלקים ארוכים מהמשפט. יותר קשה: יותר ביצועים.
-
להסתיר מהמודל עוד מילים גם בקלט וגם בפלט (זה גם סוג של Dropout ברמת הCPU למי מאיתנו שקצר בזכרון GPU)
-
פשוט Focal Loss
שאלת השאלות: עכשיו כשיש לנו מודל ש"דופק" ומודל ש"מתקן" במי מהם נשתמש?! אני מעדיף לבחור מה לאכול לצהריים מרוב שהשאלה הזו קשה. ולארוחת צהריים יש לי כבר סקריפט שמזמין random choice מוולט.
הם לא נרגעים שם במיקרוסופט..
שחלקם אומנו על כל (!!!) גיטהאב.
בנושא אחר: למישהו יש קצת זכרון GPU שהוא לא צריך?