Partager via


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 gauche
  • y: entrée droite

Les dimensions et doivent correspondre (sous réserve des règles de xy 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))

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))