Weight decay — это метод регуляризации, который при обучении нейронной сети штрафует модель за слишком большие значения весов. Идея проста: если вес становится чрезмерно большим, он получает «штраф», и обучение стремится его уменьшить. Это заставляет сеть искать более простые решения, которые лучше обобщают на новые данные, а не заучивают обучающую выборку наизусть.
Чаще всего weight decay реализуется как добавление к функции потерь слагаемого, пропорционального сумме квадратов весов. Именно поэтому его часто отождествляют с L2-регуляризацией.
Как это работает
Во время обучения нейросеть минимизирует функцию потерь, которая измеряет, насколько предсказания модели отличаются от правильных ответов. Weight decay добавляет к этой функции дополнительный член. Если обозначить исходную функцию потерь как Ltrain, а вектор всех весов модели как w, то итоговая функция потерь выглядит так:
L = Ltrain + (λ / 2) · Σ wi²
Здесь λ (лямбда) — гиперпараметр, который задаёт силу штрафа. Чем он больше, тем сильнее модель «прижимает» веса к нулю. При вычислении градиента этого дополнительного слагаемого появляется член λ · wi. Это означает, что на каждом шаге обучения каждый вес уменьшается на величину, пропорциональную его текущему значению. Именно этот эффект и называют «затуханием весов».
Важно различать weight decay и L2-регуляризацию. Для классического стохастического градиентного спуска (SGD) они математически эквивалентны. Однако для адаптивных оптимизаторов, таких как Adam, это не так. В Adam L2-штраф добавляется к градиенту, который затем нормализуется, из-за чего эффект регуляризации искажается. Поэтому в 2019 году был предложен AdamW — вариант Adam, в котором weight decay применяется напрямую к весам, минуя адаптивную нормализацию градиента. AdamW стал стандартом де-факто для обучения современных трансформеров и других архитектур.
Зачем это нужно
Главная задача weight decay — борьба с переобучением. Переобученная модель отлично работает на обучающих данных, но плохо справляется с новыми примерами. Штраф за большие веса заставляет сеть использовать меньшие значения коэффициентов, что делает функцию, которую она аппроксимирует, более гладкой и простой. Простые модели, как правило, лучше обобщают.
Кроме того, weight decay помогает в ситуациях, когда обучающих данных мало или когда признаки коррелируют между собой. Без регуляризации веса могут «раздуваться», компенсируя друг друга, что приводит к нестабильному обучению. Регуляризация стабилизирует этот процесс.
Примеры
- Обучение ResNet-50 на CIFAR-10: Стандартный рецепт включает SGD с weight decay = 5e-4. Без него точность на тестовой выборке падает на несколько процентных пунктов из-за переобучения.
- Файн-тюнинг BERT для классификации текстов: В большинстве публичных реализаций используется AdamW с weight decay = 0.01. Это значение стало практически стандартным для трансформеров.
- Генеративно-состязательные сети (GAN): В дискриминаторе часто применяют weight decay, чтобы предотвратить ситуацию, когда он становится слишком «уверенным» и перестаёт давать генератору полезный сигнал.
- Линейная регрессия с большим числом признаков: Ridge-регрессия — это та же L2-регуляризация. Если признаков больше, чем объектов, обычная линейная регрессия переобучается. Ridge с weight decay решает эту проблему.
Формула или метрика
Итоговая функция потерь с weight decay:
L = Ltrain + (λ / 2) · ||w||²
Градиент по весу wi:
∂L / ∂wi = ∂Ltrain / ∂wi + λ · wi
Правило обновления веса при SGD:
wi ← wi − η · (∂Ltrain / ∂wi + λ · wi)
Здесь η — скорость обучения (learning rate). Типичные значения λ варьируются от 1e-5 до 1e-2 в зависимости от архитектуры и задачи.
Типичные ошибки
- Применение weight decay к bias и параметрам нормализации. Смещения (bias) и параметры слоёв BatchNorm/LayerNorm обычно не регуляризуются. Штраф на них может ухудшить обучение. В PyTorch для этого принято разделять параметры на группы.
- Слишком большое значение λ. Если штраф слишком сильный, модель становится недообученной: веса «прижимаются» к нулю, и сеть теряет способность улавливать даже простые закономерности.
- Использование L2-регуляризации в Adam вместо weight decay. Как показано в работе Loshchilov & Hutter, L2-штраф в Adam работает не так, как ожидается, из-за взаимодействия с адаптивной нормализацией градиента. Для Adam и его вариантов следует использовать именно decoupled weight decay (AdamW).
- Подбор λ без учёта learning rate. В некоторых реализациях (например, в оригинальном AdamW) weight decay не полностью отделён от learning rate. При использовании learning rate schedules это может приводить к непредсказуемому поведению.
Как улучшить
- Разделяйте параметры на группы. Применяйте weight decay только к весам линейных и свёрточных слоёв. Bias, параметры нормализации и embeddings (в некоторых случаях) оставляйте без регуляризации. Это стандартная практика в обучении трансформеров.
- Используйте AdamW вместо Adam + L2. Если ваш оптимизатор — Adam или его адаптивный вариант, выбирайте decoupled weight decay. Это даёт более предсказуемый и обычно лучший результат.
- Подбирайте λ через валидацию. Начните с типичных значений (0.01 для AdamW, 5e-4 для SGD) и проверяйте на валидационной выборке. Диапазон для поиска: от 1e-5 до 1e-1 по логарифмической шкале.
- Рассмотрите расписание для weight decay. В некоторых задачах (например, при обучении с большим числом эпох) полезно постепенно уменьшать λ или использовать его вместе с learning rate schedule. Исследования показывают, что это может улучшить финальное качество.
- Экспериментируйте с целевой нормой весов (Weight Norm Control). Вместо простого затухания к нулю можно задавать целевую норму весов, к которой модель стремится в процессе обучения. Это более общий подход, предложенный в работе Loshchilov (2023).