Times et TransposeTimes
CNTK produit de matrice.
A * B
Times (A, B, outputRank=1)
TransposeTimes (A, B, outputRank=1)
Paramètres
A
premier argument du produit de matrice. Il peut s’agir d’une séquence chronologique.B
deuxième argument du produit de matrice. Il peut s’agir d’une séquence chronologique.outputRank
(valeur par défaut : 1) : nombre d’axes qui constituent la dimension deA
sortie. Voir « Interprétation étendue pour les tenseurs » ci-dessous.
Valeur renvoyée
Produit de matrice résultant (tensoriel). Il s’agit d’une séquence chronologique si l’une des entrées était une séquence chronologique.
Description
La Times()
fonction implémente le produit de matrice, avec des extensions pour les tenseurs. L’opérateur *
est une courte main pour elle. TransposeTimes()
transpose le premier argument.
Si A
et B
sont des matrices (tenseur rank-2) ou des vecteurs de colonne (ensoriel rank-1), A * B
calcule le produit de matrice commun, comme prévu.
TransposeTimes (A, B)
calcule le produit A^T * B
de matrice, où ^T
désigne la transpose. TransposeTimes (A, B)
a le même résultat que Transpose (A) * B
, mais il est plus efficace car il évite une copie temporaire de la version A
transpose de .
Séquences chronologiques
Les deux A
et B
peuvent être des matrices uniques ou des séquences chronologiques. Un cas courant pour les réseaux récurrents est qu’il s’agit d’une matrice de poids, alors qu’il A
s’agit B
d’une séquence d’entrées.
Remarque : S’il s’agit A
d’une séquence chronologique, l’opération n’est pas efficace, car elle lance un appel GEMM distinct pour chaque étape. L’exception est l’endroit TransposeTimes()
où les deux entrées sont des vecteurs de colonne, pour lesquels une optimisation spéciale existe.
Prise en charge partiellement alloué
Times()
et TransposeTimes()
prendre en charge la matrice éparse. Le résultat est une matrice dense, sauf si les deux sont éparses. Les deux cas d’usage les plus importants sont les suivants :
B
étant une représentation à chaud d’un mot d’entrée (ou, plus généralement, une séquence entière de vecteurs à chaud). Ensuite,A * B
désigne un mot incorporé, où les colonnes sontA
les vecteurs d’incorporation des mots. Voici la méthode recommandée pour réaliser des incorporations dans CNTK :``` Embedding (x, dim) = Parameter (dim, 0/*inferred*/) * x e = Embedding (input, 300) ```
A
étant une représentation unique d’un mot d’étiquette. Le critère d’entropie croisée populaire et le compteur d’erreur peuvent être écrits à l’aideTransposeTimes()
des éléments suivants, respectivement, oùz
est l’entrée du classifieur Softmax() de niveau supérieur etL
la séquence d’étiquettes qui peut être éparse :``` CrossEntropyWithSoftmax (L, z) = ReduceLogSum (z) - TransposeTimes (L, z) ErrorPrediction (L, z) = BS.Constants.One - TransposeTimes (L, Hardmax (z)) ```
Multiplication par un scalaire
Le produit de matrice ne peut pas être utilisé pour multiplier une matrice par un scalaire. Vous obtiendrez une erreur concernant les dimensions incompatibles. Pour se multiplier par un scalaire, utilisez plutôt le produit .*
basé sur les éléments. Par exemple, la moyenne pondérée de deux matrices peut être écrite comme suit :
z = Constant (alpha) .* x + Constant (1-alpha) .* y
Multiplication par une matrice diagonale
Si votre matrice d’entrée est diagonale et stockée en tant que vecteur, n’utilisez Times()
pas mais une multiplication par élément (ElementTimes()
ou l’opérateur .*
).
Par exemple
dMat = ParameterTensor {(100:1)}
z = dMat .* v
Cela tire parti de la sémantique de diffusion pour multiplier chaque élément de v
la ligne correspondante de dMat
.
Interprétation étendue du produit matriciel pour les tenseurs du rang > 2
Si A
et/ou B
sont des tenseurs de rang supérieur, l’opération *
désigne un produit de matrice généralisée où toutes les dimensions, mais la première dimension, A
doit correspondre aux dimensions de début de B
, et sont interprétées par aplatissement. Par exemple, un produit d’un et d’un [J x K x L]
tenseur (que nous allons abrégés comme [I x J x K] * [J x K x L]
) est réinterprété en remodelant les deux tenseurs comme matrices [I x (J * K)] * [(J * K) x L]
comme , pour lesquels le produit de matrice est défini et génère un résultat de dimension [I x L]
.[I x J x K]
Cela est logique si l’on considère les lignes d’une matrice de poids comme des modèles auxquels les vecteurs d’activation sont mis en correspondance. La généralisation ci-dessus permet à ces modèles eux-mêmes d’être multidimensionnels, tels que des images ou des fenêtres de fonctionnalités vocales.
Il est également possible d’avoir plusieurs dimensions non mises en correspondance dans B
. Par exemple [I x J] * [J x K x L]
, il est interprété comme ce produit de matrice : [I x J] * [J x (K * L)]
ce qui génère ainsi un résultat de dimensions [I x K x L]
. Par exemple, cela permet d’appliquer une matrice à tous les vecteurs à l’intérieur d’une fenêtre propagée de L
fonctionnalités vocales de dimension J
.
Si le résultat du produit doit avoir plusieurs dimensions (par exemple, organiser les activations d’une couche en tant que champ 2D), au lieu d’utiliser l’opérateur *
, on doit dire Times (A, B, outputRank=m)
où m
est le nombre de dimensions dans lesquelles les « modèles » sont organisés et qui sont conservés dans la sortie. Par exemple, Times (tensor of dim [I x J x K], tensor of dim [K x L], outputRank=2)
sera interprété comme le produit [(I * J) x K] * [K x L]
de matrice et générera un résultat de dimensions [I x J x L]
.