Transmissão

Neste documento, descrevemos a semântica de transmissão do XLA.

O que é transmissão?

A transmissão é o processo de fazer matrizes com diferentes formatos formas compatíveis para operações aritméticas. A terminologia é emprestado Transmissão NumPy:

A transmissão pode ser necessária para operações entre matrizes multidimensionais de classificações diferentes ou entre matrizes multidimensionais com valores e formas compatíveis. Considere a adição X+v, em que X é uma matriz (uma matriz de classificação 2) e v é um vetor (uma matriz de classificação 1). Para trabalhar com elementos Além disso, o XLA precisa "transmitir" o vetor v para a mesma classificação que o X da matriz, replicando v um certo número de vezes. O comprimento do vetor precisa corresponder a pelo menos uma das dimensões da matriz.

Exemplo:

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

As dimensões da matriz são (2,3) e a dimensão do vetor é (3). O vetor é transmitida replicando-a em linhas para conseguir:

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

Em numpy, isso é chamado transmissão.

Princípios

A linguagem do XLA é a mais rigorosa e explícita possível, evitando "mágico" atributos de machine learning. Esses atributos podem tornar alguns cálculos um pouco mais fáceis para definir, mas à custa de mais suposições incorporadas ao código do usuário difíceis de mudar a longo prazo. Se necessário, atributos mágicos implícitos podem ser adicionados em wrappers no nível do cliente.

Com relação à transmissão, o XLA exige especificações explícitas de transmissão operações entre matrizes de diferentes classificações. Ele é diferente do NumPy, que infere a especificação quando possível.

Transmissão de uma matriz de classificação inferior para uma matriz de classificação mais alta

Scalars sempre podem ser transmitidos por matrizes sem uma especificação explícita de dimensões de transmissão. Operação binária por elemento entre um escalar Uma matriz significa aplicar a operação com o escalar a cada elemento da matriz. Por exemplo, adicionar um escalar a uma matriz significa produzir uma matriz em em que cada elemento é uma soma do escalar e o elemento correspondente do matriz de entrada.

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

A maioria das necessidades de transmissão pode ser capturada usando uma tupla de dimensões em uma operação binária. Quando as entradas da operação têm classificações diferentes, tupla de transmissão especifica quais dimensões na matriz high-rank devem ser adicionadas corresponder à matriz lower-rank.

Considere o exemplo anterior. Em vez de adicionar um escalar a uma matriz (2,3), adicione um vetor de dimensão (3) para uma matriz de dimensões (2,3). Sem especificar transmissão, essa operação é inválida. Para solicitar corretamente o vetor de matriz Além disso, especifique a dimensão de transmissão como (1), o que significa que a corresponde à dimensão 1 da matriz. Em 2D, se a dimensão 0 representa linhas e a dimensão 1 representa colunas, isso significa que cada elemento do vetor torna-se uma coluna de tamanho que corresponde ao número de linhas no matricial:

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

Como um exemplo mais complexo, considere adicionar um vetor de três elementos (dimensão (3)) ao uma matriz 3x3 (dimensões (3,3)). A transmissão pode ocorrer de duas maneiras neste exemplo:

(1) É possível usar uma dimensão de transmissão de 1. Cada elemento vetorial se torna um e o vetor é duplicado em cada linha da matriz.

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

(2) É possível usar uma dimensão de transmissão de 0. Cada elemento vetorial se torna uma linha e o vetor é duplicado em cada coluna da matriz.

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

As dimensões de transmissão podem ser uma tupla que descreve como uma classificação menor é transmitido em uma forma de classificação maior. Por exemplo, considerando um bloco de 2x3x4 e uma matriz 3x4, uma tupla de transmissão (1,2) significa corresponder a matriz a dimensões 1 e 2 do organismo.

Esse tipo de transmissão é usado nas operações binárias em XlaBuilder, se o O argumento broadcast_dimensions é fornecido. Por exemplo, consulte XlaBuilder::Add. No código-fonte do XLA, esse tipo de transmissão às vezes é chamado de "InDim" a transmissão de dados.

Definição formal

O atributo de transmissão permite corresponder uma matriz de classificação mais baixa a uma matriz mais alta matriz especificando quais dimensões da matriz de classificação mais alta devem corresponder. Para exemplo, para uma matriz com dimensões MxNxPxQ, um vetor com dimensão T pode ser correspondentes da seguinte forma:

          MxNxPxQ

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

Em cada caso, T deve ser igual à dimensão de correspondência da classificação mais alta matriz. Em seguida, os valores do vetor são transmitidos da dimensão correspondente para todas as outras dimensões.

Para corresponder uma matriz TxV à matriz MxNxPxQ, um par de dimensões de transmissão é usado:

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

A ordem das dimensões na tupla de transmissão deve ser a ordem em que o é esperado que as dimensões da matriz de classificação inferior correspondam às dimensões matriz de classificação mais alta. O primeiro elemento na tupla especifica qual dimensão a matriz de classificação mais alta precisa corresponder à dimensão 0 na matriz de classificação mais baixa. A segundo elemento na tupla especifica qual dimensão na matriz de classificação mais alta precisa corresponder à dimensão 1 na matriz de classificação inferior e assim por diante. A ordem de as dimensões de transmissão devem aumentar estritamente. Por exemplo, no exemplo, é ilegal combinar V a N e T a P; também é ilegal corresponder a V a P e N.

Como transmitir matrizes de classificação semelhante com dimensões degeneradas

Um problema relacionado é transmitir duas matrizes que têm a mesma classificação, mas diferentes tamanhos de dimensão. Assim como no NumPy, isso só é possível quando as matrizes são compatíveis. Duas matrizes serão compatíveis quando todas as dimensões forem compatíveis. Duas dimensões serão compatíveis se:

  • Eles são iguais ou
  • Uma delas é 1 (uma dimensão "degenerar")

Quando duas matrizes compatíveis são encontradas, o formato resultante tem o máximo de as duas entradas em cada índice de dimensão.

Exemplos:

  1. (2,1) e (2,3) transmitem para (2,3).
  2. (1,2,5) e (7,2,5) transmitem para (7,2,5).
  3. (7,2,5) e (7,1,5) transmitem para (7,2,5).
  4. (7,2,5) e (7,2,6) são incompatíveis e não podem ser transmitidos.

surge um caso especial, e também é suportado, em que cada uma das matrizes de entrada tem uma dimensão degenerada em um índice diferente. Nesse caso, o resultado é uma "operação externa": (2,1) e (1,3) transmitem para (2,3). Para mais exemplos, consulte o Documentação do NumPy sobre transmissão.

Composição da transmissão

transmissão de uma matriz de classificação inferior para uma matriz de classificação superior e transmissão usando dimensões degeneradas podem ser realizados na mesma operação binária. Por exemplo, é possível somar um vetor de tamanho 4 e uma matriz de tamanho 1x2 usando dimensões de transmissão de valor (0):

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

Primeiro, o vetor é transmitido até a classificação 2 (matriz) usando a dimensões. O valor único (0) nas dimensões de transmissão indica que a dimensão zero do vetor corresponde à dimensão zero da matriz. Isso produz uma matriz de tamanho 4xM onde o valor M é escolhido para corresponder ao ao tamanho da dimensão na matriz 1x2. Portanto, uma matriz 4x2 é produzida:

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

Em seguida, "degenerar a transmissão de dimensão" transmite a dimensão zero do para corresponder ao tamanho da dimensão correspondente do lado direito:

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

Um exemplo mais complicado é uma matriz de tamanho 1x2 adicionada a uma matriz de tamanho 4x3x1 usando as dimensões de transmissão de (1, 2). Primeiro, a matriz 1x2 é transmitida para classificar 3 usando as dimensões de transmissão para produzir uma matriz Mx1x2 intermediária em que o tamanho da dimensão M é determinado pelo tamanho do operando maior (o valor matriz 4x3x1) produzindo uma matriz intermediária 4x1x2. O M está na dimensão 0 ( mais à esquerda) porque as dimensões 1 e 2 são mapeadas para as dimensões da matriz 1x2 original, pois as dimensões de transmissão são (1, 2). Isso matriz intermediária pode ser adicionada à matriz 4x3x1 usando a transmissão de degere dimensões para produzir um resultado de matriz 4x3x2.