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
- ¿Cómo se define el tamaño del minibatch en CNTK
- ¿Cómo se define el tamaño de época en CNTK
- ¿Cómo convertir los parámetros de velocidad de aprendizaje e impulso de otros kits de herramientas?
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 sontrue
yfalse
(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 sontrue
yfalse
(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 es0.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 sontrue
yfalse
(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á enlearningRatesPerSample
dividiendo los valores por el especificado "minibatchSize". Mutuamente excluyente conlearningRatesPerSample
.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 alearningratesPerSample
, 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 , usemomentumAsTimeConstant = -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á enmomentumAsTimeConstant = -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 sonNone
(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) ySearchBeforeEpoch
(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 es0
.learnRateDecreaseFactor
: factor de disminución de velocidad de aprendizaje. El valor predeterminado es0.618
.increaseLearnRateIfImproveMoreThan
: aumenta la velocidad de aprendizaje si la mejora es mayor que este valor. El valor predeterminado es1#INF
(infinito), lo que significa que nunca aumenta.learnRateIncreaseFactor
: factor de aumento de velocidad de aprendizaje. El valor predeterminado es1.382
.loadBestModel
: si se carga el mejor modelo si el modelo actual disminuye el rendimiento. Los valores válidos sontrue
(predeterminado) yfalse
.learnRateAdjustInterval
: determina la frecuencia de aplicación de la comprobación de ajuste de velocidad de aprendizaje. El valor predeterminado es1
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 últimaslearnRateAdjustInterval
é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 es500
. 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 es5
.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 es1
.
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 es500
. 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 enSearchBeforeEpoch
modo.autoAdjustMinibatch
: habilita o deshabilita si el tamaño de minibatch se ajusta de forma adaptable. El valor predeterminado esfalse
. 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 es1
.minibatchSizeTuningMax
: tamaño máximo permitido para un tamaño de minibatch ajustado de forma adaptable. El valor predeterminado es1048576
.
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 sontrue
(predeterminado) yfalse
. 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 es1#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 sonNone
(valor predeterminado, ningún tratamiento especial para el degradado),AdaGrad
yRmsProp
.- Cuando
gradUpdateType
es igual aAdaGrad
oRmsProp
, 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 estrue
(valor predeterminado).
- Cuando
gradUpdateType
es igual aRmsProp
, 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 es1.2
.rms_wgt_dec
: disminución multiplicativa de la escala de velocidad de aprendizaje. El valor predeterminado es0.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 es10
.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 es0.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 es0.99
.
- Cuando
gaussianNoiseInjectStd
: desviación estándar del ruido gaussiano agregado al usar elAdaGrad
enfoque. El valor predeterminado es0
.
Visualización de información
traceLevel
: nivel de seguimiento para decidir qué información se va a imprimir en stderr. Los valores válidos son0
(predeterminado) y1
.numMBsToShowResult
: muestra las estadísticas de entrenamiento después de cuántas minibatches. El valor predeterminado es10
.
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 esfalse
. 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ést
de muestrasg(t')
: degradado sin procesar de la muestra en el momentot'
M(t)
: modelo usado después de vert
ejemplos.t
incremento en pasos deminibatchSize
(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 minibatcheta
: 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
}
}