البث

يصف هذا المستند دلالات البث بلغة XLA.

ما هو البث؟

البث هو عملية تحويل الصفائف بأشكال مختلفة إلى أشكال متوافقة مع العمليات الحسابية. تم استعارة المصطلح من بث NumPy.

قد يكون البث مطلوبًا للعمليات بين المصفوفات متعددة الأبعاد ذات الترتيبات المختلفة أو بين صفائف متعددة الأبعاد ذات أشكال مختلفة ومتوافقة. ضع في الاعتبار الإضافة 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 صارمة وصريحة قدر الإمكان، مع تجنُّب الميزات "السحرية" الضمنية. وقد تجعل هذه الميزات بعض العمليات الحسابية أسهل قليلاً، ولكن على حساب المزيد من الافتراضات المدمَجة في رمز المستخدم والتي سيكون من الصعب تغييرها على المدى الطويل. وإذا لزم الأمر، يمكن إضافة ميزات سحرية ضمنية إلى برامج تضمين على مستوى العميل.

في ما يتعلق بالبث، تطلب XLA مواصفات بث صريحة بشأن العمليات بين المصفوفات من مختلف الترتيب. ويختلف هذا عن NumPy، التي تستنتج المواصفات عندما يكون ذلك ممكنًا.

بث مجموعة مصفوفة أقل الرتبة على مصفوفة ترتيب أعلى

يمكن في أي وقت بث الأعداد القياسية عبر الصفائف بدون تحديد أبعاد البث بشكل صريح. العملية الثنائية من حيث العناصر بين مقياس وصفيف تعني تطبيق العملية باستخدام القيمة العددية على كل عنصر في المصفوفة. على سبيل المثال، تعني إضافة مقياسي إلى مصفوفة إنتاج مصفوفة يكون فيها كل عنصر فيها مجموع المقياس والعنصر المقابل لمصفوفة الإدخال.

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

يمكن تسجيل معظم احتياجات البث باستخدام مجموعة من الأبعاد في عملية ثنائية. عندما يكون لمدخلات العملية ترتيب مختلف، يحدد صف البث هذا البُعد(الأبعاد) في المصفوفة أعلى ترتيب لمطابقة الصفيف بالترتيب الأدنى.

ضع في الاعتبار المثال السابق. بدلاً من إضافة مقياس إلى مصفوفة (2,3)، أضف متجهًا للبعد (3) إلى مصفوفة الأبعاد (2,3). بدون تحديد البث، تكون هذه العملية غير صالحة. لطلب إضافة متجه المصفوفة بشكل صحيح، حدد بُعد البث ليكون (1)، مما يعني أن بُعد المتجه يتطابق مع البعد 1 بالمصفوفة. في الوضع الثنائي الأبعاد، إذا كان البعد 0 يمثل الصفوف والبعد 1 يمثل الأعمدة، فهذا يعني أن كل عنصر من عناصر المتجه يصبح عمودًا بحجم يطابق عدد الصفوف في المصفوفة:

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

وكمثال أكثر تعقيدًا، يمكنك إضافة متجه مكون من 3 عناصر (البعد (3)) إلى مصفوفة 3×3 (الأبعاد (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 للخط التكعيبي.

يُستخدم هذا النوع من البث في العمليات الثنائية في 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...

يجب أن يكون ترتيب الأبعاد في صف البث هو الترتيب الذي من المتوقع أن تتطابق به أبعاد المصفوفة ذات الترتيب الأقل مع أبعاد المصفوفة ذات الترتيب الأعلى. يحدد العنصر الأول في الصف أي بُعد في الصفيفة ذات الترتيب الأعلى يجب أن يتطابق مع البُعد 0 في الصفيف ذي الترتيب الأقل. يحدد العنصر الثاني في الصف أي بُعد في الصفيفة ذات الترتيب الأعلى يجب أن يطابق البُعد 1 في المصفوفة ذات الترتيب الأقل، وهكذا. يجب أن يكون ترتيب أبعاد البث متزايدًا للغاية. على سبيل المثال، في المثال السابق، من غير القانوني مطابقة V مع N وT إلى P؛ كما أنه من غير القانوني أيضًا مطابقة V مع كل من 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 ومصفوفة بحجم 1×2 معًا باستخدام أبعاد البث ذات القيمة (0):

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

أولاً، يتم بث الخط المتجه حتى يصل إلى الترتيب 2 (المصفوفة) باستخدام أبعاد البث. تشير القيمة المفردة (0) في أبعاد البث إلى أن البعد صفر للمتجه يتطابق مع البعد صفر في المصفوفة. وينتج عن ذلك مصفوفة بحجم 4xM، حيث يتم اختيار القيمة M لمطابقة حجم البُعد المقابل في صفيف 1x2. وبالتالي، يتم إنشاء مصفوفة 4×2:

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

بعد ذلك، يؤدي "إلغاء إنشاء البعد" إلى بث البُعد الصفري للمصفوفة 1×2 لمطابقة حجم البُعد المقابل للجانب الأيمن:

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

وهناك مثال أكثر تعقيدًا، وهو مصفوفة بحجم 1×2 تمت إضافتها إلى مصفوفة بحجم 4×3×1 باستخدام أبعاد البث (1، 2). أولاً، يتم بث مصفوفة 1×2 حتى الترتيب 3 باستخدام أبعاد البث لإنتاج مصفوفة Mx1x2 وسيطة حيث يتم تحديد حجم البُعد M حسب حجم المعامل الأكبر (مصفوفة 4×3×1) والذي ينتج صفيفًا وسيطًا 4×1×2. ويكون الحرف M عند البعد 0 (البعد في أقصى اليسار) لأن البُعدين 1 و2 يتم تعيينهما لأبعاد المصفوفة 1×2 الأصلية، حيث إن أبعاد البث هي (1، 2). يمكن إضافة هذه المصفوفة الوسيطة إلى المصفوفة 4×3×1 باستخدام بث الأبعاد المتحوّلة للحصول على نتيجة مصفوفة 4×3×2.