Batch-normalization
Нормализация батчей (англ. batch-normalization) — это метод, который позволяет повысить производительность и стабилизировать работу искусственных нейронных сетей. Суть данного метода заключается в том, что некоторым слоям нейронной сети на вход подаются данные, предварительно обработанные и имеющие нулевое математическое ожидание и единичную дисперсию. Впервые данный метод был представлен в [1].
Идея
Нормализация входного слоя обычно выполняется путем масштабирования функции активации. Например, когда у нас есть признаки со значениями от 0 до 1 и некоторые признаки со значениями от 1 до 1000, то их необходимо нормализовать, чтобы ускорить обучение. То же самое можно сделать и для скрытых слоев нейронных сетей.
Нормализация батчей уменьшает величину, на которую смещаются значения узлов в скрытых слоях (т.н. смещение ковариации (англ. covariance shift)). Проиллюстрируем смещение ковариации примером. Пусть есть глубокая нейронная сеть, которая обучена определять находится ли на изображении роза. И нейронная сеть была обучена на изображении только красных роз. Теперь, если попытаться использовать обученную модель для обнаружения цветных роз, то, очевидно, результат будет неудовлетворительный. Обучающая и тестовая выборки содержат изображения роз, но немного отличаются. Другими словами, если модель обучена отображению из множества
в множество и если распределение элементов в изменяется, то появляется необходимость обучить модель заново, чтобы "выровнять" распределение элементов в и . Когда батчи содержат изображения, равномерно-распределенные на всем множестве, то смещение ковариации незначительно. Однако, когда батчи выбираются только из одного из двух подмножеств (в данном случае, красные розы и цветные розы), то смещение ковариации возрастает. Это довольно сильно замедляет процесс обучения модели.Простой способ решить проблему смещения ковариации для входного слоя — это рандомизировать данные перед созданием батчей. Но для скрытых слоев нейронной сети данный метод не подходит, так как распределение входных данных для каждого узла скрытых слоев изменяется каждый раз, когда происходит обновление параметров в предыдущем слое. Данная проблема называется внутренним смещением ковариации (англ. internal covariate shift). Для решения этой проблемы необходимо использовать маленький коэффициент скорости обучения и методы регуляризации. Но, для решения данной проблемы как раз и был придуман метод нормализация батчей.
Кроме того, нормализация батчей имеет несколько приемуществ:
- более быстрая сходимость моделей, несмотря на добавление новых вычислений;
- позволяет каждому слою сети обучатся более независимо от других слоев;
- становится возможно использование более высокого коэффициента скорости обучения, так как нормализация батчей гарантирует, что выходы узлов нейронной сети не будут иметь слишком больших или малых значений;
- нормализация батчей в каком-то смысле также является механизмом регуляризации: данный метод привносит в выходы узлов скрытых слоев некоторый шум, аналогично методу dropout;
- модели становятся менее чувствительны к начальной инициализации весов.
Описание метода
Опишем устройство метода нормализации батчей. Пусть, на вход некоторому слою нейронной сети поступает вектор размерности
: . Нормализуем данный вектор по каждой размерности :,
где математическое ожидание и дисперсия считаются по всей обучающей выборке. Такая нормализация входа слоя нейронной сети может изменить представление данных в слое. Чтобы избежать данной проблемы, вводятся два параметра сжатия и сдвига нормализованной величины для каждого
: , — которые действуют следующим образом:.
Данные параметры настраиваются в процессе обучения вместе с остальными гиперпараметрами модели.
Пусть, обучение модели производится с помощью батчей
размера : . Здесь нормализация применяется к каждой компоненте входа с номером отдельно, поэтому в индекс опускается для ясности изложения. Пусть, были получены нормализованные значения батча . Далее, после применения операций сжатия и сдвига были получены . Обозначим данную функцию нормализации батчей следующим образом:
Тогда, алгоритм нормализации батчей можно представить так:
Вход: значенияиз батча ; настраиваемые параметры ; константа для вычислительной устойчивости. Выход: // математическое ожидание батча // дисперсия батча // нормализация // сжатие и сдвиг
Заметим, что если
и , то равен , то есть является тождественным отображением. Таким образом, использование нормализации батчей не может привести к снижению точности, поскольку оптимизатор просто может использовать нормализацию как тождественное отображение.Обучение нейронных сетей с нормализацией батчей
Для обучения нейронных сетей необходимо вычислять градиент функции потерь
. В случае использования метода нормализации батчей градиент вычисляется следующим образом:
Нормализация батчей в свёрточных сетях
Нормализация батчей может быть применена к любой функции активации. Рассмотрим подробнее случай аффинного преобразования с некоторой нелинейной функцией:
,
где cигмоида или ReLU. Данной функцией можно описать как обычные, так и сверточные слои нейронных сетей. Так, нормализация батчей применяется сразу перед нелинейной функцией к . Параметр может быть проигнорирован последующим вычитание математического ожидания (затем роль этого параметра будет играть ). Поэтому может быть записано так:
и — настраиваемые параметры модели, а — некоторая нелинейная функция, например,
где
применяется отдельно к каждой размерности с отдельной парой параметров и для каждой размерности.В случае свёрточных сетей, дополнительно необходима нормализация, чтобы удовлетворить свойство свёрточных сетей, что различные элементы в разных местах одной карты признаков должны быть нормализованны одинаково. Чтобы этого добиться, нормализация выполняется совместно над всеми значениями в батче. Пусть,
— множество всех значений в карте признаков по всему батчу и всем точкам в карте признаков. Тогда для батча размера и карты признаков размера размер равен . Тогда, параметры и настраиваются для каждой карты признаков отдельно.