Questo documento descrive la semantica della trasmissione di un'XL.
Che cos'è la trasmissione?
La trasmissione è il processo per creare array con forme diverse di forme compatibili per le operazioni aritmetiche. La terminologia è presa in prestito Trasmissione NumPy.
Potrebbe essere necessario trasmettere per le operazioni tra array multidimensionali
ranghi diversi o tra array multidimensionali con
di forme compatibili. Considera l'aggiunta X+v
dove X
è una matrice (un array
di rango 2) e v
è un vettore (un array di rango 1). Per eseguire le operazioni
Inoltre, XLA deve "trasmettere" il vettore v
nello stesso rango del
matrice X
, replicando v
un certo numero di volte. La lunghezza del vettore
deve corrispondere ad almeno una delle dimensioni della matrice.
Ad esempio:
|1 2 3| + |7 8 9|
|4 5 6|
Le dimensioni della matrice sono (2,3) e la dimensione del vettore è (3). Il vettore viene trasmesso replicandolo su righe per ottenere:
|1 2 3| + |7 8 9| = |8 10 12|
|4 5 6| |7 8 9| |11 13 15|
In NumPy, questo processo è chiamato trasmissione.
Princìpi
Il linguaggio XLA è il più severo ed esplicito possibile, in quanto evita le "magico" le funzionalità di machine learning. Queste caratteristiche potrebbero semplificare alcuni calcoli ma a scapito di più ipotesi integrate nel codice dell'utente che difficili da modificare nel lungo periodo. Se necessario, le funzionalità magiche implicite possono essere aggiunte in wrapper a livello di client.
Per quanto riguarda la trasmissione, la XLA richiede specifiche esplicite per la trasmissione operazioni tra array di livelli diversi. Questo è diverso da NumPy, che deduce la specifica quando possibile.
Trasmettere un array di ranking inferiore su uno di ranking più elevato
Le Scalars possono sempre essere trasmesse su array senza una specifica esplicita. delle dimensioni di trasmissione. Un'operazione binaria a livello di elemento tra uno scalare e un array significa applicare l'operazione con lo scalare a ogni elemento un array di dati. Ad esempio, aggiungere uno scalare a una matrice significa produrre una matrice in in cui ogni elemento è una somma dello scalare e dell'elemento corrispondente del una matrice di input.
|1 2 3| + 7 = |8 9 10|
|4 5 6| |11 12 13|
La maggior parte delle esigenze di trasmissione può essere acquisita utilizzando una tupla di dimensioni su un un'operazione binaria. Quando gli input nell'operazione hanno livelli diversi, questo la tupla di trasmissione specifica le dimensioni nell'array higher-rank a cui assegnare corrisponde all'array lower-ranking.
Considera l'esempio precedente. Invece di aggiungere uno scalare a una matrice (2,3), aggiungi da un vettore di dimensione (3) a una matrice di dimensioni (2,3). Senza specificare trasmissione, questa operazione non è valida. Richiesta corretta del vettore matrice inoltre, specifica che la dimensione di trasmissione è (1), cioè il valore viene abbinata alla dimensione 1 della matrice. In 2D, se la dimensione è 0 rappresenta le righe e la dimensione 1 rappresenta le colonne, il che significa che ogni elemento del vettore diventa una colonna di dimensioni corrispondenti al numero di righe nella :
|7 8 9| ==> |7 8 9|
|7 8 9|
Come esempio più complesso, considera l'aggiunta di un vettore a 3 elementi (dimensione (3)) per una matrice 3x3 (dimensioni (3,3)). La trasmissione dei contenuti può avvenire in due modi: in questo esempio:
(1) È possibile utilizzare una dimensione di trasmissione pari a 1. Ogni elemento vettoriale diventa un e il vettore è duplicato per ogni riga della matrice.
|7 8 9| ==> |7 8 9|
|7 8 9|
|7 8 9|
(2) È possibile utilizzare una dimensione di trasmissione pari a 0. Ogni elemento vettoriale diventa una riga e il vettore è duplicato per ogni colonna della matrice.
|7| ==> |7 7 7|
|8| |8 8 8|
|9| |9 9 9|
Le dimensioni di trasmissione possono essere una tupla che descrive come un ranking più piccolo viene trasmesso in una forma di ranking più grande. Ad esempio, dato un cuboide 2x3x4 e una matrice 3x4, una tupla di trasmissione (1,2) significa abbinare la matrice a dimensioni 1 e 2 del cuboide.
Questo tipo di trasmissione viene utilizzato nelle operazioni binarie in XlaBuilder
, se
È stato specificato l'argomento broadcast_dimensions
. Ad esempio, vedi
XlaBuilder::Add (Aggiungi).
Nel codice sorgente XLA, questo tipo di trasmissione è talvolta chiamato "InDim"
per la trasmissione dei dati.
Definizione formale
L'attributo di trasmissione consente di abbinare un array di ranking più basso a uno di ranking più alto specificando le dimensioni della matrice di ranking più elevato da abbinare. Per Ad esempio, per una matrice di dimensioni MxNxPxQ, un vettore con dimensione T può essere corrisponde alla seguente:
MxNxPxQ
dim 3: T
dim 2: T
dim 1: T
dim 0: T
In ogni caso, T deve essere uguale alla dimensione corrispondente del ranking più alto un array di dati. I valori del vettore vengono quindi trasmessi dalla dimensione corrispondente a tutti le altre dimensioni.
Per abbinare una matrice TxV all'array MxNxPxQ, una coppia di dimensioni di trasmissione in uso:
MxNxPxQ
dim 2,3: T V
dim 1,2: T V
dim 0,3: T V
etc...
L'ordine delle dimensioni nella tupla di trasmissione deve essere l'ordine in cui il parametro della matrice con ranking inferiore dovrebbero corrispondere alle dimensioni con un array di ranking più elevato. Il primo elemento della tupla specifica la dimensione in la matrice con ranking più elevato deve corrispondere alla dimensione 0 nella matrice di ranking inferiore. La il secondo elemento della tupla specifica la dimensione nell'array con ranking più elevato deve corrispondere alla dimensione 1 nell'array con il ranking più basso e così via. L'ordine di le dimensioni di trasmissione devono essere rigorosamente crescenti. Ad esempio, nell'articolo Ad esempio, è illegale abbinare V a N e T a P; è illegale anche abbinare V sia a P che a N.
Trasmissione di array con ranking simile con dimensioni degenerate
Un problema correlato è la trasmissione di due array che hanno lo stesso ranking ma dimensioni diverse. Come per NumPy, questo è possibile solo quando gli array sono compatibili. Due array sono compatibili quando tutte le loro dimensioni sono compatibili. Due dimensioni sono compatibili se:
- Sono uguali o
- Uno di questi è 1 (una dimensione "degenerata")
Quando si incontrano due array compatibili, la forma del risultato ha il massimo di i due input a ogni indice di dimensione.
Esempi:
- (2,1) e (2,3) trasmettono a (2,3).
- (1,2,5) e (7,2,5) trasmettono a (7,2,5).
- (7,2,5) e (7,1,5) trasmettono a (7,2,5).
- (7,2,5) e (7,2,6) sono incompatibili e non possono essere trasmesse.
Si verifica un caso speciale, ed è anch'esso supportato, in cui ogni array di input ha una dimensione degenerata su un indice diverso. In questo caso, il risultato è “operazione esterna”: (2,1) e (1,3) trasmissione a (2,3). Per altri esempi, consulta il Documentazione di NumPy sulla trasmissione.
Composizione della trasmissione
Trasmissione di un array di ranking inferiore a un array di ranking più elevato e trasmissione che usano dimensioni degenerate possono essere eseguite nella stessa operazione binaria. Ad esempio, si possono sommare un vettore di dimensione 4 e una matrice di dimensione 1x2 utilizzando le dimensioni di trasmissione del valore (0):
|1 2 3 4| + [5 6] // [5 6] is a 1x2 matrix, not a vector.
Innanzitutto, il vettore viene trasmesso fino al grado 2 (matrice) usando la dimensioni. Il singolo valore (0) nelle dimensioni di trasmissione indica che la dimensione zero del vettore corrisponde alla dimensione zero della matrice. Questo produce una matrice di dimensione 4xM dove il valore M viene scelto per nell'array 1x2. Di conseguenza, viene prodotta una matrice 4x2:
|1 1| + [5 6]
|2 2|
|3 3|
|4 4|
Quindi, "degenera la trasmissione delle dimensioni" trasmette la dimensione zero del modello 1 x 2 in modo che corrisponda alla dimensione del lato destro:
|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 esempio più complicato è una matrice di dimensioni 1x2 aggiunta a un array di dimensioni 4 x 3 x 1 utilizzando le dimensioni di trasmissione di (1, 2). Prima viene trasmessa la matrice 1x2 al ranking 3 utilizzando le dimensioni di broadcast per produrre un array Mx1x2 intermedio in cui la dimensione M è determinata dalla dimensione dell'operando più grande (il array 4x3x1) producendo un array intermedio 4x1x2. La M è alla dimensione 0 (la più a sinistra) perché le dimensioni 1 e 2 sono mappate alle dimensioni della matrice 1x2 originale come le dimensioni di trasmissione (1, 2). Questo un array intermedio può essere aggiunto alla matrice 4x3x1 utilizzando degenerare le dimensioni per produrre un risultato di array 4x3x2.