Freigeben über


BrainScript SGD-Block

Der SGD-Konfigurationsblock steuert das Verhalten des SGD -Algorithmus (Stochastic Gradient Descent) in CNTK. Wenn Sie mit anderen Toolkits vertraut sind, sollten Sie sich unbedingt auschecken.

Der SGD-Konfigurationsblock weist die folgende Struktur und Standardwerte auf:

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
}

Parameter

Schulungsprozesssteuerung

  • trainCriterionNodeName: der Name des Schulungskriteriumsknotens. Wenn nicht der Standardschulungskriteriumknoten im Netzwerk verwendet wird.

  • evalCriterionNodeName: der Name des Bewertungskriteriumsknotens. Wenn nicht der Standardbewertungskriteriumknoten im Netzwerk verwendet wird.

  • epochSize: Klicken Sie hier, um mehr über die EpocheNgröße zu erfahren.

  • keepCheckPointFiles: ob Sie die Häkchendatei nach Beginn einer neuen Epoche beibehalten möchten. Gültige Werte sind true und false (Standard).

  • disableWkInBatchNormal: ob der Gewichtsverwesungsbegriff der Batch normalisierung während der SGD-Updates aktiviert werden soll. Gültige Werte sind true und false (Standard).

  • maxEpochs: maximale Anzahl der zu ausführenden Epochen.

  • minibatchSize: Klicken Sie hier, um mehr über minibatchSize zu erfahren

  • dropoutRate: Abbruchrate während des Schulungsvorgangs. Der Standardwert ist 0.0. Kann Syntax wie 0,5*10:0.2 verwenden, was bedeutet, dass die Dropoutrate 0,5 für 10 Epochen und dann 0,2 für den Rest verwendet wird.

  • maxTempMemSizeInSamplesForCNN: Maximale temporäre Speicherverwendung (in Anzahl von Beispielen) beim Verpacken und Entpacken von Eingabefeatures. Standard ist 0, was bedeutet, dass jeder Wert nach Bedarf verwendet wird. Nützlich zum Steuern des Speicherfußdrucks esp. Beim Ausführen unter GPU.

  • saveBestModelPerCriterion: Option, das beste Modell für jedes Kriterium zu speichern, das bei Kreuzüberprüfungsdaten gemessen wird. Wenn Schulungen enden, werden Modelle benannt <modelName>_<criterionName>. Gültige Werte sind true und false (Standard).

Learning Rate- und Dynamiksteuerung

Beachten Sie, dass CNTK Die Möglichkeit der Angabe von Lernraten und Dynamik von anderen Toolkits unterscheidet. Hier finden Sie eine detaillierte Beschreibung.

  • learningRatesPerSample: die Lernraten pro Epoche, mit denen der Farbverlauf jedes Beispiels das Modell aktualisiert. Sie können verschiedene Werte für verschiedene Epochen verwenden, z. B. 0.025*10:0.00625 bedeutet, dass die Lernrate 0,025 für die ersten 10 Epochen und dann 0,00625 für den Rest verwendet wird. Dies ist die bevorzugte Methode zum Angeben in CNTK, da sie die Lernraten agnostisch an die Minibatchgröße angibt, die beim Einsatz der automatischen Minibatch-Größe wichtig ist. Andere Toolkits geben häufig Lernraten in einer Minibatch-averaging-Mode an. Um diese Notation zu konvertieren, verwenden Sie die Lernrate pro Beispiel = Lernrate pro MB / minibatchSize (siehe hier , weitere Details).

  • learningRatesPerMB: alternative Methode zum Angeben von Lernraten , die auf den Durchschnitt der Proben im Minibatch angewendet werden sollen. Dies ist die am häufigsten verwendete Methode zum Angeben von Lernraten in anderen Toolkits, ist aber in CNTK problematisch, wo daten parallele Schulung, die die Minibatchgröße ändert. Intern wird dies konvertiert, indem die Werte durch die angegebene "minibatchSize" unterteilt werden learningRatesPerSample . Gegenseitig ausschließen mit learningRatesPerSample.

  • minLearningRatePerSample: Minimale Lernrate pro Beispiel. Wenn die Lernrate pro Beispiel kleiner ist als dieser Wert, wird der Schulungsvorgang beendet. Dies wird häufig verwendet, um den frühen Stopp zu steuern, wenn die automatische Anpassung der Lernrate aktiviert ist. Standard ist 1e-9.

  • momentumAsTimeConstant: ähnlich learningratesPerSamplewie , CNTK gibt Schwung in einer Minibatch-Größe agnostische Weise als Zeitkonstante (in Beispielen) eines 1st-Order IIR-Filters an. Der Wert gibt die Anzahl der Beispiele an, nach denen ein Farbverlauf einen Effekt von 1/e=37 % hat. Andere Toolkits geben häufig Schwung als Pro-Minibatch-Gewicht (z. B. 0,9) an. Um von diesem Zu konvertieren, verwenden Sie momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB). Sie können Syntax wie 20000*10:2500 verwenden, was bedeutet, dass die Momentzeitkonstante 2000 für 10 Epochen und dann 2500 für den Rest verwendet wird.

  • momentumPerMB: diese alternative Methode zum Angeben von Dynamik imitiert das Verhalten gemeinsamer Toolkits. Die Angabe von 0,9 bedeutet z. B., dass der vorherige Farbverlauf mit einer Gewichtung von 0,9 beibehalten wird. Beachten Sie jedoch, dass CNTK im Gegensatz zu einigen anderen Toolkits weiterhin einen Einheitsgewinnfilter verwendet, d. h. der neue Farbverlauf wird mit (1-momentumPerMB)multipliziert. Intern wird dies in momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)konvertiert.

  • autoAdjust: enthält die Informationen im Zusammenhang mit dem automatischen Lernrate-Steuerelement. Standardwert ist leer ("") und bedeutet kein automatisches Lernrate-Steuerelement. Innerhalb des Blocks können folgende Werte vorhanden sein:

    • autoAdjustLR: der zu verwendende Algorithmus zur automatischen Anpassung der Lernrate. Gültige Werte sind None (Standard, nicht automatisch anpassen Lernrate), AdjustAfterEpoch (überprüfen Sie das Schulungskriterium nach jeder Epoche, indem Sie den Entwicklungssatz des Schulungssatzes verwenden und entscheiden, ob sie die Lernrate anpassen möchten), und SearchBeforeEpoch (durchsuchen Sie die Lernrate basierend auf einem kleinen Teil des Schulungssatzes, bevor jede Epoche beginnt).

    • Wenn Sie im AdjustAfterEpoch Modus verwendet werden:

      • reduceLearnRateIfImproveLessThan: verringern Sie die Lernrate, wenn die Verbesserung kleiner als dieser Wert ist. Der Standardwert ist 0.
      • learnRateDecreaseFactor: Der Lernrate verringert den Faktor. Der Standardwert ist 0.618sein.
      • increaseLearnRateIfImproveMoreThan: erhöhen Sie die Lernrate, wenn die Verbesserung größer als dieser Wert ist. Standardwert ist (Unendlichkeit), was bedeutet, dass sie nie erhöht wird 1#INF .
      • learnRateIncreaseFactor: der Lernrate erhöhen faktor. Der Standardwert ist 1.382sein.
      • loadBestModel: Ob das beste Modell geladen werden soll, wenn das aktuelle Modell die Leistung verringert. Gültige Werte sind true (Standard) und false.
      • learnRateAdjustInterval: bestimmen Sie die Häufigkeit der Anwendung der Lernrateanpassungsprüfung. Standard ist 1 Eine Epoche. Wenn dieser Wert auf einen Wert festgelegt wird, der größer als 1 ist, basiert die Anpassung der Lernrate auf dem von den letzten learnRateAdjustInterval Epochen berechneten Mittelwert.
      • useEvalCriterionControlLR: Verwenden Sie das Bewertungskriterium anstelle des Schulungskriteriums, um die Lernrate zu steuern. Der Parameter ist standardmäßig auf „false“ festgelegt.
    • Wenn Sie SearchBeforeEpoch im Modus verwendet werden.

      • numMiniBatch4LRSearch: die Anzahl der Minibatches, die zum Durchsuchen der Lernrate verwendet wurden. Der Standardwert ist 500sein. Es ist in der Regel auf 10-20 % der gesamten Minibatches in einer Epoche festgelegt.
      • numPrevLearnRate: Anzahl der vorherigen Lernraten, die als Hinweis zum Suchbereich verwendet werden. Der Standardwert ist 5sein.
      • numBestSearchEpoch: Anzahl der Epochen, in denen wir die beste Lernrate anstelle der ausreichenden Lernrate verwenden. Der Standardwert ist 1sein.
    • Wird im Modus "AdaptiveMinibatchSizing" verwendet.

      • numMiniBatch4LRSearch: die Anzahl der Minibatches, die zum Durchsuchen der Minibatchgröße verwendet werden, wenn im adaptiven Minibatch-Größenmodus. Der Standardwert ist 500sein. Es ist in der Regel auf 10-20 % der gesamten Minibatches in einer Epoche festgelegt, die mit der Suche nach Lernrate im SearchBeforeEpoch Modus geteilt wird.
      • autoAdjustMinibatch: Aktivieren oder Deaktivieren, ob die Minibatchgröße adaptive angepasst wird. Der Standardwert ist falsesein. Adaptive Minibatch-Größe beginnt bei Epochen, die beginnen, nachdem die explizit angegebenen Minibatchgrößen des Benutzers abgeschlossen sind. Wenn der Benutzer z. B. minibatchSize=256:1024 angegeben hat, werden dann 256 und 1024 in den ersten 2 Epochen und adaptiven Minibatchsgröße danach verwendet.
      • minibatchSizeTuningFrequency: Die Anzahl der Epochen, die regelmäßig übersprungen werden sollen, bevor sie die Minibatchgröße dynamisch anpassen. Der Standardwert ist 1sein.
      • minibatchSizeTuningMax: Die maximale Größe, die für eine adaptive angepasste Minibatchgröße zulässig ist. Der Standardwert ist 1048576sein.

Farbverlaufssteuerelement

  • gradientClippingWithTruncation: Ob sie die abschneidende basierte Farbverlaufsclipping verwenden möchten, um Farbverlaufsexplosion zu steuern. Gültige Werte sind true (Standard) und false. Wenn es falsch ist, wird stattdessen die normbasierte Clipping verwendet, was teurer ist.

  • clippingThresholdPerSample: der Clippingschwellenwert für jedes Beispiel. Standardwert ist 1#INF dies die Unendlichkeit (d. h., Clipping ist deaktiviert).

  • L2RegWeight (Standard 0): die L2-Regularisierungsgewichtung pro Stichprobe. Die Frobenius-Norm des lernbaren Parameters wird dem Ziel mit dieser Gewichtung hinzugefügt. Dies wird pro Stichprobe angegeben, d. h. die Frobenius-Norm wird durch die Anzahl der Proben im Minibatch multipliziert.

  • L1RegWeight (Standard 0): die L1-Regularisierungsgewichtung pro Stichprobe.

  • gradUpdateType: Farbverlaufsaktualisierungstyp. Gültige Werte sind None (Standard, keine spezielle Behandlung für den Farbverlauf), AdaGradund RmsProp.

    • Wenn gradUpdateType sie gleich oder RmsProp, können Sie das Verhalten des Farbverlaufsupdates AdaGrad mithilfe der folgenden Parameter steuern:
      • normWithAveMultiplier: Normalisieren Sie den Farbverlauf mit den durchschnittlichen Multiplizierern, die auf die Farbverläufe durch den AdaGrad/RmsProp-Algorithmus angewendet werden. Der Standardwert ist true (Standard).
    • Wenn gradUpdateType dies gleich ist, können Sie das Verhalten des Farbverlaufsupdates RmsPropmithilfe der folgenden Parameter steuern:
      • rms_wgt_inc: Multiplicative Inkrementierung der Lernratesskala. Der Standardwert ist 1.2.
      • rms_wgt_dec: Multiplicative Decrement of the learning rate scale. Der Standardwert ist 0.75.
      • rms_wgt_max: Maximale Zulässige Lernrate. Ein Wert näher an 1 macht die Anpassung der Lernrate stabiler, aber langsamer. Der Standardwert ist 10.
      • rms_wgt_min: Mindestlernratenskala zulässig. Ein Wert näher an 1 macht die Anpassung der Lernrate stabiler, aber langsamer. Der Standardwert ist 0.1.
      • rms_gamma: Glättungsfaktor, der verwendet wird, um den gleitenden Mittelwert der Varianz zu schätzen. Je kleiner der Wert ist, desto schneller vergessen sie die letzten Informationen. Der Standardwert ist 0.99.
  • gaussianNoiseInjectStd: die Standardabweichung des gaussischen Rauschens, der bei Verwendung des AdaGrad Ansatzes hinzugefügt wird. Der Standardwert ist 0.

Informationsanzeige

  • traceLevel: Ablaufverfolgungsebene, um zu entscheiden, welche Informationen im Stderr gedruckt werden sollen. Gültige Werte sind 0 (Standard) und 1.

  • numMBsToShowResult: Zeigt Schulungsstatistiken nach der Anzahl der Minibatches an. Der Standardwert ist 10.

TensorBoard

  • tensorBoardNumMBsToLogResult: Anzahl der Minibatches zwischen protokollierungsergebnissen in TensorBoard.

Farbverlaufsprüfung

  • gradientCheck: bestimmt, ob die Farbverlaufsprüfung verwendet werden soll. Standardwert: false. Wenn Sie die Farbverlaufsprüfung verwenden, müssen Sie eine Minibatchgröße verwenden, die größer als die Sequenzlänge für RNNs ist, aufgrund des abgeschnittenen Backpropagation-Algorithmus (BPTT), der zum Trainieren von RNNs verwendet wird, und eine kleinere Lernrate, um numerische Probleme zu verhindern, die durch Divergenz verursacht werden. Darüber hinaus sollte die Genauigkeit auf doppelt festgelegt werden.

BESCHREIBUNG

Das Verhalten des SGD-Algorithmus (Stochastic Gradient Descent Learner) wird vom SGD-Block der Optionen gesteuert. Wenn eine Option nicht angegeben wird, wird der Standardwert angenommen.

Parameter, die nicht explizit angegeben werden, sind den Standardwerten überlassen.

Angeben von Datengrößen

Konvertieren von Learning-Rate- und Momentumparametern aus anderen Toolkits

CNTK Modellaktualisierungsformeln unterscheiden sich etwas von einigen anderen Toolkits und von der Literatur, da in CNTK die Parameter auf eine Weise angegeben werden, die agnostisch der Minibatchgröße ist. Dies ist im Zusammenhang mit daten parallelen Schulungen wichtig, wobei CNTK selbst die Minibatchgröße ändern kann. Durch die Angabe von Lernrate und Dynamik auf agnostische Weise werden komplexe Anpassungen dieser Werte bei Änderungen der Minibatchgröße vermieden.

Dies sind CNTK Modellaktualisierungsformel für SGD mit Dynamik:

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)

durch

  • G(t): Geglätteter Farbverlauf nach t Proben
  • g(t'): roher Farbverlauf der Probe zur Zeit t'
  • M(t): Modell, das nach dem Anzeigen von t Beispielen verwendet wird.
  • t Inkrementierung in Schritten minibatchSize

(Hinweis: Bei Verwendung von Sequenzen mit variabler Länge wird es leicht schwanken, minibathSize da Sequenzlängen in einem Minibatch im Allgemeinen nicht genau auf die angeforderte minibathSizesummen .)

Sie bemerken Folgendes:

  • Der Dynamikfilter ist einheitsverwendigend G(t) . Der Farbverlauf jedes Beispiels wird über die Zeit verteilt, sodass seine Summe 1 beträgt.
  • Die Lernrate wird pro Beispiel angegeben, anstatt w.r.t. einen Mittelwert über Beispiele.

Die spezifikation, die in anderen Toolkits und neural-netzwerk-literatur verwendet wird, ist häufig dies:

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

durch

  • G': Farbverlauf definiert auf alternative Weise als Mittelwert pro Minibatch und ohne (1-mu)
  • mu: Impulsparameter, z. B. 0,9, eines Nicht-Unit-Gain IIR-Filters, angewendet pro Minibatch
  • eta: Lernrate mit minibatch-durchschnittlichen Farbverlauf

Auf diese Weise angegebene Parameter können mithilfe dieser Formeln CNTK Parametern zugeordnet werden:

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

Sie erhalten dies mithilfe learningRatePerMB und momentumPerMB, die wie folgt zugeordnet werden (beachten Sie, dass die Abwesenheit von / (1-mu) :learningRatePerSample

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

Beispiel

Konfiguration, die vom ImageHandsOn-Lernprogramm mit Daten parallelismus und automatischer Minibatchskalierung verwendet wird:

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
    }
}