Почему пакетная нормализация не ‘зануляет’ пакет размера один?

Вопрос или проблема

Я использую Tensorflow. Рассмотрим следующий пример:

>>> x
<tf.Tensor: shape=(1,), dtype=float32, numpy=array([-0.22630838], dtype=float32)>
>>> tf.keras.layers.BatchNormalization()(x)
<tf.Tensor: shape=(1,), dtype=float32, numpy=array([-0.22619529], dtype=float32)>

Кажется, что изменений нет вообще, кроме, возможно, небольших возмущений из-за эпсилон.
Разве нормализованный образец размером один не должен быть просто нулевым тензором?

Я подумал, может быть, проблема в том, что размер батча = 1 (дисперсия в этом случае равна нулю, так как сделать дисперсию равной 1)
Но я пробовал другие простые примеры с разными формами и установкой

axis=0,1 и т. д.

параметра на разные значения. Ничто из этого вообще не вносит изменений.

Может быть, я просто неправильно использую API?

Возможно, вы запускаете нормализацию батча с бегущим средним, и оно объединяет среднее и стандартное отклонение единственного образца с начальными значениями среднего и дисперсии. Попробуйте установить momentum в 0 (я думаю, также попробуйте 1, суть в том, чтобы отключить текущий расчет), и тогда, возможно, это решит проблему.

.

Ответ или решение

Понимание того, почему нормализация по батчам (Batch Normalization) не "обнуляет" батч размера один, требует осознания как теоретических основ этой техник, так и её практической реализации в Tensorflow.

Теория

Нормализация по батчам — это техника, используемая в обучении нейронных сетей для стабилизации и ускорения обучения. Идея заключается в том, чтобы линейно нормализовать входные данные каждого слоя путем применения среднего значения и стандартного отклонения на уровне мини-батчей. Этот процесс приводит распределение активаций слоев к стандартному нормальному распределению, уменьшая спектр изменения градиентов и способствуя более стабильному и быстрому обучению модели.

При нормализации батча размера один, возникает проблема: стандартное отклонение такого батча равно нулю (так как все значения одинаковы), что теоретически создает неопределенную ситуацию при делении на ноль. Однако на практике эта проблема решается добавлением небольшого значения, известного как эпсилон, к стандартному отклонению.

Пример

Рассмотрим следующую реализацию в Tensorflow:

>>> x
<tf.Tensor: shape=(1,), dtype=float32, numpy=array([-0.22630838], dtype=float32)>
>>> tf.keras.layers.BatchNormalization()(x)
<tf.Tensor: shape=(1,), dtype=float32, numpy=array([-0.22619529], dtype=float32)>

Здесь мы видим, что нормаализованное значение практически не изменилось. Это связано с тем, что нормализация по батчам использует обучаемые параметры сдвига и масштаба (gamma и beta), которые позволяют модели сохранять определенные трансформации на уровнях даже при нормализации.

Применение

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

  1. Running Mean and Variance: Если используется "скользящее среднее" и "скользящая дисперсия", они учитывают предыдущие батчи, что может повлиять на результат. Настройка momentum определяет, как быстро эти статистики адаптируются к новым данным.

  2. Параметры масштаба и сдвига: Внутренние параметры слоя нормализации, которые обучаются и могут быть настраиваемы, должны быть правильно инициализированы и, если необходимо, заморожены.

  3. Параметр epsilon: Использование эпсилона помогает избежать делений на ноль. Убедитесь, что это значение достаточно мало, чтобы не вносить значительные искажения в данные, но достаточно велико для обеспечения стабильности.

Таким образом, нормализация по батчам не приводит к нулевому результату на батче из одного элемента из-за использования параметров сдвига и масштаба, а также механизма скользящих значений. Для более правильной настройки нормализации следует правильно выбирать и настраивать параметры слоя и алгоритма обучения.

Оцените материал
Добавить комментарий

Капча загружается...