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


Нормализация пакетной службы

BatchNormalization(input, scale, bias, runMean, runVariance, spatial,
                   normalizationTimeConstant = 0,
                   blendTimeConstant = 0, epsilon = 0.00001, useCntkEngine = true)

Параметры

  • input — входные данные узла нормализации пакета
  • scaleпараметр ParameterTensor{} , содержащий коэффициенты масштабирования по компоненту (gamma термин в приведенном ниже уравнении).
  • biasпараметр ParameterTensor{} , содержащий обученное смещение (beta термин). scale и bias должны иметь те же измерения, которые должны быть равны input измерениям в случае spatial = false или числа карт признаков свертки вывода в случае spatial = true.
  • runMean — это среднее значение, которое используется во время этапа оценки и может использоваться во время обучения. Необходимо передать ParameterTensor{} с теми же измерениями, что scale и bias, начальное значение 0, и learningRateMultiplier=0 задать.
  • runVariance — это выполняющаяся дисперсия. Он представлен так же, как runMeanи .
  • spatial — это флаг, указывающий, следует ли вычислять среднее/var для каждой функции в мини-пакете независимо или, в случае сверточных слоев, на карту признаков.
  • normalizationTimeConstant (по умолчанию 0): константа времени для вычислений среднего и дисперсии в качестве низкой отфильтрованной версии пакетной статистики. Примечание. Значение по умолчанию обычно не является нужным.
  • blendTimeConstant (по умолчанию 0): позволяет сглаживать пакетные оценки с помощью выполняющихся статистических данных.
  • epsilon является константой кондиционера, добавляемой к дисперсии при вычислении обратного стандартного отклонения.
  • useCntkEngine (по умолчанию: true): задайте для этого значение, чтобы false выбрать реализацию cuDNN только для GPU.

Возвращаемое значение

Нормализованный пакет.input

Описание

BatchNormalization реализует методику, описанную в документе Нормализация пакетной службы: ускорение глубокой сетевой подготовки путем сокращения внутренней ковариатной смены (Сергей Иоффе, Кристиан Szegedy)). Короче говоря, он нормализует выходные данные слоя для каждого мини-пакета для каждого выходного (компонента) независимо и применяет аффинное преобразование для сохранения представления слоя. То есть для слоя input:

m = mean (input)
var = variance (input)
inputNorm = (input - mean)/sqrt (epsilon + var)
output = gamma * inputNorm + beta

где gamma и beta являются обучаемыми параметрами.

mean и variance оценивается на основе обучающих данных. В самом простом случае они являются средним и дисперсией текущего мини-бэтча во время обучения. Вместо этого используется долгосрочная оценка.

Долгосрочные оценки представляют собой версию статистики мини-batch с низкой фильтрацией с константой времени (в примерах), заданной параметром normalizationTimeConstant . Значение 0 означает, что не будет экспоненциального сглаживания и запущенного среднего или дисперсии всегда будет равно значению последнего замеченного мини-сглаживания. Это часто нежелательно. Вместо этого рекомендуется использовать здесь значение нескольких тысяч. Оболочка BatchNormalizationLayer{} имеет значение по умолчанию 5000.

Дополнительные сведения о константах времени и экспоненциальном сглаживаении: https://en.wikipedia.org/wiki/Exponential_smoothing#Time_Constant

Так как статистика минибатча может быть шумной, CNTK также позволяет использовать оценку MAP (максимум a-posteriori) во время обучения, где выполняющаяся долгосрочная оценка принимается в качестве предыдущего. Вес предыдущего управляется параметром blendTimeConstant . Тем не менее, это не было найдено полезным до сих пор в наших экспериментах.

Обратите внимание, что во время вывода CNTK автоматически установит обе константы времени таким образом, чтобы использовалось только существующее среднее значение выполнения, и что он не обновляется. Пользователю не требуется явное действие.

Реализация cuDNN

По умолчанию эта функция использует реализацию CNTK, которая работает как с GPU, так и с процессорами. Вы можете использовать реализацию cuDNN, которая является более производительной. Однако обратите внимание, что реализация cuDNN не поддерживает все варианты, а для обучения требуется GPU (CNTK однако предоставляет эмуляцию ЦП для вывода, даже если выбрана реализация cuDNN).