Cómo expresar cosas en BrainScript
- Obtener un resaltado de sintaxis agradable para los archivos de configuración de BrainScript ?
- ¿Expresa la tasa de errores de mi clasificador binario?
- ¿Expresa un softmax con un parámetro de temperatura?
- ¿Expresar un mecanismo de acceso?
- ¿Expresa un softmax sobre un eje dinámico?
- ¿Zona de salida?
- ¿Crea un tensor 3D constante?
- ¿Combinar o concatenar vectores en BrainScript?
- ¿Interpretar la pérdida de entrenamiento?
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-mode
hay , 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.