این سند معناشناسی پخش 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)) به یک ماتریس 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 مکعب است.
اگر آرگومان broadcast_dimensions
داده شود، این نوع پخش در عملیات باینری در XlaBuilder
استفاده می شود. به عنوان مثال، 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 است (بعد "منحط")
هنگامی که با دو آرایه سازگار روبرو می شویم، شکل نتیجه دارای حداکثر دو ورودی در هر شاخص بعد است.
مثال ها:
- (2،1) و (2،3) پخش به (2،3).
- (1،2،5) و (7،2،5) پخش تا (7،2،5).
- (7،2،5) و (7،1،5) پخش تا (7،2،5).
- (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 است که با استفاده از ابعاد پخش (1، 2) به آرایه ای با اندازه 4x3x1 اضافه شده است. ابتدا ماتریس 1x2 تا رتبه 3 با استفاده از ابعاد پخش پخش می شود تا یک آرایه Mx1x2 میانی تولید کند که در آن اندازه ابعاد M با اندازه عملوند بزرگتر (آرایه 4x3x1) تعیین می شود که یک آرایه میانی 4x1x2 را تولید می کند. M در بعد 0 (سمت چپ ترین بعد) است زیرا ابعاد 1 و 2 به ابعاد ماتریس اصلی 1x2 نگاشت می شوند همانطور که ابعاد پخش می شود (1، 2). این آرایه میانی را می توان با استفاده از پخش ابعاد منحط به ماتریس 4x3x1 اضافه کرد تا نتیجه آرایه 4x3x2 ایجاد شود.