В процессе обучения нейросети значения активаций на разных слоях могут сильно меняться: числа становятся слишком большими или слишком маленькими. Это приводит к затуханию или взрыву градиентов, из-за чего сеть перестает учиться. Нормализация слоя (Layer Normalization, LayerNorm) – это технический прием, который принудительно приводит значения внутри слоя к единому масштабу. Это делает обучение стабильным, позволяет использовать высокую скорость обучения (learning rate) и является стандартом для современных архитектур, таких как Трансформеры.
| Что разберем | Что это даст на практике |
| Как физически работает LayerNorm | Поймете, как масштабируются данные и почему это спасает градиенты |
| LayerNorm или BatchNorm: что выбрать | Сможете подобрать правильный тип нормализации под свою архитектуру |
| Куда ставить слой нормализации | Избежите ошибок с затуханием сигнала в глубоких сетях (Pre-norm vs Post-norm) |
Как работает нормализация слоя
Суть любой нормализации – вычесть среднее значение и поделить на стандартное отклонение. Главный вопрос в том, по каким данным мы считаем это среднее.
В Layer Normalization расчет идет по всем признакам (нейронам/каналам) одного конкретного примера независимого от остальных данных.
Алгоритм работы внутри нейросети выглядит так:
- На вход слоя поступает вектор признаков для одного объекта (например, представление одного слова в тексте).
- Слой вычисляет среднее значение и дисперсию только для этих признаков конкретного вектора.
- Каждое значение в векторе сдвигается так, чтобы среднее стало равно нулю, а дисперсия – единице.
- К результату применяются два обучаемых параметра: gamma (масштаб) и beta (сдвиг). Они нужны, чтобы нейросеть могла при необходимости отменить нормализацию или сместить распределение, если это выгодно для решения задачи.
Пример для понимания:
Представьте, что три студента сдали три разных экзамена.
Если мы используем Batch Normalization, мы берем оценки всех студентов по математике и выводим средний балл по предмету.
Если мы используем Layer Normalization, мы берем оценки одного студента по всем трем предметам и смотрим, как он сдал конкретный экзамен относительно своего же среднего уровня. Нам не важно, сколько всего студентов пришло на сессию (размер батча).
Развилка: LayerNorm или BatchNorm
Это самый частый практический выбор при проектировании архитектуры. Выбор зависит от типа данных и размера батча.
| Критерий | Layer Normalization | Batch Normalization |
| Зависимость от размера батча | Не зависит. Отлично работает даже при батче = 1. | Критически зависит. При маленьком батче (меньше 8-16) статистика ломается, сеть не учится. |
| Тип сети/данных | Тексты (NLP), временные ряды, Трансформеры, рекуррентные сети (RNN/LSTM). | Сверточные сети (CNN), работа с изображениями (ResNet, YOLO). |
| Длина последовательности | Справляется с динамической длиной (предложения разной длины). | Плохо работает с динамической длиной, требует сложных обходных путей. |
Когда использовать Layer Normalization
1. В архитектурах Трансформеров (LLM, BERT, GPT)
В NLP-задачах длина предложений постоянно меняется. BatchNorm в таких условиях высчитывает некорректную статистику для “хвостов” длинных предложений. LayerNorm считает среднее по признакам каждого отдельного токена, поэтому длина последовательности на него не влияет. Это стандарт де-факто для всех современных языковых моделей.
2. В рекуррентных нейросетях (RNN, LSTM, GRU)
В RNN одни и те же веса применяются на каждом шаге времени. Если использовать BatchNorm, для каждого временного шага придется хранить свою статистику, что сложно реализуемо и нестабильно. LayerNorm нормализует скрытое состояние на каждом шаге независимо, предотвращая взрыв градиентов при обработке длинных цепочек.
3. В обучении с подкреплением (Reinforcement Learning) и онлайн-обучении
Когда агент взаимодействует со средой, данные часто поступают по одному кадру или состоянию (размер батча = 1). В таких условиях BatchNorm технически не может работать, а LayerNorm стабилизирует обучение без проблем.
Где можно ошибиться: Pre-norm против Post-norm
В архитектурах типа Трансформера есть два способа поставить слой Layer Normalization относительно блока внимания (Self-Attention) и полносвязной сети (Feed Forward). От этого выбора зависит, запустится ли обучение вообще.
Вариант 1: Post-norm (как в оригинальной статье Attention Is All You Need)
Порядок: Вход -> Внимание -> Сложение с остаточной связью (Add) -> LayerNorm.
- К чему приводит: В глубоких сетях градиенты на нижних слоях начинают затухать.
- Ограничение: Чтобы такая сеть сошлась, требуется сложная настройка “разогрева” скорости обучения (learning rate warmup). Без этого параметры улетят в бесконечность на первых же шагах.
Вариант 2: Pre-norm (современный стандарт, используется в GPT, LLaMA)
Порядок: Вход -> LayerNorm -> Внимание -> Сложение с остаточной связью (Add).
- К чему приводит: Остаточные связи (Skip Connections) остаются чистыми, по ним беспрепятственно течет градиент от самого конца сети к началу.
- Результат: Обучение стабильно с первой эпохи даже в сетях на сотни слоев. Не требует агрессивного warmup.
Практический вывод: Если вы собираете свой Трансформер или модифицируете существующий, всегда используйте архитектуру Pre-norm.
Частые ошибки и ограничения
Отказ от LayerNorm в пользу BatchNorm в сверточных сетях
Если вы строите классификатор картинок на базе CNN (сверток) и решите заменить BatchNorm на LayerNorm просто “потому что он новее”, качество работы сети упадет. В сверточных сетях пространственная структура признаков (соседние пиксели) имеет огромное значение. LayerNorm смешивает все каналы и пиксели одной картинки при расчете среднего, уничтожая часть полезной пространственной информации. Оставьте LayerNorm для последовательностей, а для картинок используйте BatchNorm или GroupNorm.
Замораживание параметров Gamma и Beta
Иногда при реализации кастомного слоя нормализации забывают добавить обучаемые параметры масштаба (gamma) и сдвига (beta), оставляя только чистую математическую нормализацию (вычитание среднего и деление на отклонение).
Почему это ошибка: Строгая нормализация может уничтожить способность слоя передавать определенные паттерны. Например, если слою важно выдать значения строго больше нуля для активации ReLU, жесткая нормализация сдвинет половину значений в минус. Параметры gamma и beta позволяют сети самой решить, нужно ли восстановить исходный масштаб данных после нормализации.
Игнорирование эпсилона
При делении на стандартное отклонение в формуле всегда прибавляется маленькое число epsilon (обычно 1e-5). Если при написании собственного слоя с нуля забыть его добавить, при нулевой дисперсии признаков вы получите деление на ноль, и все веса сети превратятся в NaN (Not a Number), что мгновенно убьет обучение.
Коротко о главном
- LayerNorm нормализует вектор признаков одного примера. Ему не важен размер батча.
- Если работаете с текстами, звуком, временными рядами или собираете Трансформер – ставьте LayerNorm.
- Если работаете с классическими свертками (CNN) и картинками – используйте BatchNorm.
- В Трансформерах всегда применяйте нормализацию до слоя внимания (Pre-norm), чтобы избежать затухания градиентов и сложной настройки гиперпараметров.