дисперсия будет 0
Нет, не будет; BatchNormalization
вычисляет статистику только по одной оси (обычно по оси каналов, =-1
(последняя) по умолчанию); каждая другая ось свернута , т.е. суммирована для усреднения; подробности ниже.
Более важно, однако, если вы не можете явно объяснить это, я советую не использовать BatchNormalization
с batch_size=1
; На это есть веские теоретические причины, и во многих публикациях было показано снижение производительности BN для batch_size
до 32 и значительно для <= 8. В двух словах, статистика партии, «усредненная» по одной выборке, сильно отличается от выборки к выборке (высокая дисперсия), и механизмы BN работают не так, как предполагалось. </p>
Малые альтернативы мини-партии : Перенормировка партии - Нормализация слоя - Нормализация веса
Подробности реализации : из исходный код :
reduction_axes = list(range(len(input_shape)))
del reduction_axes[self.axis]
В конце концов, tf.nn.monents
вызывается с axes=reduction_axes
, который выполняет reduce_sum
для вычисления variance
. Затем в бэкенде TensorFlow mean
и variance
передаются в tf.nn.batch_normalization
для возврата входных данных, нормализованных по ходу или выводу.
В других словами, если вы введете (batch_size, height, width, depth, channels)
или (1, height, width, depth, channels)
, то BN выполнит вычисления по измерениям 1
, height
, width
и depth
.
Может дисперсия когда-нибудь будет равна нулю? - да, если каждый отдельный элемент данных для любого заданного среза channel
(вдоль каждого измерения) одинаков. Но это должно быть почти невозможно для реальных данных.
Другие ответы : первый вводит в заблуждение:
добавляется небольшое рациональное число ( 1e-19
) к дисперсии
Этого не происходит при вычислении дисперсии, но добавляется к дисперсии при нормализации; тем не менее, это редко необходимо, так как variance
далеко от нуля. Кроме того, термин эпсилон на самом деле по умолчанию равен 1e-3
Керасом; он выполняет роль в регуляризации, а не просто избегает деления на ноль.