Menyiarkan

Dokumen ini menjelaskan semantik penyiaran XLA.

Apa itu penyiaran?

Penyiaran adalah proses pembuatan array dengan berbagai bentuk yang memiliki bentuk yang kompatibel untuk operasi aritmetika. Terminologi ini dipinjam dari penyiaran NumPy.

Penyiaran mungkin diperlukan untuk operasi antara array multidimensi dengan peringkat yang berbeda, atau antara array multidimensi 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 berdasarkan elemen, XLA harus "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 matriks adalah (2,3), dan dimensi vektor adalah (3). Vektor 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|

Dalam NumPy, hal ini disebut penyiaran.

Prinsip

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

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

Menyiarkan array berperingkat lebih rendah ke array dengan peringkat lebih tinggi

Skalar selalu dapat disiarkan melalui array tanpa spesifikasi eksplisit dimensi penyiaran. 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 yang sesuai dari matriks input.

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

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

Pertimbangkan contoh sebelumnya. Daripada 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 akan 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 untuk menyiarkan 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 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, dalam bentuk balok 2x3x4 dan matriks 3x4, tuple penyiaran (1,2) berarti mencocokkan matriks dengan dimensi 1 dan 2 bidang balok.

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 yang cocok dari array dengan peringkat yang 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 dari mana dimensi array berperingkat lebih rendah diharapkan cocok dengan dimensi array dengan peringkat lebih tinggi. Elemen pertama dalam tuple menentukan dimensi di array dengan peringkat lebih tinggi yang harus cocok dengan dimensi 0 di array dengan peringkat lebih rendah. Elemen kedua di tuple menentukan dimensi mana di array dengan peringkat lebih tinggi yang harus cocok dengan dimensi 1 di array dengan peringkat lebih rendah, dan seterusnya. Urutan dimensi siaran harus ditingkatkan secara ketat. Misalnya, dalam contoh sebelumnya, pencocokan V ke N dan T ke P adalah ilegal; pencocokan V dengan P dan N juga ilegal.

Menyiarkan array dengan peringkat serupa dengan dimensi yang diturunkan

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

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

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

Contoh:

  1. (2,1) dan (2,3) menyiarkan ke (2,3).
  2. (1,2,5) dan (7,2,5) menyiarkan 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, dengan masing-masing array input memiliki dimensi yang mengalami penurunan pada indeks yang berbeda. Dalam hal ini, hasilnya adalah "outer operations": (2,1) dan (1,3) yang disiarkan ke (2,3). Untuk contoh lainnya, lihat dokumentasi NumPy tentang penyiaran.

Komposisi siaran

Penyiaran array dengan peringkat lebih rendah ke array dengan peringkat lebih tinggi dan penyiaran menggunakan dimensi degeneratif dapat dilakukan dalam operasi biner yang sama. Misalnya, vektor berukuran 4 dan matriks berukuran 1x2 dapat dijumlahkan menggunakan dimensi nilai siaran (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 dari vektor cocok dengan dimensi nol matriks. Tindakan ini menghasilkan matriks berukuran 4xM dengan nilai M dipilih agar sesuai dengan ukuran dimensi yang sesuai dalam array 1x2. Oleh karena itu, matriks 4 x 2 dihasilkan:

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

Kemudian, "turunkan siaran dimensi" dimensi siaran nol dari matriks 1x2 agar sesuai dengan ukuran dimensi sisi kanan yang sesuai:

|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 siaran (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 sebagaimana dimensi siaran (1, 2). Array menengah ini dapat ditambahkan ke matriks 4x3x1 menggunakan penyiaran dimensi yang merosot untuk menghasilkan hasil array 4x3x2.