In diesem Dokument wird die Übertragungssemantik von XLA beschrieben.
Was bedeutet „Broadcasting“?
Broadcasting ist der Prozess, bei dem Arrays Formen für arithmetische Operationen. Die Terminologie wird übernommen von NumPy-Broadcasting:
Bei Vorgängen zwischen mehrdimensionalen Arrays von
oder zwischen multidimensionalen Arrays mit unterschiedlichen
mit kompatiblen Formen. Betrachten Sie die Addition X+v
, bei der X
eine Matrix (ein Array) ist.
von Rang 2) und v
ein Vektor ist (ein Array von Rang 1). Elementweise Durchführung
Außerdem muss XLA den Vektor v
denselben Rang wie die
Matrix X
, indem v
eine bestimmte Anzahl von Malen repliziert wird. Die Länge des Vektors
mit mindestens einer Dimension der Matrix übereinstimmen muss.
Beispiel:
|1 2 3| + |7 8 9|
|4 5 6|
Die Dimensionen der Matrix sind (2,3) und die Dimension des Vektors ist (3). Der Vektor durch Replizieren über Zeilen, 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 Broadcasting.
Grundsätze
Die XLA-Formulierungen sind so streng und explizit wie möglich und vermeiden implizite "magisch" Funktionen. Solche Funktionen können einige Berechnungen definieren müssen, aber auf Kosten von mehr Annahmen, die im Nutzercode verankert sind, auf lange Sicht schwierig zu ändern. Falls nötig, implizite magische Merkmale können in Wrappern auf Clientebene hinzugefügt werden.
Bezüglich der Übertragung erfordert XLA explizite Übertragungsspezifikationen auf Operationen zwischen Arrays unterschiedlicher Ränge. Dies unterscheidet sich von NumPy, die nach Möglichkeit die Spezifikation ableiten.
Ein Array mit einem niedrigeren Rang an ein Array mit einem höheren Rang übertragen
Scalars können immer ohne explizite Angabe über Arrays übertragen werden. von Übertragungsdimensionen verwendet werden. Eine elementweise binäre Operation zwischen einem Skalar „Array“ bedeutet, die Operation mit dem Skalar auf jedes Element im Array. Das Hinzufügen eines Skalars zu einer Matrix bedeutet beispielsweise, dass eine Matrix wobei jedes Element eine Summe aus dem Skalar und dem entsprechenden Element des die Eingabematrix.
|1 2 3| + 7 = |8 9 10|
|4 5 6| |11 12 13|
Die meisten Übertragungsanforderungen lassen sich mit einem Tupel von Dimensionen auf einem binäre Operation. Wenn die Eingaben für die Operation unterschiedliche Ränge haben, Broadcasting-Tupel gibt an, welche Dimensionen im Array höherer Rang lower-rank-Array.
Betrachten Sie das vorherige Beispiel. Anstatt einer (2,3)-Matrix einen Skalar hinzuzufügen, einen Dimensionsvektor (3) zu einer Matrix von Dimensionen (2,3) zu erstellen. Ohne Angabe von Broadcasting ist dieser Vorgang ungültig. Matrix-Vektor korrekt anfordern geben Sie die Übertragungsdimension auf (1) an, d. h. die Dimension wird Dimension 1 der Matrix zugeordnet. Wenn in 2D die Dimension 0 ist, für Zeilen und Dimension 1 für Spalten, d. h., jedes Element des Vektors wird zu einer Spalte mit einer Größe, die der Anzahl der Zeilen im Matrix:
|7 8 9| ==> |7 8 9|
|7 8 9|
Als komplexeres Beispiel könnten Sie einen Vektor mit drei Elementen (Dimension (3)) eine 3x3-Matrix (Abmessungen (3,3)) Es gibt zwei Möglichkeiten, dieses Beispiel:
(1) Es kann eine Übertragungsdimension von „1“ verwendet werden. Jedes Vektorelement wird zu 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) Es kann eine Übertragungsdimension von 0 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 ein kleinerer Rang ein zu einer größeren Rangform übertragen. Beispiel: Bei einem Quader der Größe 2 x 3 x 4 und einer 3x4-Matrix, bedeutet ein Broadcasting-Tupel (1,2), dass die Matrix mit und die Maße 1 und 2 des Quaders.
Diese Art von Broadcast wird in den binären Vorgängen in XlaBuilder
verwendet, wenn die
broadcast_dimensions
-Argument ist angegeben. Siehe zum Beispiel
XlaBuilder::Add.
Im XLA-Quellcode wird diese Art von Übertragung manchmal als "InDim" bezeichnet.
Broadcasting.
Formale Definition
Das Attribut „Broadcasting“ ermöglicht den Abgleich eines Arrays mit niedrigerer Ränge mit einem höheren Rang Array, indem angegeben wird, welche Dimensionen des Arrays mit dem höheren Rang übereinstimmen sollen. Für Für ein Array mit den Dimensionen MxNxPxQ kann ein Vektor mit der Dimension T beispielsweise Übereinstimmungen wie folgt:
MxNxPxQ
dim 3: T
dim 2: T
dim 1: T
dim 0: T
In jedem Fall muss T der übereinstimmenden Dimension des höheren Rangs entsprechen. Array. Die Vektorwerte werden dann von der übereinstimmenden Dimension an alle die anderen Dimensionen.
Um dem MxNxPxQ-Array eine TxV-Matrix zuzuordnen, muss ein Paar von Übertragungsdimensionen verwendet:
MxNxPxQ
dim 2,3: T V
dim 1,2: T V
dim 0,3: T V
etc...
Die Reihenfolge der Dimensionen im Broadcasting-Tupel muss der Reihenfolge entsprechen, in der Dimensionen des niedrigeren Rangs mit den Abmessungen des höherrangiges Array. Das erste Element im Tupel gibt an, welche Dimension muss das höherrangige Array mit der Dimension 0 im niedrigerer Rang übereinstimmen. Die Das zweite Element im Tupel gibt an, welche Dimension im höherrangigen Array mit Dimension 1 im niedrigeren Rang übereinstimmen usw. Die Reihenfolge der Übertragungsdimensionen müssen streng anwachsen. In der vorherigen Spalte Beispiel: V mit N und T mit P abzugleichen, ist unzulässig. ist es auch nicht erlaubt, V sowohl P als auch N.
Arrays mit ähnlichem Rang mit degenerierten Dimensionen übertragen
Ein ähnliches Problem ist das Senden von zwei Arrays, die den gleichen Rang haben, mit unterschiedlichen Dimensionsgrößen. Wie bei NumPy ist dies nur möglich, wenn die Arrays sind kompatibel. Zwei Arrays sind kompatibel, wenn alle Dimensionen gleich sind. kompatibel sind. Zwei Dimensionen sind in folgenden Fällen kompatibel:
- Sie sind gleich oder
- Eine davon ist „1“ (eine „degenerierte“ Dimension).
Wenn zwei kompatible Arrays gefunden werden, hat die Ergebnisform das Maximum von zwei Eingaben bei jedem Dimensionsindex.
Beispiele:
- (2,1) und (2,3) senden an (2,3).
- (1,2,5) und (7,2,5) senden an (7,2,5).
- (7,2,5) und (7,1,5) senden an (7,2,5).
- (7,2,5) und (7,2,6) sind nicht kompatibel und können nicht übertragen werden.
Ein Sonderfall tritt auf, der ebenfalls unterstützt wird, wobei jedes Eingabearray eine degenerierte Dimension an einem anderen Index. In diesem Fall ist das Ergebnis ein „Outer Vorgangs“: (2,1) und (1,3) senden an (2,3). Weitere Beispiele konsultieren Sie die NumPy-Dokumentation zum Broadcasting
Zusammensetzung der Sendung
Broadcasting eines niedrigeren Arrays an ein höherrangiges Array und Broadcasting mit degenerierten Dimensionen können beide im selben binären Vorgang ausgeführt werden. Beispielsweise können ein Vektor der Größe 4 und eine Matrix der Größe 1 x 2 addiert werden. unter Verwendung von Übertragungsdimensionen mit Wert (0):
|1 2 3 4| + [5 6] // [5 6] is a 1x2 matrix, not a vector.
Zunächst wird der Vektor unter Verwendung der Dimensionen. Der einzelne Wert (0) in den Broadcast-Dimensionen gibt an, dass Die Dimension 0 des Vektors stimmt mit der Dimension 0 der Matrix überein. Dadurch entstehen eine Matrix der Größe 4xM, wobei der Wert M ausgewählt wird, im 1x2-Array festgelegt. Daher wird eine 4x2-Matrix erzeugt:
|1 1| + [5 6]
|2 2|
|3 3|
|4 4|
Wählen Sie dann „degenerate Dimension Broadcasting“ Broadcasts Dimension 0 von 1x2 -Matrix so, dass sie der entsprechenden Dimensionsgröße auf der rechten Seite entspricht:
|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 hinzugefügt wurde. 4 x 3 x 1 mit den Übertragungsabmessungen (1, 2) Zuerst wird die 1x2-Matrix , um mit den Broadcast-Dimensionen einen Rang 3 zu erhalten und ein Mx1 x 2-Zwischenarray zu erstellen. wobei die Dimensionsgröße M durch die Größe des größeren Operanden (die 4x3x1-Array), was ein 4x1x2-Zwischenarray erzeugt. Das M befindet sich bei Dimension 0 (die Dimension ganz links), da die Dimensionen 1 und 2 den Dimensionen der ursprünglichen 1x2-Matrix, da die Broadcast-Dimensionen (1, 2) sind. Dieses Ein Zwischenarray kann zur 4x3x1-Matrix hinzugefügt werden, indem von degenerieren Sie die Abmessungen, um ein 4x3x2-Array-Ergebnis zu erhalten.