Freigeben über


Gewusst wie Ausdrücke in BrainScript

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-modeein. 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.