Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le bloc de configuration SGD contrôle le comportement de l’algorithme SGD (descente de dégradé stochastique) dans CNTK. Si vous êtes familiarisé avec d’autres boîtes à outils, veillez à consulter
- Comment la taille minibatch définie dans CNTK
- Définition de la taille de l’époque dans CNTK
- Comment convertir des paramètres de taux d’apprentissage et d’élan à partir d’autres boîtes à outils ?
Le bloc de configuration SGD a la structure et les valeurs par défaut suivantes :
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
}
Paramètres
Contrôle du processus d’entraînement
trainCriterionNodeName: nom du nœud de critère d’entraînement. Si aucun nœud de critère d’apprentissage par défaut n’est fourni dans le réseau, il est utilisé.evalCriterionNodeName: nom du nœud du critère d’évaluation. Si aucun nœud de critère d’évaluation par défaut n’est fourni dans le réseau, il sera utilisé.keepCheckPointFiles: indique si vous souhaitez conserver le fichier de point de contrôle après le début d’une nouvelle époque. Les valeurs valides sonttrueetfalse(valeur par défaut).disableWkInBatchNormal: indique s’il faut activer le terme de désintégration de poids de la normalisation par lots pendant les mises à jour SGD. Les valeurs valides sonttrueetfalse(valeur par défaut).maxEpochs: nombre maximal d’époques à exécuter.minibatchSize: cliquez ici pour en savoir plus sur minibatchSizedropoutRate: taux d’abandon pendant la procédure d’entraînement. La valeur par défaut est0.0. Peut utiliser une syntaxe telle que 0,5*10:0.2, ce qui signifie utiliser le taux d’abandon 0,5 pour 10 époques, puis 0,2 pour le reste.maxTempMemSizeInSamplesForCNN: mémoire temporaire maximale utilisée (en nombre d’échantillons) lors de l’empaquetage et de la décompression des fonctionnalités d’entrée. La valeur par défaut est 0, ce qui signifie utiliser n’importe quelle valeur si nécessaire. Utile pour contrôler l’esp d’impression de pied de mémoire. Lors de l’exécution sous GPU.saveBestModelPerCriterion: option permettant d’enregistrer le meilleur modèle pour chaque critère, tel qu’il est mesuré sur les données de validation croisée. Lorsque l’entraînement met fin aux modèles sont nommés<modelName>_<criterionName>. Les valeurs valides sonttrueetfalse(valeur par défaut).
taux de Learning et contrôle de l’élan
Notez CNTK méthode de spécification des taux d’apprentissage et de l’élan diffère des autres boîtes à outils. Consultez cette page pour obtenir une description détaillée.
learningRatesPerSample: taux d’apprentissage par époque avec lequel le dégradé de chaque échantillon met à jour le modèle. Vous pouvez utiliser différentes valeurs pour différentes époques, par exemple 0,025*10:0.00625 signifie utiliser le taux d’apprentissage 0,025 pour les 10 premières époques, puis 0,00625 pour le reste. Il s’agit du moyen préféré de spécifier dans CNTK, car il spécifie les taux d’apprentissage indépendants de la taille minibatch, ce qui est important lorsque le dimensionnement automatique de minibatch est utilisé. D’autres boîtes à outils spécifient souvent des taux d’apprentissage de manière minibatch-moyenne. Pour effectuer une conversion à partir de cette notation, utilisez le taux d’apprentissage par échantillon = taux d’apprentissage par Mo /minibatchSize(voir ici pour plus d’informations).learningRatesPerMB: autre méthode de spécification des taux d’apprentissage à appliquer à la moyenne sur les échantillons dans le minibatch. Il s’agit du moyen le plus courant de spécifier des taux d’apprentissage dans d’autres boîtes à outils, mais il est problématique dans CNTK’s où l’entraînement en parallèle des données, qui modifie la taille de minibatch. En interne, cela sera converti enlearningRatesPerSampledivisant les valeurs par le « minibatchSize » spécifié. S’exclue mutuellement aveclearningRatesPerSample.minLearningRatePerSample: taux d’apprentissage minimal par échantillon. Lorsque le taux d’apprentissage par échantillon est inférieur à cette valeur, le processus d’entraînement se termine. Cela est souvent utilisé pour contrôler l’arrêt précoce lorsque l’ajustement automatique du taux d’apprentissage est activé. La valeur par défaut est 1e-9.momentumAsTimeConstant: de la même façonlearningratesPerSampleque , CNTK spécifie l’élan d’une manière indépendante de la taille minibatch comme constante de temps (dans les échantillons) d’un filtre IIR de gain d’unité. La valeur spécifie le nombre d’échantillons après lesquels un dégradé a un effet de 1/e=37 %. D’autres boîtes à outils spécifient souvent l’élan comme poids par minibatch (par exemple, 0,9). Pour convertir à partir de cela, utilisezmomentumAsTimeConstant = -minibatchSize / ln (momentumPerMB). Vous pouvez utiliser une syntaxe telle que 20000*10:2500, ce qui signifie utiliser la constante de temps dynamique 20000 pour 10 époques, puis 2500 pour le reste.momentumPerMB: cette autre façon de spécifier l’élan imite le comportement des boîtes à outils courantes. Par exemple, spécifier 0,9 signifie que le dégradé précédent sera conservé avec un poids de 0,9. Notez toutefois que, contrairement à d’autres boîtes à outils, CNTK utilise toujours un filtre de gain unitaire, c’est-à-dire que le nouveau dégradé sera multiplié par(1-momentumPerMB). En interne, cela sera converti enmomentumAsTimeConstant = -minibatchSize / ln (momentumPerMB).autoAdjust: contient les informations relatives au contrôle automatique du taux d’apprentissage. La valeur par défaut est vide ( » « ) ce qui signifie qu’aucun contrôle automatique du taux d’apprentissage. À l’intérieur du bloc, il peut y avoir les valeurs suivantes :autoAdjustLR: algorithme d’ajustement automatique du taux d’apprentissage à utiliser. Les valeurs valides sontNone(par défaut, ne pas ajuster automatiquement le taux d’apprentissage)AdjustAfterEpoch(vérifiez le critère d’entraînement après chaque époque à l’aide du jeu de développement du jeu d’entraînement et décidez s’il faut ajuster le taux d’apprentissage) etSearchBeforeEpoch(recherchez le taux d’apprentissage en fonction d’une petite partie du jeu d’entraînement avant chaque époque).Lorsqu’il est
AdjustAfterEpochutilisé en mode :reduceLearnRateIfImproveLessThan: réduisez le taux d’apprentissage si l’amélioration est inférieure à cette valeur. La valeur par défaut est0.learnRateDecreaseFactor: facteur de diminution du taux d’apprentissage. La valeur par défaut est0.618.increaseLearnRateIfImproveMoreThan: augmentez le taux d’apprentissage si l’amélioration est supérieure à cette valeur. La valeur par défaut est1#INF(infini), ce qui signifie ne jamais augmenter.learnRateIncreaseFactor: facteur d’augmentation du taux d’apprentissage. La valeur par défaut est1.382.loadBestModel: indique s’il faut charger le meilleur modèle si le modèle actuel diminue les performances. Les valeurs valides sonttrue(valeur par défaut) etfalse.learnRateAdjustInterval: déterminer la fréquence d’application du contrôle d’ajustement du taux d’apprentissage. La valeur par défaut est l’époque1. Si cette valeur est définie sur une valeur supérieure à 1, l’ajustement du taux d’apprentissage est basé sur le critère moyen calculé à partir des dernièreslearnRateAdjustIntervalépoques.useEvalCriterionControlLR: utilisez le critère d’évaluation au lieu du critère d’apprentissage pour contrôler le taux d’apprentissage. La valeur par défaut est false.
Lorsqu’il est
SearchBeforeEpochutilisé en mode.numMiniBatch4LRSearch: nombre de minibatches utilisés pour rechercher le taux d’apprentissage. La valeur par défaut est500. Il est généralement défini sur 10-20% du nombre total de minibatches dans une époque.numPrevLearnRate: nombre de taux d’apprentissage précédents utilisés comme indicateur de la plage de recherche. La valeur par défaut est5.numBestSearchEpoch: nombre d’époques dans lesquelles nous utilisons le meilleur taux d’apprentissage au lieu du taux d’apprentissage suffisant. La valeur par défaut est1.
Lorsqu’il est utilisé en mode « AdaptiveMinibatchSizing ».
numMiniBatch4LRSearch: nombre de minibatches utilisés pour rechercher la taille de minibatch en mode de taille de minibatch adaptatif. La valeur par défaut est500. Il est généralement défini sur 10 à 20 % du nombre total de minibatches dans une époque qui est partagée avec la recherche du taux d’apprentissage enSearchBeforeEpochmode.autoAdjustMinibatch: activer ou désactiver si la taille de minibatch est ajustée de manière adaptative. La valeur par défaut estfalse. Le dimensionnement de minibatch adaptatif commence sur les époques commençant après que les tailles de minibatch utilisateur spécifiées explicitement sont terminées. Par exemple, si l’utilisateur a spécifié minibatchSize=256:1024, alors 256 et 1024 sont utilisés dans les 2 premières époques et le dimensionnement adaptatif de minibatch est utilisé par la suite.minibatchSizeTuningFrequency: nombre d’époques à ignorer, périodiquement, avant d’ajuster dynamiquement la taille du minibatch. La valeur par défaut est1.minibatchSizeTuningMax: taille maximale autorisée pour une taille minibatch ajustée de manière adaptative. La valeur par défaut est1048576.
Contrôle dégradé
gradientClippingWithTruncation: indique s’il faut utiliser le découpage de dégradé basé sur la troncation pour contrôler l’explosion du dégradé. Les valeurs valides sonttrue(valeur par défaut) etfalse. S’il est faux, le découpage basé sur la norme sera utilisé à la place, ce qui est plus coûteux.clippingThresholdPerSample: seuil de découpage pour chaque exemple. La valeur par défaut signifie1#INFl’infini (c’est-à-dire la coupure est désactivée).L2RegWeight(valeur par défaut 0) : poids de la normalisation L2 par échantillon. La norme Frobenius du paramètre apprenant est ajoutée à l’objectif avec ce poids. Cela est spécifié par échantillon, ce qui signifie que la norme Frobenius est multipliée par le nombre d’échantillons dans le minibatch.L1RegWeight(valeur par défaut 0) : poids de la normalisation L1 par échantillon.gradUpdateType: type de mise à jour de dégradé. Les valeurs valides sontNone(par défaut, aucun traitement spécial au dégradé),AdaGradetRmsProp.- En cas
gradUpdateTyped’égalité ouRmsProp, vous pouvez contrôler le comportement de la mise à jour de dégradé àAdaGradl’aide des paramètres suivants :normWithAveMultiplier: normalisez le dégradé avec les multiplicateurs moyens appliqués aux dégradés par l’algorithme AdaGrad/RmsProp. La valeur par défaut esttrue(par défaut).
- Quand
gradUpdateTypeelle est égale à , vous pouvez contrôler le comportement de la mise à jour de dégradé àRmsPropl’aide des paramètres suivants :rms_wgt_inc: incrément multiplicative de l’échelle du taux d’apprentissage. La valeur par défaut est1.2.rms_wgt_dec: décrémentation multipliée de l’échelle du taux d’apprentissage. La valeur par défaut est0.75.rms_wgt_max: échelle maximale du taux d’apprentissage autorisée. Une valeur plus proche de 1 rend l’ajustement du taux d’apprentissage plus stable mais plus lent. La valeur par défaut est10.rms_wgt_min: échelle minimale du taux d’apprentissage autorisée. Une valeur plus proche de 1 rend l’ajustement du taux d’apprentissage plus stable mais plus lent. La valeur par défaut est0.1.rms_gamma: facteur de lissage utilisé pour estimer la moyenne mobile de la variance. Plus la valeur est réduite, plus elle oublie les informations passées. La valeur par défaut est0.99.
- En cas
gaussianNoiseInjectStd: écart type du bruit gaussien ajouté lors de l’utilisation de l’approcheAdaGrad. La valeur par défaut est0.
Affichage des informations
traceLevel: niveau de trace pour décider quelles informations imprimer dans le stderr. Les valeurs valides sont0(valeur par défaut) et1.numMBsToShowResult: affiche les statistiques d’entraînement après le nombre de minibatches. La valeur par défaut est10.
TensorBoard
tensorBoardNumMBsToLogResult: nombre de minibatches entre les résultats de journalisation dans TensorBoard.
Vérification de dégradé
gradientCheck: détermine s’il faut utiliser le vérificateur de dégradé. La valeur par défaut estfalse. Lorsque vous utilisez le vérificateur de dégradé, vous devez utiliser une taille minibatch supérieure à la longueur de séquence pour les rnns en raison de l’algorithme backpropagation tronqué par le temps (BPTT) utilisé pour entraîner les RNN, et un taux d’apprentissage plus petit pour empêcher les problèmes numériques causés par la divergence. En outre, la précision doit être définie sur double.
Description
Le comportement de l’algorithme SGD (Apprenant de descente de dégradé stochastique) est contrôlé par le bloc SGD des options. Lorsqu’une option est omise, la valeur par défaut est supposée.
Les paramètres qui ne sont pas spécifiés explicitement sont laissés aux valeurs par défaut.
Spécification des tailles de données
Conversion de paramètres Learning-rate et Momentum à partir d’autres toolkits
CNTK la formule de mise à jour du modèle diffère un peu de certaines autres boîtes à outils et de la littérature, dans cette CNTK, les paramètres sont spécifiés d’une manière qui est agnostique de la taille minibatch. Il est important dans le contexte de l’apprentissage parallèle des données, où CNTK peut modifier la taille du minibatch. La spécification du taux d’apprentissage et de l’élan de manière agnostique évite les complexités de l’ajustement de ces valeurs sur les changements de taille minibatch.
Il s’agit de la formule de mise à jour de modèle de CNTK pour SGD avec un élan :
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)
par
G(t): dégradé lisse à l’élan aprèstdes échantillonsg(t'): dégradé brut d’échantillon au momentt'M(t): modèle utilisé après avoir vutdes exemples.tincrémentation dans les étapes deminibatchSize
(Remarque : Lors de l’utilisation de séquences de longueur variable, varie légèrement, minibathSize car les longueurs de séquence dans un minibatch ne se résument généralement pas précisément à la demande minibathSize.)
Vous remarquez :
- Le filtre
G(t)d’élan est un gain unitaire. Chaque dégradé de chaque échantillon est distribué au fil du temps de sorte que leur somme soit 1. - Le taux d’apprentissage est spécifié par échantillon, plutôt que w.r.t. une moyenne par rapport aux échantillons.
La spécification utilisée dans d’autres boîtes à outils et la littérature de réseau neuronal sont souvent les suivantes :
G'(t) = average { g(t-minibatchSize+1) ... g(t) } + mu * G'(t-minibatchSize)
M(t) = M(t-minibatchSize) + eta G'(t)
par
G': dégradé défini de la manière alternative comme moyenne par minibatch et sans(1-mu)mu: paramètre d’élan, par exemple 0,9, d’un filtre IIR non unitaire , appliqué par minibatcheta: taux d’apprentissage avec dégradé moyen minibatch
Les paramètres spécifiés de cette façon peuvent être mappés aux paramètres CNTK à l’aide de ces formules :
learningRatePerSample = eta / minibatchSize / (1-mu)
momentumAsTimeConstant = -minibatchSize / ln (mu)
Vous serez proche de cela à l’aide learningRatePerMB et momentumPerMB, qui sont mappés comme suit (notez l’absence de / (1-mu) :learningRatePerSample
learningRatePerSample = learningRatePerMB / minibatchSize
momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
Exemple
Configuration utilisée par le didacticiel ImageHandsOn avec le parallélisme des données et la mise à l’échelle automatique 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
}
}