Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Rundfunksemantik

Dieses Dokument beschreibt, wie die Broadcast-Semantik in XLA funktioniert.

Was ist Rundfunk?

Beim Broadcasting werden Arrays mit unterschiedlichen Formen für arithmetische Operationen kompatibel gemacht. Die Terminologie stammt aus dem Numpy- Rundfunk .

Broadcasting kann für Operationen zwischen mehrdimensionalen Arrays unterschiedlicher Ränge oder zwischen mehrdimensionalen Arrays mit unterschiedlichen, aber kompatiblen Formen erforderlich sein. Betrachten Sie die Addition X+v wobei X eine Matrix (ein Array von Rang 2) und v ein Vektor (ein Array von Rang 1) ist. Um eine elementweise Addition durchzuführen, muss XLA den Vektor v auf den gleichen Rang wie die Matrix X "senden", indem v eine bestimmte Anzahl von Malen repliziert wird. Die Länge des Vektors muss mit mindestens einer der Dimensionen der Matrix übereinstimmen.

Beispielsweise:

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

Die Dimensionen der Matrix sind (2,3), die Vektoren sind (3). Der Vektor wird gesendet, indem er über Zeilen repliziert wird, um Folgendes zu erhalten:

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

In Numpy wird dies als Rundfunk bezeichnet .

Prinzipien

Die XLA-Sprache ist so streng und explizit wie möglich und vermeidet implizite und "magische" Funktionen. Solche Funktionen können die Definition einiger Berechnungen etwas vereinfachen, und zwar auf Kosten von mehr Annahmen, die in Benutzercode eingebettet sind und auf lange Sicht nur schwer zu ändern sind. Bei Bedarf können implizite und magische Funktionen in Wrappern auf Client-Ebene hinzugefügt werden.

In Bezug auf Rundfunk sind explizite Rundfunkspezifikationen für Operationen zwischen Arrays unterschiedlicher Ränge erforderlich. Dies unterscheidet sich von Numpy, bei dem die Spezifikation nach Möglichkeit abgeleitet wird.

Senden eines Arrays mit niedrigerem Rang auf ein Array mit höherem Rang

Skalare können immer über Arrays gesendet werden, ohne dass die Broadcast-Dimensionen explizit angegeben werden. Eine elementweise binäre Operation zwischen einem Skalar und einem Array bedeutet, dass die Operation mit dem Skalar für jedes Element im Array angewendet wird. Zum Beispiel bedeutet das Hinzufügen eines Skalars zu einer Matrix das Erzeugen einer Matrix, von der jedes Element eine Summe des Skalars mit dem Element der entsprechenden Eingabematrix ist.

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

Die meisten Broadcast-Anforderungen können mithilfe eines Tupels von Dimensionen für eine Binäroperation erfasst werden. Wenn die Eingaben für die Operation unterschiedliche Ränge haben, gibt dieses Sendetupel an, welche Dimension (en) im Array mit dem höheren Rang mit dem Array mit dem niedrigeren Rang übereinstimmen sollen.

Betrachten Sie das vorherige Beispiel, anstatt einer (2,3) -Matrix einen Skalar hinzuzufügen, fügen Sie einer Dimensionsmatrix (2,3) einen Vektor der Dimension (3) hinzu. Ohne Angabe von Broadcasting ist dieser Vorgang ungültig. Um die Matrix-Vektor-Addition korrekt anzufordern, geben Sie die Broadcast-Dimension als (1) an, was bedeutet, dass die Vektor-Dimension mit Dimension 1 der Matrix übereinstimmt. Wenn in 2D Dimension 0 als Zeilen und Dimension 1 als Spalten betrachtet wird, bedeutet dies, dass jedes Element des Vektors zu einer Spalte mit einer Größe wird, die der Anzahl der Zeilen in der Matrix entspricht:

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

Als komplexeres Beispiel sollten Sie einen 3-Element-Vektor (Dimension (3)) zu einer 3x3-Matrix (Dimensionen (3,3)) hinzufügen. Für dieses Beispiel gibt es zwei Möglichkeiten der Übertragung:

(1) Eine Rundfunkdimension von 1 kann verwendet werden. Jedes Vektorelement wird zu einer Spalte und der Vektor wird für jede Zeile in der Matrix dupliziert.

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

(2) Eine Rundfunkdimension von 0 kann verwendet werden. Jedes Vektorelement wird zu einer Zeile und der Vektor wird für jede Spalte in der Matrix dupliziert.

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

Die Übertragungsdimensionen können ein Tupel sein, das beschreibt, wie eine kleinere Rangform in eine größere Rangform gesendet wird. Beispielsweise bedeutet bei einem 2 × 3 × 4-Quader und einer 3 × 4-Matrix ein Sendetupel (1,2), dass die Matrix an die Dimensionen 1 und 2 des Quaders angepasst wird.

Diese Art der Sendung wird in dem binären ops in verwendet XlaBuilder , wenn das broadcast_dimensions Argument angegeben wird. Siehe beispielsweise XlaBuilder :: Add . Im XLA-Quellcode wird diese Art der Übertragung manchmal als "InDim" -Sendung bezeichnet.

Formale Definition

Das Broadcast-Attribut ermöglicht das Abgleichen eines Arrays mit niedrigerem Rang mit einem Array mit höherem Rang, indem angegeben wird, welche Dimensionen des Arrays mit höherem Rang übereinstimmen sollen. Beispielsweise kann für ein Array mit den Dimensionen MxNxPxQ ein Vektor mit der Dimension T wie folgt abgeglichen werden:

           MxNxPxQ

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

In jedem Fall muss T gleich der übereinstimmenden Dimension des höherrangigen Arrays sein. Die Werte des Vektors werden dann von der übereinstimmenden Dimension an alle anderen Dimensionen gesendet.

Um eine TxV-Matrix mit dem MxNxPxQ-Array abzugleichen, werden zwei Broadcast-Dimensionen verwendet:

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

Die Reihenfolge der Dimensionen im Sendetupel muss die Reihenfolge sein, in der erwartet wird, dass die Dimensionen des Arrays mit niedrigerem Rang mit den Dimensionen des Arrays mit höherem Rang übereinstimmen. Das erste Element im Tupel gibt an, welche Dimension im höherrangigen Array mit der Dimension 0 im niederrangigen Array übereinstimmen muss. Das zweite Element für Dimension 1 usw. Die Reihenfolge der Sendedimensionen muss strikt erhöht werden. Im vorherigen Beispiel ist es beispielsweise unzulässig, V mit N und T mit P abzugleichen. Es ist auch illegal, V sowohl mit P als auch mit N abzugleichen.

Senden von Arrays mit ähnlichem Rang und entarteten Dimensionen

Ein verwandtes Broadcast-Problem ist das Broadcasting von zwei Arrays mit demselben Rang, aber unterschiedlichen Dimensionsgrößen. Ähnlich wie bei Numpys Regeln ist dies nur möglich, wenn die Arrays kompatibel sind . Zwei Arrays sind kompatibel, wenn alle ihre Abmessungen kompatibel sind. Zwei Dimensionen sind kompatibel, wenn:

  • Sie sind gleich oder
  • Eine davon ist 1 (eine "entartete" Dimension)

Wenn zwei kompatible Arrays angetroffen werden, hat die Ergebnisform bei jedem Dimensionsindex das Maximum unter den beiden Eingaben.

Beispiele:

  1. (2,1) und (2,3) senden an (2,3).
  2. (1,2,5) und (7,2,5) senden an (7,2,5)
  3. (7,2,5) und (7,1,5) senden an (7,2,5)
  4. (7,2,5) und (7,2,6) sind nicht kompatibel und können nicht gesendet werden.

Ein Sonderfall tritt auf und wird auch unterstützt, wenn jedes der Eingabearrays eine entartete Dimension bei einem anderen Index aufweist. In diesem Fall ist das Ergebnis eine "äußere Operation": (2,1) und (1,3) werden an (2,3) gesendet. Weitere Beispiele finden Sie in der Numpy-Dokumentation zum Rundfunk .

Broadcast-Komposition

Das Senden eines Arrays mit niedrigerem Rang an ein Array mit höherem Rang und das Senden mit entarteten Dimensionen können beide in derselben Binäroperation durchgeführt werden. Zum Beispiel können ein Vektor der Größe 4 und eine Matrix der Größe 1x2 unter Verwendung des Broadcast-Dimensionswerts von (0) addiert werden:

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

Zuerst wird der Vektor unter Verwendung der Sendedimensionen bis zu Rang 2 (Matrix) gesendet. Der Einzelwert (0) in den Broadcast-Dimensionen gibt an, dass die Dimension Null des Vektors mit der Dimension Null der Matrix übereinstimmt. Dies erzeugt eine Matrix der Größe 4xM, in der der Wert M so gewählt wird, dass er mit der entsprechenden Dimensionsgröße im 1x2-Array übereinstimmt. Daher wird eine 4x2-Matrix erzeugt:

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

Dann sendet "Degenerate Dimension Broadcasting" die Dimension Null der 1x2-Matrix, um sie an die entsprechende Dimensionsgröße auf der rechten Seite anzupassen:

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

Ein komplizierteres Beispiel ist eine Matrix der Größe 1x2, die einem Array der Größe 4x3x1 unter Verwendung der Broadcast-Dimensionen von (1, 2) hinzugefügt wird. Zuerst wird die 1x2-Matrix unter Verwendung der Broadcast-Dimensionen auf Rang 3 gesendet, um ein Zwischen-Mx1x2-Array zu erzeugen, wobei die Dimensionsgröße M durch die Größe des größeren Operanden (des 4x3x1-Arrays) bestimmt wird, der ein 4x1x2-Zwischenarray erzeugt. Das M hat die Dimension 0 (Dimension ganz links), da die Dimensionen 1 und 2 auf die Dimensionen der ursprünglichen 1x2-Matrix abgebildet werden, da die Broadcast-Dimension (1, 2) ist. Dieses Zwischenarray kann der 4x3x1-Matrix hinzugefügt werden, indem entartete Dimensionen gesendet werden, um ein 4x3x2-Array-Ergebnis zu erzielen.