Comment faire exprimer des éléments dans BrainScript
- Obtenez une belle mise en surbrillance de la syntaxe pour les fichiers de configuration BrainScript ?
- Exprimer le taux d’erreur de mon classifieur binaire ?
- Exprimer un softmax avec un paramètre de température ?
- Exprimer un mécanisme de gating ?
- Exprimer un softmax sur un axe dynamique ?
- Zoneout ?
- Créez un tenseur 3D constant ?
- Combiner ou concaténer des vecteurs dans BrainScript ?
- Interpréter la perte d’entraînement ?
Obtenir une belle mise en surbrillance de la syntaxe pour les fichiers de configuration BrainScript
Voici comment procéder si vous utilisez vim
; d’autres éditeurs doivent être similaires
:set syntax=conf
Ce n’est pas parfait, mais il est beaucoup mieux qu’aucune mise en surbrillance de syntaxe. Si vous savez comment écrire un .vim
fichier de syntaxe, envoyez-nous une demande de tirage( pull request).
Dans Emacs, conf-mode
il convient le mieux. Pour basculer, appuyez M-x
pour commencer à entrer des commandes, puis entrez conf-mode
. Sur Windows Emacs, il existe égalementconf-windows-mode
, cependant, ce mode semble parfois confus par des caractères spéciaux dans les commentaires.
Exprimer le taux d’erreur de mon classifieur binaire
N’utilisez pas ClassificationError, car elle fonctionne uniquement pour les étiquettes multiclasses. À l’aide des opérateurs arithmétiques et logiques standard, vous pouvez l’exprimer comme suit
err = (label != (prediction > 0.5))
...
evaluationNodes = (err)
où nous supposons ici que la prédiction est une estimation de la probabilité de la classe positive en fonction de l’entrée.
Exprimer un softmax avec un paramètre de température
Un softmax de température est très facile dans BrainScript
TemperatureSoftmax (z, T) = Softmax (z / Constant (T))
Exprimer un mécanisme de gating
La façon la plus simple consiste à utiliser
BS.Boolean.If
(condition, thenExpression, elseExpression)
qui fonctionne avec des scalaires ainsi que des tenseurs (tous les arguments peuvent être diffusés).
Exprimer un softmax sur un axe dynamique
Un softmax sur un axe dynamique peut être effectué via une périodicité :
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
Implémenter zoneout
Vous vous demandez peut-être si le dropout appliqué à une constante est évalué dynamiquement. Voilà ! Par conséquent , Zoneout est aussi simple que
Zoneout (x, xprev) =
{
mask = Dropout (BS.Constants.OnesLike (x))
res = BS.Boolean.If (mask, xprev, x)
}.res
Générer un tensoriel 3D constant
Je veux créer un tenseur 3D constant dans CNTK. J’ai appris à produire des tableaux de constantes 1D et 2D, je peux les empiler (concaténer ou combiner) et les répéter. Maintenant, je dois empiler les tenseurs 2D pour créer un tenseur 3D ?
Supposons que vous avez trois tenseurs, par exemple
A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}
Vous pouvez maintenant dire
ABC = Splice (A:B:C, axis=3)
qui vous donnera un tensoriel [100 x 200 x 3].
(Si, d’un autre côté, vous aviez dit Splice (A:B:C, axis=1), vous obtiendriez un tenseur [300 x 200] et Splice (A:B:C, axis=2) vous obtiendrait un tensor [100 x 600].)
Notez que pour ajouter une nouvelle dimension, les dimensions de toutes les entrées doivent correspondre. Par exemple, vous ne pouvez pas empiler un ParameterTensor {100:200} et un ParameterTensor {100:50} le long de l’axe 3 (mais vous pouvez l’empiler le long de l’axe 2, ce qui vous donnerait un tensor [100 x 250].
Notez également que les index d’axe sont basés sur 1, comme en mathématiques. Par exemple, la dimension de ligne d’une matrice est le premier axe, axe=1 et la dimension de colonne est le deuxième axe, axe=2.
Interpréter la perte d’entraînement
Comment CNTK calculer la perte d’entraînement (comme en gras) après la fin d’une époque ? Le modèle final passe-t-il par l’ensemble de l’ensemble de l’entraînement pour obtenir la valeur, ou est-il simplement moyen des pertes d’entraînement miniBatch produites par le modèle pendant qu’il est mis à jour pendant l’époque ?
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 réponse est la dernière (où la moyenne est pondérée par les échantillons dans le minibatch en cas de longueur variable). C’est-à-dire que vous n’obtenez pas la perte d’entraînement réelle du modèle dans l’état où il se trouve à la fin de l’époque.