Como devo proceder para expressam coisas no BrainScript
- Obtenha um bom destaque de sintaxe para ficheiros configurar BrainScript ?
- Expressar a taxa de erro do meu classificador binário?
- Expressar um softmax com um parâmetro de temperatura?
- Expressar um mecanismo de gating?
- Expressar um softmax sobre um eixo dinâmico?
- Zona para fora?
- Construir um tensor 3D constante?
- Combinar ou concatenate vetores no BrainScript?
- Interpretar a perda de treino?
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.