Jak mogę wyrażać elementy w języku BrainScript
- Uzyskać ładne wyróżnianie składni dla plików konfiguracji BrainScript ?
- Wyrażanie współczynnika błędów mojego klasyfikatora binarnego?
- Wyrażać softmax z parametrem temperatury?
- Wyrażanie mechanizmu dyktowania?
- Wyrażanie softmax na osi dynamicznej?
- Limit strefy?
- Czy utworzyć stały tensor 3D?
- Łączenie lub łączenie wektorów w języku BrainScript?
- Zinterpretuj stratę trenowania?
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.