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
- Come viene definita la dimensione del minibatch in CNTK
- Modalità di definizione delle dimensioni dell'epoca in CNTK
- Come convertire i parametri di frequenza di apprendimento e slancio da altri toolkit?
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 epochSizekeepCheckPointFiles
: se si desidera mantenere il file del punto di controllo dopo l'avvio di un nuovo periodo. I valori validi sonotrue
efalse
(impostazione predefinita).disableWkInBatchNormal
: se abilitare il termine di decadimento del peso della normalizzazione batch durante gli aggiornamenti sgd. I valori validi sonotrue
efalse
(impostazione predefinita).maxEpochs
: numero massimo di periodi da eseguire.minibatchSize
: fare clic qui per informazioni su minibatchSizedropoutRate
: 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 sonotrue
efalse
(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 inlearningRatesPerSample
dividendo i valori in base al valore specificato "minibatchSize". Si escludono a vicenda conlearningRatesPerSample
.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 alearningratesPerSample
, 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, usaremomentumAsTimeConstant = -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 inmomentumAsTimeConstant = -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 sonoNone
(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) eSearchBeforeEpoch
(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 sonotrue
(valore predefinito) efalse
.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 ultimilearnRateAdjustInterval
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 inSearchBeforeEpoch
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 sonotrue
(valore predefinito) efalse
. 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 sonoNone
(impostazione predefinita, nessun trattamento speciale per la sfumatura),AdaGrad
eRmsProp
.- Quando
gradUpdateType
è uguale aAdaGrad
oRmsProp
, è 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 aRmsProp
, è 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
.
- Quando
gaussianNoiseInjectStd
: deviazione standard del rumore gaussiano aggiunto quando si usa l'approccioAdaGrad
. Il valore predefinito è0
.
Visualizzazione delle informazioni
traceLevel
: livello di traccia per decidere quali informazioni stampare nello stderr. I valori validi sono0
(valore predefinito) e1
.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 dopot
i campionig(t')
: sfumatura non elaborata del campione in fase di esecuzionet'
M(t)
: modello usato dopo aver visualizzatot
esempi.t
incremento nei passaggi diminibatchSize
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 minibatcheta
: 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
}
}