Bloco SGD BrainScript
O bloco de configuração SGD controla o comportamento do algoritmo SGD (Descida do Gradiente Stochastic) em CNTK. Se você está familiarizado com outros kits de ferramentas, certifique-se de check-out
- Como é definido o tamanho da minibatch em CNTK
- Como é definido o tamanho da época em CNTK
- Como converter a taxa de aprendizagem e os parâmetros de impulso de outros kits de ferramentas?
O bloco de configuração SGD tem a seguinte estrutura e valores predefinidos:
SGD = {
# Training process control
modelPath = ...
trainCriterionNodeName = ...
evalCriterionNodeName = ...
maxEpochs = ...
epochSize = 0
minibatchSize = 256
truncated = false
dropoutRate = 0
maxTempMemSizeInSamplesForCNN = 0
keepCheckPointFiles = false
disableWkInBatchNormal = false
# Learning rate and momentum control
learningRatesPerSample = ...
learningRatesPerMB = ...
minLearningRatePerSample = ...
momentumAsTimeConstant = ...
momentumPerMB = ...
useNAG = false
autoAdjust = {
autoAdjustLR = "none" # | "searchBeforeEpoch" | "adjustAfterEpoch"
autoAdjustMinibatch = false
# for autoAdjustLR = "adjustAfterEpoch":
reduceLearnRateIfImproveLessThan = 0
learnRateDecreaseFactor = 0.618
increaseLearnRateIfImproveMoreThan = infinity
learnRateIncreaseFactor = 1.382
loadBestModel = true
learnRateAdjustInterval = 1
useCVSetControlLRIfCVExists = true
useEvalCriterionControlLR = false
# for autoAdjustLR = "searchBeforeEpoch":
numMiniBatch4LRSearch = 500
numPrevLearnRates = 5
numBestSearchEpoch = 1
# for autoAdjustMinibatch = true:
numMiniBatch4LRSearch = 500
minibatchSizeTuningFrequency = 1
minibatchSizeTuningMax = 1048576
minibatchSearchCriterionErrorMargin = 1
}
parallelTrain = {
parallelizationMethod = "none" # | "dataParallelSGD" | "blockMomentumSGD" | "modelAveragingSGD"
parallelizationStartEpoch = 1
distributedMBReading = false
syncPerfStats = 0
# for parallelizationMethod = "dataParallelSGD"
dataParallelSGD =
{
gradientBits = (8*sizeof(precision)) # | 1 | 2
useBufferedAsyncGradientAggregation= false
}
# for parallelizationMethod = "blockMomentumSGD"
blockMomentumSGD = {
blockSize = (120000 * #workers)
blockMomentumAsTimeConstant = (-blockSize / log(1 - 1/#workers))
resetSGDMomentum = true;
useNesterovMomentum = true;
blockLearningRate = 1.0
}
# for parallelizationMethod = "modelAveragingSGD"
modelAveragingSGD = {
blockSize = (40000 * #workers)
}
}
# Gradient control
gradientClippingWithTruncation = true
clippingThresholdPerSample = (infinity)
L2RegWeight = 0
L1RegWeight = 0
gaussianNoiseInjectStd = 0
gradUpdateType = "" # "" | "adagrad" | "rmsProp" | "fsAdaGrad"
# for gradUpdateType = "adaGrad" or "rmsProp":
normWithAveMultiplier = true
# for gradUpdateType = "rmsProp":
rms_wgt_inc = 1.2
rms_wgt_dec = 0.75
rms_wgt_max = 10.0
rms_wgt_min = 0.1
rms_gamma = 0.99
# Information display
traceLevel = 0
firstMBsToShowResult = 10
numMBsToShowResult = 10
numMBsToCUDAProfile = 0
# Precompute
useAllDataForPreComputedNode = true
# Gradient check
gradientCheck = false
sigFigs = 6
}
Parâmetros
Controlo de processos de formação
trainCriterionNodeName
: o nome do nó de critério de formação. Se não for fornecido o nó de critério de formação padrão na rede será utilizado.evalCriterionNodeName
: o nome do nó critério de avaliação. Se não for fornecido o nó de critério de avaliação padrão na rede será utilizado.epochSize
: clique aqui para saber sobre a épocaSizekeepCheckPointFiles
: se pretende manter o ficheiro de ponto de verificação após o início de uma nova época. Valores válidos sãotrue
efalse
(predefinição).disableWkInBatchNormal
: se permitir o termo de decomposição do peso da normalização do lote enquanto o SGD atualiza. Valores válidos sãotrue
efalse
(predefinição).maxEpochs
: número máximo de épocas a executar.minibatchSize
: clique aqui para saber sobre minibatchSizedropoutRate
: taxa de abandono durante o procedimento de treino. A predefinição é0.0
. Pode utilizar sintaxe como 0.5*10:0.2, o que significa utilizar a taxa de abandono 0,5 para 10 épocas e depois 0,2 para o resto.maxTempMemSizeInSamplesForCNN
: memória temporária máxima utilizada (em número de amostras) quando a embalagem e as características de entrada de desembalagem. O padrão é 0, o que significa usar qualquer valor conforme necessário. Útil para controlar a impressão do pé de memória esp. quando executado sob GPU.saveBestModelPerCriterion
: opção de guardar as melhores modelo para cada critério medido em dados de validação cruzada. Quando os modelos terminam o treino são nomeados<modelName>_<criterionName>
. Valores válidos sãotrue
efalse
(predefinição).
Aprendizagem taxa e controlo de impulso
Note CNTK a forma de especificar as taxas de aprendizagem e o impulso difere de outros kits de ferramentas. Consulte aqui uma descrição detalhada.
learningRatesPerSample
: as taxas de aprendizagem por época com as quais o gradiente de cada amostra atualiza o modelo. Pode utilizar valores diferentes para diferentes épocas, por exemplo, 0,025*10:0.00625 significa utilizar a taxa de aprendizagem 0,025 para as primeiras 10 épocas e depois 0,00625 para as restantes. Esta é a forma preferida de especificar em CNTK, uma vez que especifica as taxas de aprendizagem agnósticas para o tamanho da minibatch, o que é importante quando se utiliza minibatch-sizing automático. Outros conjuntos de ferramentas especificam frequentemente as taxas de aprendizagem de uma forma em média de minibatch. Para converter a partir dessa notação, utilize a taxa de aprendizagem por amostra = taxa de aprendizagem por MB /minibatchSize
(consulte aqui para mais detalhes).learningRatesPerMB
: forma alternativa de especificar as taxas de aprendizagem a aplicar à média sobre as amostras na minibatch. Esta é a forma mais comum de especificar as taxas de aprendizagem em outros kits de ferramentas, mas é problemática em CNTK onde a formação em paralelo de dados, que modifica o tamanho das minibatchs. Internamente, esta será convertida dividindolearningRatesPerSample
os valores pelo 'minibatchSize' especificado. Mutuamente exclusivo comlearningRatesPerSample
.minLearningRatePerSample
: taxa mínima de aprendizagem por amostra. Quando a taxa de aprendizagem por amostra for menor do que este valor, o processo de formação terminará. Isto é frequentemente usado para controlar a paragem precoce quando o ajuste automático da taxa de aprendizagem é ativado. O padrão é 1e-9.momentumAsTimeConstant
: da mesma formalearningratesPerSample
, CNTK especifica o impulso de uma forma agnóstica de tamanho minibástico como a constante de tempo (em amostras) de um filtro IIR de 1ª ordem unitária. O valor especifica o número de amostras após as quais um gradiente tem um efeito de 1/e=37%. Outros conjuntos de ferramentas especificam frequentemente o impulso como um peso por minibatch (por exemplo, 0,9). Para converter a partir daí, usemomentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
. Pode utilizar a sintaxe como 20000*10:2500, o que significa usar o tempo de impulso constante 20000 para 10 épocas e depois 2500 para o resto.momentumPerMB
: esta forma alternativa de especificar o impulso imita o comportamento dos kits de ferramentas comuns. Por exemplo, especificar 0,9 significa que o gradiente anterior será mantido com um peso de 0,9. Note-se, no entanto, que, ao contrário de outros conjuntos de ferramentas, CNTK ainda utiliza um filtro de ganho unitário, ou seja, o novo gradiente será multiplicado com(1-momentumPerMB)
. Internamente, isto será convertido emmomentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
.autoAdjust
: contém as informações relativas ao controlo automático da taxa de aprendizagem. O valor predefinido está vazio ("") o que significa que não há controlo automático da taxa de aprendizagem. Dentro do bloco, pode haver valores seguintes:autoAdjustLR
: o algoritmo automático de ajustamento da taxa de aprendizagem a utilizar. Os valores válidos sãoNone
(padrão, não ajuste automaticamente a taxa de aprendizagem),AdjustAfterEpoch
(verifique o critério de formação após cada época utilizando o conjunto de desenvolvimento do conjunto de formação e decida se ajusta a taxa de aprendizagem) eSearchBeforeEpoch
(pesquisar a taxa de aprendizagem com base numa pequena parte do conjunto de treino antes de cada época começar).Quando utilizado no
AdjustAfterEpoch
modo:reduceLearnRateIfImproveLessThan
: reduzir a taxa de aprendizagem se a melhoria for inferior a este valor. A predefinição é0
.learnRateDecreaseFactor
: o fator de diminuição da taxa de aprendizagem. O valor predefinido é0.618
.increaseLearnRateIfImproveMoreThan
: aumentar a taxa de aprendizagem se a melhoria for maior do que este valor. O valor predefinido é1#INF
(infinito) o que significa nunca aumentar.learnRateIncreaseFactor
: o fator de aumento da taxa de aprendizagem. O valor predefinido é1.382
.loadBestModel
: se carregar as melhores modelo se o modelo atual diminuir o desempenho. Valores válidos sãotrue
(predefinido) efalse
.learnRateAdjustInterval
: determinar a frequência de aplicação da verificação de ajustamento da taxa de aprendizagem. O padrão é1
época. Se este valor for definido para um valor superior a 1, o ajustamento da taxa de aprendizagem basear-se-á no critério médio calculado das últimaslearnRateAdjustInterval
épocas.useEvalCriterionControlLR
: utilizar o critério de avaliação em vez do critério de formação para controlar a taxa de aprendizagem. Por defeito, é falso.
Quando utilizado no
SearchBeforeEpoch
modo.numMiniBatch4LRSearch
: o número de mini-reduções utilizados para pesquisar a taxa de aprendizagem. O valor predefinido é500
. Normalmente é definido para 10-20% do total de minibatches numa época.numPrevLearnRate
: número de taxas de aprendizagem anteriores utilizadas como sugestão para o intervalo de pesquisa. O valor predefinido é5
.numBestSearchEpoch
: número de épocas em que utilizamos a melhor taxa de aprendizagem em vez da taxa de aprendizagem suficiente. O valor predefinido é1
.
Quando utilizado no modo 'AdaptiveMinibatchSizing'.
numMiniBatch4LRSearch
: o número de mini-minibaches utilizados para pesquisar o tamanho do minibatch quando em modo de tamanho de minibatch adaptativo. O valor predefinido é500
. É tipicamente definido para 10-20% do total de minibatches numa época que é partilhada com a procura de taxa de aprendizagem emSearchBeforeEpoch
modo.autoAdjustMinibatch
: ativar ou desativar se o tamanho da minibatch é ajustado de forma adaptável. O valor predefinido éfalse
. O tamanho de minibatch adaptativo começará em épocas a partir de tamanhos de minibatch do utilizador explicitamente especificados. Por exemplo, se o utilizador especificado minibatchSize=256:1024, então 256 e 1024 são usados nas primeiras 2 épocas e o tamanho de minibatch adaptativo é usado depois.minibatchSizeTuningFrequency
: O número de épocas a saltar, numa base periódica, antes de ajustar dinamicamente o tamanho da minibatch. O valor predefinido é1
.minibatchSizeTuningMax
: O tamanho máximo permitido para um tamanho de minibatch ajustado adaptativamente. O valor predefinido é1048576
.
Controlo de gradiente
gradientClippingWithTruncation
: se utilizar o recorte de gradiente baseado em truncação para controlar a explosão do gradiente. Valores válidos sãotrue
(predefinido) efalse
. Se for falso, o recorte baseado na norma será usado, o que é mais caro.clippingThresholdPerSample
: o limiar de retenção para cada amostra. O valor predefinido é1#INF
o que significa infinito (isto é, o recorte é desligado).L2RegWeight
(predefinição 0): o peso de regularização L2 por amostra. A norma Frobenius do parâmetro apregável é adicionada ao objetivo com este peso. Isto é especificado por amostra, o que significa que a norma Frobenius é multiplicada pelo número de amostras na minibatch.L1RegWeight
(predefinição 0): o peso de regularização L1 por amostra.gradUpdateType
: tipo de atualização de gradiente. Valores válidos sãoNone
(padrão, sem tratamento especial para o gradiente),AdaGrad
eRmsProp
.- Quando
gradUpdateType
é igual ouAdaGrad
RmsProp
, pode controlar o comportamento da atualização de gradiente utilizando os seguintes parâmetros:normWithAveMultiplier
: normalizar o gradiente com os multiplicadores médios aplicados aos gradientes pelo algoritmo AdaGrad/RmsProp. O predefinição étrue
(predefinição).
- Quando
gradUpdateType
é igual aRmsProp
, pode controlar o comportamento da atualização de gradiente utilizando os seguintes parâmetros:rms_wgt_inc
: incremento multiplicativo da escala de taxa de aprendizagem. A predefinição é1.2
.rms_wgt_dec
: decremento multiplicador da escala de taxa de aprendizagem. A predefinição é0.75
.rms_wgt_max
: escala máxima de taxa de aprendizagem permitida. Um valor mais próximo de 1 torna o ajustamento da taxa de aprendizagem mais estável, mas mais lento. A predefinição é10
.rms_wgt_min
: escala mínima de taxa de aprendizagem permitida. Um valor mais próximo de 1 torna o ajustamento da taxa de aprendizagem mais estável, mas mais lento. A predefinição é0.1
.rms_gamma
: fator de alisamento utilizado para estimar a média móvel da variação. Quanto menor o valor, mais depressa esquece a informação passada. A predefinição é0.99
.
- Quando
gaussianNoiseInjectStd
: o desvio padrão do ruído gaussiano adicionado ao utilizar aAdaGrad
abordagem. A predefinição é0
.
Exibição de informação
traceLevel
: nível de rastreio para decidir que informações imprimir no stderr. Valores válidos são0
(predefinido) e1
.numMBsToShowResult
: apresentar estatísticas de treino após quantos minibatches. A predefinição é10
.
TensorBoard
tensorBoardNumMBsToLogResult
: número de mini-mectores entre os resultados da registo registador para o TensorBoard.
Verificação de gradiente
gradientCheck
: determina se deve utilizar o verificador de gradiente. O valor predefinido éfalse
. Ao utilizar o verificador de gradiente, é necessário utilizar um tamanho de minibatch maior do que o comprimento da sequência para RNNs devido ao algoritmo de backpropagation truncado através do tempo (BPTT) usado para treinar RNNs, e uma taxa de aprendizagem menor para prevenir problemas numéricos causados pela divergência. Além disso, a precisão deve ser definida para duplicar.
Description
O comportamento do algoritmo SGD (Stochastic Gradient Descent Learner) é controlado pelo bloco SGD das opções. Quando uma opção é omitida, o valor predefinido é assumido.
Os parâmetros que não são explicitamente especificados são deixados aos valores predefinidos.
Especificar tamanhos de dados
Conversão de parâmetros de Aprendizagem e momentum de outros kits de ferramentas
As fórmulas de modelo-actualização de CNTK diferem um pouco de outros kits de ferramentas e da literatura, na medida em que em CNTK, os parâmetros são especificados de uma forma que é agnóstica do tamanho da minibatch. Isto é importante no contexto da formação data-paralelo, onde CNTK em si pode modificar o tamanho da minibatch. Especificar a taxa de aprendizagem e o impulso de forma agnóstica evita complexidades de ajustar estes valores em alterações do tamanho das minibatchs.
Estas são as fórmulas de modelo-actualização da CNTK para ADS com impulso:
G(t) = (1-mu) sum { g(t-minibatchSize+1) ... g(t) } + mu * G(t-minibatchSize)
mu = exp (-minibatchSize/momentumAsTimeConstant)
M(t) = M(t-minibatchSize) + learningRatePerSample G(t)
com o
G(t)
: gradientet
com um impulso após amostrasg(t')
: gradiente bruto da amostra no momentot'
M(t)
: modelo utilizados após vert
amostras.t
incrementando em passos deminibatchSize
(Nota: Ao utilizar sequências de comprimento variável, oscilar ligeiramente, minibathSize
uma vez que os comprimentos de sequência numa minibatch geralmente não se resumem precisamente ao solicitado minibathSize
.)
Nota:
- O filtro
G(t)
de impulso é de ganho unitário. O gradiente de cada amostra é distribuído ao longo do tempo de modo que a sua soma é 1. - A taxa de aprendizagem é especificada por amostra, em vez de w.r.t. uma média sobre amostras.
A especificação utilizada em outros kits de ferramentas e literatura de rede neural é frequentemente esta:
G'(t) = average { g(t-minibatchSize+1) ... g(t) } + mu * G'(t-minibatchSize)
M(t) = M(t-minibatchSize) + eta G'(t)
com o
G'
: gradiente definido de forma alternativa como uma média por minibatch e sem(1-mu)
mu
: parâmetro de impulso, por exemplo, 0.9, de um filtro IIR não unitário , aplicado por minibatcheta
: taxa de aprendizagem com gradiente médio de minibatch
Os parâmetros especificados desta forma podem ser mapeados para CNTK parâmetros utilizando estas fórmulas:
learningRatePerSample = eta / minibatchSize / (1-mu)
momentumAsTimeConstant = -minibatchSize / ln (mu)
Você vai chegar perto disso usando learningRatePerMB
emomentumPerMB
, que são mapeados da seguinte forma (note a ausência de/ (1-mu)
:learningRatePerSample
learningRatePerSample = learningRatePerMB / minibatchSize
momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
Exemplo
Configuração utilizada pelo tutorial ImageHandsOn com paralelismo de dados e escala automática de minibatch:
SGD = {
epochSize = 50000
maxEpochs = 160 ; minibatchSize = 128
learningRatesPerSample = 0.0078125*80:0.00078125*40:0.000078125
momentumAsTimeConstant = 1200
L2RegWeight = 0.0001
firstMBsToShowResult = 10 ; numMBsToShowResult = 500
parallelTrain = {
parallelizationMethod = "dataParallelSGD"
parallelizationStartEpoch = 1
distributedMBReading = true
dataParallelSGD = { gradientBits = 2 }
}
autoAdjust = {
autoAdjustMinibatch = true # enable automatic growing of minibatch size
minibatchSizeTuningFrequency = 10 # try to enlarge after this many epochs
numMiniBatch4LRSearch = 200
minibatchSizeTuningMax = 15000 # out of memory above this
}
}