Transmisja

Ten dokument opisuje semantykę transmisji w XLA.

Co to jest transmisja?

Transmisje to proces przygotowywania tablic o różnych kształtach kształtów zgodnych z działaniami arytmetycznymi. Terminologia została zapożyczona Transmisja NumPy.

W przypadku operacji między wielowymiarowymi tablicami w takich tablicach może być wymagane transmitowanie lub dla wielowymiarowych tablic z różnymi wartościami kształtów. Rozważ dodanie elementu X+v, w którym X to macierz (tablica rangi 2), a v jest wektorem (tablica rangi 1). Aby wykonywać działania z uwzględnieniem elementów XLA wymaga transmitowania. wektor v do tej samej rangi macierz X, replikując funkcję v określoną liczbę razy. Długość wektora musi pasować do co najmniej jednego z wymiarów 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 transmitowana 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 tzw. transmitowania.

Zasady

Język XLA jest jak najbardziej rygorystyczny i bezpośredni, unikając domniemanego „magiczny” funkcje zabezpieczeń. Takie funkcje mogą nieco ułatwić niektóre obliczenia do jej zdefiniowania, ale kosztem większej liczby założeń osadzonych w kodzie ciężko zmienić na dłuższą metę. w razie potrzeby dodać niejawne magiczne funkcje; można dodawać w kodach na poziomie klienta.

Jeśli chodzi o transmisję, XLA wymaga wyraźnych specyfikacji dotyczących transmisji. na operacjach między tablicami o różnych rangach. Różni się od NumPy, który w miarę możliwości ustala specyfikację.

Transmitowanie tablicy niższego rangi do tablicy wyższego rangi

Scalars zawsze mogą być transmitowane w tablicach bez wyraźnej specyfikacji wymiarów transmisji. Operacja binarna elementu między wartością skalarną a tablica oznacza zastosowanie operacji z wartością skalarną do każdego elementu w . Na przykład dodanie funkcji skalarnej do macierzy oznacza wygenerowanie macierzy w gdzie każdy element jest sumą wartości skalarnej i odpowiadającego jej elementu macierzy wejściowej.

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

Większość potrzeb dotyczących transmisji można uchwycić za pomocą krotki wymiarów operacji binarnej. Jeśli dane wejściowe operacji mają różne rangi, krotka transmisji określa, które wymiary w tablicy wyższej rangi zgodne z tablicą niższa pozycja.

Przeanalizuj poprzedni przykład. Zamiast dodawać wartość skalarną do macierzy (2,3), dodaj wektor wymiaru (3) do macierzy wymiarów (2,3). Bez określenia transmisji, ta operacja jest nieprawidłowa. Aby prawidłowo zażądać wektora macierzy dodatkowo należy określić wymiar transmisji na (1), co oznacza wartość wektora wymiar jest dopasowywany do wymiaru 1 macierzy. w 2D, jeśli wymiar 0 reprezentuje wiersze, a wymiar 1 reprezentuje kolumny, co oznacza, że każdy element staje się kolumną o rozmiarze odpowiadającym liczbie wierszy w macierz:

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

W bardziej złożonym przykładzie dodaj wektor 3-elementowy (wymiar (3)) do macierz 3 x 3 (wymiary (3,3). Transmisja może odbywać się na 2 sposoby ten przykład:

(1) Można zastosować wymiar transmisji równy 1. Każdy element wektorowy staje się i wektor jest zduplikowany w każdym wierszu macierzy.

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

(2) Można zastosować wymiar transmisji równy 0. Każdy element wektorowy zmienia się w wiersz i dla każdej kolumny macierzy jest zduplikowany wektor.

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

Wymiary transmisji mogą być krotką informującą, jak mniejsza pozycja jest transmitowany na większy kształt rangi. Na przykład dla prostopadłościanu 2 x 3 x 4 a macierz 3x4, krotka (1,2) oznacza dopasowanie macierzy do 1 i 2 prostoida.

Ten typ transmisji jest używany w operacjach binarnych w XlaBuilder, jeśli Podano broadcast_dimensions. Na przykład zobacz XlaBuilder::Add W kodzie źródłowym XLA ten typ transmisji jest czasami nazywany „InDim”. transmisji.

Definicja formalna

Atrybut transmitowanie umożliwia dopasowanie tablicy niższego rangi do tablicy wyższej przez określenie, które wymiary tablicy wyższego rzędu mają zostać dopasowane. Dla: Na przykład w przypadku tablicy o wymiarach MxNxPxQ wektor o wymiarach T może zostać dopasowane w następujący sposób:

          MxNxPxQ

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

W każdym przypadku T musi być równe wymiarowi dopasowania wyższej pozycji. . Wartości wektora są następnie przekazywane z pasującego wymiaru do wszystkich i pozostałych wymiarów.

Aby dopasować macierz TxV do tablicy MxNxPxQ, jest to para wymiarów transmisji jest używany:

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

Kolejność wymiarów w krotce transmisji musi być kolejnością, w jakiej wymiary tablicy niższego rangi powinny być zgodne z wymiarami macierz wyższej rangi. Pierwszy element w krotce określa, który wymiar tablica wyższej rangi musi pasować do wymiaru 0 w tablicy niższego rangi. drugi element krotki określa, który wymiar w tablicy wyższego rzędu musi pasować do wymiaru 1 w tablicy niższego rangi itd. Kolejność że wymiary transmisji muszą się znacznie zwiększać. Na przykład w poprzednim przykład nielegalne jest dopasowanie liter V do N, a T do P; nielegalnie jest też dopasowanie V zarówno na P, jak i N.

Transmitowanie tablic podobnych rangi z wykorzystaniem zdegenerowanych wymiarów

Powiązany problem to transmitowanie dwóch macierzy o tej samej pozycji, ale o różnych rozmiarach. Tak jak w przypadku NumPy, jest to możliwe tylko wtedy, gdy tablice są zgodne. Dwie tablice są zgodne, gdy wszystkie ich wymiary są są zgodne. Dwa wymiary są zgodne, jeśli:

  • są równe,
  • Jeden z nich to 1 (wymiar zdegenerowany),

W przypadku znalezienia 2 zgodnych tablic wynikowy kształt ma maksymalną wartość te 2 dane wejściowe w każdym indeksie wymiaru.

Przykłady:

  1. (2,1) i (2,3) przesyłać do (2,3).
  2. (1,2,5) i (7,2,5) przekazują do (7,2,5).
  3. (7,2,5) i (7,1,5) przekazują do (7,2,5).
  4. (7,2,5) i (7,2,6) są niezgodne i nie mogą być przesyłane.

Występuje specjalny przypadek, który jest również obsługiwany, gdy każda z tablic wejściowych ma zdegenerowany wymiar o innym indeksie. W tym przypadku wynikiem jest "operacja zewnętrzna": (2,1) i (1,3) przesyłanie do (2,3). Więcej przykładów: zapoznaj się z Dokumentacja NumPy dotycząca transmisji

Kompozycja naziemna

Przesyłanie tablicy niższego rangi do macierzy wyższego rzędu oraz transmisji użycie wymiarów zdegenerowanych może zostać wykonane w ramach tej samej operacji binarnej. Na przykład można dodać do siebie wektor o rozmiarze 4 i macierz o wymiarach 1 x 2 używając emisyjnych wymiarów wartości (0):

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

Najpierw wektor jest rozpowszechniany do poziomu 2 (matrycy) za pomocą funkcji transmisji wymiarów. Pojedyncza wartość (0) w wymiarach transmisji oznacza, wymiar zero wektora odpowiada wymiarowi zero macierzy. Dzięki temu powstaje macierz o rozmiarze 4xM, w której wartość M jest wybierana jako odpowiadająca w tablicy 1 x 2. W ten sposób powstaje macierz 4x2:

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

Następnie „zdegeneruj przesyłanie wymiaru” przesyła wymiar zero 1x2 aby dopasować do siebie rozmiar wymiaru po prawej stronie:

|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 skomplikowanym przykładem jest macierz o rozmiarze 1 x 2 dodana do tablicy o określonych rozmiarach 4 x 3 x 1 z wykorzystaniem transmisji wymiarów (1, 2). Najpierw rozpowszechniona jest macierz 1 x 2. do pozycji 3 przy użyciu wymiarów transmisji w celu wygenerowania pośredniej tablicy Mx1x2 gdzie rozmiar M jest określany na podstawie rozmiaru większego argumentu ( 4 x 3 x 1), co tworzy macierz przejściową 4 x 1 x 2. Litera M jest w wymiarze 0 ( wymiar skrajny po lewej stronie), bo wymiary 1 i 2 są zmapowane do wymiarów pierwotnej macierzy 1x2, ponieważ wymiary transmisji są następujące (1, 2). Ten macierz pośrednią można dodać do macierzy 4x3x1 za pomocą rozpowszechniania degenerować wymiary, aby otrzymać wynik w postaci tablicy 4 x 3 x 2.