Yayınlama

Bu belgede, XLA'nın yayın semantiği açıklanmaktadır.

Yayın nedir?

Yayın, farklı şekillere sahip dizilerin aritmetik işlemler için uyumlu şekillere sahip olmasını sağlama sürecidir. Terminoloji, NumPy yayınından alınmıştır.

Farklı sıralara sahip çok boyutlu diziler veya farklı ancak uyumlu şekillere sahip çok boyutlu diziler arasındaki işlemler için yayın yapılması gerekebilir. X+v toplama işlemini ele alalım. Burada X bir matris (2 boyutlu bir dizi) ve v bir vektördür (1 boyutlu bir dizi). XLA'nın öğe bazında toplama işlemi yapabilmesi için v vektörünü belirli sayıda çoğaltarak X matrisiyle aynı sayıda boyuta "yayınlaması" gerekir.v 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), vektörün boyutu ise (3) olur. Vektör, satırlara kopyalanarak yayınlanır. Sonuç:

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

NumPy'da buna yayın denir.

İlkeler

XLA dili, mümkün olduğunca katı ve açık bir dildir. Bu dilde, örtülü "sihirli" özellikler kullanılmaz. Bu tür özellikler, bazı hesaplamaların tanımlanmasını biraz daha kolaylaştırabilir ancak kullanıcı koduna daha fazla varsayım eklenmesine neden olur. Bu varsayımları uzun vadede değiştirmek zor olabilir. Gerekirse istemci düzeyindeki sarmalayıcılara örtülü sihirli özellikler eklenebilir.

Yayınlama ile ilgili olarak XLA, farklı sıralardaki diziler arasındaki işlemler için açık yayınlama spesifikasyonları gerektirir. Bu, mümkün olduğunda spesifikasyonu tahmin eden NumPy'den farklıdır.

Daha düşük boyutlu bir diziyi daha yüksek boyutlu bir diziye yayınlama

Skalerler, yayın boyutları açıkça belirtilmeden her zaman diziler üzerinden yayınlanabilir. Bir skaler ile bir dizi arasındaki öğe bazında ikili işlem, skaler ile dizideki her öğeye işlemi uygulama anlamına gelir. Örneğin, bir matrise skaler eklemek, her öğenin skaler ve giriş matrisinin karşılık gelen öğesinin 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şlemde boyut demeti kullanılarak karşılanabilir. İşleme girişleri farklı sıralara sahip olduğunda, bu yayın grubu, daha yüksek boyutlu dizideki hangi boyutların daha düşük boyutlu diziyle eşleştirileceğini belirtir.

Önceki örneği inceleyelim. Skaler bir değeri (2,3) matrisine eklemek yerine, (3) boyutlu bir vektörü (2,3) boyutlu bir matrise ekleyin. Yayın belirtilmeden bu işlem geçersizdir. Matris-vektör toplamı isteğinde bulunmak için yayın boyutunu (1) olarak belirtin. Bu, vektörün boyutunun matrisin 1. boyutuyla eşleştiği anlamına gelir. 2 boyutlu bir matriste, boyut 0 satırları, boyut 1 ise sütunları temsil ediyorsa bu, 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 matrise (boyutlar (3,3)) 3 öğeli bir vektör (boyut (3)) eklemeyi düşünün. Bu örnekte yayın iki şekilde yapılabilir:

(1) 1 yayın boyutu kullanılabilir. Her vektör öğesi bir sütuna dönüşür 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) 0 yayın boyutu kullanılabilir. Her vektör öğesi bir satır haline gelir ve vektör, matristeki her 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 boyutlu bir şeklin daha büyük boyutlu bir şekle nasıl yayınlandığını açıklayan bir demet olabilir. Örneğin, 2x3x4 boyutlarında bir dikdörtgenler prizması ve 3x4 boyutlarında bir matris verildiğinde, yayınlanan bir demet (1,2), matrisin dikdörtgenler prizmasının 1 ve 2 boyutlarıyla eşleştiği anlamına gelir.

Bu yayın türü, XlaBuilder bağımsız değişkeni verilirse broadcast_dimensions içindeki ikili işlemlerinde kullanılır. Örneğin, XlaBuilder::Add'e bakın. XLA kaynak kodunda bu tür yayınlara bazen "InDim" yayını denir.

Resmi tanım

Yayın özelliği, yüksek boyutlu dizinin hangi boyutlarının eşleştirileceğini belirterek düşük boyutlu bir dizinin yüksek boyutlu bir diziyle eşleştirilmesine olanak tanır. Örneğin, MxNxPxQ boyutlarına sahip bir dizi için T boyutlu bir vektör aşağıdaki şekilde eşleştirilebilir:

          MxNxPxQ

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

Her durumda, T, daha yüksek boyutlu 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 iki yayın boyutu kullanılır:

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

Yayınlama demetindeki boyutların sırası, daha düşük boyutlu dizinin boyutlarının daha yüksek boyutlu dizinin boyutlarıyla eşleşmesinin beklendiği sıra olmalıdır. Demetin ilk öğesi, daha yüksek boyutlu dizideki hangi boyutun daha düşük boyutlu dizideki 0. boyutla eşleşmesi gerektiğini belirtir. Demetin ikinci öğesi, daha yüksek boyutlu dizideki hangi boyutun daha düşük boyutlu dizideki 1. boyutla eşleşmesi gerektiğini belirtir. Yayın boyutlarının sırası kesinlikle artan sırada olmalıdır. Örneğin, önceki örnekte V'yi N ile, T'yi ise P ile eşleştirmek yasa dışıdır. Ayrıca V'yi hem P hem de N ile eşleştirmek de yasa dışıdır.

Dejenere boyutlara sahip benzer boyutlu dizileri yayınlama

Bununla ilgili bir sorun da aynı sayıda boyuta sahip ancak farklı boyutlarda olan iki dizinin yayınlanmasıdır. NumPy'da olduğu gibi bu işlem yalnızca diziler uyumlu olduğunda mümkündür. Tüm boyutları uyumlu olduğunda iki dizi uyumludur. İki boyutun uyumlu olması için:

  • Eşitlerse veya
  • Bunlardan biri 1'dir ("dejenere" bir boyut).

İki uyumlu diziyle karşılaşıldığında sonuç şekli, her boyut dizininde iki girişin maksimum değerine sahiptir.

Örnekler:

  1. (2,1) ve (2,3) değerleri (2,3) değerine yayınlanır.
  2. (1,2,5) ve (7,2,5) adresleri (7,2,5) adresine yayın yapar.
  3. (7,2,5) ve (7,1,5) adresleri (7,2,5) adresine yayın yapar.
  4. (7,2,5) ve (7,2,6) uyumlu olmadığından yayınlanamaz.

Giriş dizilerinin her birinde farklı bir dizinde dejenere bir boyutun bulunduğu özel bir durum ortaya çıkar ve bu durum da desteklenir. Bu durumda sonuç, "dış işlem"dir: (2,1) ve (1,3) değerleri (2,3) değerine yayınlanır. Daha fazla örnek için NumPy'nin yayınlama ile ilgili dokümanlarına bakın.

Yayın kompozisyonu

Daha düşük boyutlu bir dizinin daha yüksek boyutlu bir diziye yayınlanması ve dejenere boyutlar kullanılarak yayınlanması aynı ikili işlemde gerçekleştirilebilir. Örneğin, 4 boyutlu bir vektör ve 1x2 boyutlu bir matris, değer (0) yayın boyutları kullanılarak birlikte eklenebilir:

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

Öncelikle vektör, yayın boyutları kullanılarak 2 boyutlu (matris) olacak şekilde 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, 1x2 dizisindeki ilgili boyutun boyutuyla eşleşecek şekilde M değerinin seçildiği 4xM boyutunda bir matris oluşturur. Bu nedenle, 4x2 boyutlu bir matris oluşturulur:

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

Ardından, "dejenere boyut yayınlama" işlemi, 1x2 matrisinin sıfır boyutunu sağ taraftaki ilgili boyut boyutuyla eşleşecek şekilde 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 boyutundaki bir diziye eklenen 1x2 boyutundaki bir matristir. Öncelikle 1x2 matrisi, yayın boyutları kullanılarak 3 boyuta kadar yayınlanır. Bu işlem, boyut boyutu M'nin daha büyük işlenenin (4x3x1 dizisi) boyutuyla belirlendiği bir Mx1x2 ara dizisi oluşturur. Bu işlem sonucunda 4x1x2 ara dizisi elde edilir. Yayın boyutları (1, 2) olduğundan 1 ve 2 boyutları orijinal 1x2 matrisinin boyutlarıyla eşlendiği için M, 0 boyutundadır (en soldaki boyut). Bu ara dizi, 4x3x2 dizi sonucu oluşturmak için dejenere boyutların yayınlanması kullanılarak 4x3x1 matrisine eklenebilir.