Funciones de activación con BrainScript
Sigmoid(), Tanh(), ReLU(), Softmax(), LogSoftmax(), Hardmax()
Funciones de activación no lineales para redes neuronales.
Sigmoid (x)
Tanh (x)
ReLU (x)
Softmax (x)
LogSoftmax (x)
Hardmax (x)
Parámetros
x
: argumento para aplicar la no linealidad a
Valor devuelto
Resultado de aplicar la no linealidad. La forma de tensor de la salida es la misma que la de la entrada.
Descripción
Estas son las funciones de activación populares de las redes neuronales.
Todos ellos excepto la Softmax()
familia y Hardmax()
se aplican en el caso de los elementos.
Tenga en cuenta que, al usar el criterio de entrenamiento entre entropías, a menudo es conveniente no aplicar una operación Softmax al final, sino pasar la entrada de Softmax a CrossEntropyWithSoftmax()
La Hardmax()
operación determina el elemento con el valor más alto y representa su ubicación como un vector o tensor de un solo uso.
Se usa para realizar la clasificación.
Expresar otras no linealidades en BrainScript
Si su no linealidad necesaria no es una de las anteriores, puede ser composable como una expresión BrainScript. Por ejemplo, una ReLU filtrada con una pendiente de 0,1 para la parte negativa podría escribirse como
LeakyReLU (x) = 0.1 * x + 0.9 * ReLU (x)
Softmax a lo largo de ejes
La familia Softmax es especial en que implica el cálculo de un denominador. Este denominador se calcula en todos los valores del vector de entrada.
Sin embargo, en algunos escenarios, la entrada es un tensor con rango>1, donde los ejes se deben tratar por separado.
Considere, por ejemplo, un tensor de entrada de forma [10000 x 20]
que almacena 20 distribuciones diferentes, cada columna representa la distribución de probabilidad de un elemento de entrada distinto.
Por lo tanto, la operación Softmax debe calcular 20 denominadores independientes.
Esta operación no es compatible con las funciones integradas (Log)Softmax()
, pero se puede realizar en BrainScript mediante una operación de reducción de elementos de la siguiente manera:
ColumnwiseLogSoftmax (z) = z - ReduceLogSum (axis=1)
En este caso, ReduceLogSum()
calcula el denominador (registro de), lo que da como resultado un tensor con dimensión 1 para el eje reducido; [1 x 20]
en el ejemplo anterior. Restando esto del [10000 x 20]
vector de entrada dimensional es una operación válida, como de costumbre, que 1
se "difundirá", es decir, duplicada para que coincida con la dimensión de entrada.
Ejemplo
Un MLP simple que realiza una clasificación de 10 vías de vectores de características 40 dimensionales:
features = Input{40}
h = Sigmoid (ParameterTensor{256:0} * features + ParameterTensor{256})
z = ParameterTensor{10:0} * h * ParameterTensor{10} # input to Softmax
labels = Input{10}
ce = CrossEntropyWithSoftmax (labels, z)