Transmisión

En este documento, se describe la semántica de transmisión de XLA.

¿Qué es la transmisión?

La transmisión es el proceso de hacer que los arrays con diferentes formas tengan formas compatibles para operaciones aritméticas. La terminología se toma de Transmisión de NumPy.

Es posible que se requiera transmisión para operaciones entre matrices multidimensionales de diferentes clasificaciones o entre arrays multidimensionales con diferentes formas compatibles. Considera la suma X+v, en la que X es una matriz (un array de rango 2) y v es un vector (un array de rango 1). Para realizar análisis de elementos Además, XLA debe "transmitir" el vector v al mismo rango que el matriz X, mediante la replicación de v una cierta cantidad 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) y la dimensión del vector es (3). El vector se transmite replicando en filas para obtener lo siguiente:

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

En NumPy, esto se denomina de transmisión.

Principios

El lenguaje XLA es lo más estricto y explícito posible, evitando el uso "mágico" atributos. Estas funciones pueden facilitar algunos cálculos definir, pero a costa de más suposiciones incorporadas al código del usuario que difíciles de cambiar a largo plazo. Si es necesario, se usan atributos mágicos implícitos se pueden agregar en wrappers a nivel de cliente.

Con respecto a las transmisiones, XLA requiere especificaciones explícitas de transmisión. en operaciones entre arrays de diferentes rangos. Esto es diferente de NumPy, que infiere la especificación cuando es posible.

Transmite un array de rango inferior a uno de rango más alto

Los Scalars siempre se pueden transmitir a través de arrays sin una especificación explícita. de las dimensiones de transmisión. Una operación binaria a nivel de elementos entre un escalar Un array significa aplicar la operación con el escalar a cada elemento del . Por ejemplo, agregar un escalar a una matriz significa producir una matriz en en la que cada elemento es una suma del escalar y el elemento correspondiente de la de entrada estándar.

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

La mayoría de las necesidades de transmisión pueden capturarse usando una tupla de dimensiones en un que es una operación binaria. Cuando las entradas de la operación tienen diferentes clasificaciones, esta la tupla de transmisión especifica qué dimensiones de la matriz de rango superior se deben coincide con el array lower-rank.

Considera el ejemplo anterior. En lugar de agregar un escalar a una matriz (2,3), agrega un vector de dimensión (3) a una matriz de dimensiones (2,3). Sin especificar transmisión, esta operación no es válida. Cómo solicitar correctamente vectores matriciales especifica la dimensión de transmisión (1), lo que significa que la dimensión coincide con la dimensión 1 de la matriz. En 2D, si la dimensión 0 representa filas y la dimensión 1 representa 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 ejemplo más complejo, considera agregar un vector de 3 elementos (dimensión (3)) a una matriz de 3x3 (dimensiones [3,3]). Existen dos formas en las que la transmisión puede ocurrir este ejemplo:

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

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

(2) Se puede usar una dimensión de transmisión igual a 0. Cada elemento vectorial 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 una clasificación más pequeña se transmite a una forma de rango más grande. Por ejemplo, dado un cuboide de 2 × 3 × 4 Una matriz de 3x4, una tupla de transmisión (1,2) significa hacer coincidir la matriz con dimensiones 1 y 2 del cuboide.

Este tipo de emisión se usa en las operaciones binarias de XlaBuilder si el elemento Se proporciona un argumento broadcast_dimensions. Por ejemplo, consulta XlaBuilder::Add. En el código fuente de XLA, este tipo de transmisión a veces se denomina "InDim". la transmisión de contenido.

Definición formal

El atributo de transmisión permite hacer coincidir una matriz de rango inferior con un rango más alto. de la matriz especificando las dimensiones del array de rango más alto con las que debe coincidir. Para Por ejemplo, para un array con dimensiones MxNxPxQ, un vector con dimensión T puede ser coincide de la siguiente manera:

          MxNxPxQ

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

En cada caso, T debe ser igual a la dimensión coincidente del rango más alto. . Los valores del vector se transmiten desde la dimensión coincidente a todos las demás dimensiones.

Para hacer coincidir una matriz TxV con el array MxNxPxQ, hay un par de dimensiones de transmisión. se usa:

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

El orden de las dimensiones de la tupla de transmisión debe ser el mismo en el que se espera que las dimensiones del array de rango inferior coincidan con las dimensiones del un array de rango superior. El primer elemento de la tupla especifica en qué dimensión de El array de rango más alto debe coincidir con la dimensión 0 del array de rango inferior. El El segundo elemento de la tupla especifica qué dimensión en el array de rango más alto. debe coincidir con la dimensión 1 de la matriz de rango inferior, y así sucesivamente. El orden de las dimensiones de transmisión deben aumentar de forma estricta. Por ejemplo, en el ejemplo anterior ejemplo, es ilegal hacer coincidir V con N y T con P; también es ilegal unir V a P y N.

Cómo transmitir arrays de rango similar con dimensiones degeneradas

Un problema relacionado es transmitir dos arrays que tienen la misma clasificación, pero tamaños de dimensiones diferentes. Al igual que con NumPy, esto solo es posible cuando los arrays son compatibles. Dos arrays son compatibles cuando todas sus dimensiones son compatibles. Dos dimensiones son compatibles si se cumplen las siguientes condiciones:

  • Son iguales o
  • Una de ellas es 1 (una dimensión "degenerar")

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

Ejemplos:

  1. (2,1) y (2,3) transmitir a (2,3).
  2. (1,2,5) y (7,2,5) transmitir a (7,2,5).
  3. (7,2,5) y (7,1,5) transmitir a (7,2,5).
  4. (7,2,5) y (7,2,6) no son compatibles y no se pueden transmitir.

Surge un caso especial, y también es compatible, en el que cada uno de los arrays de entrada una dimensión en un índice diferente. En este caso, el resultado es "operación externa": (2,1) y (1,3) transmitir a (2,3). Para ver más ejemplos, consulta la Documentación de NumPy sobre transmisiones.

Composición de la transmisión

Realizar transmisiones de un array de rango inferior a un array de rango superior y transmitir usar dimensiones degeneradas se pueden realizar en la misma operación binaria. Por ejemplo, se pueden sumar un vector de tamaño 4 y una matriz de tamaño 1 x 2 con dimensiones de transmisión de valor (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) con la transmisión dimensiones. El valor único (0) en las dimensiones de transmisió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 se elige el valor M para que coincida con el valor en el array de 1 x 2. Por lo tanto, se produce una matriz de 4x2:

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

Luego, "degenerar transmisión de dimensión" transmite la dimensión cero de la columna 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 1 x 2 agregada a un array de tamaño 4 × 3 × 1 con dimensiones de transmisión de (1, 2) Primero, la matriz 1x2 se transmite para clasificar 3 usando las dimensiones de transmisión para producir un array intermedio de Mx1x2 donde el tamaño de la dimensión M está determinado por el tamaño del operando más grande (el 4 x 3 x 1) y produce un array intermedio de 4 x 1 x 2. La M está en la dimensión 0 (la dimensión más a la izquierda) porque las dimensiones 1 y 2 están asignadas a las dimensiones de la matriz 1x2 original como las dimensiones de transmisión (1, 2). Esta una matriz intermedia se puede agregar a la matriz 4x3x1 con la transmisión de degeneran dimensiones para producir un resultado de array 4x3x2.