Partilhar via


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

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 épocaSize

  • keepCheckPointFiles: se pretende manter o ficheiro de ponto de verificação após o início de uma nova época. Valores válidos são true e false (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ão true e false (predefinição).

  • maxEpochs: número máximo de épocas a executar.

  • minibatchSize: clique aqui para saber sobre minibatchSize

  • dropoutRate: 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ão true e false (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 dividindo learningRatesPerSample os valores pelo 'minibatchSize' especificado. Mutuamente exclusivo com learningRatesPerSample.

  • 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í, use momentumAsTimeConstant = -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 em momentumAsTimeConstant = -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ão None (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) e SearchBeforeEpoch (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ão true (predefinido) e false.
      • 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 últimas learnRateAdjustInterval é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 em SearchBeforeEpoch 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ão true (predefinido) e false. 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ão None (padrão, sem tratamento especial para o gradiente), AdaGrade RmsProp.

    • Quando gradUpdateType é igual ou AdaGradRmsProp, 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 a RmsProp, 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.
  • gaussianNoiseInjectStd: o desvio padrão do ruído gaussiano adicionado ao utilizar a AdaGrad 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ão 0 (predefinido) e 1.

  • 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): gradiente t com um impulso após amostras
  • g(t'): gradiente bruto da amostra no momento t'
  • M(t): modelo utilizados após ver t amostras.
  • t incrementando em passos de minibatchSize

(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 minibatch
  • eta: 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
    }
}