Udostępnij za pośrednictwem


Jak mogę wyrażać elementy w języku BrainScript

Uzyskiwanie ładnego wyróżniania składni dla plików konfiguracji BrainScript

Oto jak to zrobić, jeśli używasz vim; inne edytory powinny być podobne

:set syntax=conf

Nie jest to idealne, ale jest znacznie lepsze niż wyróżnianie składni. Jeśli wiesz, jak napisać .vim plik składniowy, wyślij nam żądanie ściągnięcia.

W Emacs conf-mode najlepiej nadaje się. Aby przełączyć się, naciśnij klawisz M-x , aby rozpocząć wprowadzanie poleceń, a następnie wprowadź polecenie conf-mode. Na Windows Emacs istnieje również conf-windows-mode, jednak ten tryb wydaje się czasami być mylony przez znaki specjalne w komentarzach.

Wyrażanie współczynnika błędów klasyfikatora binarnego

Nie należy używać klasy ClassificationError, ponieważ działa tylko w przypadku etykiet wieloklasowych. Używając standardowych operatorów arytmetycznych i logicznych, można to wyrazić jako

err = (label != (prediction > 0.5))
...
evaluationNodes = (err)  

w tym miejscu przyjęto założenie, że przewidywanie jest oszacowaniem prawdopodobieństwa dodatniej klasy, biorąc pod uwagę dane wejściowe.

Wyrażanie softmax z parametrem temperatury

Softmax temperatury jest bardzo łatwy w języku BrainScript

TemperatureSoftmax (z, T) = Softmax (z / Constant (T))

Wyrażanie mechanizmu gating

Najprostszym sposobem jest użycie

BS.Boolean.If (condition, thenExpression, elseExpression)

który działa z skalarnymi, a także tensorami (wszystkie argumenty mogą być emitowane).

Wyrażanie softmax na osi dynamicznej

Softmax nad osią dynamiczną można wykonać za pomocą cyklu:

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

Implementowanie limitu strefy

Możesz się zastanawiać, czy funkcja Dropout zastosowana do stałej jest obliczana dynamicznie. To jest! W związku z tym limit strefy jest tak prosty, jak

Zoneout (x, xprev) =
{
    mask = Dropout (BS.Constants.OnesLike (x))
    res = BS.Boolean.If (mask, xprev, x)
}.res

Tworzenie stałej tensor 3D

Chcę utworzyć stały tensor 3D w CNTK. Dowiedzieliśmy się, jak tworzyć tablice stałe 1D i 2D, mogę je stosować (łączyć lub łączyć) i powtarzać. Teraz muszę stos tensorów 2D, aby wykonać tensor 3D?

Załóżmy, że masz trzy tensory, np.

A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}

Teraz możesz powiedzieć

    ABC = Splice (A:B:C, axis=3)

co daje [100 x 200 x 3] tensor.

(Z drugiej strony, masz splice (A:B:C, axis=1), uzyskasz tensor [300 x 200] i Splice (A:B:C, axis=2) uzyskasz tensor [100 x 600].

Należy pamiętać, że aby połączyć się w nowym wymiarze, wymiary wszystkich danych wejściowych muszą być zgodne. Na przykład nie można utworzyć stosu klasy ParameterTensor {100:200} i klasy ParameterTensor {100:50} wzdłuż osi 3 (ale można umieścić ją na osi 2, co daje tensor [100 x 250].

Należy również zauważyć, że indeksy osi są oparte na 1, podobnie jak w matematyce. Na przykład wymiar wiersza macierzy jest pierwszą osią, osią =1, a wymiar kolumny to druga oś, oś=2.

Interpretowanie utraty trenowania

Jak CNTK oblicza stratę trenowania (pogrubioną) po zakończeniu epoki? Czy ostatni model przechodzi przez cały zestaw szkoleniowy, aby uzyskać wartość, czy po prostu średnia strat treningowych miniBatch generowanych przez model podczas aktualizacji w epoki?

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

Odpowiedź jest druga (gdzie średnio jest ważona przez próbki w minibatch w przypadku, gdy są one zmiennej długości). Tj. nie otrzymujesz rzeczywistej utraty trenowania modelu w stanie, w którym znajduje się na końcu epoki.