Compartir a través de


Operaciones binarias

Operadores binarios en modo de elemento.

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)

Parámetros

  • x: entrada izquierda
  • y: entrada correcta

Las dimensiones de x y y deben coincidir (sujetas a reglas de difusión, véase a continuación).

Para las tres Boolean operaciones, se espera que ambas entradas sean 0 o 1; de lo contrario, el comportamiento de las funciones no se especifica y, de hecho, cambiará en versiones futuras.

Actualmente no se admiten valores dispersos.

Valor devuelto

Estas funciones devuelven el resultado de las operaciones correspondientes. Los operadores de relación (Equal() etc.) y las tres Boolean operaciones devuelven valores que son 0 o 1.

La dimensión de salida o la forma de tensor son idénticas a las de las entradas, sujetas a difusión, véase a continuación.

Descripciones

Estos son los operadores binarios comunes. Se aplican en forma de elemento. (Tenga en cuenta que el operador de * BrainScript no es elementwise, pero significa el producto de matriz. Esto es diferente, por ejemplo, de la biblioteca de numpy Python).

Las dimensiones de las entradas deben ser idénticas, a excepción de la difusión.

Semántica de difusión

Difusión, un concepto que CNTK modelos después de la biblioteca de numpy Python, significa que una dimensión de una de las entradas puede ser 1 donde la otra entrada no es. En ese caso, la entrada con la dimensión 1 se copiará n veces, donde n es la dimensión de otra entrada correspondiente. Si las clasificaciones de tensor no coinciden, se supone que la forma tensor de la entrada con menos dimensiones será 1 y la difusión del desencadenador.

Por ejemplo, agregar un [13 x 1] tensor a un [1 x 42] vector produciría un [13 x 42] vector que contiene las sumas de todas las combinaciones.

Operaciones de relación

Los operadores de relación (Equal() etc.) no son diferentes, su degradado siempre se considera 0. Se pueden usar para marcas, por ejemplo, como argumento de condición en la If() operación.

LogPlus()

La LogPlus() operación calcula la suma de valores representados en forma logarítmica. Es decir, calcula lo siguiente:

LogPlus (x, y) = Log (Exp (x) + Exp (y))

donde x y y son logaritmos de valores. Esta operación es útil cuando se trabaja con probabilidades, que a menudo son tan pequeñas que solo una representación logarítmica permite una precisión numérica adecuada.

Nota: Otro nombre común para esta operación es log-add-exp, por ejemplo, SciPy.

Ejemplos

Capa sigmoide estándar

Esta capa usa el binario de tipo elementwise +:

z = Sigmoid (W * x + b)

Tenga en cuenta que * lo anterior no es elementwise, pero significa el producto de matriz.

Implementación alternativa de la activación de Softmax

La Softmax() función de activación se puede escribir mediante la difusión Minus:

MySoftmax (z) = Exp (z - ReduceLogSum (z))

Aquí, ReduceLogSum() reduce el vector z a un escalar calculando su suma logarítmica. A través de la semántica de difusión de la resta, este escalar se resta de cada valor de entrada. Esto implementa la división por la suma de todos los valores de la función Softmax.

Valor máximo de dos entradas en forma de elemento

El máximo del elemento de dos entradas se puede calcular como una combinación de Greater() y If():

MyElementwiseMax (a, b) = If (Greater (a, b), a, b)

Esto también funciona con la difusión. Por ejemplo, el rectificador lineal se puede escribir con esto mediante una constante escalar como la segunda entrada:

MyReLU (x) = MyElementwiseMax (x, Constant(0))