Compartir a través de


Cómo expresar cosas en BrainScript

Obtener un resaltado de sintaxis agradable para los archivos de configuración de BrainScript

A continuación se muestra cómo hacerlo si usa vim; otros editores deben ser similares.

:set syntax=conf

Esto no es perfecto, pero es mucho mejor que ningún resaltado de sintaxis. Si sabe cómo escribir un .vim archivo de sintaxis, envíenos una solicitud de incorporación de cambios.

En Emacs, conf-mode es más adecuado. Para cambiar, presione M-x para empezar a escribir comandos y, a continuación, escriba conf-mode. En Windows Emacs, también conf-windows-modehay , sin embargo, ese modo parece a veces confundirse por caracteres especiales en los comentarios.

Expresar la tasa de errores del clasificador binario

No use ClassificationError, ya que solo funciona para etiquetas multiclase. Con los operadores aritméticos y lógicos estándar, puede expresarlo como

err = (label != (prediction > 0.5))
...
evaluationNodes = (err)  

donde suponemos aquí que la predicción es una estimación de la probabilidad de la clase positiva dada la entrada.

Expresar un softmax con un parámetro de temperatura

Una temperatura softmax es muy fácil en BrainScript

TemperatureSoftmax (z, T) = Softmax (z / Constant (T))

Expresar un mecanismo de acceso

La manera más sencilla de usar es

BS.Boolean.If (condition, thenExpression, elseExpression)

que funciona con escalares, así como tensores (todos los argumentos pueden difundir).

Expresar un softmax sobre un eje dinámico

Un softmax sobre un eje dinámico se puede realizar a través de una periodicidad:

BrainScript:

SoftMaxOverSequence (z) = {
    # define a recursive expression for \log(\sum_{i=1}^t \exp(z_i))
    runningLogSumExp = LogPlus (z,
                           PastValue (0, runningLogSumExp, defaultHiddenActivation=-1e30)) 
    logSumExp = If (BS.Loop.IsLast (runningLogSumExp),  # if last entry
                /*then*/ runningLogSumExp,              # then copy that
                /*else*/ FutureValue (0, logSumExp))    # else just propagate to the front
    result = Exp (z - logSumExp)
}.result

Implementación de Zoneout

Es posible que se pregunte si dropout se aplica a una constante se evalúa dinámicamente. ¡Es así! Por lo tanto , Zoneout es tan simple como

Zoneout (x, xprev) =
{
    mask = Dropout (BS.Constants.OnesLike (x))
    res = BS.Boolean.If (mask, xprev, x)
}.res

Crear una constante tensor 3D

Quiero crear una constante tensor 3D en CNTK. Aprendí a generar matrices de constantes 1D y 2D, puedo apilarlas (concatenar o combinar) y repetirlas. Ahora necesito apilar los tensores 2D para crear un tensor 3D?

Supongamos que tiene tres tensores, por ejemplo.

A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}

Ahora puede decir

    ABC = Splice (A:B:C, axis=3)

que le dará un tensor [100 x 200 x 3].

(Por otro lado, si hubieras dicho Splice (A:B:C, axis=1), obtendrías un tensor [300 x 200] y Splice (A:B:C, axis=2) te obtendría un tensor [100 x 600].

Tenga en cuenta que para combinar en una nueva dimensión, las dimensiones de todas las entradas deben coincidir. Por ejemplo, no se puede apilar un ParameterTensor {100:200} y un parameterTensor {100:50} a lo largo del eje 3 (pero podría apilarlo a lo largo del eje 2, lo que le daría un tensor [100 x 250].

Tenga en cuenta también que los índices de eje se basan en 1, como en matemáticas. Por ejemplo, la dimensión de fila de una matriz es el primer eje, axis=1 y la dimensión de columna es el segundo eje, axis=2.

Interpretación de la pérdida de entrenamiento

¿Cómo CNTK calcular la pérdida de entrenamiento (como negrita) después de que finalice una época? ¿El modelo final pasa por todo el conjunto de entrenamiento para obtener el valor o simplemente promedia las pérdidas de entrenamiento de miniBatch producidas por el modelo mientras se actualiza durante la época?

Finished Epoch[ 1 of 100]: [Training] CE = 0.15920662 * 59999999; totalSamplesSeen = 59999999; learningRatePerSample = 9.9999997e-05; epochTime=641.392s
Final Results: Minibatch[1-3510]: CE = 0.32190538 * 3592929
Finished Epoch[ 1 of 100]: [Validate] CE = 0.32190538 * 3592929

La respuesta es la segunda (donde el promedio se pondera por las muestras en el minibatch en caso de que sean de longitud variable). Es decir, no obtiene la pérdida de entrenamiento real del modelo en el estado en el que está al final de la época.