Поделиться через


Блок BRAINScript ДЛЯ БЛОКИРОВКИ

Блок конфигурации СИСТЕМЫ БЕЗОПАСНОСТИ управляет поведением алгоритма ГРАДиентного градиента (STOchastic Gradient Descent) в 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: щелкните здесь, чтобы узнать о epochSize

  • keepCheckPointFiles: нужно ли сохранить файл контрольной точки после начала новой эпохи. Допустимые значения: true и false (по умолчанию).

  • disableWkInBatchNormal: следует ли включать срок распада веса пакетной нормализации при обновлении ПАКЕТА. Допустимые значения: true и false (по умолчанию).

  • maxEpochs: максимальное число эпох для выполнения.

  • minibatchSize: щелкните здесь, чтобы узнать о minibatchSize

  • dropoutRate: коэффициент выпадания во время процедуры обучения. По умолчанию — 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.

TensorBoard

  • 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)

Вы будете близко к этому с помощью и learningRatePerMBmomentumPerMB, которые сопоставлены следующим образом (обратите внимание на отсутствие / (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
    }
}