Esta página foi traduzida pela API Cloud Translation.
Switch to English

Semântica de transmissão

Este documento descreve como a semântica de transmissão no XLA funciona.

O que é transmissão?

A transmissão é o processo de fazer com que matrizes com formas diferentes tenham formas compatíveis para operações aritméticas. A terminologia é emprestada da transmissão Numpy.

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

Por exemplo:

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

As dimensões da matriz são (2,3), os vetores são (3). O vetor é transmitido replicando-o sobre linhas para obter:

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

No Numpy, isso é chamado de transmissão .

Princípios

A linguagem XLA é o mais estrita e explícita possível, evitando recursos implícitos e "mágicos". Esses recursos podem facilitar a definição de alguns cálculos, à custa de mais suposições inseridas no código do usuário que serão difíceis de alterar a longo prazo. Se necessário, recursos implícitos e mágicos podem ser adicionados aos wrappers no nível do cliente.

Em relação à transmissão, são necessárias especificações explícitas de transmissão nas operações entre matrizes de diferentes categorias. Isso é diferente do Numpy, que infere a especificação quando possível.

Transmitindo uma matriz de classificação inferior para uma matriz de classificação superior

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

 |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 para a operação têm classificações diferentes, essa tupla de transmissão especifica quais dimensões na matriz de classificação mais alta devem corresponder à matriz de classificação mais baixa .

Considere o exemplo anterior, em vez de adicionar um escalar a uma matriz (2,3), adicione um vetor de dimensão (3) a uma matriz de dimensões (2,3). Sem especificar a transmissão, esta operação é inválida. Para solicitar corretamente a adição de vetor de matriz, especifique a dimensão de transmissão como (1), o que significa que a dimensão do vetor é correspondida à dimensão 1 da matriz. Em 2D, se a dimensão 0 é considerada como linhas e a dimensão 1 como colunas, isso significa que cada elemento do vetor se torna uma coluna de tamanho correspondente ao número de linhas na matriz:

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

Como um exemplo mais complexo, considere adicionar um vetor de 3 elementos (dimensão (3)) a uma matriz 3x3 (dimensões (3,3)). Há duas maneiras pelas quais a transmissão pode acontecer neste exemplo:

(1) Uma dimensão de transmissão de 1 pode ser usada. Cada elemento do vetor se torna uma coluna e o vetor é duplicado para cada linha da matriz.

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

(2) Uma dimensão de transmissão de 0 pode ser usada. Cada elemento do vetor se torna uma linha e o vetor é duplicado para cada coluna na 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 forma de classificação menor é transmitida para uma forma de classificação maior. Por exemplo, dado um cubóide 2x3x4 e uma matriz 3x4, uma tupla de transmissão (1,2) significa corresponder a matriz às dimensões 1 e 2 do cubóide.

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

Definição formal

O atributo de transmissão permite corresponder uma matriz de classificação inferior a uma matriz de classificação superior, especificando quais dimensões da matriz de classificação superior corresponder. Por exemplo, para uma matriz com dimensões MxNxPxQ, um vetor com a dimensão T pode corresponder 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 correspondente da matriz de classificação mais alta. Os valores do vetor são transmitidos da dimensão correspondente para todas as outras dimensões.

Para corresponder uma matriz TxV ao array 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 na qual as dimensões da matriz de classificação inferior devem corresponder às dimensões da matriz de classificação superior. O primeiro elemento da tupla diz qual dimensão na matriz de classificação mais alta deve corresponder à dimensão 0 na matriz de classificação inferior. O segundo elemento da dimensão 1 e assim por diante. A ordem das dimensões da transmissão deve aumentar estritamente. Por exemplo, no exemplo anterior, é ilegal corresponder V a N e T a P; também é ilegal combinar V com P e N.

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

Um problema de transmissão relacionado está transmitindo duas matrizes que têm a mesma classificação, mas tamanhos de dimensões diferentes. Da mesma forma que as regras do Numpy, isso só é possível quando as matrizes são compatíveis . Duas matrizes são compatíveis quando todas as suas dimensões são compatíveis. Duas dimensões são compatíveis se:

  • Eles são iguais, ou
  • Um deles é 1 (uma dimensão "degenerada")

Quando duas matrizes compatíveis são encontradas, a forma do resultado tem o máximo entre as duas entradas em cada índice de dimensão.

Exemplos:

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

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

Composição da transmissão

A transmissão de uma matriz de classificação inferior para uma matriz de classificação superior e a transmissão usando dimensões degeneradas podem ser realizadas na mesma operação binária. Por exemplo, um vetor de tamanho 4 e uma matriz de tamanho 1x2 podem ser adicionados usando o valor das dimensões de transmissão de (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 as dimensões de transmissão. 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, em que o valor M é escolhido para corresponder ao tamanho da dimensão correspondente na matriz 1x2. Portanto, uma matriz 4x2 é produzida:

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

Em seguida, a "transmissão de dimensão degenerada" transmite a dimensão zero da matriz 1x2 para corresponder ao tamanho de 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 dimensões de difusão de (1, 2). Primeiro, a matriz 1x2 é transmitida até a classificação 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 (a matriz 4x3x1) que produz uma matriz intermediária 4x1x2. OM está na dimensão 0 (dimensão mais à esquerda) porque as dimensões 1 e 2 são mapeadas para as dimensões da matriz 1x2 original, como a dimensão de difusão (1, 2). Essa matriz intermediária pode ser adicionada à matriz 4x3x1 usando difusão de dimensões degeneradas para produzir um resultado da matriz 4x3x2.