Menyiarkan

Dokumen ini menjelaskan semantik penyiaran XLA.

Apa itu siaran?

Penyiaran adalah proses membuat array dengan berbagai bentuk yang memiliki bentuk yang kompatibel untuk operasi aritmatika. Terminologi ini dipinjam dari NumPy broadcasting.

Penyiaran mungkin diperlukan untuk operasi antara array multi-dimensi dengan peringkat yang berbeda, atau antara array multi-dimensi dengan bentuk yang berbeda tetapi kompatibel. Pertimbangkan penambahan X+v dengan X adalah matriks (array peringkat 2) dan v adalah vektor (array peringkat 1). Untuk melakukan penambahan berbasis elemen, XLA perlu "menyiarkan" vektor v ke peringkat yang sama dengan matriks X, dengan mereplikasi v beberapa kali. Panjang vektor harus sesuai dengan setidaknya salah satu dimensi matriks.

Contoh:

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

Dimensi matriksnya adalah (2,3), dan dimensi vektornya adalah (3). Vektor tersebut disiarkan dengan mereplikasinya melalui baris untuk mendapatkan:

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

Di NumPy, ini disebut penyiaran.

Prinsip

Bahasa XLA bersifat seketat dan eksplisit, untuk menghindari fitur "ajaib" implisit. Fitur tersebut mungkin membuat beberapa komputasi sedikit lebih mudah ditentukan, tetapi mengorbankan lebih banyak asumsi yang dimasukkan ke dalam kode pengguna yang akan sulit diubah dalam jangka panjang. Jika perlu, fitur ajaib implisit dapat ditambahkan dalam wrapper level klien.

Sehubungan dengan penyiaran, XLA memerlukan spesifikasi penyiaran eksplisit pada operasi antara array dengan peringkat yang berbeda. NumPy berbeda dengan NumPy, yang menyimpulkan spesifikasi jika memungkinkan.

Menyiarkan array berperingkat lebih rendah ke array berperingkat lebih tinggi

Skalar selalu dapat disiarkan melalui array tanpa spesifikasi dimensi penyiaran yang eksplisit. Operasi biner berbasis elemen antara skalar dan array berarti menerapkan operasi dengan skalar ke setiap elemen dalam array. Misalnya, menambahkan skalar ke matriks berarti menghasilkan matriks yang setiap elemennya merupakan jumlah skalar dan elemen dari matriks input yang sesuai.

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

Sebagian besar kebutuhan penyiaran dapat diperoleh menggunakan tuple dimensi pada operasi biner. Jika input untuk operasi memiliki peringkat yang berbeda, tuple siaran ini akan menentukan dimensi mana dalam array peringkat lebih tinggi untuk dicocokkan dengan array peringkat lebih rendah.

Pertimbangkan contoh sebelumnya. Alih-alih menambahkan skalar ke matriks (2,3), tambahkan vektor dimensi (3) ke matriks dimensi (2,3). Tanpa menentukan penyiaran, operasi ini tidak valid. Untuk meminta penambahan matriks-vektor dengan benar, tentukan dimensi penyiaran menjadi (1), yang berarti dimensi vektor dicocokkan dengan dimensi 1 dari matriks. Dalam 2D, jika dimensi 0 mewakili baris dan dimensi 1 mewakili kolom, ini berarti setiap elemen vektor menjadi kolom dengan ukuran yang sesuai dengan jumlah baris dalam matriks:

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

Sebagai contoh yang lebih kompleks, pertimbangkan untuk menambahkan vektor 3 elemen (dimensi (3)) ke matriks 3x3 (dimensi (3,3)). Ada dua cara penyiaran dapat terjadi untuk contoh ini:

(1) Dimensi penyiaran 1 dapat digunakan. Setiap elemen vektor menjadi kolom dan vektor diduplikasi untuk setiap baris dalam matriks.

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

(2) Dimensi penyiaran bernilai 0 dapat digunakan. Setiap elemen vektor menjadi baris dan vektor diduplikasi untuk setiap kolom dalam matriks.

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

Dimensi penyiaran dapat berupa tuple yang menjelaskan bagaimana bentuk peringkat yang lebih kecil disiarkan ke bentuk peringkat yang lebih besar. Misalnya, dengan kubus 2x3x4 dan matriks 3x4, tuple penyiaran (1,2) berarti mencocokkan matriks dengan dimensi 1 dan 2 balok tersebut.

Jenis siaran ini digunakan dalam operasi biner di XlaBuilder, jika argumen broadcast_dimensions diberikan. Misalnya, lihat XlaBuilder::Add. Dalam kode sumber XLA, jenis penyiaran ini terkadang disebut siaran "InDim".

Definisi formal

Atribut penyiaran memungkinkan pencocokan array berperingkat lebih rendah dengan array berperingkat lebih tinggi dengan menentukan dimensi array berperingkat lebih tinggi yang akan dicocokkan. Misalnya, untuk array dengan dimensi MxNxPxQ, vektor dengan dimensi T dapat dicocokkan sebagai berikut:

          MxNxPxQ

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

Dalam setiap kasus, T harus sama dengan dimensi pencocokan dari array yang berperingkat lebih tinggi. Nilai vektor kemudian disiarkan dari dimensi yang cocok ke semua dimensi lainnya.

Untuk mencocokkan matriks TxV ke array MxNxPxQ, sepasang dimensi penyiaran digunakan:

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

Urutan dimensi dalam tuple penyiaran harus berupa urutan dimensi array berperingkat lebih rendah yang diharapkan cocok dengan dimensi array peringkat lebih tinggi. Elemen pertama dalam tuple menentukan dimensi mana di array berperingkat lebih tinggi yang harus cocok dengan dimensi 0 di array peringkat lebih rendah. Elemen kedua dalam tuple menentukan dimensi mana di array berperingkat lebih tinggi yang harus cocok dengan dimensi 1 di array peringkat lebih rendah, dan seterusnya. Urutan dimensi siaran harus ditingkatkan secara ketat. Misalnya, dalam contoh sebelumnya, mencocokkan V dengan N dan T dengan P adalah ilegal; juga ilegal untuk mencocokkan V dengan P dan N.

Menyiarkan array dengan peringkat serupa dengan dimensi yang diturunkan

Masalah terkait adalah menyiarkan dua array yang memiliki peringkat yang sama, tetapi ukuran dimensi berbeda. Seperti halnya NumPy, ini hanya memungkinkan jika array kompatibel. Dua array kompatibel jika semua dimensinya kompatibel. Dua dimensi akan kompatibel jika:

  • Mereka sama, atau
  • Salah satunya adalah 1 (dimensi "degenerasi")

Jika dua array yang kompatibel ditemukan, bentuk hasil memiliki jumlah maksimum dari dua input pada setiap indeks dimensi.

Contoh:

  1. (2,1) dan (2,3) disiarkan ke (2,3).
  2. (1,2,5) dan (7,2,5) disiarkan ke (7,2,5).
  3. (7,2,5) dan (7,1,5) disiarkan ke (7,2,5).
  4. (7,2,5) dan (7,2,6) tidak kompatibel dan tidak dapat disiarkan.

Kasus khusus muncul, dan juga didukung, ketika setiap array input memiliki dimensi degenerasi pada indeks yang berbeda. Dalam hal ini, hasilnya adalah "operasi luar": (2,1) dan (1,3) yang disiarkan ke (2,3). Untuk contoh lainnya, lihat dokumentasi NumPy tentang penyiaran.

Komposisi siaran

Penyiaran array berperingkat lebih rendah ke array peringkat lebih tinggi dan menyiarkan menggunakan dimensi degenerasi dapat dilakukan dalam operasi biner yang sama. Misalnya, vektor berukuran 4 dan matriks berukuran 1x2 dapat dijumlahkan menggunakan dimensi broadcast dari nilai (0):

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

Pertama, vektor disiarkan ke peringkat 2 (matriks) menggunakan dimensi siaran. Nilai tunggal (0) dalam dimensi siaran menunjukkan bahwa dimensi nol vektor cocok dengan dimensi nol matriks. Cara ini menghasilkan matriks berukuran 4xM, dengan nilai M dipilih agar cocok dengan ukuran dimensi yang sesuai dalam array 1x2. Oleh karena itu, matriks 4x2 dihasilkan:

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

Kemudian, "turunkan penyiaran dimensi" menyiarkan dimensi nol dari matriks 1x2 agar cocok dengan ukuran dimensi yang sesuai di sisi kanan:

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

Contoh yang lebih rumit adalah matriks berukuran 1x2 yang ditambahkan ke array berukuran 4x3x1 menggunakan dimensi broadcast (1, 2). Pertama, matriks 1x2 disiarkan hingga ke peringkat 3 menggunakan dimensi siaran untuk menghasilkan array Mx1x2 menengah, dengan ukuran dimensi M ditentukan oleh ukuran operand yang lebih besar (array 4x3x1) yang menghasilkan array perantara 4x1x2. M berada pada dimensi 0 (dimensi paling kiri) karena dimensi 1 dan 2 dipetakan ke dimensi matriks 1x2 asli seperti dimensi siaran (1, 2). Array perantara ini dapat ditambahkan ke matriks 4x3x1 menggunakan penyiaran dimensi degenerasi untuk menghasilkan hasil array 4x3x2.