Opérations binaires
Opérateurs binaires dans le sens de l’élément.
ElementTimes (x, y)
x .* y
Minus (x, y)
x - y
Plus (x, y)
x + y
LogPlus (x, y)
Less (x, y)
Equal (x, y)
Greater (x, y)
GreaterEqual (x, y)
NotEqual (x, y)
LessEqual (x, y)
BS.Boolean.And (x, y)
BS.Boolean.Or (x, y)
BS.Boolean.Xor (x, y)
Paramètres
x
: entrée gauchey
: entrée droite
Les dimensions et doivent correspondre (sous réserve des règles de x
y
diffusion, voir ci-dessous).
Pour les trois Boolean
opérations, les deux entrées sont censées être 0 ou 1, sinon le comportement des fonctions n’est pas spécifié et changera en fait dans les versions futures.
Les valeurs éparses ne sont actuellement pas prises en charge.
Valeur retournée
Ces fonctions retournent le résultat des opérations correspondantes. Les opérateurs de relation (Equal()
etc.) et les trois Boolean
opérations retournent des valeurs qui sont soit 0 ou 1.
La dimension de sortie ou la forme de capteur est identique à celles des entrées, soumises à la diffusion, voir ci-dessous.
Descriptions
Il s’agit des opérateurs binaires courants.
Ils sont appliqués dans le sens des éléments.
(Notez que l’opérateur de BrainScript n’est *
pas un élément, mais représente le produit de matrice. Ceci est différent, par exemple, de la bibliothèque Python numpy
.)
Les dimensions des entrées doivent être identiques, à l’exception de la diffusion.
Sémantique de diffusion
La diffusion, un concept qui CNTK modèles après la bibliothèque de numpy
Python, signifie qu’une dimension dans l’une des entrées peut être 1 où l’autre entrée n’est pas.
Dans ce cas, l’entrée avec la dimension 1 est copiée n
, où n
se trouve la dimension correspondante de l’autre entrée.
Si les rangs de capteur ne correspondent pas, la forme de capteur de l’entrée avec moins de dimensions est supposée être 1 et déclencher la diffusion.
Par exemple, l’ajout d’un [13 x 1]
capteur à un [1 x 42]
vecteur génère un [13 x 42]
vecteur qui contient les sommes de toutes les combinaisons.
Opérations de relation
Les opérateurs de relation (Equal()
etc.) ne sont pas différents, leur dégradé est toujours considéré comme 0.
Ils peuvent être utilisés pour les indicateurs, par exemple comme argument de condition dans l’opération If()
.
LogPlus()
L’opération LogPlus()
calcule la somme des valeurs représentées sous forme logarithmique.
C’est-à-dire qu’il calcule :
LogPlus (x, y) = Log (Exp (x) + Exp (y))
où x
et y
sont des logarithmes de valeurs.
Cette opération est utile lorsque vous traitez des probabilités, qui sont souvent si petites qu’une représentation logarithmique permet une précision numérique appropriée.
Remarque : Un autre nom commun pour cette opération est log-add-exp, par exemple SciPy.
Exemples
Couche sigmoid standard
Cette couche utilise le binaire dans le sens de l’élément +
:
z = Sigmoid (W * x + b)
Notez que *
ci-dessus n’est pas un élément, mais représente le produit de matrice.
Implémentation alternative de l’activation softmax
La fonction d’activation peut être écrite à l’aide Softmax()
de la diffusion Minus
:
MySoftmax (z) = Exp (z - ReduceLogSum (z))
Ici, ReduceLogSum()
réduit le vecteur z
à un scalaire en calculant sa somme logarithmique. Grâce à la sémantique de diffusion de soustraction, cette scalaire est ensuite soustraite de chaque valeur d’entrée.
Cela implémente la division par la somme sur toutes les valeurs de la fonction Softmax.
Nombre maximal d’entrées dans le sens de l’élément
Le maximum d’éléments de deux entrées peut être calculé en tant que combinaison et Greater()
If()
:
MyElementwiseMax (a, b) = If (Greater (a, b), a, b)
Cela fonctionne également avec la diffusion. Par exemple, le redresseur linéaire peut être écrit à l’aide d’une constante scalaire comme deuxième entrée :
MyReLU (x) = MyElementwiseMax (x, Constant(0))