Partager via


Comment faire exprimer des éléments dans BrainScript

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.