Gewusst wie Ausdrücke in BrainScript
- Holen Sie sich eine schöne Syntaxmarkierung für BrainScript-Konfigurationsdateien ?
- Express the error rate of my binary classifier?
- Express a softmax with a temperature parameter?
- Ausdruck eines Gatingmechanismus?
- Express a softmax over a dynamic axis?
- Zoneout?
- Erstellen sie einen Konstanten-3D-Tensor?
- Kombinieren oder Verketten von Vektoren in BrainScript?
- Interpretieren sie den Trainingsverlust?
Abrufen einer schönen Syntaxmarkierung für BrainScript-Konfigurationsdateien
Hier erfahren Sie, wie Sie dies tun, wenn Sie verwenden vim
; andere Editoren sollten ähnlich sein.
:set syntax=conf
Dies ist nicht perfekt, aber es ist viel besser als keine Syntaxmarkierung. Wenn Sie wissen, wie Sie eine .vim
Syntaxdatei schreiben, senden Sie uns bitte eine Pullanfrage.
In Emacs conf-mode
eignet sich am besten. Um zu wechseln, drücken M-x
Sie, um die Eingabe von Befehlen zu starten, und geben Sie dann die EINGABETASTE conf-mode
ein. Auf Windows Emacs gibt es auch conf-windows-mode
, aber dieser Modus scheint manchmal durch Sonderzeichen in Kommentaren verwechselt zu werden.
Ausdruck der Fehlerrate meines binären Klassifizierers
Verwenden Sie "ClassificationError" nicht, da es nur für mehrklassige Bezeichnungen funktioniert. Mithilfe der standardmäßigen arithmetischen und logischen Operatoren können Sie dies ausdrücken als
err = (label != (prediction > 0.5))
...
evaluationNodes = (err)
wo wir hier davon ausgehen, dass die Vorhersage eine Schätzung der Wahrscheinlichkeit der positiven Klasse ist, die die Eingabe erhält.
Express a softmax with a temperature parameter
Eine Temperatur softmax ist sehr einfach in BrainScript
TemperatureSoftmax (z, T) = Softmax (z / Constant (T))
Ausdruck eines Gatingmechanismus
Die einfachste Möglichkeit ist die Verwendung
BS.Boolean.If
(condition, thenExpression, elseExpression)
die mit Skalaren sowie Tensoren funktioniert (alle Argumente können übertragen werden).
Express a softmax over a dynamic axis
Eine Softmax über eine dynamische Achse kann über eine Serie erfolgen:
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
Implementieren von Zoneout
Möglicherweise fragen Sie sich, ob Dropout, das auf eine Konstante angewendet wird, dynamisch ausgewertet wird. Doch so ist es. Daher ist Zoneout so einfach wie
Zoneout (x, xprev) =
{
mask = Dropout (BS.Constants.OnesLike (x))
res = BS.Boolean.If (mask, xprev, x)
}.res
Erstellen einer Konstanten-3D-Tensor
Ich möchte einen konstanten 3D-Tensor in CNTK erstellen. Ich habe gelernt, wie 1D- und 2D-Konstantenarrays erzeugt werden, ich kann sie stapeln (verketten oder kombinieren), und wiederholen Sie sie. Jetzt muss ich die 2D-Tensoren stapeln, um einen 3D-Tensor zu erstellen?
Angenommen, Sie haben drei Tensoren, z. B.
A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}
Sie können jetzt sagen
ABC = Splice (A:B:C, axis=3)
das gibt Ihnen einen [100 x 200 x 3] Tensor.
(Wenn Sie dagegen Splice (A:B:C, axis=1) sagen, würden Sie einen [300 x 200] Tensor erhalten, und Splice (A:B:C, axis=2) würde Ihnen einen [100 x 600] Tensor erhalten.)
Beachten Sie, dass die Abmessungen aller Eingaben übereinstimmen müssen, um in einer neuen Dimension zu splizieren. Sie können z. B. keinen ParameterTensor {100:200} und einen ParameterTensor {100:50} entlang der Achse 3 stapeln (aber Sie könnten ihn entlang der Achse 2 stapeln, was Ihnen einen [100 x 250] Tensor gibt).
Beachten Sie auch, dass Achsenindizes 1-basiert sind, z. B. in Mathematik. Die Zeilendimension einer Matrix ist z. B. die erste Achse, Achse=1, und die Spaltendimension ist die zweite Achse, Achse=2.
Interpretieren des Schulungsverlusts
Wie berechnet CNTK den Trainingsverlust (wie fett formatiert) nach Abschluss einer Epoche? Durchläuft das endgültige Modell den gesamten Schulungssatz, um den Wert zu erhalten, oder durchläuft es einfach die miniBatch-Trainingsverluste, die vom Modell erzeugt werden, während sie während der Epoche aktualisiert wird?
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
Die Antwort ist letzteres (wobei die Verwertung durch die Stichproben im Minibatch gewichtet wird, falls sie variable Länge sind). Sie erhalten also nicht den tatsächlichen Schulungsverlust des Modells im Zustand, in dem es sich am Ende der Epoche befindet.