Hur gör jag för att uttrycka saker i BrainScript
- Få bra syntaxmarkering för BrainScript-konfigurationsfiler ?
- Vill du uttrycka felfrekvensen för min binära klassificerare?
- Vill du uttrycka ett softmax med en temperaturparameter?
- Vill du uttrycka en gating-mekanism?
- Vill du uttrycka ett softmax över en dynamisk axel?
- Zonutdelning?
- Skapa en konstant 3D-tensor?
- Kombinera eller sammanfoga vektorer i BrainScript?
- Tolka träningsförlusten?
Hämta fin syntaxmarkering för BrainScript-konfigurationsfiler
Så här gör du om du använder vim
; andra redigerare bör vara liknande
:set syntax=conf
Detta är inte perfekt, men det är mycket bättre än ingen syntaxmarkering. Om du vet hur du skriver en .vim
syntaxfil skickar du en pull-begäran till oss.
I Emacs conf-mode
passar bäst. Om du vill växla trycker du på M-x
för att börja ange kommandon och anger conf-mode
sedan . På Windows Emacs finns det också conf-windows-mode
, men det läget verkar ibland bli förvirrat av specialtecken i kommentarer.
Uttrycka felfrekvensen för min binära klassificerare
Använd inte ClassificationError eftersom det endast fungerar för etiketter med flera klasser. Med hjälp av standardaritmetiska och logiska operatorer kan du uttrycka detta som
err = (label != (prediction > 0.5))
...
evaluationNodes = (err)
där vi här förutsätter att förutsägelsen är en uppskattning av sannolikheten för den positiva klassen givet indata.
Uttrycka ett softmax med en temperaturparameter
En temperatur softmax är mycket lätt i BrainScript
TemperatureSoftmax (z, T) = Softmax (z / Constant (T))
Uttrycka en gating-mekanism
Det enklaste sättet är att använda
BS.Boolean.If
(condition, thenExpression, elseExpression)
som fungerar med skalärer samt tensorer (alla argument kan sändas).
Uttrycka ett softmax över en dynamisk axel
Ett softmax över en dynamisk axel kan göras via upprepning:
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
Implementera Zoneout
Du kanske undrar om dropout som tillämpas på en konstant utvärderas dynamiskt. Det är det! Därför är Zoneout så enkelt som
Zoneout (x, xprev) =
{
mask = Dropout (BS.Constants.OnesLike (x))
res = BS.Boolean.If (mask, xprev, x)
}.res
Skapa en konstant 3D-tensor
Jag vill skapa en konstant 3D-tensor i CNTK. Jag lärde mig att skapa 1D- och 2D-konstantmatriser, jag kan stapla (sammanfoga eller kombinera) dem och upprepa dem. Nu måste jag stapla 2D Tensors för att göra en 3D-tensor?
Anta att du har tre tensorer, t.ex.
A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}
Du kan nu säga
ABC = Splice (A:B:C, axis=3)
som ger dig en [100 x 200 x 3] tensor.
(Om du å andra sidan hade texten Splice (A:B:C, axis=1) skulle du få en tensor på [300 x 200] och Splice (A:B:C, axis=2) skulle ge dig en [100 x 600] tensor.)
Observera att om du vill skarva i en ny dimension måste dimensionerna för alla indata matcha. Du kan t.ex. inte stapla en ParameterTensor {100:200} och parametertensor {100:50} längs axel 3 (men du kan stapla den längs axel 2, vilket skulle ge dig en [100 x 250] tensor).
Observera också att axelindex är 1-baserade, som i matematik. Till exempel är raddimensionen för en matris den första axeln, axeln = 1, och kolumndimensionen är den andra axeln, axel = 2.
Tolka träningsförlusten
Hur beräknar CNTK träningsförlusten (som fetstilt) när en epok har slutförts? Går den slutliga modellen igenom hela träningsuppsättningen för att hämta värdet, eller medelvärder den helt enkelt de miniBatch-träningsförluster som produceras av modellen medan den uppdateras under epoken?
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
Svaret är det senare (där medelvärdet viktas av proverna i minibatchen om de är varierande längd). Det vill säga att du inte får den faktiska träningsförlusten av modellen i det tillstånd den är i i slutet av epoken.