Compartir a través de


Bloque SGD de BrainScript

El bloque de configuración SGD controla el comportamiento del algoritmo de descenso de degradado estocástico (SGD) en CNTK. Si está familiarizado con otros kits de herramientas, asegúrese de consultar

El bloque de configuración SGD tiene la estructura y los valores predeterminados siguientes:

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

Control del proceso de entrenamiento

  • trainCriterionNodeName: el nombre del nodo de criterio de entrenamiento. Si no se proporciona el nodo de criterio de entrenamiento predeterminado en la red se usará.

  • evalCriterionNodeName: el nombre del nodo criterio de evaluación. Si no se proporciona el nodo de criterio de evaluación predeterminado en la red se usará.

  • epochSize: haga clic aquí para obtener información sobre epochSize.

  • keepCheckPointFiles: si desea mantener el archivo de punto de comprobación después de que se inicie una nueva época. Los valores válidos son true y false (predeterminado).

  • disableWkInBatchNormal: si se debe habilitar el término de degradación del peso de la normalización por lotes mientras se actualiza SGD. Los valores válidos son true y false (predeterminado).

  • maxEpochs: número máximo de épocas que se van a ejecutar.

  • minibatchSize: haga clic aquí para obtener información sobre minibatchSize.

  • dropoutRate: tasa de deserción durante el procedimiento de entrenamiento. El valor predeterminado es 0.0. Puede usar sintaxis como 0,5*10:0,2, lo que significa usar la tasa de eliminación 0,5 para 10 épocas y, a continuación, 0,2 para el resto.

  • maxTempMemSizeInSamplesForCNN: memoria temporal máxima usada (en número de muestras) al empaquetar y desempaquetar características de entrada. El valor predeterminado es 0, lo que significa usar cualquier valor según sea necesario. Resulta útil para controlar la impresión de pie de memoria esp. cuando se ejecuta en GPU.

  • saveBestModelPerCriterion: opción para guardar el mejor modelo para cada criterio medido en los datos de validación cruzada. Cuando el entrenamiento finaliza los modelos se denominan <modelName>_<criterionName>. Los valores válidos son true y false (predeterminado).

Learning control de velocidad e impulso

Tenga en cuenta CNTK manera de especificar las tasas de aprendizaje y el impulso difieren de otros kits de herramientas. Consulte aquí para obtener una descripción detallada.

  • learningRatesPerSample: las tasas de aprendizaje por época con las que el degradado de cada muestra actualiza el modelo. Puede usar valores diferentes para diferentes épocas, por ejemplo, 0,025*10:0,00625 significa usar la velocidad de aprendizaje 0,025 para las primeras 10 épocas y, después, 0,00625 para el resto. Esta es la manera preferida de especificar en CNTK, ya que especifica las tasas de aprendizaje independientes del tamaño de minibatch, que es importante cuando se usa el ajuste de tamaño automático de minibatch. Otros kits de herramientas suelen especificar tasas de aprendizaje de forma media. Para realizar la conversión de esa notación, use la velocidad de aprendizaje por muestra = velocidad de aprendizaje por MB / minibatchSize (consulte aquí para obtener más detalles).

  • learningRatesPerMB: forma alternativa de especificar las tasas de aprendizaje que se aplicarán al promedio de muestras en el minibatch. Esta es la forma más común de especificar velocidades de aprendizaje en otros kits de herramientas, pero es problemática en CNTK donde el entrenamiento en paralelo de datos, que modifica el tamaño del minibatch. Internamente, esto se convertirá en learningRatesPerSample dividiendo los valores por el especificado "minibatchSize". Mutuamente excluyente con learningRatesPerSample.

  • minLearningRatePerSample: velocidad de aprendizaje mínima por muestra. Cuando la velocidad de aprendizaje por muestra es menor que este valor, el proceso de entrenamiento finalizará. Esto se usa a menudo para controlar la detención temprana cuando se habilita el ajuste automático de velocidad de aprendizaje. El valor predeterminado es 1e-9.

  • momentumAsTimeConstant: de forma similar a learningratesPerSample, CNTK especifica el impulso de una forma independiente del tamaño de minibatch como la constante de tiempo (en muestras) de un filtro IIR de ganancia unitaria 1. El valor especifica el número de muestras después de las cuales un degradado tiene un efecto de 1/e=37%. Otros kits de herramientas suelen especificar impulso como peso por minibatch (por ejemplo, 0,9). Para realizar la conversión de , use momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB). Puede usar la sintaxis como 20000*10:2500, lo que significa usar la constante de tiempo de impulso 20000 para 10 épocas y, a continuación, 2500 para el resto.

  • momentumPerMB: esta forma alternativa de especificar el impulso imita el comportamiento de los kits de herramientas comunes. Por ejemplo, especificar 0,9 significa que el degradado anterior se conservará con un peso de 0,9. Sin embargo, tenga en cuenta que, a diferencia de otros kits de herramientas, CNTK sigue usando un filtro de ganancia de unidad, es decir, el nuevo degradado se multiplicará con (1-momentumPerMB). Internamente, esto se convertirá en momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB).

  • autoAdjust: contiene la información relacionada con el control de velocidad de aprendizaje automático. El valor predeterminado está vacío (""), lo que significa que no hay ningún control de velocidad de aprendizaje automático. Dentro del bloque, puede haber valores siguientes:

    • autoAdjustLR: el algoritmo de ajuste de velocidad de aprendizaje automático que se va a usar. Los valores válidos son None (valor predeterminado, no ajustar automáticamente la velocidad de aprendizaje), AdjustAfterEpoch (compruebe el criterio de entrenamiento después de cada época mediante el conjunto de desarrollo del conjunto de entrenamiento y decida si ajustar la velocidad de aprendizaje) y SearchBeforeEpoch (busque la velocidad de aprendizaje en función de una pequeña parte del conjunto de entrenamiento antes de que comience cada época).

    • Cuando se usa en el AdjustAfterEpoch modo :

      • reduceLearnRateIfImproveLessThan: reduce la velocidad de aprendizaje si la mejora es menor que este valor. El valor predeterminado es 0.
      • learnRateDecreaseFactor: factor de disminución de velocidad de aprendizaje. El valor predeterminado es 0.618.
      • increaseLearnRateIfImproveMoreThan: aumenta la velocidad de aprendizaje si la mejora es mayor que este valor. El valor predeterminado es 1#INF (infinito), lo que significa que nunca aumenta.
      • learnRateIncreaseFactor: factor de aumento de velocidad de aprendizaje. El valor predeterminado es 1.382.
      • loadBestModel: si se carga el mejor modelo si el modelo actual disminuye el rendimiento. Los valores válidos son true (predeterminado) y false.
      • learnRateAdjustInterval: determina la frecuencia de aplicación de la comprobación de ajuste de velocidad de aprendizaje. El valor predeterminado es 1 la época. Si este valor se establece en un valor mayor que 1, el ajuste de velocidad de aprendizaje se basará en el criterio medio calculado a partir de las últimas learnRateAdjustInterval épocas.
      • useEvalCriterionControlLR: use el criterio de evaluación en lugar del criterio de entrenamiento para controlar la velocidad de aprendizaje. De forma predeterminada, es "false".
    • Cuando se usa en el SearchBeforeEpoch modo .

      • numMiniBatch4LRSearch: el número de minibaches usados para buscar la velocidad de aprendizaje. El valor predeterminado es 500. Normalmente se establece en 10-20% de los minibatos totales en una época.
      • numPrevLearnRate: número de tasas de aprendizaje anteriores usadas como sugerencia para el intervalo de búsqueda. El valor predeterminado es 5.
      • numBestSearchEpoch: número de épocas en las que usamos la mejor velocidad de aprendizaje en lugar de la tasa de aprendizaje suficiente. El valor predeterminado es 1.
    • Cuando se usa en el modo "AdaptiveMinibatchSizing".

      • numMiniBatch4LRSearch: el número de minibaches usados para buscar el tamaño del minibatch cuando se encuentra en modo de tamaño de minibatch adaptable. El valor predeterminado es 500. Normalmente, se establece en un 10-20 % del total de minibaches en una época que se comparte con la búsqueda de velocidad de aprendizaje en SearchBeforeEpoch modo.
      • autoAdjustMinibatch: habilita o deshabilita si el tamaño de minibatch se ajusta de forma adaptable. El valor predeterminado es false. El ajuste de tamaño de minibatch adaptable comenzará en épocas que comienzan después de que se completen los tamaños de minibatch del usuario especificados explícitamente. Por ejemplo, si el usuario especificó minibatchSize=256:1024, se usan 256 y 1024 en las primeras 2 épocas y el ajuste de tamaño de minibatch adaptable se usa después.
      • minibatchSizeTuningFrequency: el número de épocas que se omitirán, de forma periódica, antes de ajustar dinámicamente el tamaño del minibatch. El valor predeterminado es 1.
      • minibatchSizeTuningMax: tamaño máximo permitido para un tamaño de minibatch ajustado de forma adaptable. El valor predeterminado es 1048576.

Control degradado

  • gradientClippingWithTruncation: si se debe usar el recorte de degradado basado en truncamiento para controlar la explosión del degradado. Los valores válidos son true (predeterminado) y false. Si es false, se usará el recorte basado en normas en su lugar, que es más caro.

  • clippingThresholdPerSample: umbral de recorte para cada muestra. El valor predeterminado es 1#INF que significa infinito (es decir, el recorte está desactivado).

  • L2RegWeight (valor predeterminado 0): el peso de regularización L2 por muestra. La norma Frobenius del parámetro aprendiz se agrega al objetivo con este peso. Esto se especifica por muestra, lo que significa que la norma Frobenius se multiplica por el número de muestras en el minibatch.

  • L1RegWeight (valor predeterminado 0): el peso de regularización L1 por muestra.

  • gradUpdateType: tipo de actualización de degradado. Los valores válidos son None (valor predeterminado, ningún tratamiento especial para el degradado), AdaGrady RmsProp.

    • Cuando gradUpdateType es igual a AdaGrad o RmsProp, puede controlar el comportamiento de la actualización de degradado mediante los parámetros siguientes:
      • normWithAveMultiplier: normaliza el degradado con los multiplicadores promedio aplicados a los degradados por el algoritmo AdaGrad/RmsProp. El valor predeterminado es true (valor predeterminado).
    • Cuando gradUpdateType es igual a RmsProp, puede controlar el comportamiento de la actualización de degradado mediante los parámetros siguientes:
      • rms_wgt_inc: incremento multiplicativo de la escala de velocidad de aprendizaje. El valor predeterminado es 1.2.
      • rms_wgt_dec: disminución multiplicativa de la escala de velocidad de aprendizaje. El valor predeterminado es 0.75.
      • rms_wgt_max: se permite la escala de velocidad de aprendizaje máxima. Un valor más cercano a 1 hace que el ajuste de la velocidad de aprendizaje sea más estable pero más lento. El valor predeterminado es 10.
      • rms_wgt_min: se permite la escala de velocidad de aprendizaje mínima. Un valor más cercano a 1 hace que el ajuste de la velocidad de aprendizaje sea más estable pero más lento. El valor predeterminado es 0.1.
      • rms_gamma: factor de suavizado utilizado para calcular la media móvil de la varianza. Cuanto menor sea el valor, más rápido olvidará la información pasada. El valor predeterminado es 0.99.
  • gaussianNoiseInjectStd: desviación estándar del ruido gaussiano agregado al usar el AdaGrad enfoque. El valor predeterminado es 0.

Visualización de información

  • traceLevel: nivel de seguimiento para decidir qué información se va a imprimir en stderr. Los valores válidos son 0 (predeterminado) y 1.

  • numMBsToShowResult: muestra las estadísticas de entrenamiento después de cuántas minibatches. El valor predeterminado es 10.

TensorBoard

  • tensorBoardNumMBsToLogResult: número de minibatches entre los resultados de registro en TensorBoard.

Comprobación de degradado

  • gradientCheck: determina si se va a usar el comprobador de degradado. El valor predeterminado es false. Al usar el comprobador de degradado, debe usar un tamaño de minibatch que sea mayor que la longitud de la secuencia para RNN debido al algoritmo backpropagation truncado a través del tiempo (BPTT) que se usa para entrenar RNN y una velocidad de aprendizaje menor para evitar problemas numéricos causados por la divergencia. Además, la precisión debe establecerse en double.

Descripción

El comportamiento del algoritmo SGD (Aprendiz de descenso de degradado estocástico) se controla mediante el bloque SGD de las opciones. Cuando se omite una opción, se asume el valor predeterminado.

Los parámetros que no se especifican explícitamente se dejan a los valores predeterminados.

Especificación de tamaños de datos

Conversión de parámetros de velocidad Learning e impulso de otros kits de herramientas

CNTK fórmulas de actualización de modelos difieren un poco de otros kits de herramientas y de la literatura, en que en CNTK, los parámetros se especifican de una manera independiente del tamaño de minibatch. Esto es importante en el contexto del entrenamiento paralelo de datos, donde CNTK puede modificar el tamaño de minibatch. La especificación de la velocidad de aprendizaje y el impulso de una manera independiente evita complejidades de ajustar estos valores en función de los cambios de tamaño de minibatch.

Estas son las fórmulas de actualización de modelos de CNTK para SGD con 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)

con

  • G(t): degradado suavizado de impulso después t de muestras
  • g(t'): degradado sin procesar de la muestra en el momento t'
  • M(t): modelo usado después de ver t ejemplos.
  • t incremento en pasos de minibatchSize

(Nota: Cuando se usan secuencias de longitud variable, minibathSize fluctúa ligeramente, ya que las longitudes de secuencia en un minibatch generalmente no se suman precisamente al objeto solicitado minibathSize).

Observe lo siguiente:

  • El filtro G(t) de impulso es de ganancia unitaria. El degradado de cada muestra se distribuye con el tiempo de forma que su suma sea 1.
  • La velocidad de aprendizaje se especifica por muestra, en lugar de w.r.t. un promedio de muestras.

La especificación utilizada en otros kits de herramientas y documentación sobre redes neuronales suele ser la siguiente:

G'(t) = average { g(t-minibatchSize+1) ... g(t) } + mu * G'(t-minibatchSize)
M(t) = M(t-minibatchSize) + eta G'(t)

con

  • G': degradado definido en la forma alternativa como promedio por minibatch y sin (1-mu)
  • mu: parámetro de impulso, por ejemplo, 0,9, de un filtro IIR que no es de ganancia unitaria , aplicado por minibatch
  • eta: velocidad de aprendizaje con degradado medio de minibatch

Los parámetros especificados de esta manera se pueden asignar a CNTK parámetros mediante estas fórmulas:

learningRatePerSample = eta / minibatchSize / (1-mu)
momentumAsTimeConstant = -minibatchSize / ln (mu)

Se acercará a esto mediante learningRatePerMB y momentumPerMB, que se asignan de la siguiente manera (observe la ausencia de / (1-mu) para learningRatePerSample:

learningRatePerSample = learningRatePerMB / minibatchSize
momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)

Ejemplo

Configuración usada por el tutorial imageHandsOn con paralelismo de datos y escalado automático 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
    }
}