Ricerca per categorie esprimere le cose in BrainScript
- Ottenere una bella evidenziazione della sintassi per i file di configurazione BrainScript ?
- Esprimere la frequenza di errore del classificatore binario?
- Esprimere una softmax con un parametro di temperatura?
- Esprimere un meccanismo di gating?
- Esprimere una softmax su un asse dinamico?
- Zoneout?
- Creare un tensore 3D costante?
- Combinare o concatenare vettori in BrainScript?
- Interpretare la perdita di training?
Ottenere una bella evidenziazione della sintassi per i file di configurazione BrainScript
Ecco come eseguire questa operazione se si usa vim
. Altri editor dovrebbero essere simili
:set syntax=conf
Questo non è perfetto, ma è molto meglio di nessuna evidenziazione della sintassi. Se si sa come scrivere un .vim
file di sintassi, inviare una richiesta pull.
In Emacs, conf-mode
è più adatto. Per passare, premere M-x
per iniziare a immettere i comandi, quindi immettere conf-mode
. In Windows Emacs, c'è anche conf-windows-mode
, tuttavia tale modalità sembra talvolta confusa da caratteri speciali nei commenti.
Esprimere la frequenza di errore del classificatore binario
Non usare ClassificationError perché funziona solo per le etichette multiclasse. Usando gli operatori aritmetici e logici standard, è possibile esprimere questa operazione come
err = (label != (prediction > 0.5))
...
evaluationNodes = (err)
dove si presuppone che la stima sia una stima della probabilità della classe positiva data l'input.
Esprimere una softmax con un parametro di temperatura
Una softmax di temperatura è molto facile in BrainScript
TemperatureSoftmax (z, T) = Softmax (z / Constant (T))
Esprimere un meccanismo di controllo
Il modo più semplice consiste nell'usare
BS.Boolean.If
(condition, thenExpression, elseExpression)
che funziona con scalari e tensori (tutti gli argomenti possono trasmettere).
Esprimere una softmax su un asse dinamico
Una softmax su un asse dinamico può essere eseguita tramite una ricorrenza:
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
Implementare zoneout
Ci si potrebbe chiedere se dropout applicato a una costante viene valutato in modo dinamico. Lo è! Di conseguenza Zoneout è semplice come
Zoneout (x, xprev) =
{
mask = Dropout (BS.Constants.OnesLike (x))
res = BS.Boolean.If (mask, xprev, x)
}.res
Creare un tensore 3D costante
Voglio creare un tensore 3D costante in CNTK. Ho imparato a produrre matrici costanti 1D e 2D, posso impilarle (concatenarle o combinarle) e ripeterle. Ora devo impilare i tensori 2D per creare un tensore 3D?
Si supponga di avere tre tensori, ad esempio
A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}
È ora possibile dire
ABC = Splice (A:B:C, axis=3)
che ti darà un tensore [100 x 200 x 3].
(Se, d'altra parte, avevi detto Splice (A:B:C, axis=1), otterresti un tensore [300 x 200] e Splice (A:B:C, axis=2) ti otterrebbe un tensore [100 x 600].
Si noti che per eseguire la giunzione in una nuova dimensione, le dimensioni di tutti gli input devono corrispondere. Ad esempio, non è possibile impilare un parameterTensor {100:200} e un parameterTensor {100:50} lungo l'asse 3 (ma è possibile impilarlo lungo l'asse 2, che darebbe un tensore [100 x 250].
Si noti anche che gli indici dell'asse sono basati su 1, ad esempio in matematica. Ad esempio, la dimensione di riga di una matrice è il primo asse, axis=1 e la dimensione della colonna è il secondo asse, axis=2.
Interpretare la perdita di training
In che modo CNTK calcolare la perdita di training (in grassetto) al termine di un periodo? Il modello finale passa attraverso l'intero set di training per ottenere il valore oppure esegue semplicemente la media delle perdite di training miniBatch prodotte dal modello durante l'aggiornamento durante l'epoca?
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 risposta è la seconda (dove la media è ponderata dai campioni nel minibatch nel caso siano a lunghezza variabile). Ad esempio, non si ottiene la perdita di training effettiva del modello nello stato in cui si trova alla fine dell'epoca.