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