close menu

הטרנספורמרים, הגרסה העברית: מה היה לפני


פוסט זה נכתב על ידי חי הופמן.

עריכה מדעית: מייק ארליכסון ושי אהרון

#deepnightlearners


הקדמה

כחלק מעבודת התזה שלי התעמקתי לאחרונה בארכיטקטורת הטרנספורמרים. כשקראתי את המאמרים הראשוניים בתחום (Attention is all You Need, ViT) התקשיתי לעבד את הרעיונות הקונקרטיים שעליהם מבוססים הטרנספורמרים לרעיונות מופשטים. כתוצאה מכך צללתי לנושא, ניתחתי קוד ממספר מקורות באינטרנט לצד קריאת המאמרים, ולבסוף ניהלתי עם ChatGPT סיבוב שאלות-תשובות כדי לחדד את ההבנה. לאחר שבוע וחצי של מחקר מאומץ, הגעתי למסקנה שאני רוצה לשתף את הידע שצברתי עם העולם. ולכן, החלטתי לכתוב סדרת פוסטים שאוכל להביע דרכה את ההבנה שלי, ואולי לקצר תהליך למי שאין לו הזמן שהיה לי להשקיע בלמידה הזו. כחלק מהכתיבה, אסקור את ההיסטוריה של התחום, ארכיטקטורות הרשת השונות, יתרונות וחסרונות של כל אחת מהן, וכיצד מאמנים אותן. בשלב השני אסקור מאמרים בתחום הראייה הממוחשבת המציגים את השימוש ברשת למשימות כגון סגמנטציה, הדבקת תמונות (Image Matting), העתקת מנח גוף (Gait Transfer), סיווג וכדומה.

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

פרק 1

סקירה היסטורית

לפני שנפתח בהצגה ההיסטורית, נגדיר מספר מושגי יסוד שיתרמו להבנה המשותפת. סדרה (series) הינה רצף (sequence) של פריטים מאותו הסוג, המאורגנים בסדר כרונולוגי מוגדר מראש, ומתארים כיצד משתנה מסוים (variable) משתנה לאורך זמן. סדרות יכולות לתאר רצף של נתונים פיננסים, משפט בשפה טבעית או סרט וידאו המחולק לפריימים וכו'. המושג השני שנגדיר יהיה טוקן (token) והוא תוצר של פעולת טוקניזציה (tokenization). בפעולה זו, מפרקים את הטקסט המתקבל כקלט ליחידות קטנות יותר בתהליך הקודם לתהליך הלמידה. היחידות הקטנות ביותר נקראות טוקנים, שיכולים לייצג מילה, חלקי מילה, תו או אות. המושג האחרון שנגדיר יהיה קלט (input) – קלט יכול להיות המידע הנוכחי שאנחנו מכניסים לרשת, בארכיטקטורות מסוימות ניתן להכניס את כל הסדרה כקלט, ובאחרות טוקן יחיד.

טרנספורמים הוצעו בהתחלה כפתרון לבעיית ניתוח טקסט. המאמר בו הטרנספורמרים הופיעו לראשונה נקרא Attention is all You Need, שבו הכותבים השתמשו בארכיטקטורה למשימת תרגום משפטים מאנגלית לצרפתית. מאמר זה למעשה פתח את הסכר למהפכה בתחום ה-NLP, שהתפשטה גם לתחומים אחרים שאנו רואים היום כגון ראייה ממוחשבת, זיהוי קולי, ביו-אינפורמטיקה, למידה מבוססת חיזוקים, מודלים גנרטיביים, חיזוי סדרות ועוד. כמו ארכיטקטורות שונות לפנייה גם טרנספורמרים מיועדים ללמוד את הקשרים בין הטוקנים השונים בסדרה, אך בשונה מרשתות קודמות שהופעלו באופן איטרטיבי, טרנספורמרים הציגו מספר רעיונות חדשים. השניים המרכזיים, שזורים אחד בשני בארכיטקטורה, ומהווים את אבני הבניין הקונספטואלים של הרשת (בנוסף לעוד חידושים שהמאמר הציג). הראשון היה עיבוד מקבילי של הסדרה, שהוביל ליעילות חישובית באימון המודל ביחס למודלים קודמים (RNN\LSTM\GRU), ואפשר בפעם הראשונה לפרוץ את מחסום הלמידה הסדרתית (עיבוד טוקן בודד בהפעלת הרשת) של מידע התלוי בזמן כלומר, ניתן כעת ללמוד במקביל תלויות קצרות וארוכות טווח. נציין שגם טרנספורמרים מוגבלים ביכולתם לעבד קלט מקבילי, אולם זוהי מגבלה התלויה במשאבי חישוב כדוגמת זיכרון זמין ויחידות עיבוד.

בנוסף, הרשת הציגה שני מנגנוני תשומת הלב (attention). הראשון הוא תשומת לב-עצמית (self-attention) שאפשרה למודל ללמוד קורלציה-זוגית (pairwise correlation) בין הטוקנים שהתקבלו בקלט הנוכחי, כלומר, הרשת לומדת כיצד למדל את קשרים/תלויות בין טוקנים שונים בתוך הסדרה. המנגנון השני הינו תשומת לב מוצלבת (cross-attention) שאפשרה, בדומה לתשומת לב עצמית, ללמוד את הקשרים בין טוקן מהקלט הנוכחי, לבין טוקנים שונים מסדרות שונות או בין טוקנים בפלט של הרשת. תכונות אלו הכרחיות במשימות כדוגמת תרגום, מענה על שאלות או סיכום טקסט, שדורשות בחירה מודעת בחלקים החשובים ביותר של הקלט והפלט. רעיונות אלו הלהיבו אותי, וגרמו לי לרצות להבין מה הוביל להתפתחותם. על מנת לעשות זאת התחלתי לסקור את הארכיטקטורות שקדמו לטרנספורמים, כיצד הם עבדו, ומדוע לא צלחו במשימה שהטרנספורמים כן הצליחו בה. 

ארכיטקטורת RNN

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

נדגים כעת את מורכבות ניתוח שפה, באמצעות בעיית התרגום, ואת הקושי שהיא מציפה. נניח ואנו מעוניינים לתרגם את המשפט הבא מאנגלית לעברית: "The dog sleeps"' – "הכלב ישן". ניתן לתרגם כל מילה במשפט ללא תלות במילים האחרות. הכלל היחיד שעלינו להתחשב בו הינו שהמילה "the" תוסיף תחילית "ה" למילה שבאה אחרייה. ולכן, נוכל לשמור מילון המכיל לכל מילה באנגלית את התרגום שלה בתוספת לחוקים שהצענו ולקבל תרגום תקין. אולם, בהינתן המשפט "We're all mad here" (עליסה בארץ הפלאות) תוצאת התרגום שבוצע בהתאם לחוקים אלו תהיה "כולנו את כל מטורף כאן". שורש הבעיה הוא תרגום המילה הנוכחית ללא התחשבות בהקשר(context), כלומר, במהלך התרגום אנו מוכרחים להתחשב בתלויות בין המילה שאנו מתרגמים לבין המילים האחרות במשפט. ניתן להציע פתרון המשכלל את המילון שהצענו, ולשמור בנוסף על המילים והתרגום שלהם, גם צמדי מילים, אך זהו פתרון נקודתי לבעיה מבנית, ודי מהר נצטרך להרחיב את המילון לביטויים בעלי 3, 4 ויותר מילים. ולבסוף, נתכנס לכישלון המשותף לכל האלגוריתמים שניסו לפתור את הבעיה בצורת rule-based, והוא חוסר היכולת למדל את חוקיות הבעיה בצורה יעילה.

                  איור 1: מבנה רכיב RNN

הארכיטקטורה הראשונה שניסתה למדל את התלות בין מילים בקלט מתוארכת לסוף שנות השמונים של המאה הקודמת [2, 3], ונקראת  RNN . הרעיון המרכזי מאחוריה הוא ניתוח הטוקן הנוכחי, בתוספת למידע שהתקבל מטוקנים אחרים בסדרה. הרשת מקבלת מילה במשפט ומייצרת שני פלטים, הראשון מתאים למילה הבאה, כלומר מה החיזוי של הרשת ביחס לטוקן הנוכחי ,והשני הוא ההקשר שנצפה עד עתה, ומהווה תמצות של כל המידע שהרשת קיבלה עד לאותו הרגע (בייצוג lossy). ארכיטקטורה פשוטה שמממשת את הפתרון שהצגנו הינה שרשור של יחידות חישוב כך שכל יחידה (שנקרא לה בלוק מטעמי נוחות החל מכאן) מקבלת טוקן בזמן t (כלומר את הטוקן במיקום ה-t בסדרה) ואת ההקשר מזמן t-1 ומייצרת את הפלט המתאים לו. אולם, סדרות  שונות מכילות מספר טוקנים שונה, ולכן, לא ניתן להחזיק מספר בלתי מוגבל של בלוקים כך שכל בלוק מתאים לטוקן מסוים בסדרה. בנוסף, בארכיטקטורה שכזו הבלוקים הראשונים יאומנו הרבה יותר מהבלוקים האחרונים, דבר הנובע מכך שסדרות הקצרות ממספר הבלוקים המרבי, ירופדו באפסים, וכתוצאה מכך הבלוקים האחרונים ישתתפו פחות בתהליך הלמידה. ולכן, הפתרון הינו הפעלה איטרטיבית של הרשת. כלומר שימוש בבלוק יחיד בעל סט משקולות משותף, כך שהרשת מקבלת בכל איטרציה טוקן חדש ואת ההקשר שהתקבל במוצאה באיטרציה הקודמת. הייצוג הטורי מהווה פריסה (unfolding) של הרשת (ראה איור 2), בייצוג הקומפקטי: הרשת מקבלת קלט Xi ואת המצב הפנימי מהאיטרציה הקודמת המתואר כ- Hi-1, ומוציאה פלט Yi, בעוד שהמצב הפנימי Hi מוזן בחזרה לרשת באיטרציה הבאה.

 

איור 2: RNN בייצוג טורי (מימין) ובייצוג קומפקטי (unfolded)

אז כיצד משתמשים ברשת כזו לטובת ניתוח שפה? טרם השימוש מקודדים את המילים/חלקי מילים /טוקנים (word/token embedding). פעולת הקידוד היא המרת מילה/טוקן בשפה טבעית, לוקטור המקרה מילים בעלות משמעות דומה, ומרחיק מילים בעלות משמעות שונה אחת מהשנייה. בקישור הנ"ל ניתן לראות שיטות שונות לבצע זאת, כאשר הנפוצה ביותר הייתה שימוש ברשת נוירונים (לדוגמא word2vec). בהקשר זה, אחד החידושים שארכיטקטורת הטרנספורמרים מציגה הינו שיכון (embedding) המילים כחלק מהארכיטקטורה, דבר שאפשר למידה של שיכון המילה ביחס למילים קרובות אליה, וגם ביחס למילים רחוקות ממנה (כלומר שיכוני מילים במרחב תלויי הקשר או contextualized embeddings).

על פניו, נראה שהרשת מספקת פתרון לבעיה, היא מסוגלת לאגור מידע ולמדל את התלות בין חתימות הזמן השונות. אז מדוע זה לא עובד? ישנן מספר סיבות האחראיות לכך. הראשונה נעוצה במבנה הטורי של הרשת, שהוביל כמעט תמיד לדעיכת הגרדיאנט לאפס (vanishing gradient). כפי שהוזכר בהתחלה, במשימות ניתוח שפה הפלט עבור טוקן מסוים תלוי בסדרת טוקנים שקדמו לו, ולכן, בעת אימון הרשת המשקולות מעודכנות רק לאחר העברת הסדרה כולה. ברשתות איטרטיביות, יש לחשב את הגרדיאנט של המשקולות גם כן בסדר איטרטיבי אולם הפעם הוא הפוך. כדי לחשב את השפעת המשקולות על השינוי בשגיאה, עלינו לכפול בטור את הנגזרות החלקיות של כל מצב פנימי i ביחס למצב הפנימי i-1. מכיוון שהשינוי מחושב עבור אותו סט משקולות, הגרדיאנט יכול לדעוך או להתבדר לאורך האימון. ניתן להמחיש זאת באמצעות הערכים העצמיים של מטריצת המשקולות; במידה והם קטנים מ-1, הגרדיאנט ידעך מכיוון שמטריצת המשקולות מקטינה אותו בכל פעם שמתבצע עדכון, ובמידה והערכים העצמיים גדולים מ-1 הגרדיאנט יתבדר מכיוון שמטריצת המשקולות מגדילה אותו בכל איטרציה (דעיכת הגרדיאנט ופתרונות ב-RNN). הבעיה השנייה נובעת מהיחס בין גודל המצבים הפנימיים והיכולת שלהם לדחוס מידע, לבין גודל הסדרה שהרשת נדרשת לנתח. המצב הפנימי "דוחס" את כל המידע עד לנקודת הזמן הנוכחית, ולכן, כאשר הסדרה עוברת סף מסוים בגודלה ומתחילות להיווצר תלויות ארוכות טווח בין מרכיביה, המצב הפנימי הופך להיות צוואר-בקבוק ברשת והיא מתחילה "לשכוח" פרטים שרחוקים מהקלט הנוכחי שלה. הבעיה האחרונה צצה במהלך השימוש ברשת לאחר האימון (inference). הרשת אינה מנצלת את מלוא הפוטנציאל החישובי שלה (ושל המכונה שהיא רצה עליה) כתוצאה מאופי קבלת הקלטים באופן טורי, דבר הגורר זמני הסקה ארוכים (כלומר latency גבוה) במגוון משימות NLP. בעיה מהותית זו נפתרת בארכיטקטורת הטרנספורמים שנדבר עליה בהמשך.

נקודות מפתח של פרק 1:

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

 פרק 2: ארכיטקטורת LSTM 

                      איור 3: בלוק LSTM

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

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

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

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

היתרון של LSTM מתבטא בעיקר במשפטים ארוכים, לדוגמה, במשפט "She left" תרגום המילה "left" על ידי RNN תהייה "הלכה" ולא "הלך" (או "שמאל״) מכיון שההקשר הוא קרוב. אולם, אם ניקח את המשפט "The goalie was determined to protect the goal" את המילה האחרונה ניתן לתרגם כ"משימה/מטרה" או "שער (כדורגל)", במקרה זה, מילה ההקשר "goalie" (שוער) מרוחקת מהמילה שאנו רוצים לתרגם, ולכן RNN עלולה לטעות בתרגום. במקרה זה יבוא לידי ביטוי הזיכרון ארוך הטווח, שמתחשב במילה "goalie" בתרגום המילה "goal". 

מדוע LSTM סובלת פחות מדעיכת הגרדיאנט? הסיבה נובעת מכך שרכיב הזיכרון אינו מתעדכן בפלט של פונקציית האקטיבציה כמו ב-RNN, אלא בשימוש במוצא שער השכחה ושער הקלט. שער השכחה מסיר חלקים מהקלט על ידי יצירת וקטור של ערכים רציפים במקטע של [0,1], כאשר 0 משמעו שכחה מוחלטת, ו-1 מהווה שימור מוחלט של המידע. הקלט והמצב הפנימי קובעים כמה מידע יש לשכוח, אולם הם אינם קובעים מה יהיה תוכן תא הזיכרון לאחר העדכון. מן הצד השני, הוספת מידע חדש לזיכרון אינה מתבצעת כדריסה של התוכן על ידי הקלט, אלא כחיבור שלו. שער הקלט מייצר וקטור שמתווסף למידע הקיים בתא הזיכרון בפעולת חיבור (element-wise addition) ובכך מאפשר את העברת האינפורמציה ברשת ומונע את דעיכת הגרדיאנט, מכיוון שפעולה זו פחות רגישה לשינויים בקלט כפי שמוצא פונקציית האקטיבציה רגישה אליהם. כתוצאה מכך, הנגזרות שאינן מושפעות באופן ישיר מפונקציות האקטיבציה ולא מתאפסות, מאפשרות את עדכון המשקולות. בנוסף, מכיוון ששער השכחה מייצר וקטור הקובע אילו חלקים ברכיב הזיכרון יש לשכוח ואילו לשמר, כאשר ערך הוקטור קרוב ל-1, המידע יכול לזרום ברשת מבלי להינזק באופן משמעותי. במילים אחרות, מתאפשרת שמירת מידע ארוך טווח (מידול מתמטי של נושא זה ניתן למצוא בקישור). בזכות השימוש ברכיב זיכרון, המצב הפנימי מצטמצם להיות זיכרון לטווח קצר בלבד והשפעת צוואר הבקבוק שנוצרת ב-RNN פוחתת גם היא. 

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

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

נקודות מפתח של פרק 2:

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

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

מיכאל (מייק) ארליכסון, PhD, Michael Erlihson. עובד בחברת הסייבר Salt Security בתור Principal Data Scientist. מיכאל חוקר ופועל בתחום הלמידה העמוקה, ולצד זאת מרצה ומנגיש את החומרים המדעיים לקהל הרחב.

#deepnightlearners

עוד בנושא: