Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Semántica de radiodifusión

Este documento describe cómo funciona la semántica de transmisión en XLA.

¿Qué es la transmisión?

La difusión es el proceso de hacer que las matrices con diferentes formas tengan formas compatibles para operaciones aritméticas. La terminología se toma prestada de la transmisión de Numpy.

La transmisión puede ser necesaria para operaciones entre matrices multidimensionales de diferentes rangos, o entre matrices multidimensionales con formas diferentes pero compatibles. Considere la suma X+v donde X es una matriz (una matriz de rango 2) y v es un vector (una matriz de rango 1). Para realizar una suma de elementos, XLA necesita "transmitir" el vector v al mismo rango que la matriz X , replicando v un cierto número de veces. La longitud del vector debe coincidir con al menos una de las dimensiones de la matriz.

Por ejemplo:

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

Las dimensiones de la matriz son (2,3), las del vector son (3). El vector se transmite al replicarlo en filas para obtener:

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

En Numpy, esto se llama transmisión .

Principios

El lenguaje XLA es lo más estricto y explícito posible, evitando características implícitas y "mágicas". Dichas características pueden hacer que algunos cálculos sean un poco más fáciles de definir, a costa de más suposiciones integradas en el código de usuario que serán difíciles de cambiar a largo plazo. Si es necesario, se pueden agregar características implícitas y mágicas en contenedores de nivel de cliente.

Con respecto a la transmisión, se requieren especificaciones de transmisión explícitas sobre las operaciones entre matrices de diferentes rangos. Esto es diferente de Numpy, que infiere la especificación cuando es posible.

Difundir una matriz de rango inferior en una matriz de rango superior

Los escalares siempre se pueden transmitir sobre matrices sin una especificación explícita de las dimensiones de transmisión. Una operación binaria basada en elementos entre un escalar y una matriz significa aplicar la operación con el escalar para cada elemento de la matriz. Por ejemplo, agregar un escalar a una matriz significa producir una matriz cuyo elemento es una suma del escalar con el elemento de la matriz de entrada correspondiente.

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

La mayoría de las necesidades de transmisión se pueden capturar utilizando una tupla de dimensiones en una operación binaria. Cuando las entradas a la operación tienen diferentes rangos, esta tupla de transmisión especifica qué dimensión (es) en la matriz de rango más alto coincide con la matriz de rango más bajo .

Considere el ejemplo anterior, en lugar de agregar un escalar a una matriz (2,3), agregue un vector de dimensión (3) a una matriz de dimensiones (2,3). Sin especificar la transmisión, esta operación no es válida. Para solicitar correctamente la suma del vector matriz, especifique que la dimensión de transmisión sea (1), lo que significa que la dimensión del vector coincide con la dimensión 1 de la matriz. En 2D, si la dimensión 0 se considera como filas y la dimensión 1 como columnas, esto significa que cada elemento del vector se convierte en una columna de un tamaño que coincide con el número de filas en la matriz:

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

Como un ejemplo más complejo, considere agregar un vector de 3 elementos (dimensión (3)) a una matriz de 3x3 (dimensiones (3,3)). Hay dos formas en que puede ocurrir la transmisión para este ejemplo:

(1) Se puede utilizar una dimensión de transmisión de 1. Cada elemento del vector se convierte en una columna y el vector se duplica para cada fila de la matriz.

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

(2) Se puede utilizar una dimensión de transmisión de 0. Cada elemento del vector se convierte en una fila y el vector se duplica para cada columna de la matriz.

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

Las dimensiones de transmisión pueden ser una tupla que describe cómo se transmite una forma de rango más pequeña en una forma de rango más grande. Por ejemplo, dado un cuboide de 2x3x4 y una matriz de 3x4, una tupla de transmisión (1,2) significa hacer coincidir la matriz con las dimensiones 1 y 2 del cuboide.

Este tipo de difusión se utiliza en las operaciones binarias en XlaBuilder , si se proporciona el argumento broadcast_dimensions . Por ejemplo, vea XlaBuilder :: Agregar . En el código fuente de XLA, este tipo de transmisión a veces se denomina transmisión "InDim".

Definicion formal

El atributo de transmisión permite hacer coincidir una matriz de rango inferior con una matriz de rango superior, al especificar qué dimensiones de la matriz de rango superior se deben combinar. Por ejemplo, para una matriz con dimensiones MxNxPxQ, un vector con dimensión T puede coincidir de la siguiente manera:

           MxNxPxQ

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

En cada caso, T tiene que ser igual a la dimensión correspondiente de la matriz de rango superior. Los valores del vector se transmiten desde la dimensión coincidente a todas las demás dimensiones.

Para hacer coincidir una matriz TxV con la matriz MxNxPxQ, se utilizan un par de dimensiones de transmisión:

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

El orden de dimensiones en la tupla de transmisión tiene que ser el orden en que se espera que las dimensiones de la matriz de rango inferior coincidan con las dimensiones de la matriz de rango superior. El primer elemento en la tupla dice qué dimensión en la matriz de rango superior tiene que coincidir con la dimensión 0 en la matriz de rango inferior. El segundo elemento para la dimensión 1, y así sucesivamente. El orden de las dimensiones de difusión debe ser estrictamente creciente. Por ejemplo, en el ejemplo anterior es ilegal hacer coincidir V con N y T con P; También es ilegal hacer coincidir V con P y N.

Transmitiendo matrices de rango similar con dimensiones degeneradas

Un problema de transmisión relacionado es transmitir dos matrices que tienen el mismo rango pero diferentes tamaños de dimensión. De manera similar a las reglas de Numpy, esto solo es posible cuando las matrices son compatibles . Dos matrices son compatibles cuando todas sus dimensiones son compatibles. Dos dimensiones son compatibles si:

  • Son iguales o
  • Uno de ellos es 1 (una dimensión "degenerada")

Cuando se encuentran dos matrices compatibles, la forma del resultado tiene el máximo entre las dos entradas en cada índice de dimensión.

Ejemplos:

  1. (2,1) y (2,3) transmitido a (2,3).
  2. (1,2,5) y (7,2,5) transmitidos a (7,2,5)
  3. (7,2,5) y (7,1,5) transmitidas a (7,2,5)
  4. (7,2,5) y (7,2,6) son incompatibles y no se pueden transmitir.

Surge un caso especial, y también es compatible, donde cada una de las matrices de entrada tiene una dimensión degenerada en un índice diferente. En este caso, el resultado es una "operación externa": (2,1) y (1,3) transmitida a (2,3). Para obtener más ejemplos, consulte la documentación de Numpy sobre transmisión .

Composición de difusión

La difusión de una matriz de rango inferior a una matriz de rango superior y la difusión utilizando dimensiones degeneradas se pueden realizar en la misma operación binaria. Por ejemplo, un vector de tamaño 4 y una matriz de tamaño 1x2 se pueden agregar juntos usando el valor de dimensiones de difusión de (0):

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

Primero, el vector se transmite hasta el rango 2 (matriz) utilizando las dimensiones de transmisión. El valor único (0) en las dimensiones de difusión indica que la dimensión cero del vector coincide con la dimensión cero de la matriz. Esto produce una matriz de tamaño 4xM donde el valor M se elige para que coincida con el tamaño de dimensión correspondiente en la matriz 1x2. Por lo tanto, se produce una matriz 4x2:

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

Luego, la "transmisión de dimensión degenerada" transmite la dimensión cero de la matriz 1x2 para que coincida con el tamaño de dimensión correspondiente del lado derecho:

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

Un ejemplo más complicado es una matriz de tamaño 1x2 agregada a una matriz de tamaño 4x3x1 usando dimensiones de difusión de (1, 2). Primero, la matriz 1x2 se transmite hasta el rango 3 utilizando las dimensiones de difusión para producir una matriz Mx1x2 intermedia donde el tamaño de dimensión M está determinado por el tamaño del operando más grande (la matriz 4x3x1) que produce una matriz intermedia 4x1x2. La M está en la dimensión 0 (dimensión más a la izquierda) porque las dimensiones 1 y 2 se asignan a las dimensiones de la matriz original 1x2 como las dimensiones de difusión son (1, 2). Esta matriz intermedia se puede agregar a la matriz 4x3x1 mediante la transmisión de dimensiones degeneradas para producir un resultado de matriz 4x3x2.