Dela via


Hur gör jag för att uttrycka saker i BrainScript

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