דלג לתוכן הראשי
🎓 תלמיד רשום? חזור לפורטל לאחר הלימוד | 🚀 גולש חדש? הצטרף חינם
🎓 DL-NLP-701-2024: Deep Learning for Natural Language Processing // מפגש 5 לאזור האישי

📋 סילבוס המפגש

למה הנושא חשוב בקורס "Deep Learning for Natural Language Processing"?

ארכיטקטורת הטרנספורמר חוללה מהפכה של ממש בתחום הבינה המלאכותית, ובפרט בעיבוד שפה טבעית (NLP). מאז הצגתה במאמר פורץ הדרך "Attention Is All You Need" בשנת 2017, היא הפכה לבסיס למודלי שפה גדולים (LLMs) דוגמת GPT ו-BERT.

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

1. היסודות התיאורטיים של ארכיטקטורת הטרנספורמר

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

  • קשב רב-ראשי (Multi-Head Attention): במקום ראש קשב יחיד, הטרנספורמר משתמש במספר ראשי קשב הפועלים במקביל. כל ראש לומד ייצוג שונה של הקשב, מה שמעשיר את יכולת המודל ללכוד מידע מגוון מהקלט.
  • קידוד עמדה (Positional Encoding): מכיוון שמנגנון הקשב העצמי אינו מכיל מידע אינהרנטי על סדר המילים ברצף, מוסיפים וקטורי קידוד עמדה ל-Embeddings של המילים. וקטורים אלו מקודדים את המיקום היחסי או המוחלט של כל מילה, ומאפשרים למודל להבין את הסדר הסמנטי.
  • מבנה מקודד-מפענח (Encoder-Decoder): הטרנספורמר המקורי מורכב ממקודד (Encoder) ומפענח (Decoder). המקודד מעבד את רצף הקלט כולו ומייצר ייצוגים עשירים, ואילו המפענח משתמש בייצוגים אלו ובקלט קודם כדי לייצר את רצף הפלט.

תרשים מושגים (Concept Map)

graph TD; A[ארכיטקטורת טרנספורמר] --> B{רכיבים מרכזיים}; B --> C[מנגנון קשב עצמי]; C --> C1[קשב רב-ראשי]; B --> D[קידוד עמדה]; B --> E[שכבות הזנה קדימה]; B --> F[נורמליזציה וחיבורים שיוריים]; A --> G[בלוק מקודד]; A --> H[בלוק מפענח]; G -- קשב צולב --> H;
import torch
import torch.nn as nn

class SimpleSelfAttention(nn.Module):
    def __init__(self, embed_dim):
        super(SimpleSelfAttention, self).__init__()
        self.embed_dim = embed_dim
        # Query, Key, Value linear transformations
        self.query = nn.Linear(embed_dim, embed_dim)
        self.key = nn.Linear(embed_dim, embed_dim)
        self.value = nn.Linear(embed_dim, embed_dim)

    def forward(self, x):
        # x shape: (batch_size, seq_len, embed_dim)
        
        # 1. Linear projections to get Q, K, V
        Q = self.query(x) # (batch_size, seq_len, embed_dim)
        K = self.key(x)   # (batch_size, seq_len, embed_dim)
        V = self.value(x) # (batch_size, seq_len, embed_dim)

        # 2. Calculate attention scores: Q * K^T
        # K.transpose(-2, -1) swaps the last two dimensions (seq_len, embed_dim) -> (embed_dim, seq_len)
        scores = torch.matmul(Q, K.transpose(-2, -1)) # (batch_size, seq_len, seq_len)
        
        # 3. Scale scores to prevent vanishing gradients
        scores = scores / (self.embed_dim ** 0.5)

        # 4. Apply softmax to get attention weights
        attention_weights = torch.softmax(scores, dim=-1) # (batch_size, seq_len, seq_len)

        # 5. Multiply weights by V to get the output
        output = torch.matmul(attention_weights, V) # (batch_size, seq_len, embed_dim)
        return output

# Example usage:
# embed_dim = 64
# seq_len = 10
# batch_size = 2
# 
# model = SimpleSelfAttention(embed_dim)
# dummy_input = torch.randn(batch_size, seq_len, embed_dim)
# output = model(dummy_input)
# print(f"Input shape: {dummy_input.shape}")
# print(f"Output shape: {output.shape}")

💡 חומר למחשבה

האם ידעת ש... האם ידעתם שארכיטקטורת הטרנספורמר נולדה מתוך צורך לוותר על רשתות רקורסיביות (RNNs) כדי להאיץ את האימון במודלים ארוכים ולטפל טוב יותר בתלויות ארוכות טווח?

2. יישום מעשי של הטרנספורמר: מבנה וזרימת נתונים

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

  • בלוק מקודד: מקבל קלט (מילים + קידוד עמדה), מעביר אותו דרך מנגנון קשב עצמי רב-ראשי, ולאחר מכן דרך רשת הזנה קדימה פשוטה (Feed-Forward Network).
  • בלוק מפענח: מורכב משלוש תת-שכבות: קשב עצמי רב-ראשי מוסווה (Masked Multi-Head Self-Attention), קשב רב-ראשי צולב (Multi-Head Cross-Attention) המקבל מפתחות וערכים מהמקודד, ושוב רשת הזנה קדימה. המסווה בקשב העצמי של המפענח מבטיח שהמודל יחזה את המילה הבאה רק על סמך המילים הקודמות, ללא הצצה קדימה.

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

תהליך העבודה (Workflow)

graph LR; A[קלט טקסט] --> B[Embedding + קידוד עמדה]; B --> C[בלוק מקודד 1]; C --> D[בלוק מקודד N]; D -- ייצוגים --> E[בלוק מפענח 1]; E --> F[בלוק מפענח N]; F --> G[שכבת פלט (Softmax)]; G --> H[פלט (מילה חזויה)]; E & F -- 'מפתחות וערכים' --> C & D; E -- 'קלט קודם' --> E; F -- 'קלט קודם' --> F;
  1. שלב 1: הגדרת שכבת Embedding וקידוד עמדה: המרת מילים לווקטורים צפופים והוספת מידע על המיקום שלהן ברצף.
  2. שלב 2: בניית מודול הקשב העצמי (Self-Attention): יצירת פונקציה שמחשבת את יחסי הגומלין בין כל אסימון ברצף לכל שאר האסימונים.
  3. שלב 3: שילוב שכבות נורמליזציה וחיבורים שיוריים: הוספת Layer Normalization ו-Residual Connections כדי לייצב את האימון ולשפר את זרימת הגרדיאנטים.
  4. שלב 4: הרכבת בלוק המקודד (Encoder Block): שילוב מנגנון הקשב העצמי ורשת הזנה קדימה עם הנורמליזציה והחיבורים השיוריים.
  5. שלב 5: הרכבת בלוק המפענח (Decoder Block): בניית בלוק הכולל קשב עצמי מוסווה, קשב צולב (עם פלטי המקודד) ורשת הזנה קדימה.
  6. שלב 6: בניית מודל הטרנספורמר המלא: חיבור מספר בלוקי מקודד ובלוקי מפענח ליצירת הארכיטקטורה השלמה.
  7. שלב 7: אימון וחיזוי: אימון המודל על מערך נתונים גדול ושימוש בו לביצוע משימות כמו תרגום או יצירת טקסט.

⚠️ רגע, עצור!

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

3. מושגים מתקדמים ואתגרים בטרנספורמרים

וריאציות ושיפורים בארכיטקטורה

  • טרנספורמרים דלילים (Sparse Transformers): מודלים המפחיתים את העלות החישובית של הקשב עבור רצפים ארוכים במיוחד.
  • טרנספורמרים קונבולוציוניים (Convolutional Transformers): שילוב יתרונות של רשתות קונבולוציה עם מנגנון הקשב.
  • מודלים ספציפיים: BERT (דו-כיווני למשימות הבנה), GPT (חד-כיווני למשימות יצירה), T5 (מודל מאוחד למגוון משימות).
  • טרנספורמרים יעילים (Efficient Transformers): כמו Reformer, Performer, Linformer, המציעים דרכים חלופיות להפחית את מורכבות הקשב.

אתגרים ופתרונות עתידיים

  • עלות חישובית: מנגנון הקשב דורש משאבי חישוב וזיכרון רבים, במיוחד עבור רצפים ארוכים. פתרונות כוללים קשב דליל, קשב מבוסס ליבה (kernel-based attention), ועוד.
  • צורך בנתונים: אימון מודלי טרנספורמר גדולים דורש כמויות אדירות של נתונים, מה שמגביל את הנגישות. למידת העברה (Transfer Learning) באמצעות מודלים מאומנים מראש היא פתרון נפוץ.
  • הטיה אתית: מודלים גדולים נוטים לשקף הטיות הקיימות בנתוני האימון, מה שמעלה שאלות אתיות וחברתיות. מחקר מתמקד בזיהוי והפחתת הטיות אלו.
  • פרשנות והבנה: קשה להבין בדיוק כיצד מודלי טרנספורמר מגיעים להחלטותיהם. פיתוח כלים לפרשנות (Explainable AI) הוא תחום מחקר פעיל.

🤫 סוד קטן

טעות נפוצה: סוד תעשייתי: רוב חברות הטכנולוגיה הגדולות אינן מאמנות מודלי טרנספורמר מאפס, אלא משתמשות במודלים מאומנים מראש (pre-trained) ומכווננות אותם למשימות ספציפיות (fine-tuning) – גישה יעילה בהרבה!

🎯 סיכום המפגש

✅ מה למדנו היום?

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

🚀 לקראת המפגש הבא

  • חקור לעומק את מנגנון הקשב הרב-ראשי (Multi-Head Attention) ואת אופן פעולתו המתמטי.
  • נסה ליישם בלוק טרנספורמר בסיסי באמצעות ספריות למידה עמוקה כמו PyTorch או TensorFlow.
  • קרא את המאמר המקורי "Attention Is All You Need" כדי להבין את הרציונל והפרטים הטכניים.
  • התנסה עם ספריות כמו Hugging Face Transformers כדי לטעון ולהשתמש במודלים מאומנים מראש.

⚠️ דגשים חשובים

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

📋 מטלות להגשה (מתוך מערכת הקורס)

יש להגיש את המטלות הבאות דרך מערכת ה-LMS עד המועד הנקוב.

📋 מטלה ניתוח מנגנון הקשב בטרנספורמר

משקל: 25%

כתוב חיבור קצר (300-400 מילים) המתאר את מנגנון הקשב העצמי בטרנספורמר, את יתרונותיו לעומת רשתות RNN/LSTM, והסבר כיצד קשב רב-ראשי (Multi-Head Attention) משפר את ביצועיו. יש לכלול דוגמאות קצרות להמחשה.

📊 מחוון הערכה (Rubric)
קריטריון תיאור נקודות
הסבר מנגנון הקשב העצמי הבנה מעמיקה של מנגנון הקשב העצמי והסבר ברור. 40
השוואה למודלים רקורסיביים השוואה מפורטת ומנומקת לרשתות RNN/LSTM. 30
הסבר קשב רב-ראשי הסבר מדויק על תפקידו ויתרונותיו של קשב רב-ראשי. 20
איכות הכתיבה והניסוח בהירות, לכידות וכתיבה אקדמית נאותה. 10

🚀 פרויקט תרגיל תכנות: בלוק מקודד של טרנספורמר

משקל: 35%

כתוב קוד Python (באמצעות PyTorch או TensorFlow) המיישם בלוק מקודד יחיד של טרנספורמר. הקוד צריך לכלול את מנגנון הקשב העצמי, שכבת Feed-Forward, נורמליזציה (LayerNorm) וחיבורים שיוריים. כלול הערות מפורטות והדגמה קצרה עם קלט דמה.

📊 מחוון הערכה (Rubric)
קריטריון תיאור נקודות
יישום Self-Attention נכונות היישום של מנגנון הקשב העצמי (Self-Attention). 40
יישום Feed-Forward נכונות היישום של שכבת Feed-Forward. 20
LayerNorm ו-Residuals שילוב נכון של Layer Normalization ו-Residual Connections. 20
איכות הקוד והתיעוד בהירות הקוד, שימוש בהערות מפורטות, והדגמת קלט/פלט. 20

😎 בונוס (רשות)

תרגיל אתגר: בונוס: מודלי טרנספורמר משמשים כיום לא רק למשימות שפה, אלא גם למשימות ראייה ממוחשבת (Vision Transformers), עיבוד אודיו, ואף רובוטיקה, מה שמדגים את הרבגוניות והכוח שלהם!

🎯 סיימת את יחידת הלימוד!

🚀

חומר זה הוא חלק מקורס Deep Learning for Natural Language Processing (DL-NLP-701-2024)
יש לחזור לפורטל הקורס לצורך ביצוע המבחן המסכם והגשת המטלות.

🎓 חזרה לפורטל הקורס - EduManage

📚 יחידות לימוד נוספות בקורס

🧠 מבוא ללמידת מכונה עמוקה הכר את העקרונות הבסיסיים של רשתות נוירונים עמוקות, סוגי ארכיטקטורות נפוצות וכיצד הן פועלות. 💬 יסודות עיבוד שפה טבעית (NLP) למד על הכלים והטכניקות המרכזיות בעיבוד שפה טבעית, החל מ-Tokenization ועד ייצוגי מילים. 📚 מודלי שפה גדולים (LLM): עקרונות ויישומים צלול לעולם מודלי השפה הגדולים, עקרונותיהם, יכולותיהם, והאתגרים הכרוכים בפיתוחם.

❓ שאלות נפוצות על המפגש

מה ההבדל העיקרי בין טרנספורמר ל-RNN (רשת נוירונים רקורסיבית)?

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

האם טרנספורמרים יכולים לשמש למשימות שאינן קשורות לשפה?

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

מהו קידוד עמדה (Positional Encoding) ומדוע הוא חשוב בארכיטקטורת הטרנספורמר?

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

כמה קשה לאמן מודל טרנספורמר גדול מאפס?

אימון מודלי טרנספורמר גדולים (כמו GPT-3) דורש משאבי חישוב עצומים – אלפי מעבדי GPU למשך שבועות או חודשים – וסטים עצומים של נתונים. לכן, הוא נגיש בעיקר לחברות גדולות ומוסדות מחקר עם תקציבים משמעותיים. למטרות לימוד ופיתוח, ניתן להשתמש במודלים קטנים יותר או במודלים מאומנים מראש (pre-trained models) ולבצע עליהם Fine-tuning.