Partilhar via


Como devo proceder para expressam coisas no BrainScript

Obtenha um bom destaque de sintaxe para ficheiros configurar BrainScript

Aqui está como fazê-lo se você usar vim; outros editores devem ser semelhantes

:set syntax=conf

Isto não é perfeito, mas é muito melhor do que nenhum destaque de sintaxe. Se souber escrever um .vim ficheiro de sintaxe, por favor envie-nos um pedido de retirada.

Em Emacs, conf-mode é mais adequado. Para mudar, prima M-x para começar a entrar nos comandos e, em seguida, introduza conf-mode. No Windows Emacs, há também conf-windows-mode, no entanto, que o modo parece por vezes confundir-se com personagens especiais em comentários.

Expresse a taxa de erro do meu classificador binário

Não utilize o ClassificationError, pois funciona apenas para etiquetas multiclasse. Usando os operadores aritméticos e lógicos padrão, você pode expressar isto como

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

onde assumimos aqui que a previsão é uma estimativa da probabilidade da classe positiva dada a entrada.

Expresse um softmax com um parâmetro de temperatura

Um softmax de temperatura é muito fácil no BrainScript

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

Expresse um mecanismo de gating

A maneira mais simples é usar

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

que funciona com escalares, bem como tensores (todos os argumentos podem ser transmitidos).

Expresse um softmax sobre um eixo dinâmico

Um softmax sobre um eixo dinâmico pode ser feito através de uma recorrência:

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

Implementar Zoneout

Podem estar a perguntar-se se o Abandono aplicado a uma Constante é avaliado dinamicamente. É! Portanto , Zoneout é tão simples como

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

Construa um tensor 3D constante

Quero construir um tensor 3D constante em CNTK. Aprendi a produzir matrizes constantes 1D e 2D, posso empilhar (concatenate ou combinar) e repeti-las. Agora preciso de empilhar os Tensors 2D para fazer um tensor 3D?

Digamos que tem três tensores, por exemplo.

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

Agora pode dizer

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

que lhe dará um tensor [100 x 200 x 3].

(Se, por outro lado, tivesse dito Splice (A:B:C, eixo=1), obteria um tensor [300 x 200], e Splice (A:B:C, eixo=2) lhe daria um tensor [100 x 600].)

Note que para combinar numa nova dimensão, as dimensões de todas as entradas devem coincidir. Por exemplo, não é possível empilhar um ParâmetroTensor {100:200} e um ParameterTensor {100:50} ao longo do eixo 3 (mas pode empilhá-lo ao longo do eixo 2, o que lhe daria um tensor [100 x 250]).

Note também que os índices de eixo são baseados em 1, como em matemática. Por exemplo, a dimensão da linha de uma matriz é o primeiro eixo, eixo=1, e a dimensão da coluna é o segundo eixo, eixo=2.

Interpretar a perda de treino

Como calcula CNTK perda de treino (como ousadia) após a final de uma época? Será que o modelo final passa por todo o conjunto de treinos para obter o valor, ou simplesmente faz a média das perdas de treino miniBatch produzidas pela modelo enquanto é atualizada durante a época?

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

A resposta é esta última (onde a média é ponderada pelas amostras na minibatch no caso de serem de comprimento variável). Ou seja, não se obtém a perda de treino real do modelo no estado em que está no final da época.