BrainScript SGD Block

Il blocco di configurazione SGD controlla il comportamento dell'algoritmo SGD (Stochastic Gradient Descent) in CNTK. Se si ha familiarità con altri toolkit, assicurarsi di consultare

Il blocco di configurazione SGD ha la struttura e i valori predefiniti seguenti:

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
}

Parametri

Controllo del processo di training

  • trainCriterionNodeName: nome del nodo del criterio di training. Se non viene specificato il nodo del criterio di training predefinito nella rete, verrà usato.

  • evalCriterionNodeName: nome del nodo del criterio di valutazione. Se non viene specificato il nodo del criterio di valutazione predefinito nella rete, verrà usato.

  • epochSize: fare clic qui per informazioni su epochSize

  • keepCheckPointFiles: se si desidera mantenere il file del punto di controllo dopo l'avvio di un nuovo periodo. I valori validi sono true e false (impostazione predefinita).

  • disableWkInBatchNormal: se abilitare il termine di decadimento del peso della normalizzazione batch durante gli aggiornamenti sgd. I valori validi sono true e false (impostazione predefinita).

  • maxEpochs: numero massimo di periodi da eseguire.

  • minibatchSize: fare clic qui per informazioni su minibatchSize

  • dropoutRate: frequenza di rilascio durante la procedura di training. Il valore predefinito è 0.0. Può usare la sintassi, ad esempio 0,5*10:0,2, che significa usare la frequenza di rilascio 0,5 per 10 periodi e quindi 0,2 per il resto.

  • maxTempMemSizeInSamplesForCNN: memoria temporanea massima usata (in numero di campioni) durante la creazione di pacchetti e la decompressione delle funzionalità di input. Il valore predefinito è 0, ovvero l'uso di qualsiasi valore in base alle esigenze. Utile per controllare l'esp di stampa del piè di pagina della memoria quando viene eseguito in GPU.

  • saveBestModelPerCriterion: opzione per salvare il modello migliore per ogni criterio misurato sui dati di convalida incrociata. Quando termina il training, i modelli sono denominati <modelName>_<criterionName>. I valori validi sono true e false (impostazione predefinita).

Learning tasso e controllo dello slancio

Si noti CNTK modo di specificare i tassi di apprendimento e lo slancio differiscono da altri toolkit. Per una descrizione dettagliata, vedere qui.

  • learningRatesPerSample: velocità di apprendimento per periodo con cui ogni sfumatura del campione aggiorna il modello. È possibile usare valori diversi per periodi diversi, ad esempio 0,025*10:0,00625 significa usare la frequenza di apprendimento 0,025 per i primi 10 periodi e quindi 0,00625 per il resto. Questo è il modo preferito per specificare in CNTK, poiché specifica le frequenze di apprendimento indipendenti dalle dimensioni del minibatch, che è importante quando viene usato il ridimensionamento automatico del minibatch. Altri toolkit spesso specificano le frequenze di apprendimento in modo minibatch-media. Per eseguire la conversione da tale notazione, usare la frequenza di apprendimento per campione = frequenza di apprendimento per MB / minibatchSize (vedere qui per altri dettagli).

  • learningRatesPerMB: metodo alternativo per specificare i tassi di apprendimento da applicare alla media rispetto ai campioni nel minibatch. Questo è il modo più comune per specificare le frequenze di apprendimento in altri toolkit, ma è problematico in CNTK in cui il training parallelo dei dati, che modifica le dimensioni del minibatch. Internamente, verrà convertito in learningRatesPerSample dividendo i valori in base al valore specificato "minibatchSize". Si escludono a vicenda con learningRatesPerSample.

  • minLearningRatePerSample: frequenza di apprendimento minima per campione. Quando la frequenza di apprendimento per campione è inferiore a questo valore, il processo di training verrà terminato. Questo viene spesso usato per controllare l'arresto anticipato quando è abilitata la regolazione automatica della velocità di apprendimento. Il valore predefinito è 1e-9.

  • momentumAsTimeConstant: in modo analogo a learningratesPerSample, CNTK specifica lo slancio in modo indipendente dalle dimensioni del minibatch come costante temporale (in campioni) di un filtro IIR di guadagno unitario 1° ordine. Il valore specifica il numero di campioni dopo il quale una sfumatura ha un effetto di 1/e=37%. Altri toolkit spesso specificano lo slancio come peso per minibatch (ad esempio 0,9). Per eseguire la conversione da questa classe, usare momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB). È possibile usare la sintassi, ad esempio 20000*10:2500, il che significa usare la costante di tempo di slancio 20000 per 10 periodi e quindi 2500 per il resto.

  • momentumPerMB: questo modo alternativo di specificare lo slancio simula il comportamento dei toolkit comuni. Ad esempio, se si specifica 0,9 si intende che la sfumatura precedente verrà mantenuta con un peso pari a 0,9. Si noti, tuttavia, che, a differenza di altri toolkit, CNTK usa ancora un filtro per il guadagno di unità, ovvero il nuovo gradiente verrà moltiplicato con (1-momentumPerMB). Internamente, verrà convertito in momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB).

  • autoAdjust: contiene le informazioni correlate al controllo automatico della frequenza di apprendimento. Il valore predefinito è vuoto ("") che significa che non è stato eseguito alcun controllo automatico della frequenza di apprendimento. All'interno del blocco possono essere presenti valori seguenti:

    • autoAdjustLR: algoritmo di regolazione automatica della velocità di apprendimento da usare. I valori validi sono None (impostazione predefinita, non regolare automaticamente la frequenza di apprendimento), AdjustAfterEpoch (controllare il criterio di training dopo ogni periodo usando il set di sviluppo del set di training e decidere se modificare la frequenza di apprendimento) e SearchBeforeEpoch (cercare la frequenza di apprendimento in base a una piccola parte del set di training prima dell'avvio di ogni periodo).

    • Se usato nella AdjustAfterEpoch modalità :

      • reduceLearnRateIfImproveLessThan: ridurre la frequenza di apprendimento se il miglioramento è minore di questo valore. Il valore predefinito è 0.
      • learnRateDecreaseFactor: fattore di diminuzione della frequenza di apprendimento. Il valore predefinito è 0.618.
      • increaseLearnRateIfImproveMoreThan: aumentare la frequenza di apprendimento se il miglioramento è maggiore di questo valore. Il valore predefinito è 1#INF (infinito) che significa non aumentare mai.
      • learnRateIncreaseFactor: fattore di aumento della frequenza di apprendimento. Il valore predefinito è 1.382.
      • loadBestModel: indica se caricare il modello migliore se il modello corrente riduce le prestazioni. I valori validi sono true (valore predefinito) e false.
      • learnRateAdjustInterval: determinare la frequenza di applicazione del controllo di regolazione della frequenza di apprendimento. Il valore predefinito è 1 epoch. Se questo valore è impostato su un valore maggiore di 1, la regolazione della velocità di apprendimento sarà basata sul criterio medio calcolato dagli ultimi learnRateAdjustInterval periodi.
      • useEvalCriterionControlLR: usare il criterio di valutazione anziché il criterio di training per controllare la frequenza di apprendimento. Per impostazione predefinita, questo parametro è impostato su false.
    • Se utilizzata nella SearchBeforeEpoch modalità .

      • numMiniBatch4LRSearch: numero di minibatches usate per cercare la frequenza di apprendimento. Il valore predefinito è 500. In genere è impostato su 10-20% dei minibatches totali in un periodo.
      • numPrevLearnRate: numero di frequenze di apprendimento precedenti usate come hint per l'intervallo di ricerca. Il valore predefinito è 5.
      • numBestSearchEpoch: numero di periodi in cui viene usata la migliore frequenza di apprendimento anziché la frequenza di apprendimento sufficiente. Il valore predefinito è 1.
    • Se usato nella modalità 'AdaptiveMinibatchSizing'.

      • numMiniBatch4LRSearch: numero di minibatches usati per cercare le dimensioni del minibatch in modalità di dimensioni minibatch adattive. Il valore predefinito è 500. In genere è impostato sul 10-20% dei minibatches totali in un periodo condiviso con la ricerca della frequenza di apprendimento in SearchBeforeEpoch modalità.
      • autoAdjustMinibatch: abilitare o disabilitare se le dimensioni del minibatch vengono modificate in modo adattivo. Il valore predefinito è false. Il ridimensionamento del minibatch adattivo inizierà in periodi a partire dal completamento delle dimensioni del minibatch dell'utente specificate in modo esplicito. Ad esempio, se l'utente ha specificato minibatchSize=256:1024, vengono usati 256 e 1024 nei primi 2 periodi e il ridimensionamento adattivo del minibatch.
      • minibatchSizeTuningFrequency: numero di periodi da ignorare, periodicamente, prima di regolare dinamicamente le dimensioni del minibatch. Il valore predefinito è 1.
      • minibatchSizeTuningMax: le dimensioni massime consentite per una dimensione minibatch modificata in modo adattivo. Il valore predefinito è 1048576.

Controllo sfumatura

  • gradientClippingWithTruncation: se usare il ritaglio sfumato basato sul troncamento per controllare l'esplosione della sfumatura. I valori validi sono true (valore predefinito) e false. Se è falso, verrà utilizzato il ritaglio basato su norma, che è più costoso.

  • clippingThresholdPerSample: soglia di ritaglio per ogni esempio. Il valore predefinito è 1#INF il che significa che l'infinito (ad esempio, il ritaglio è disattivato).

  • L2RegWeight (impostazione predefinita 0): peso di regolarizzazione L2 per campione. La norma Frobenius del parametro imparabile viene aggiunta all'obiettivo con questo peso. Questo valore viene specificato per esempio, ovvero la norma Frobenius viene moltiplicata per il numero di campioni nel minibatch.

  • L1RegWeight (impostazione predefinita 0): peso di regolarizzazione L1 per campione.

  • gradUpdateType: tipo di aggiornamento sfumatura. I valori validi sono None (impostazione predefinita, nessun trattamento speciale per la sfumatura), AdaGrade RmsProp.

    • Quando gradUpdateType è uguale a AdaGrad o RmsProp, è possibile controllare il comportamento dell'aggiornamento sfumatura usando i parametri seguenti:
      • normWithAveMultiplier: normalizzare la sfumatura con i moltiplicatori medi applicati alle sfumature dall'algoritmo AdaGrad/RmsProp. Il valore predefinito è true (impostazione predefinita).
    • Quando gradUpdateType è uguale a RmsProp, è possibile controllare il comportamento dell'aggiornamento sfumatura usando i parametri seguenti:
      • rms_wgt_inc: incremento moltiplicativo della scala di frequenza di apprendimento. Il valore predefinito è 1.2.
      • rms_wgt_dec: decremento moltiplicativo della scala di frequenza di apprendimento. Il valore predefinito è 0.75.
      • rms_wgt_max: scala massima della frequenza di apprendimento consentita. Un valore più vicino a 1 rende la regolazione della frequenza di apprendimento più stabile ma più lenta. Il valore predefinito è 10.
      • rms_wgt_min: scala minima di frequenza di apprendimento consentita. Un valore più vicino a 1 rende la regolazione della frequenza di apprendimento più stabile ma più lenta. Il valore predefinito è 0.1.
      • rms_gamma: fattore di smoothing usato per stimare la media mobile della varianza. Il valore più piccolo, più veloce dimentica le informazioni precedenti. Il valore predefinito è 0.99.
  • gaussianNoiseInjectStd: deviazione standard del rumore gaussiano aggiunto quando si usa l'approccio AdaGrad . Il valore predefinito è 0.

Visualizzazione delle informazioni

  • traceLevel: livello di traccia per decidere quali informazioni stampare nello stderr. I valori validi sono 0 (valore predefinito) e 1.

  • numMBsToShowResult: visualizzare le statistiche di training dopo il numero di minibatches. Il valore predefinito è 10.

TensorBoard

  • tensorBoardNumMBsToLogResult: numero di minibatches tra i risultati della registrazione a TensorBoard.

Controllo sfumatura

  • gradientCheck: determina se usare il controllo sfumatura. Il valore predefinito è false. Quando si usa il controllo sfumatura è necessario usare una dimensione minibatch maggiore della lunghezza della sequenza per i RNN a causa dell'algoritmo backpropagation troncato attraverso il tempo (BPTT) usato per eseguire il training di RNN e una frequenza di apprendimento più piccola per evitare problemi numerici causati dalla divergenza. Inoltre, la precisione deve essere impostata su double.

Descrizione

Il comportamento dell'algoritmo SGD (Stochastic Gradient Descent Learner) è controllato dal blocco SGD delle opzioni. Quando viene omessa un'opzione, viene assunto il valore predefinito.

I parametri non specificati in modo esplicito vengono lasciati ai valori predefiniti.

Specifica delle dimensioni dei dati

Conversione di parametri Learning e momentum da altri toolkit

CNTK formula di aggiornamento modello differiscono in qualche modo da alcuni altri toolkit e dalla letteratura, in quanto in CNTK, i parametri vengono specificati in modo che sia agnostico delle dimensioni minibatch. Questo è importante nel contesto del training parallelo dei dati, in cui CNTK può modificare le dimensioni del minibatch. Specificando la frequenza di apprendimento e lo slancio in modo agnostico, evita complessità di regolare questi valori in base alle modifiche delle dimensioni minibatch.

Queste sono le formule di aggiornamento del modello di CNTK per SGD con slancio:

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): sfumatura lisciata dal momento dopo t i campioni
  • g(t'): sfumatura non elaborata del campione in fase di esecuzione t'
  • M(t): modello usato dopo aver visualizzato t esempi.
  • t incremento nei passaggi di minibatchSize

Nota: quando si usano sequenze a lunghezza variabile, minibathSize le sequenze variano leggermente poiché le lunghezze della sequenza in un minibatch in genere non sommano esattamente all'oggetto richiesto minibathSize.

Si noti:

  • Il filtro G(t) di slancio è un guadagno unitario. Ogni sfumatura di esempio viene distribuita nel tempo in modo che la somma sia 1.
  • La frequenza di apprendimento viene specificata per esempio anziché w.r.t. una media rispetto ai campioni.

La specifica usata in altri toolkit e letteratura di rete neurale è spesso questa:

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

con

  • G': sfumatura definita in modo alternativo come media per minibatch e senza (1-mu)
  • mu: parametro momentum, ad esempio 0,9, di un filtro IIR non unit-gain , applicato per minibatch
  • eta: frequenza di apprendimento con sfumatura media minibatch

I parametri specificati in questo modo possono essere mappati ai parametri CNTK usando queste formule:

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

Si otterrà vicino a questo usando learningRatePerMB e momentumPerMB, che vengono mappati come segue (si noti l'assenza di / (1-mu) per learningRatePerSample:

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

Esempio

Configurazione usata dall'esercitazione ImageHandsOn con parallelismo dei dati e ridimensionamento minibatch automatico:

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