Yayınlama

Bu dokümanda, XLA'nın yayınlama semantiği açıklanmaktadır.

Yayınlama nedir?

Yayınlama, aritmetik işlemler için farklı şekillere sahip diziler haline getirme sürecidir. Terminoloji, NumPy yayınlama'dan alınmıştır.

Yayın işlemi, farklı sıralamalara sahip çok boyutlu diziler veya farklı ama uyumlu şekillere sahip çok boyutlu diziler arasındaki işlemler için gerekebilir. X ifadesinin matris (2. sıra dizisi) ve v'nin vektör (1. sıra dizisi) olduğu X+v toplama işlemini düşünün. Öğe bazında ekleme yapmak için, XLA'nın v belirli bir sayıda çoğaltarak, vektörü v matrisle X aynı sıralamaya "yayınlaması" gerekir. Vektörün uzunluğu, matrisin boyutlarından en az biriyle eşleşmelidir.

Örneğin:

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

Matrisin boyutları (2,3) ve vektörün boyutu (3)'tür. Vektör, şu değerleri elde etmek için satırlara çoğaltılarak yayınlanır:

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

NumPy'de buna yayınlama denir.

İlkeler

XLA dili mümkün olduğunca katı ve uygunsuzdur, dolaylı "sihirli" özelliklerden kaçınır. Bu tür özellikler, bazı hesaplamaların tanımlanmasını biraz daha kolay hale getirebilir ancak kullanıcı koduna yerleştirilen ve uzun vadede değiştirilmesi zor olacak daha fazla varsayımlar söz konusu olduğunda. Gerekirse istemci düzeyinde sarmalayıcılara örtülü sihirli özellikler eklenebilir.

Yayın açısından, XLA, farklı sıralamalardaki diziler arasındaki işlemlerde açık yayın spesifikasyonları gerektirir. Bu, mümkün olduğunda spesifikasyonu çıkaran NumPy'den farklıdır.

Daha düşük sıralı bir diziyi daha yüksek sıralamalı bir diziye yayınlama

Skalerler, yayın boyutlarına ilişkin açık bir spesifikasyon olmadan her zaman diziler üzerinden yayınlanabilir. Skaler ile dizi arasındaki öğe düzeyinde ikili işlem, skaler fonksiyonlu işlemin dizideki her bir öğeye uygulanması anlamına gelir. Örneğin, bir matrise skaler eklenmesi, her elemanın skaler ve giriş matrisinde karşılık gelen elemanın toplamı olduğu bir matris oluşturmak anlamına gelir.

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

Çoğu yayın ihtiyacı, ikili işlem üzerinde birkaç boyut kullanılarak karşılanabilir. İşlemin girişleri farklı sıralamalara sahip olduğunda bu yayın demeti, üst sıradaki dizide bulunan hangi boyutların düşük sıralı diziyle eşleşeceğini belirtir.

Bir önceki örneği düşünün. Bir (2,3) matrise skaler eklemek yerine, bir boyut matrisine (2,3) bir boyut vektörü (3) ekleyin. Yayın belirtilmeden bu işlem geçersizdir. Matris-vektör ekleme işlemini doğru bir şekilde istemek için yayın boyutunu (1) olarak belirtin. Yani vektörün boyutu, matrisin 1. boyutuyla eşleştirilir. 2D'de, boyut 0 satırları, boyut 1 ise sütunları temsil ediyorsa bu durum, vektörün her bir öğesinin, matristeki satır sayısıyla eşleşen boyutta bir sütun haline geldiği anlamına gelir:

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

Daha karmaşık bir örnek olarak, 3x3 boyutunda bir matrise (boyutlar (3,3)) 3 öğeli bir vektör (boyut (3)) eklemeyi düşünün. Bu örnekte yayın iki şekilde gerçekleştirilebilir:

(1) Yayın boyutu olarak 1 kullanılabilir. Her vektör öğesi bir sütun haline gelir ve vektör, matristeki her satır için çoğaltılır.

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

(2) Yayın boyutu olarak 0 kullanılabilir. Her vektör öğesi bir satır haline gelir ve vektör, matristeki her bir sütun için çoğaltılır.

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

Yayın boyutları, daha küçük bir sıralama şeklinin daha büyük bir sıralama şekline nasıl yayıldığını açıklayan bir unsur olabilir. Örneğin, 2x3x4 boyutunda bir küboid ve 3x4 boyutunda bir matris belirtildiğinde, yayın unsur (1,2), matrisin küboidin 1 ve 2. boyutlarıyla eşleştirilmesi anlamına gelir.

Bu yayın türü, broadcast_dimensions bağımsız değişkeni verilirse XlaBuilder içindeki ikili işlemlerde kullanılır. Örneğin, XlaBuilder::Add bölümüne bakın. XLA kaynak kodunda, bu yayın türü bazen "InDim" yayın olarak da adlandırılır.

Resmi tanım

Yayınlama özelliği, daha yüksek sıralamalı dizinin hangi boyutlarının eşleşeceğini belirterek düşük sıralı bir dizinin daha yüksek sıralı bir diziyle eşleştirilmesini sağlar. Örneğin, MxNxPxQ boyutlarına sahip bir dizi için T boyutuna sahip bir vektör aşağıdaki gibi eşleştirilebilir:

          MxNxPxQ

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

Her durumda T, daha yüksek sıralamalı dizinin eşleşen boyutuna eşit olmalıdır. Ardından vektörün değerleri, eşleşen boyuttan diğer tüm boyutlara yayınlanır.

Bir TxV matrisini MxNxPxQ dizisiyle eşleştirmek için bir yayın boyutu çifti kullanılır:

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

Yayın bileşenindeki boyutların sırası, düşük sıralı dizinin boyutlarının, daha yüksek sıralamaya sahip dizinin boyutlarıyla eşleşmesi beklenen sırayla olmalıdır. Tuple'daki ilk öğe, daha yüksek sıralamaya sahip dizide hangi boyutun düşük sıralı dizideki 0 boyutuyla eşleşmesi gerektiğini belirtir. Tuple'daki ikinci öğe, daha yüksek sıralamaya sahip dizideki hangi boyutun düşük sıralı dizideki 1. boyutla eşleşmesi gerektiğini belirtir. Yayın boyutlarının sırası sıkı bir şekilde artmalıdır. Örneğin, önceki örnekte V ile N ve T'nin P ile eşleştirilmesi yasa dışıdır; V'nin hem P hem de N ile eşleştirilmesi de yasa dışıdır.

Bozuk boyutlara sahip benzer sıralı dizileri yayınlama

İlgili bir sorun da aynı sıralamaya, ancak farklı boyut boyutlarına sahip iki dizi yayınlamaktır. NumPy'de olduğu gibi bu, yalnızca diziler uyumlu olduğunda mümkündür. İki dizi, tüm boyutları uyumlu olduğunda uyumludur. Aşağıdaki durumlarda iki boyut uyumludur:

  • Eşittir veya
  • Bunlardan biri 1'dir ("bozuk" bir boyut).

İki uyumlu diziyle karşılaşıldığında sonuç şekli, her boyut dizininde en fazla iki girişe sahip olur.

Örnekler:

  1. (2,1) ve (2,3) (2,3)'e yayın yapar.
  2. (1,2,5) ve (7,2,5) (7,2,5) numaralı telefona yayın yapar.
  3. (7,2,5) ve (7,1,5) (7,2,5) numaralı telefona yayın yapar.
  4. (7,2,5) ve (7,2,6) uyumsuzdur ve yayınlanamaz.

Girdi dizilerinin her birinin farklı bir dizinde bozuk bir boyuta sahip olduğu özel bir durum oluşur ve bu durum da desteklenir. Bu durumda sonuç, bir "dış işlem" olur: (2,1) ve (1,3) (2,3)'e yayın yapar. Daha fazla örnek için yayınlamayla ilgili NumPy dokümanlarına bakın.

Yayın bestesi

Düşük sıralı bir dizinin daha yüksek sıralamalı bir diziye yayınlanması ve bozuk boyutlar kullanılarak yayın yapılması aynı ikili işlemde gerçekleştirilebilir. Örneğin, 4 boyutunda bir vektör ile 1x2 boyutunda bir matris, değer (0) yayın boyutları kullanılarak toplanabilir:

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

İlk olarak vektör, yayın boyutları kullanılarak rütbe 2'ye (matris) kadar yayınlanır. Yayın boyutlarındaki tek değer (0), vektörün sıfır boyutunun matrisin sıfır boyutuyla eşleştiğini gösterir. Bu işlem, 4xM boyutunda bir matris elde eder. Bu matriste M değerinin, 1x2 dizisindeki karşılık gelen boyut boyutuyla eşleşmesi için seçilir. Dolayısıyla, bir 4x2 matris elde edilir:

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

Daha sonra "boyut yayınının bozulması", sağ tarafın karşılık gelen boyut boyutuyla eşleştirmek için 1x2 matrisin sıfır boyutunu yayınlar:

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

Daha karmaşık bir örnek, (1, 2) yayın boyutları kullanılarak 4x3x1 boyutlu bir diziye eklenen 1x2 büyüklükteki bir matristir. İlk olarak 1x2 matris, yayın boyutları kullanılarak 3. sıraya kadar yayınlanır. Bu tür bir ara Mx1x2 dizisi, M boyutu M boyutu, 4x1x2 ara dizi üreten daha büyük işlenenin boyutuyla (4x3x1 dizi) belirlenir. M boyutu 0 boyutunda (en soldaki boyut) çünkü 1 ve 2 boyutları, yayın boyutları (1, 2) olduğu gibi orijinal 1x2 matrisin boyutlarıyla eşlenir. Bu ara dizi, 4x3x2 dizi sonucu elde etmek için bozuk boyutların yayınlanması kullanılarak 4x3x1 matrise eklenebilir.