Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Blok konfiguracji SGD kontroluje zachowanie algorytmu SGD (Stochastic Gradient Descent) w CNTK. Jeśli znasz inne zestawy narzędzi, zapoznaj się z tematem
- Jak jest rozmiar minibatch zdefiniowany w CNTK
- Jak jest rozmiar epoki zdefiniowany w CNTK
- Jak przekonwertować szybkość nauki i parametry tempa z innych zestawów narzędzi?
Blok konfiguracji SGD ma następującą strukturę i wartości domyślne:
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
}
Parametry
Kontrola procesu trenowania
trainCriterionNodeName: nazwa węzła kryterium trenowania. Jeśli nie podano domyślnego węzła kryterium trenowania w sieci, zostanie użyty.evalCriterionNodeName: nazwa węzła kryterium oceny. Jeśli nie podano domyślnego węzła kryterium oceny w sieci, zostanie użyty.epochSize: kliknij tutaj, aby dowiedzieć się więcej o epochSizekeepCheckPointFiles: czy chcesz zachować plik punktu kontrolnego po rozpoczęciu nowej epoki. Prawidłowe wartości totrueifalse(wartość domyślna).disableWkInBatchNormal: czy włączyć termin rozpadu wagi normalizacji wsadowej podczas aktualizacji SGD. Prawidłowe wartości totrueifalse(wartość domyślna).maxEpochs: maksymalna liczba epok do uruchomienia.minibatchSize: kliknij tutaj, aby dowiedzieć się więcej o minibatchSizedropoutRate: współczynnik porzucania podczas procedury trenowania. Wartość domyślna to0.0. Może używać składni, takiej jak 0,5*10:0.2, co oznacza użycie współczynnika spadku 0,5 dla 10 epok, a następnie 0,2 dla reszty.maxTempMemSizeInSamplesForCNN: maksymalna ilość używanej pamięci tymczasowej (w liczbie próbek) podczas pakowania i rozpakowywania funkcji wejściowych. Wartość domyślna to 0, co oznacza użycie dowolnej wartości zgodnie z potrzebami. Przydatne do sterowania odciskiem stopki pamięci esp. po uruchomieniu pod procesorem GPU.saveBestModelPerCriterion: opcja zapisania najlepszego modelu dla każdego kryterium mierzonego na danych weryfikacji krzyżowej. Po zakończeniu trenowania modele mają nazwę<modelName>_<criterionName>. Prawidłowe wartości totrueifalse(wartość domyślna).
Edukacja szybkość i kontrola tempa
Zwróć uwagę, CNTK sposób określania szybkości nauki i tempa uczenia się różni się od innych zestawów narzędzi. Zobacz tutaj , aby uzyskać szczegółowy opis.
learningRatesPerSample: współczynniki uczenia na epokę, z którą gradient każdej próbki aktualizuje model. Możesz użyć różnych wartości dla różnych epok, np. 0,025*10:0,00625 oznacza użycie współczynnika uczenia 0,025 dla pierwszych 10 epok, a następnie 0,00625 dla reszty. Jest to preferowany sposób określania w CNTK, ponieważ określa wskaźniki uczenia niezależne od rozmiaru minibatch, co jest ważne, gdy jest używany automatyczny rozmiar minibatch-sizing. Inne zestawy narzędzi często określają stawki nauki w minibatch-a średnio moda. Aby przekonwertować na podstawie tej notacji, użyj współczynnika uczenia na próbkę = szybkość nauki na MB /minibatchSize(zobacz tutaj , aby uzyskać więcej szczegółów).learningRatesPerMB: alternatywny sposób określania współczynników uczenia się, które mają być stosowane do średniej w porównaniu z próbkami w minibatch. Jest to najczęstszy sposób określania współczynników uczenia się w innych zestawach narzędzi, ale jest problematyczny w CNTK, gdzie trenowanie równoległe danych, które modyfikuje rozmiar minibatch. Wewnętrznie zostanie to przekonwertowane nalearningRatesPerSampleprzez podzielenie wartości określonych "minibatchSize". Wzajemnie wykluczające się zlearningRatesPerSample.minLearningRatePerSample: minimalna szybkość nauki na próbkę. Gdy szybkość nauki na próbkę jest mniejsza niż ta wartość, proces trenowania zakończy się. Jest to często używane do kontrolowania wczesnego zatrzymywania, gdy jest włączona automatyczna korekta szybkości uczenia. Wartość domyślna to 1e-9.momentumAsTimeConstant: podobnie jaklearningratesPerSample, CNTK określa pęd w sposób niezależny od minibatch rozmiaru jako stała czasowa (w próbkach) filtru IIR o 1 kolejności. Wartość określa liczbę próbek, po których gradient ma wpływ 1/e=37%. Inne zestawy narzędzi często określają rozmach jako wagę na minibatch (np. 0,9). Aby przekonwertować z tego elementu, użyj poleceniamomentumAsTimeConstant = -minibatchSize / ln (momentumPerMB). Możesz użyć składni, takiej jak 20000*10:2500, co oznacza użycie stałej czasu tempa 20000 dla 10 epok, a następnie 2500 dla reszty.momentumPerMB: ten alternatywny sposób określania tempa naśladuje zachowanie typowych zestawów narzędzi. Na przykład określenie wartości 0,9 oznacza, że poprzedni gradient zostanie zachowany z wagą 0,9. Należy jednak pamiętać, że w przeciwieństwie do niektórych innych zestawów narzędzi, CNTK nadal używa filtru przyrostowego, tj. nowy gradient zostanie pomnożony za pomocą polecenia(1-momentumPerMB). Wewnętrznie zostanie to przekonwertowane namomentumAsTimeConstant = -minibatchSize / ln (momentumPerMB).autoAdjust: zawiera informacje związane z automatyczną kontrolą szybkości uczenia. Wartość domyślna jest pusta (""), co oznacza, że nie ma automatycznej kontroli szybkości uczenia. Wewnątrz bloku mogą istnieć następujące wartości:autoAdjustLR: algorytm dostosowywania szybkości uczenia automatycznego do użycia. Prawidłowe wartości toNone(wartość domyślna, nie dopasowuj automatycznie szybkości uczenia)AdjustAfterEpoch(sprawdź kryterium trenowania po każdej epoki przy użyciu zestawu programistycznego zestawu szkoleniowego i zdecyduj, czy dostosować szybkość nauki) iSearchBeforeEpoch(wyszukaj szybkość nauki na podstawie niewielkiej części zestawu treningowego przed rozpoczęciem każdej epoki).W przypadku użycia w trybie
AdjustAfterEpoch:reduceLearnRateIfImproveLessThan: zmniejsz szybkość nauki, jeśli poprawa jest mniejsza niż ta wartość. Wartość domyślna to0.learnRateDecreaseFactor: współczynnik spadku szybkości nauki. Wartość domyślna to0.618.increaseLearnRateIfImproveMoreThan: zwiększ szybkość nauki, jeśli poprawa jest większa niż ta wartość. Wartość domyślna to1#INF(nieskończoność), co oznacza, że nigdy nie zwiększa się.learnRateIncreaseFactor: współczynnik wzrostu szybkości nauki. Wartość domyślna to1.382.loadBestModel: czy załadować najlepszy model, jeśli bieżący model zmniejszy wydajność. Prawidłowe wartości totrue(wartość domyślna) ifalse.learnRateAdjustInterval: określa częstotliwość stosowania sprawdzania szybkości nauki. Wartość domyślna to1epoka. Jeśli ta wartość jest ustawiona na wartość większą niż 1, korekta szybkości nauki będzie oparta na średnim kryterium obliczonym z ostatniejlearnRateAdjustIntervalepoki.useEvalCriterionControlLR: użyj kryterium oceny zamiast kryterium trenowania, aby kontrolować szybkość nauki. Domyślnie jest to fałsz.
W przypadku użycia w trybie
SearchBeforeEpoch.numMiniBatch4LRSearch: liczba minibatów używanych do wyszukiwania współczynnika uczenia. Wartość domyślna to500. Zazwyczaj jest ustawiona na 10–20% wszystkich minibatów w epoki.numPrevLearnRate: liczba poprzednich stawek szkoleniowych używanych jako wskazówka dla zakresu wyszukiwania. Wartość domyślna to5.numBestSearchEpoch: liczba epok, w których używamy najlepszego współczynnika uczenia się zamiast wystarczającej liczby uczenia. Wartość domyślna to1.
W przypadku użycia w trybie "AdaptiveMinibatchSizing".
numMiniBatch4LRSearch: liczba minibatów używanych do wyszukiwania rozmiaru minibatch w trybie adaptacyjnego rozmiaru minibatch. Wartość domyślna to500. Zazwyczaj jest ona ustawiona na 10–20% wszystkich minibatów w epoki, która jest udostępniana w trybie wyszukiwania szybkościSearchBeforeEpochnauki.autoAdjustMinibatch: włącza lub wyłącza, czy rozmiar minibatch jest dostosowywany adaptacyjnie. Wartość domyślna tofalse. Adaptacyjne rozmiary minibatch rozpocznie się w epokach rozpoczynających się od jawnie określonych rozmiarów minibatch użytkownika. Jeśli na przykład użytkownik określił minibatchSize=256:1024, wówczas 256 i 1024 są używane w pierwszych 2 epokach i adaptacyjnym rozmiarze minibatch jest używany później.minibatchSizeTuningFrequency: Liczba epok, które należy pominąć, okresowo, przed dynamicznym dostosowaniem rozmiaru minibatch. Wartość domyślna to1.minibatchSizeTuningMax: maksymalny rozmiar dozwolony dla rozmiaru minibatch dostosowanego do adaptacyjnego rozmiaru. Wartość domyślna to1048576.
Kontrolka gradientu
gradientClippingWithTruncation: czy używać obcięcia na podstawie przycinania gradientu w celu kontrolowania eksplozji gradientu. Prawidłowe wartości totrue(wartość domyślna) ifalse. Jeśli jest to fałsz, zostanie użyte wycinek oparty na normie, zamiast tego jest droższy.clippingThresholdPerSample: próg przycinania dla każdej próbki. Wartość domyślna oznacza1#INFnieskończoność (tj. wycinanie jest wyłączone).L2RegWeight(wartość domyślna 0): waga uregulowania L2 na próbkę. Norma Frobenius parametru do nauki jest dodawana do celu z tą wagą. Jest to określone dla próbki, co oznacza, że normę Frobenius jest mnożona przez liczbę próbek w minibatch.L1RegWeight(wartość domyślna 0): waga regularyzacji L1 na próbkę.gradUpdateType: typ aktualizacji gradientu. Prawidłowe wartości toNone(wartość domyślna, brak specjalnego traktowania gradientu),AdaGradiRmsProp.- W przypadku
gradUpdateTypewartościAdaGradrównej lubRmsPropmożna kontrolować zachowanie aktualizacji gradientu przy użyciu następujących parametrów:normWithAveMultiplier: normalizuj gradient za pomocą średnich mnożników zastosowanych do gradientów przez algorytm AdaGrad/RmsProp. Wartość domyślna totrue(wartość domyślna).
- Gdy
gradUpdateTypejestRmsProprówna , możesz kontrolować zachowanie aktualizacji gradientu przy użyciu następujących parametrów:rms_wgt_inc: mnożenie przyrostu skali szybkości nauki. Wartość domyślna to1.2.rms_wgt_dec: mnożenie dekrementacji skali szybkości nauki. Wartość domyślna to0.75.rms_wgt_max: dozwolona maksymalna skala szybkości nauki. Wartość bliższa 1 sprawia, że dostosowanie szybkości nauki jest bardziej stabilne, ale wolniejsze. Wartość domyślna to10.rms_wgt_min: dozwolona minimalna skala szybkości nauki. Wartość bliższa 1 sprawia, że dostosowanie szybkości nauki jest bardziej stabilne, ale wolniejsze. Wartość domyślna to0.1.rms_gamma: współczynnik wygładzania używany do szacowania średniej ruchomej wariancji. Mniejsza wartość, tym szybciej zapomnisz o poprzednich informacjach. Wartość domyślna to0.99.
- W przypadku
gaussianNoiseInjectStd: odchylenie standardowe szumu Gaussiana dodane podczas korzystania zAdaGradpodejścia. Wartość domyślna to0.
Wyświetlanie informacji
traceLevel: poziom śledzenia, aby zdecydować, jakie informacje mają być drukowane w stderr. Prawidłowe wartości to0(wartość domyślna) i1.numMBsToShowResult: wyświetla statystyki treningowe po tylu minibatches. Wartość domyślna to10.
TensorBoard
tensorBoardNumMBsToLogResult: liczba minibatches między wynikami rejestrowania do TensorBoard.
Sprawdzanie gradientu
gradientCheck: określa, czy używać sprawdzania gradientu. Wartość domyślna tofalse. W przypadku korzystania z modułu sprawdzania gradientu należy użyć rozmiaru minibatch, który jest większy niż długość sekwencji dla sieci RNN ze względu na obcięte backpropagation w czasie (BPTT) algorytm używany do trenowania sieci RNN i mniejszy współczynnik uczenia, aby zapobiec problemom liczbowym spowodowanym rozbieżnością. Ponadto należy ustawić precyzję na wartość podwójną.
Opis
Zachowanie algorytmu SGD (Stochastic Gradient Descent Learner) jest kontrolowane przez blok SGD opcji. W przypadku pominięcia opcji przyjmowana jest wartość domyślna.
Parametry, które nie są jawnie określone, są pozostawiane do wartości domyślnych.
Określanie rozmiarów danych
Konwertowanie parametrów szybkości Edukacja i momentu z innych zestawów narzędzi
CNTK formuła aktualizacji modelu różni się nieco od innych zestawów narzędzi i literatury, w tym w CNTK parametry są określane w sposób, który jest niezależna od rozmiaru minibatch. Jest to ważne w kontekście trenowania równoległego danych, w którym CNTK może modyfikować rozmiar minibatch. Określanie tempa nauki i tempa w sposób niespoletyczny pozwala uniknąć złożoności dostosowywania tych wartości po zmianie rozmiaru minibatch.
Są to formuły aktualizacji modelu CNTK dla SGD z rozmachem:
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)
with
G(t): gradient wygładzony pędem potpróbkachg(t'): surowy gradient próbki w czasiet'M(t): model używany po obejrzeniutprzykładów.tinkrementacja w krokachminibatchSize
(Uwaga: w przypadku używania sekwencji o zmiennej długości nieznacznie zmienia się, minibathSize ponieważ długość sekwencji w minibatch zazwyczaj nie sumuje się dokładnie do żądanego minibathSizeelementu ).
Zauważysz:
- Filtr
G(t)rozmachu jest przyrostem jednostkowym. Gradient każdej próbki jest rozkładany w czasie, tak aby ich suma wynosiła 1. - Szybkość nauki jest określana na próbkę, a nie w.r.t. średnią w przypadku próbek.
Specyfikacja używana w innych zestawach narzędzi i literaturze sieci neuronowej jest często następująca:
G'(t) = average { g(t-minibatchSize+1) ... g(t) } + mu * G'(t-minibatchSize)
M(t) = M(t-minibatchSize) + eta G'(t)
with
G': gradient zdefiniowany w alternatywny sposób jako średnia na minibatch i bez(1-mu)mu: parametr momentu, np. 0,9, filtrU IIR bez jednostki , zastosowany na minibatcheta: szybkość nauki z gradientem minibatch-average
Parametry określone w ten sposób mogą być mapowane na parametry CNTK przy użyciu następujących formuł:
learningRatePerSample = eta / minibatchSize / (1-mu)
momentumAsTimeConstant = -minibatchSize / ln (mu)
Zbliżysz się do tego za pomocą metod learningRatePerMB i momentumPerMB, które są mapowane w następujący sposób (zwróć uwagę na brak / (1-mu) elementu dla learningRatePerSampleelementu :
learningRatePerSample = learningRatePerMB / minibatchSize
momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
Przykład
Konfiguracja używana przez samouczek ImageHandsOn z równoległością danych i automatycznym skalowaniem 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
}
}