Блок BRAINScript ДЛЯ БЛОКИРОВКИ
Блок конфигурации СИСТЕМЫ БЕЗОПАСНОСТИ управляет поведением алгоритма ГРАДиентного градиента (STOchastic Gradient Descent) в CNTK. Если вы знакомы с другими наборами средств, обязательно ознакомьтесь с
- Как определяется размер мини-пакета, определенный в CNTK
- Как определяется размер эпохи в CNTK
- Как преобразовать параметры скорости обучения и импульса из других наборов средств?
Блок конфигурации МЕД имеет следующие значения структуры и значения по умолчанию:
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
}
trainCriterionNodeName
: имя узла условия обучения. Если не указан узел критерия обучения по умолчанию в сети, будет использоваться.evalCriterionNodeName
: имя узла критерия оценки. Если не указан узел критерия оценки по умолчанию в сети, будет использоваться.epochSize
: щелкните здесь, чтобы узнать о epochSizekeepCheckPointFiles
: нужно ли сохранить файл контрольной точки после начала новой эпохи. Допустимые значения:true
иfalse
(по умолчанию).disableWkInBatchNormal
: следует ли включать срок распада веса пакетной нормализации при обновлении ПАКЕТА. Допустимые значения:true
иfalse
(по умолчанию).maxEpochs
: максимальное число эпох для выполнения.minibatchSize
: щелкните здесь, чтобы узнать о minibatchSizedropoutRate
: коэффициент выпадания во время процедуры обучения. По умолчанию —0.0
. Можно использовать синтаксис, например 0,5*10:0.2, что означает использование коэффициента выпада 0,5 для 10 эпох, а затем 0,2 для остальных.maxTempMemSizeInSamplesForCNN
: максимальный объем используемой временной памяти (в количестве выборок) при упаковке и распаковке входных функций. Значение по умолчанию — 0, что означает использование любого значения по мере необходимости. Полезно управлять печатью ноги памяти esp. При запуске под GPU.saveBestModelPerCriterion
: параметр сохранения оптимальной модели для каждого критерия, измеряемого на данных перекрестной проверки. При окончании обучения модели именуются<modelName>_<criterionName>
. Допустимые значения:true
иfalse
(по умолчанию).
Обратите внимание, CNTK способ указания скорости обучения и импульса отличается от других наборов средств. Подробные описания см. здесь .
learningRatesPerSample
: скорость обучения на эпоху, с которой градиент каждого образца обновляет модель. Вы можете использовать разные значения для разных эпох, например 0,025*10:0,00625 означает использование скорости обучения 0,025 для первых 10 эпох, а затем 0,00625 для остальных. Это предпочтительный способ указания в CNTK, так как он указывает скорость обучения, не зависящая от размера мини-бэтч, что важно при использовании автоматического изменения размера мини-пакетов. Другие наборы средств часто указывают скорость обучения в мини-бэтч-усреднении. Чтобы преобразовать из этой нотации, используйте частоту обучения на выборку = скорость обучения на МБ /minibatchSize
(дополнительные сведения см. здесь ).learningRatesPerMB
: альтернативный способ указания показателей обучения, применяемых к среднему значению выборок в мини-бэтче. Это наиболее распространенный способ указания скорости обучения в других наборах средств, но проблематично в CNTK где параллельное обучение данных, что изменяет размер мини-пакета. Внутренне это преобразование будет преобразованоlearningRatesPerSample
путем деления значений на указанный параметр minibatchSize. Взаимоисключающими сlearningRatesPerSample
.minLearningRatePerSample
: минимальная скорость обучения на выборку. Если скорость обучения на выборку меньше, чем это значение, процесс обучения завершится. Это часто используется для управления ранней остановкой при включенной автоматической корректировке скорости обучения. Значение по умолчанию — 1e-9.momentumAsTimeConstant
: аналогичноlearningratesPerSample
, CNTK указывает импульс в мини-batch-size независимо от того, как константа времени (в примерах) фильтра IIR 1-го порядка единиц. Значение указывает количество выборок, после которых градиент имеет эффект 1/e=37 %. Другие наборы средств часто указывают импульс как вес на мини-бэтч (например, 0,9). Для преобразования из этого используйтеmomentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
. Можно использовать такой синтаксис, как 20000*10:2500, что означает использование константы времени импульса 20000 для 10 эпох, а затем 2500 для остальных.momentumPerMB
: этот альтернативный способ указания импульса имитирует поведение общих наборов средств. Например, указание 0,9 означает, что предыдущий градиент будет сохранен с весом 0,9. Однако обратите внимание, что, в отличие от некоторых других наборов средств, CNTK по-прежнему использует фильтр получения единиц, т. е. новый градиент будет умножен на(1-momentumPerMB)
. Внутри системы это будет преобразовано вmomentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
.autoAdjust
: содержит сведения, связанные с автоматическим управлением скоростью обучения. Значение по умолчанию пусто (""), что означает отсутствие автоматического контроля скорости обучения. Внутри блока могут быть следующие значения:autoAdjustLR
: используемый алгоритм автоматической корректировки скорости обучения. Допустимые значения:None
(по умолчанию, не настраивайте скорость обучения автоматически),AdjustAfterEpoch
(проверьте критерий обучения после каждой эпохи с помощью набора средств разработки набора обучения и решите, следует ли настраивать скорость обучения) иSearchBeforeEpoch
(выполните поиск скорости обучения на основе небольшой части обучающего набора перед началом каждой эпохи).При использовании в режиме
AdjustAfterEpoch
:reduceLearnRateIfImproveLessThan
: уменьшите скорость обучения, если улучшение меньше этого значения. По умолчанию —0
.learnRateDecreaseFactor
: коэффициент уменьшения скорости обучения. Значение по умолчанию —0.618
.increaseLearnRateIfImproveMoreThan
: увеличьте скорость обучения, если улучшение превышает это значение. Значение по умолчанию —1#INF
бесконечность, что означает никогда не увеличиваться.learnRateIncreaseFactor
: коэффициент увеличения скорости обучения. Значение по умолчанию —1.382
.loadBestModel
: следует ли загружать лучшую модель, если текущая модель снижает производительность. Допустимые значенияtrue
(по умолчанию) иfalse
.learnRateAdjustInterval
: определите частоту применения проверки корректировки скорости обучения. По умолчанию используется1
эпоха. Если для этого значения задано значение больше 1, корректировка скорости обучения будет основываться на среднем критерии, вычисленном из последнихlearnRateAdjustInterval
эпох.useEvalCriterionControlLR
: используйте критерий оценки вместо критерия обучения для управления скоростью обучения. Значение по умолчанию — false.
При использовании в режиме
SearchBeforeEpoch
.numMiniBatch4LRSearch
: количество мини-пакетов, используемых для поиска скорости обучения. Значение по умолчанию —500
. Обычно это значение составляет 10–20 % от общего числа мини-пакетов в эпоху.numPrevLearnRate
: число предыдущих курсов обучения, используемых в качестве указания для диапазона поиска. Значение по умолчанию —5
.numBestSearchEpoch
: количество эпох, в которых мы используем лучшую скорость обучения вместо достаточной скорости обучения. Значение по умолчанию —1
.
При использовании в режиме AdaptiveMinibatchSizing.
numMiniBatch4LRSearch
: количество мини-пакетов, используемых для поиска размера мини-пакетов в режиме адаптивного размера мини-пакетов. Значение по умолчанию —500
. Обычно для него задано значение 10–20 % от общего числа мини-пакетов в эпоху, к которым применяется поиск скорости обучения вSearchBeforeEpoch
режиме.autoAdjustMinibatch
: включает или отключает, корректируется ли размер мини-пакета с адаптивным изменением. Значение по умолчанию —false
. Адаптивный размер мини-пакетов начнется в эпохах, начиная с явно заданных размеров мини-пакетов пользователя. Например, если пользователь указал minibatchSize=256:1024, то 256 и 1024 используются в первых двух эпохах, а затем используется адаптивный размер мини-бэтч.minibatchSizeTuningFrequency
: количество эпох, которые следует пропустить периодически, перед динамической настройкой размера мини-пакета. Значение по умолчанию —1
.minibatchSizeTuningMax
: максимальный размер, допустимый для адаптивно скорректированного размера мини-пакета. Значение по умолчанию —1048576
.
gradientClippingWithTruncation
: следует ли использовать обрезку градиента на основе усечения для управления взрывом градиента. Допустимые значенияtrue
(по умолчанию) иfalse
. Если значение false, будет использоваться вырезка на основе норм, а это дороже.clippingThresholdPerSample
: пороговое значение обрезки для каждого образца. Значение по умолчанию — это1#INF
бесконечность (т. е. вырезка отключена).L2RegWeight
(по умолчанию 0): вес регуляризации L2 на выборку. Норму Frobenius обучаемого параметра добавляется к цели с таким весом. Этот параметр задается на выборку, то есть норму Frobenius умножается на количество выборок в мини-бэтче.L1RegWeight
(по умолчанию 0): вес регуляризации L1 на выборку.gradUpdateType
: тип обновления градиента. Допустимые значения:None
(по умолчанию, никакое специальное обращение к градиенту)AdaGrad
иRmsProp
.- Если
gradUpdateType
значение равноAdaGrad
илиRmsProp
, можно управлять поведением обновления градиента с помощью следующих параметров:normWithAveMultiplier
: нормализуйте градиент со средними множителями, примененными к градиентам алгоритмом AdaGrad/RmsProp. Значение по умолчанию —true
(по умолчанию).
- Если
gradUpdateType
равноRmsProp
, можно управлять поведением обновления градиента с помощью следующих параметров:rms_wgt_inc
: умножение приращения шкалы скорости обучения. По умолчанию —1.2
.rms_wgt_dec
: мультипликативное уменьшение масштаба скорости обучения. По умолчанию —0.75
.rms_wgt_max
: разрешено максимально допустимое масштабирование скорости обучения. Значение ближе к 1 делает корректировку скорости обучения более стабильной, но медленнее. По умолчанию —10
.rms_wgt_min
: допустимый минимальный масштаб скорости обучения. Значение ближе к 1 делает корректировку скорости обучения более стабильной, но медленнее. По умолчанию —0.1
.rms_gamma
: коэффициент сглаживания, используемый для оценки скользящего среднего дисперсии. Чем меньше значение, тем быстрее он забывает о прошлой информации. По умолчанию —0.99
.
- Если
gaussianNoiseInjectStd
: стандартное отклонение гаусского шума, добавленное при использованииAdaGrad
подхода. По умолчанию —0
.
traceLevel
: уровень трассировки, чтобы определить, какие сведения следует распечатать в stderr. Допустимые значения0
(по умолчанию) и1
.numMBsToShowResult
: отображение статистики обучения после количества мини-пакетов. По умолчанию —10
.
tensorBoardNumMBsToLogResult
: количество мини-пакетов между результатами ведения журнала в TensorBoard.
gradientCheck
: определяет, следует ли использовать средство проверки градиента. Значение по умолчанию —false
. При использовании средства проверки градиента необходимо использовать размер мини-бэтча, превышающий длину последовательности для RNN из-за усеченной обратной опоры по времени (BPTT), используемого для обучения RNN, и меньшей скорости обучения, чтобы предотвратить числовые проблемы, вызванные расхождением. Кроме того, для точности необходимо задать значение double.
Поведение алгоритма JSON (Stochastic Gradient Descent Learner) управляется блоком параметров в формате JSON. Если параметр опущен, предполагается значение по умолчанию.
Параметры, которые явно не указаны, остаются значениями по умолчанию.
формула обновления модели CNTK несколько отличается от некоторых других наборов средств и от литературы, в том, что в CNTK параметры задаются способом, который не зависит от размера мини-пакета. Это важно в контексте параллельного обучения данных, где CNTK сам может изменить размер мини-пакета. Указание скорости обучения и импульса не зависит от сложности настройки этих значений при изменении размера мини-пакета.
Ниже приведены формулы обновления модели CNTK для МОДЕЛИ с импульсом:
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)
на
G(t)
: градиент сглаживания импульса послеt
выборокg(t')
: необработанный градиент выборки во времяt'
M(t)
: модель, используемая после просмотраt
примеров.t
приращение в шагахminibatchSize
(Примечание. При использовании последовательностей переменной длины немного меняется, minibathSize
так как длина последовательности в мини-пакете обычно не суммируется точно с запрошенными minibathSize
.)
Обратите внимание:
- Фильтр
G(t)
импульса является единицей увеличения. Градиент каждого образца распределяется со временем, чтобы их сумма была 1. - Скорость обучения задается на выборку, а не w.r.t. среднее значение по сравнению с выборками.
Спецификация, используемая в других наборах средств и литературе по нейронной сети, часто такая:
G'(t) = average { g(t-minibatchSize+1) ... g(t) } + mu * G'(t-minibatchSize)
M(t) = M(t-minibatchSize) + eta G'(t)
на
G'
: градиент, определенный в альтернативном способе в качестве среднего по мини-бэтчу и без него.(1-mu)
mu
: параметр импульса, например 0,9, фильтра IIR, не относящемся к единицам, применяется для мини-бэтча.eta
: скорость обучения с мини-градиентом в среднем
Параметры, указанные таким образом, можно сопоставить с параметрами CNTK с помощью следующих формул:
learningRatePerSample = eta / minibatchSize / (1-mu)
momentumAsTimeConstant = -minibatchSize / ln (mu)
Вы будете близко к этому с помощью и learningRatePerMB
momentumPerMB
, которые сопоставлены следующим образом (обратите внимание на отсутствие / (1-mu)
для learningRatePerSample
:
learningRatePerSample = learningRatePerMB / minibatchSize
momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
Конфигурация, используемая учебником ImageHandsOn с параллелизмом данных и автоматическим масштабированием мини-пакетов:
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
}
}