Transmisja

Ten dokument opisuje semantykę transmisji XLA.

Co to jest transmisja?

Transmitowanie to proces uzyskiwania tablic o różnych kształtach o zgodnych kształtach w operacjach arytmetycznych. Terminologia została zapożyczona z transmisji NumPy.

Przesyłanie może być wymagane w przypadku operacji między wielowymiarowymi tablicami o różnych poziomach lub między wielowymiarowymi tablicami o różnych, ale zgodnych kształtach. Rozważ dodanie X+v, gdzie X jest macierzą (tablica rangi 2), a v jest wektorem (tablicam rangi 1). Aby wykonać dodawanie z uwzględnieniem elementów, XLA musi „transmitować” wektor v na tę samą pozycję co macierz X przez replikację v określoną liczbę razy. Długość wektora musi być zgodna z co najmniej 1 wymiarem macierzy.

Na przykład:

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

Wymiary macierzy to (2,3), a wymiar wektora to (3). Wektor jest przesyłany przez replikację go w wierszach, aby uzyskać:

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

W NumPy jest to transmisja.

Zasady

Język XLA jest możliwie najbardziej rygorystyczny i jednoznaczny, co pozwala uniknąć ukrytych „magicznych” funkcji. Takie funkcje mogą nieco ułatwić definiowanie niektórych obliczeń, ale kosztem większej liczby założeń wbudowanych w kod użytkownika, które w dłuższej perspektywie będą trudne do zmiany. W razie potrzeby w kodach na poziomie klienta można dodać niejawne, magiczne funkcje.

W odniesieniu do nadawania XLA wymaga wyraźnych specyfikacji transmisji w przypadku operacji prowadzonych między tablicami o różnych poziomach. Różni się ona od metody NumPy, która w miarę możliwości ustala specyfikację.

Transmitowanie tablicy o niższym rankingu do macierzy o wyższej pozycji

Skalary zawsze mogą być transmitowane w tablicach bez wyraźnego określania wymiarów transmitowania. Operacja binarna elementu względem elementu skalarnego i tablicy oznacza zastosowanie operacji skalarnej do każdego elementu w tablicy. Na przykład dodanie do macierzy skalarnej oznacza utworzenie macierzy, w której każdy element jest sumą skalaru i odpowiadającego mu elementu macierzy wejściowej.

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

Większość potrzeb związanych z transmisjami można przechwycić przy użyciu krotki wymiarów w operacji binarnej. Gdy dane wejściowe operacji mają różne pozycje, ta krotka transmisji określa, które wymiary w tablicy high-rank mają być zgodne z tablicą lower-rank.

Przeanalizuj poprzedni przykład. Zamiast dodawać skalar do macierzy (2,3), dodaj wektor wymiaru (3) do macierzy wymiarów (2,3). Jeśli nie określisz dystrybucji, ta operacja będzie nieprawidłowa. Aby prawidłowo wysyłać żądanie dodania wektorów macierzy, jako wymiar emisji podaj (1), co oznacza, że wymiar wektora jest dopasowywany do wymiaru 1 macierzy. W 2D, jeśli wymiar 0 reprezentuje wiersze, a wymiar 1 reprezentuje kolumny, oznacza to, że każdy element wektora staje się kolumną o rozmiarze pasującym do liczby wierszy w macierze:

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

W bardziej złożonym przykładzie rozważ dodanie do macierzy 3 x 3 wektor 3 elementów (wymiar (3)) (wymiary (3,3)). W tym przykładzie transmisja może odbywać się na 2 sposoby:

(1) Można użyć wymiaru emisji o wartości 1. Każdy element wektorowy staje się kolumną, a w każdym wierszu macierzy jest zduplikowany.

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

(2) Można użyć wymiaru emisji o wartości 0. Każdy element wektorowy staje się wierszem, a wektor jest zduplikowany w przypadku każdej kolumny macierzy.

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

Wymiary transmitowania mogą być kropką opisującą sposób, w jaki mniejsza pozycja w rankingu jest przenoszona na większy kształt pozycji. Na przykład w przypadku prostopadłościanu 2 x 3 x 4 i macierzy 3 x 4 kropka transmitująca (1,2) oznacza dopasowanie macierzy do wymiarów 1 i 2 prostopadłościanu.

Ten typ komunikatu jest używany w operacjach binarnych w XlaBuilder, jeśli podany jest argument broadcast_dimensions. Przykład: XlaBuilder::Add. W kodzie źródłowym XLA ten typ transmisji jest czasami nazywany przesyłaniem „InDim”.

Definicja formalna

Atrybut przesyłania umożliwia dopasowanie tablicy o niższej pozycji do tablicy o wyższej pozycji przez określenie, do których wymiarów mają pasować wymiary tablicy o wyższej pozycji. Na przykład w przypadku tablicy o wymiarach MxNxPxQ wektor o wymiarze T może zostać dopasowany w ten sposób:

          MxNxPxQ

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

W każdym przypadku współczynnik T musi być równy pasującemu wymiarowi tablicy o wyższej pozycji. Wartości wektorów są następnie przesyłane z dopasowanego wymiaru do wszystkich pozostałych wymiarów.

Aby dopasować macierz TxV do tablicy MxNxPxQ, używana jest para wymiarów transmitowania:

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

Kolejność wymiarów w krocie przesyłania musi być kolejnością, w której wymiary tablicy o niższej pozycji w rankingu muszą odpowiadać wymiarom tablicy o wyższej pozycji. Pierwszy element w tablicy określa, który wymiar w tablicy wyższej pozycji musi odpowiadać wymiarowi 0 w tablicy niższej pozycji. Drugi element w tablicy określa, który wymiar w tablicy wyższej pozycji musi pasować do wymiaru 1 w tablicy niższej pozycji itd. Kolejność wymiarów transmisji musi się ściśle zwiększać. Na przykład w poprzednim przykładzie dopasowanie V do N oraz T do P jest nielegalne. Niedopasowane jest też dopasowanie V do P i N.

Transmitowanie tablic o podobnej pozycji z zdegenerowanymi wymiarami

Powiązany problem polega na przesyłaniu 2 tablic o tej samej pozycji w rankingu, ale o różnych rozmiarach. Podobnie jak w przypadku NumPy, jest to możliwe tylko wtedy, gdy tablice są zgodne. Dwie macierze są zgodne, gdy wszystkie ich wymiary są zgodne. Dwa wymiary są zgodne, jeśli:

  • są równe lub
  • Jedna z nich to 1 (wymiar „zdegenerowany”)

Jeśli napotkane są 2 zgodne tablice, kształt wyniku ma maksymalną liczbę 2 zgodnych danych wejściowych w każdym indeksie wymiaru.

Przykłady:

  1. (2,1) i (2,3) przesyłają transmisję do (2,3).
  2. (1,2,5) i (7,2,5) przesyłają transmisje do (7,2,5).
  3. (7,2,5) i (7,1,5) przesyłają transmisje do (7,2,5).
  4. (7,2,5) i (7,2,6) są niezgodne i nie mogą być transmitowane.

Występuje i obsługiwany jest szczególny przypadek – każda tablica wejściowa ma zdegenerowany wymiar w innym indeksie. W tym przypadku wynik jest „operacją zewnętrzną”: (2,1) i (1,3) przesyłanie do (2,3). Więcej przykładów znajdziesz w dokumentacji NumPy dotyczącej transmitowania.

Kompozycja transmisji

Nadawanie tablicy o niższej pozycji do tablicy o wyższej pozycji oraz transmisję z wykorzystaniem zdegenerowanych wymiarów można przeprowadzić w ramach tej samej operacji binarnej. Na przykład wektor o rozmiarze 4 i macierz o wymiarach 1 x 2 można dodać do siebie, używając przesyłanych wymiarów o wartości (0):

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

Najpierw wektor jest przesyłany na pozycję nr 2 (macierz) za pomocą wymiarów transmisji. Pojedyncza wartość (0) w wymiarach przesyłanych danych oznacza, że wymiar 0 wektora odpowiada wymiarowi 0 macierzy. Powstanie macierz o rozmiarach 4 x M, w której wartość M jest wybierana zgodnie z odpowiednim rozmiarem w tablicy 1 x 2. Tak więc powstaje macierz 4 x 2:

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

Następnie „wygeneruj przesyłanie wymiaru” transmituje wymiar zerowy macierzy 1 x 2, aby dopasować go do odpowiedniego rozmiaru prawego boku:

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

Bardziej skomplikowany przykład to macierz o wymiarach 1 x 2 dodana do tablicy o wymiarach 4 x 3 x 1 przy użyciu wymiarów emisji (1, 2). Po pierwsze, macierz 1 x 2 jest transmitowana na pozycję 3 do pozycji 3 za pomocą wymiarów transmisji, aby utworzyć pośrednią tablicę Mx1x2, w której rozmiar M jest określany na podstawie rozmiaru większego argumentu (tablica 4 x 3 x 1), co powoduje utworzenie tablicy pośredniej 4 x 1 x 2. M jest w wymiarze 0 (wymiar skrajny po lewej stronie), ponieważ wymiary 1 i 2 są zmapowane na wymiary pierwotnej macierzy 1 x 2, ponieważ wymiary emisji to (1, 2). Tę tablicę pośrednią można dodać do macierzy 4 x 3 x 1 za pomocą przesyłania zdegenerowanych wymiarów, aby otrzymać wynik w postaci tablicy 4 x 3 x 2.