רשתות עצביות חוזרות (RNNs) וגרסאותיהן עם תאים מבוקרים כמו תאי זיכרון ארוך-קצר (LSTMs) ויחידות חוזרות מבוקרות (GRUs) מספקות מנגנון למידול שפה בכך שהן יכולות ללמוד את סדר המילים ולספק תחזיות למילה הבאה ברצף. זה מאפשר לנו להשתמש ב-RNNs למשימות גנרטיביות, כמו יצירת טקסט רגיל, תרגום מכונה ואפילו תיאור תמונות.
✅ חשבו על כל הפעמים שבהן נהניתם ממשימות גנרטיביות כמו השלמת טקסט בזמן ההקלדה. חקרו את היישומים האהובים עליכם כדי לבדוק אם הם השתמשו ב-RNNs.
בארכיטקטורת RNN שדנו בה ביחידה הקודמת, כל יחידת RNN ייצרה את מצב החבוי הבא כתוצאה. עם זאת, ניתן גם להוסיף פלט נוסף לכל יחידה חוזרת, מה שיאפשר לנו להפיק רצף (ששווה באורכו לרצף המקורי). יתרה מכך, ניתן להשתמש ביחידות RNN שאינן מקבלות קלט בכל שלב, אלא רק לוקחות וקטור מצב התחלתי ומייצרות רצף של פלטים.
זה מאפשר ארכיטקטורות עצביות שונות, כפי שמוצג בתמונה הבאה:
תמונה מתוך פוסט הבלוג Unreasonable Effectiveness of Recurrent Neural Networks מאת Andrej Karpaty
- אחד-לאחד הוא רשת עצבית מסורתית עם קלט אחד ופלט אחד
- אחד-לרבים הוא ארכיטקטורה גנרטיבית שמקבלת ערך קלט אחד ומייצרת רצף של ערכי פלט. לדוגמה, אם נרצה לאמן רשת תיאור תמונות שתפיק תיאור טקסטואלי של תמונה, נוכל לקחת תמונה כקלט, להעביר אותה דרך CNN כדי לקבל את מצב החבוי שלה, ואז שרשרת חוזרת תייצר את התיאור מילה אחר מילה
- רבים-לאחד מתאר את ארכיטקטורות RNN שדנו בהן ביחידה הקודמת, כמו סיווג טקסט
- רבים-לרבים, או רצף-לרצף, מתאר משימות כמו תרגום מכונה, שבהן RNN ראשון אוסף את כל המידע מרצף הקלט למצב החבוי, ושרשרת RNN אחרת פורסת את המצב הזה לרצף הפלט.
ביחידה זו נתמקד במודלים גנרטיביים פשוטים שעוזרים לנו ליצור טקסט. לשם פשטות, נשתמש בטוקניזציה ברמת תווים.
נאמן את ה-RNN הזה ליצירת טקסט שלב אחר שלב. בכל שלב, ניקח רצף של תווים באורך nchars, ונבקש מהרשת לייצר את התו הבא עבור כל תו קלט:
בעת יצירת טקסט (בזמן הסקת מסקנות), נתחיל עם הנחיה כלשהי, שתועבר דרך תאי RNN כדי ליצור את מצב הביניים שלה, ואז מהמצב הזה מתחילה היצירה. ניצור תו אחד בכל פעם, ונעביר את המצב ואת התו שנוצר לתא RNN נוסף כדי ליצור את הבא, עד שניצור מספיק תווים.
תמונה מאת המחבר
המשיכו ללמוד במחברות הבאות:
הפלט של כל תא RNN הוא התפלגות הסתברות של תווים. אם תמיד ניקח את התו עם ההסתברות הגבוהה ביותר כתו הבא בטקסט שנוצר, הטקסט יכול לעיתים להפוך ל"מחזורי" בין אותם רצפי תווים שוב ושוב, כמו בדוגמה הזו:
today of the second the company and a second the company ...
עם זאת, אם נבחן את התפלגות ההסתברות לתו הבא, ייתכן שההבדל בין כמה הסתברויות גבוהות אינו גדול, למשל תו אחד יכול להיות בעל הסתברות של 0.2, ותו אחר - 0.19, וכו'. לדוגמה, כאשר מחפשים את התו הבא ברצף 'play', התו הבא יכול להיות באותה מידה רווח או e (כמו במילה player).
זה מוביל אותנו למסקנה שלא תמיד "הוגן" לבחור את התו עם ההסתברות הגבוהה ביותר, כי בחירת השני הגבוה ביותר עדיין יכולה להוביל לטקסט משמעותי. חכם יותר לדגום תווים מהתפלגות ההסתברות שניתנת על ידי פלט הרשת. ניתן גם להשתמש בפרמטר, טמפרטורה, שיאזן את התפלגות ההסתברות, אם נרצה להוסיף יותר אקראיות, או להפוך אותה לתלולה יותר, אם נרצה להיצמד יותר לתווים בעלי ההסתברות הגבוהה ביותר.
חקרו כיצד יצירת טקסט רכה מיושמת במחברות המקושרות לעיל.
בעוד שיצירת טקסט יכולה להיות שימושית בפני עצמה, היתרונות העיקריים מגיעים מהיכולת ליצור טקסט באמצעות RNNs מוקטור תכונות התחלתי כלשהו. לדוגמה, יצירת טקסט משמשת כחלק מתרגום מכונה (רצף-לרצף, במקרה זה וקטור מצב מ-מקודד משמש ליצירת או פענוח הודעה מתורגמת), או יצירת תיאור טקסטואלי של תמונה (במקרה זה וקטור התכונות יגיע ממחלץ CNN).
קחו שיעורים ב-Microsoft Learn בנושא זה
- יצירת טקסט עם PyTorch/TensorFlow
הנה כמה מאמרים להרחבת הידע שלכם
- גישות שונות ליצירת טקסט עם שרשרת מרקוב, LSTM ו-GPT-2: פוסט בבלוג
- דוגמת יצירת טקסט בתיעוד Keras
ראינו כיצד ליצור טקסט תו-אחר-תו. במעבדה, תחקור יצירת טקסט ברמת מילים.


