البث

يصف هذا المستند دلالات البث بتنسيق 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 ومصفوفة بحجم 1x2 معًا باستخدام أبعاد البث للقيمة (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.