Tempi e Trasposizioni
CNTK prodotto matrice.
A * B
Times (A, B, outputRank=1)
TransposeTimes (A, B, outputRank=1)
Parametri
A
primo argomento del prodotto matrice. Può essere una sequenza temporale.B
secondo argomento del prodotto matrice. Può essere una sequenza temporale.outputRank
(impostazione predefinita: 1): numero di assi di che costituiscono la dimensione diA
output. Vedere "Interpretazione estesa per tensori" di seguito.
Valore restituito
Prodotto matrice risultante (tensore). Si tratta di una sequenza temporale se entrambi gli input erano una sequenza temporale.
Descrizione
La Times()
funzione implementa il prodotto matrice, con estensioni per tensor. L'operatore *
è una mano breve. TransposeTimes()
trasponse il primo argomento.
Se A
e B
sono matrici (tensore di rango-2) o vettori di colonna (tensore di rango-1), A * B
calcola il prodotto matrice comune, proprio come si prevede.
TransposeTimes (A, B)
calcola il prodotto A^T * B
matrice , dove ^T
denota l'attuazione. TransposeTimes (A, B)
ha lo stesso risultato Transpose (A) * B
di , ma è più efficiente perché evita una copia temporanea della versione trasposta di A
.
Sequenze temporali
Entrambi A
e B
possono essere matrici singole o sequenze temporali. Un caso comune per le reti ricorrenti è una A
matrice di peso, mentre B
è una sequenza di input.
Nota: se A
è una sequenza temporale, l'operazione non è efficiente, perché avvierà una chiamata GEMM separata per ogni passaggio. L'eccezione è dove entrambi gli input sono TransposeTimes()
vettori di colonna, per cui esiste un'ottimizzazione speciale.
Supporto di sparse
Times()
e TransposeTimes()
supportare la matrice sparse. Il risultato è una matrice densa a meno che entrambe non siano sparse. I due casi d'uso più importanti sono:
B
essendo una rappresentazione uno-frequente di una parola di input (o, più comunemente, un'intera sequenza di vettori a caldo). Quindi,A * B
indica un incorporamento di parole, dove le colonne diA
sono i vettori di incorporamento delle parole. Di seguito è riportato il modo consigliato per realizzare incorporamenti in CNTK:``` Embedding (x, dim) = Parameter (dim, 0/*inferred*/) * x e = Embedding (input, 300) ```
A
essere una rappresentazione uni hot di una parola etichetta. Il criterio di entropia incrociata popolare e il contatore degli errori può essere scritto rispettivamente usandoTransposeTimes()
come segue, dovez
è l'input del classificatore Softmax() di primo livello eL
la sequenza di etichette che può essere sparse:``` CrossEntropyWithSoftmax (L, z) = ReduceLogSum (z) - TransposeTimes (L, z) ErrorPrediction (L, z) = BS.Constants.One - TransposeTimes (L, Hardmax (z)) ```
Moltiplicazione con un scalare
Il prodotto matrice non può essere usato per moltiplicare una matrice con un scalare. Verrà visualizzato un errore relativo alla mancata corrispondenza delle dimensioni. Per moltiplicare con un scalare, usare invece il prodotto .*
a livello di elemento. Ad esempio, la media ponderata di due matrici può essere scritta come segue:
z = Constant (alpha) .* x + Constant (1-alpha) .* y
Moltiplicazione con una matrice diagonale
Se la matrice di input è diagonale e archiviata come vettore, non usare Times()
ma una moltiplicazione a livello di elemento (ElementTimes()
o l'operatore .*
).
Ad esempio:
dMat = ParameterTensor {(100:1)}
z = dMat .* v
Ciò sfrutta la semantica di trasmissione per moltiplicare ogni elemento di v
con la rispettiva riga di dMat
.
Interpretazione estesa del prodotto matrice per tensori di rango > 2
Se A
e/o B
sono tensori di rango superiore, l'operazione *
indica un prodotto matrice generalizzato in cui tutte le prime dimensioni di devono corrispondere alle dimensioni iniziali di A
B
e vengono interpretate dall'appiattimento. Ad esempio, un prodotto di un e un [I x J x K]
[J x K x L]
tensore (che [I x J x K] * [J x K x L]
abbreviato di seguito come ) viene reinterpretato riconfigurando i due tensori come matrici come [I x (J * K)] * [(J * K) x L]
, per cui il prodotto matrice è definito e restituisce un risultato della dimensione [I x L]
. Ciò ha senso se si considera che le righe di una matrice di peso siano modelli corrispondenti ai vettori di attivazione. La generalizzazione precedente consente a questi modelli di essere multidimensionali, ad esempio immagini o finestre di funzionalità di riconoscimento vocale.
È anche possibile avere più di una dimensione non corrispondente in B
. Ad esempio [I x J] * [J x K x L]
, viene interpretato come questo prodotto matrice: [I x J] * [J x (K * L)]
che restituisce così un risultato di dimensioni [I x K x L]
. Ad esempio, ciò consente di applicare una matrice a tutti i vettori all'interno di una finestra in sequenza delle funzionalità vocali della L
dimensione J
.
Se il risultato del prodotto deve avere più dimensioni (ad esempio l'organizzazione delle attivazioni di un livello come campo 2D), invece di usare l'operatore *
, è necessario dire Times (A, B, outputRank=m)
dove m
è il numero di dimensioni in cui sono disposti i "pattern" e che vengono mantenuti nell'output. Ad esempio, Times (tensor of dim [I x J x K], tensor of dim [K x L], outputRank=2)
verrà interpretato come prodotto [(I * J) x K] * [K x L]
matrice e restituisce un risultato di dimensioni [I x J x L]
.