Broadcasting

Ce document décrit la sémantique de diffusion de XLA.

En quoi consiste la diffusion d'annonces ?

Le broadcasting consiste à faire en sorte que des tableaux de différentes formes des formes compatibles pour les opérations arithmétiques. La terminologie est empruntée à Diffusion NumPy :

La diffusion peut être nécessaire pour les opérations entre des tableaux multidimensionnels de de rangs différents, ou entre des tableaux multidimensionnels avec des valeurs différentes, des formes compatibles. Considérons l'addition X+v, où X est une matrice (un tableau de rang 2) et v est un vecteur (un tableau de rang 1). Pour fonctionner au niveau des éléments En outre, XLA doit "diffuser" le vecteur v au même rang que le matricielle X, en répliquant v un certain nombre de fois. Longueur du vecteur doit correspondre à au moins une des dimensions de la matrice.

Exemple :

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

Les dimensions de la matrice sont (2,3) et la dimension du vecteur est (3). Le vecteur est diffusée en le répliquant sur des lignes pour obtenir:

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

Dans NumPy, cela s'appelle diffusion.

Principes

Le langage XLA est aussi strict et explicite que possible, évitant ainsi les "magique" caractéristiques. Ces caractéristiques peuvent faciliter légèrement certains calculs à définir, mais au prix d'une plus grande quantité d'hypothèses intégrées dans le code utilisateur qui seront difficiles à changer à long terme. Si nécessaire, les fonctionnalités magiques implicites peuvent être ajoutés dans des wrappers au niveau du client.

En ce qui concerne la diffusion, XLA requiert des spécifications de diffusion explicites sur les opérations entre des tableaux de différents rangs. Ceci est différent de NumPy, qui déduit la spécification lorsque cela est possible.

Diffuser un tableau de rang inférieur sur un tableau de rang supérieur

Les Scalars peuvent toujours être diffusés sur des tableaux sans spécification explicite concernant la diffusion. Opération binaire au niveau des éléments entre une valeur scalaire et un tableau signifie appliquer l'opération avec la valeur scalaire à chaque élément du tableau. Par exemple, ajouter un scalaire à une matrice signifie produire une matrice dans chaque élément étant la somme des valeurs scalaires et de l'élément correspondant de la la matrice d'entrée.

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

La plupart des besoins de diffusion peuvent être capturés à l'aide d'un tuple de dimensions sur un opération binaire. Lorsque les entrées de l'opération ont des rangs différents, tuple de diffusion spécifie la ou les dimensions du tableau higher-rank à laquelle correspondre au tableau de rang inférieur.

Prenons l'exemple précédent. Au lieu d'ajouter un scalaire à une matrice (2,3), ajoutez un vecteur de dimension (3) en une matrice de dimensions (2,3). Sans spécifier diffusion, cette opération n'est pas valide. Pour demander correctement un vecteur matriciel la dimension de diffusion doit être (1), c'est-à-dire (1), c'est-à-dire correspond à la dimension 1 de la matrice. En 2D, si la dimension 0 est représente les lignes et la dimension 1 représente les colonnes, ce qui signifie que chaque élément du vecteur devient une colonne dont la taille correspond au nombre de lignes matricielle:

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

Prenons un exemple plus complexe : vous pouvez ajouter un vecteur à trois éléments (dimension (3)) à une matrice 3x3 (dimensions (3,3)). Il existe deux façons de faire la diffusion pour cet exemple:

(1) Vous pouvez utiliser une dimension de diffusion de 1. Chaque élément vectoriel devient colonne et le vecteur est dupliqué pour chaque ligne de la matrice.

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

(2) Vous pouvez utiliser une dimension de diffusion de 0. Chaque élément vectoriel devient une ligne. et le vecteur est dupliqué pour chaque colonne de la matrice.

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

Les dimensions de diffusion peuvent être un tuple qui décrit comment un plus petit rang est diffusée dans une forme de rang plus grande. Prenons l'exemple d'un format cuboïde de 2 x 3 x 4. et une matrice 3x4, un tuple de diffusion (1,2) signifie faire correspondre la matrice dimensions 1 et 2 du cuboïde.

Ce type de diffusion est utilisé dans les opérations binaires dans XlaBuilder, si le L'argument broadcast_dimensions est fourni. Par exemple, consultez XlaBuilder::Add. Dans le code source XLA, ce type de diffusion est parfois appelé "InDim". la diffusion d'annonces.

Définition formelle

L'attribut broadcasting permet de faire correspondre un tableau de rang inférieur à un tableau de rang supérieur. en spécifiant les dimensions du tableau de rang le plus élevé à mettre en correspondance. Pour Par exemple, pour un tableau aux dimensions MxNxPxQ, un vecteur de dimension T peut être correspond à ce qui suit:

          MxNxPxQ

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

Dans chaque cas, T doit être égal à la dimension correspondante de l'élément de rang le plus élevé. tableau. Les valeurs du vecteur sont ensuite diffusées à partir de la dimension correspondante pour les autres dimensions.

Pour faire correspondre une matrice de télévision avec le tableau MxNxPxQ, une paire de dimensions de broadcast est utilisée:

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

L'ordre des dimensions dans le tuple de diffusion doit correspondre à l'ordre dans lequel le les dimensions du tableau de rang inférieur doivent correspondre aux dimensions du tableau de rang supérieur. Le premier élément du tuple spécifie la dimension le tableau de rang le plus élevé doit correspondre à la dimension 0 du tableau de rang inférieur. La le deuxième élément du tuple spécifie la dimension dans le tableau de rang le plus élevé doit correspondre à la dimension 1 du tableau de rang inférieur, et ainsi de suite. L'ordre des les dimensions de la diffusion doivent être strictement croissantes. Par exemple, dans la partie Par exemple, il est interdit de faire correspondre V à N et T à P. il est également illégal d'établir une correspondance avec V à P et N.

Diffuser des tableaux de rang similaire avec des dimensions dégénéres

Un problème connexe est la diffusion de deux tableaux qui ont le même rang, mais qui de différentes tailles. Comme pour NumPy, cela n'est possible que lorsque les tableaux sont compatibles. Deux tableaux sont compatibles lorsque toutes leurs dimensions sont compatibles. Deux dimensions sont compatibles dans les cas suivants:

  • Ils sont égaux, ou
  • L'une d'elles est 1 (dimension "dégénérée")

Lorsque deux tableaux compatibles sont rencontrés, la forme du résultat a le maximum de pour chaque indice de dimension.

Exemples :

  1. (2,1) et (2,3) diffusent vers (2,3).
  2. (1,2,5) et (7,2,5) diffusent vers (7,2,5).
  3. (7,2,5) et (7,1,5) diffusent sur (7,2,5).
  4. (7,2,5) et (7,2,6) sont incompatibles et ne peuvent pas être diffusées.

Un cas particulier se présente et est également pris en charge : chacun des tableaux d'entrée a une dimension dégénérée à un indice différent. Dans ce cas, le résultat est "opération externe" : (2,1) et (1,3) diffusent vers (2,3). Pour voir d'autres exemples, consultez le Documentation NumPy sur la diffusion

Composition pour une diffusion

Diffusion d'un tableau de rang inférieur vers un tableau de rang supérieur et diffusion les dimensions dégénéres peuvent être effectuées dans la même opération binaire. Par exemple, un vecteur de taille 4 et une matrice de taille 1x2 peuvent être additionnés utilisant les dimensions de broadcast de la valeur (0):

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

Tout d'abord, le vecteur est diffusé jusqu'au rang 2 (matrice) à l'aide du broadcast . La valeur unique (0) des dimensions "Diffusion" indique que la dimension zéro du vecteur correspond à la dimension zéro de la matrice. Cela génère une matrice de taille 4xM où la valeur M est choisie pour correspondre à la dans le tableau 1x2. Par conséquent, une matrice 4x2 est produite:

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

Ensuite, "dégénérer la diffusion de dimension" diffuse la dimension 0 de 1 x 2, pour correspondre à la dimension correspondante du côté droit:

|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 exemple plus compliqué est l'ajout d'une matrice de taille 1x2 à un tableau de taille 4 x 3 x 1 avec les dimensions de diffusion (1, 2). La matrice 1x2 est d'abord diffusée de classer 3 en utilisant les dimensions de broadcast pour produire un tableau Mx1x2 intermédiaire où la dimension M est déterminée par la taille de l'opérande le plus grand (le un tableau 4x3x1) produisant un tableau intermédiaire 4x1x2. Le M est à la dimension 0 (la la plus à gauche), car les dimensions 1 et 2 sont mappées avec les dimensions de la matrice 1 x 2 d'origine selon les dimensions de la diffusion (1, 2). Ce un tableau intermédiaire peut être ajouté à la matrice 4x3x1 en diffusant des des dimensions dégénéres pour produire un résultat de tableau 4x3x2.