البث

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

ما هو البث؟

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

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

أولاً، يتم بث المتّجه إلى ما يصل إلى بُعدَين (مصفوفة) باستخدام أبعاد البث. تشير القيمة الفردية (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.