Нормализация партии в сверточной нейронной сети

Я новичок в сверточных нейронных сетях и просто имею представление о картах функций и о том, как свертка выполняется на изображениях для извлечения функций. Я был бы рад узнать некоторые подробности о применении пакетной нормализации в CNN.

Я прочитал эту статью https://arxiv.org/pdf/1502.03167v3.pdf и смог понять алгоритм BN, примененный к данным, но в конце они упомянули, что небольшая модификация требуется при применении к CNN:

Для сверточных слоев мы дополнительно хотим, чтобы нормализация подчинялась сверточному свойству, так что различные элементы одной и той же карты признаков в разных местах нормализуются одинаково. Для этого мы совместно нормализуем все активации в мини-партии по всем местоположениям. В Alg. 1, пусть B - множество всех значений в карте функций на обоих элементах мини-пакетной и пространственной локаций - поэтому для мини-партии размера m и карт характеристик размером p × q мы используем effec - миниатюрная мини-партия размера m '= | B | = m · pq. Мы изучаем пару параметров γ (k) и β (k) для каждой функциональной карты, а не за активацию. Alg. 2 модифицируется аналогично, так что во время вывода преобразование BN применяет одно и то же линейное преобразование к каждой активации в данной карте характеристик.

Я смущен, когда они говорят ", так что разные элементы одной и той же карты функций в разных местах нормализуются одинаково"

Я знаю, какие значки карт означают, а разные элементы - веса в каждой карте характеристик. Но я не мог понять, что означает местоположение или пространственное местоположение.

Я не мог понять нижеследующее предложение вообще "В Алг. 1 мы обозначим B как совокупность всех значений в карте признаков для обоих элементов мини-пакетной и пространственной локаций"

Я был бы рад, если бы кто-то простудился и объяснил мне в гораздо более простых выражениях

Ответ 1

Начнем с терминов. Помните, что выход сверточного слоя представляет собой 4-ранг-тензор [B, H, W, C], где B - размер партии, (H, W) - размер карты объектов, C - количество каналов. Индекс (x, y), где 0 <= x < H и 0 <= y < W является пространственным расположением.

Обычный батнорм

Теперь, как батнорм применяется обычным способом (в псевдокоде):

# t is the incoming tensor of shape [B, H, W, C]
# mean and stddev are computed along 0 axis and have shape [H, W, C]
mean = mean(t, axis=0)
stddev = stddev(t, axis=0)
for i in 0..B-1:
  out[i,:,:,:] = norm(t[i,:,:,:], mean, stddev)

В основном, он вычисляет значения H*W*C и H*W*C стандартных отклонений в элементах B. Вы можете заметить, что разные элементы в разных пространственных местоположениях имеют свое собственное значение и дисперсию и собирают только значения B.

Батновер в conv-слое

Этот путь вполне возможен. Но сверточный слой обладает особым свойством: плотность фильтра распределяется по входному изображению (вы можете прочитать его подробно в этот пост). Поэтому разумно нормализовать вывод таким же образом, чтобы каждое выходное значение принимало среднее значение и дисперсию значений B*H*W в разных местах.

Вот как выглядит код в этом случае (опять-таки псевдо-код):

# t is still the incoming tensor of shape [B, H, W, C]
# but mean and stddev are computed along (0, 1, 2) axes and have just [C] shape
mean = mean(t, axis=(0, 1, 2))
stddev = stddev(t, axis=(0, 1, 2))
for i in 0..B-1, x in 0..H-1, y in 0..W-1:
  out[i,x,y,:] = norm(t[i,x,y,:], mean, stddev)

В целом, существуют только C средства и стандартные отклонения, и каждый из них вычисляется над значениями B*H*W. Это то, что они имеют в виду, когда говорят "эффективная мини-партия": разница между ними заключается только в выборе оси (или, что то же самое, "мини-пакетный выбор" ).

Ответ 2

Я всего лишь 70% уверен в том, что я говорю, поэтому, если это не имеет смысла, отредактируйте или упомяните об этом перед downvoting.

О location или spatial location: они означают положение пикселей на изображении или карте объектов. Карта функций сопоставима с редкой модифицированной версией изображения, где представлены понятия.

О so that different elements of the same feature map, at different locations, are normalized in the same way: некоторые алгоритмы нормализации являются локальными, поэтому они зависят от их близкого окружения (местоположения), а не от того, что далеко друг от друга в изображении. Они, вероятно, означают, что каждый пиксель, независимо от их местоположения, обрабатывается так же, как элемент набора, независимо от него, прямое особое окружение.

О In Alg. 1, we let B be the set of all values in a feature map across both the elements of a mini-batch and spatial locations: они получают плоский список всех значений каждого примера обучения в мини-чае, и этот список объединяет все, что бы их местоположение не было на карте функций.

Ответ 3

Некоторые уточнения по ответу Максима.

Я был озадачен, увидев в Керасе, что указанная вами ось является осью каналов, так как не имеет смысла нормализовать по каналам - так как каждый канал в сети рассматривается как отдельная "особенность". То есть нормализация по всем каналам эквивалентна нормализации количества спален размером в квадратные футы (пример многомерной регрессии из курса Эндрю М.Л.). Обычно это не то, что вы хотите - то, что вы делаете, это нормализует каждую функцию отдельно. То есть вы нормализуете количество спален во всех примерах с mu = 0 и std = 1, и вы нормализуете квадратные футы по всем примерам с mu = 0 и std = 1.

Вот почему вы хотите, чтобы C означало и stds, потому что вы хотите среднее и стандартное для каждого канала/функции.

После проверки и тестирования я сам понял проблему: здесь есть некоторая путаница/заблуждение. Ось, которую вы указываете в Керасе, на самом деле является осью, которой нет в расчетах. то есть вы получаете среднее значение по каждой оси, кроме той, которая указана в этом аргументе. Это сбивает с толку, так как это совершенно противоположное поведение, как работает NumPy, где указанная ось - это та, над которой вы выполняете операцию (например, np.mean, np.std и т.д.).

Я фактически построил игрушечную модель только с BN, а затем вычислил BN вручную - взял среднее значение, стандартное отклонение по всем 3 первым измерениям [m, n_W, n_H] и получил результаты n_C, рассчитанные (X-mu)/std (используя трансляции) и получил результаты, почти идентичные результатам Keras.

Надеюсь, это поможет любому, кто был смущен, как я.