שידור

במסמך הזה מתוארת הסמנטיקה של השידורים XLA.

מהו שידור?

שידור הוא התהליך של יצירת מערכים עם צורות שונות צורות תואמות לפעולות אריתמטיות. הטרמינולוגיה מבוססת על NumPy Broading.

ייתכן שיידרש שידור עבור פעולות בין מערכים רב-ממדיים של או בין מערכים רב-ממדיים עם צורות תואמות. נבחן את התוספת X+v שבה X היא מטריצה (מערך מדירוג 2) ו-v הוא וקטור (מערך מדירוג 1). לביצועים ברמת היסוד בנוסף, XLA צריך "לשדר" את הווקטור v לאותו דרגה מטריצה X, על ידי שכפול של v מספר מסוים של פעמים. אורך הווקטור חייב להתאים לפחות לאחד מהמימדים של המטריצה.

לדוגמה:

|1 2 3| + |7 8 9|
|4 5 6|

מימדי המטריצה הם (2,3), ומימד הווקטור הוא (3). הווקטור משודרת על ידי שכפול שלו על שורות כדי לקבל:

|1 2 3| + |7 8 9| = |8  10 12|
|4 5 6|   |7 8 9|   |11 13 15|

ב-NumPy, הפעולה הזו נקראת שידור.

עקרונות

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

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

שידור מערך בדירוג נמוך יותר למערך בדירוג גבוה יותר

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

|1 2 3| + 7 = |8  9  10|
|4 5 6|       |11 12 13|

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

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

|7 8 9| ==> |7 8 9|
            |7 8 9|

דוגמה מורכבת יותר, כדאי להוסיף וקטור של שלושה רכיבים (מאפיין (3)) מטריצה של 3x3 (מימדים (3,3)). יש שתי דרכים לשדר בדוגמה הזו:

(1) אפשר להשתמש במימד שידור של 1. כל רכיב וקטורי הופך ואת הווקטור יש כפילות של כל שורה במטריצה.

|7 8 9| ==> |7 8 9|
            |7 8 9|
            |7 8 9|

(2) אפשר להשתמש במידות השידור 0. כל רכיב וקטורי הופך לשורה הווקטור משוכפל לכל עמודה במטריצה.

 |7| ==> |7 7 7|
 |8|     |8 8 8|
 |9|     |9 9 9|

מידות השידור יכולות להיות משולש שמתאר כיצד דירוג קטן יותר שהצורה משודרת לצורה של דירוג גדול יותר. לדוגמה, בהינתן קובואיד בגודל 2x3x4 ומטריצה בגודל 3x4, טפלון (1,2) משדר (1,2) פירושו התאמת המטריצה מימדים 1 ו-2 של הקובואיד.

סוג השידור הזה משמש לפעולות בינאריות ב-XlaBuilder, אם ניתן ארגומנט broadcast_dimensions. לדוגמה, ראה XlaBuilder::Add. בקוד המקור של XLA, סוג השידור הזה נקרא לפעמים "InDim". השידור החי.

הגדרה רשמית

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

          MxNxPxQ

dim 3:          T
dim 2:        T
dim 1:      T
dim 0:    T

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

כדי להתאים מטריצת TxV למערך MxNxPxQ, זוג של מאפייני שידור נעשה שימוש ב:

          MxNxPxQ
dim 2,3:      T V
dim 1,2:    T V
dim 0,3:  T     V
etc...

סדר המאפיינים ב-tuple של השידור חייב להיות הסדר שבו של המערך בעל הדירוג הנמוך יותר צפויים להתאים למאפיינים של מערך ברמה גבוהה יותר. הרכיב הראשון ב-tuple מציין איזה מאפיין המערך שהדירוג שלו גבוה יותר צריך להתאים למאפיין 0 במערך שהדירוג שלו נמוך יותר. הרכיב השני ב-tuple מציין איזה מאפיין במערך שהדירוג שלו גבוה יותר חייב להתאים למאפיין 1 במערך שהדירוג שלו נמוך יותר, וכן הלאה. הסדר של מידות השידור צריכות לגדול באופן משמעותי. לדוגמה, בתרחיש הקודם לדוגמה, התאמה של V ל-N ו-T ל-P היא לא חוקית. גם לא חוקי להתאים את גם ל-P וגם ל-N.

שידור מערכים בעלי דירוג דומה עם מאפיינים מנוונים

בעיה קשורה היא שידור שני מערכים שיש להם דירוג זהה, בגדלים שונים. בדומה ל-NumPy, זה אפשרי רק כאשר מערכים תואמים. שני מערכים תואמים כאשר כל המימדים שלהם תואמת. אפשר להשתמש בשני מאפיינים אם:

  • הם שווים, או
  • אחד מהם הוא 1 (מאפיין 'מנודה')

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

דוגמאות:

  1. (2,1) ו-(2,3) לשדר אל (2,3).
  2. (1,2,5) ו-(7,2,5) לשדר אל (7,2,5).
  3. (7,2,5) ו-(7,1,5) שידור אל (7,2,5).
  4. (7,2,5) ו-(7,2,6) לא תואמים ואי אפשר לשדר אותם.

קורה מקרה מיוחד שבו כל אחד ממערכי הקלט תומך מאפיין מנומר באינדקס אחר. במקרה הזה, התוצאה 'פעולה חיצונית': (2,1) ו-(1,3) שידור אל (2,3). כדי לראות דוגמאות נוספות, לעיין מסמכי תיעוד של NumPy בשידור.

יצירת שידור

שידור של מערך ברמה נמוכה יותר למערך ברמה גבוהה יותר וגם לשדר שניתן לבצע באמצעות מימדים מנוונים באותה פעולה בינארית. למשל, אפשר לחבר יחד וקטור של גודל 4 ומטריצה בגודל 1x2 באמצעות מאפייני שידור בעלי ערך (0):

|1 2 3 4| + [5 6]    // [5 6] is a 1x2 matrix, not a vector.

ראשית, הווקטור משודר בדרגה 2 (מטריצה) באמצעות מאפיינים. הערך היחיד (0) במאפייני השידור מציין מאפיין אפס של הווקטור תואם למאפיין אפס במטריצה. כתוצאה מכך מטריצה בגודל 4xM שבה הערך M נבחר כדי שיתאים גודל המאפיין במערך 1x2. לכן נוצרת מטריצה בגודל 4x2:

|1 1| + [5 6]
|2 2|
|3 3|
|4 4|

לאחר מכן, 'הסר את שידור המאפיינים' ממד השידורים שגודלו 1x2 כדי להתאים לגודל המימד המתאים של צד ימין:

|1 1| + |5 6|     |6  7|
|2 2| + |5 6|  =  |7  8|
|3 3| + |5 6|     |8  9|
|4 4| + |5 6|     |9 10|

דוגמה מורכבת יותר: מטריצה בגודל 1x2 שנוספה למערך גודל 4x3x1 עם מידות שידור של (1, 2). קודם כל, המטריצה ביחס 1x2 משודרת לדירוג 3 באמצעות מאפייני השידור כדי להפיק מערך Mx1x2 ביניים כאשר גודל המאפיין M נקבע על ידי גודל האופרנד הגדול יותר מערך 4x3x1) שמייצר מערך ביניים בגודל 4x1x2. ה-M נמצאת במאפיין 0 המאפיין בחלק השמאלי ביותר), מכיוון שהמאפיינים 1 ו-2 ממופים למאפיינים של המטריצה המקורית 1x2, כי מידות השידור הן (1, 2). הזה ניתן להוסיף מערך ביניים למטריצה בגודל 4x3x1 באמצעות שידור של ליצור מימדים כדי להפיק תוצאת מערך בגודל 4x3x2.