Weight Decay
Weight decay — это метод регуляризации, который стягивает веса модели к нулю, помогая нейронным сетям уменьшать переобучение и обобщать данные.
Weight decay — это метод регуляризации, который во время обучения стягивает обученные веса модели к нулю. Такое многократное уменьшение весов препятствует неоправданно большим значениям параметров и помогает нейронной сети обобщать данные на ранее не встречавшиеся примеры. Этот метод особенно полезен, когда у модели достаточно возможностей, чтобы запоминать шум в обучающих данных.
Джеффри Хинтон представил weight decay в своей статье 1986 года «Обучение распределённых представлений понятий». В эксперименте с генеалогическим древом он уменьшал величину весов на 0,2% после каждого обновления, чтобы упростить интерпретацию выученных связей. Впоследствии weight decay получил широкое распространение как способ контролировать переобучение.
Как работает weight decay#
При градиентном спуске оптимизатор изменяет параметры с помощью градиентов — производных, которые показывают, как каждый параметр влияет на функцию потерь. Weight decay стягивает параметры к нулю. В соглашении с масштабированием на скорость обучения, используемом многими оптимизаторами, обновление обычного SGD без момента записывается как new weight = (1 - learning rate × decay) × old weight - learning rate × gradient. В нём обучение на основе ошибок предсказаний сочетается с пропорциональным уменьшением весов.
Коэффициент затухания определяет силу этого стягивания. Нулевое значение отключает его, а при фиксированной скорости обучения более высокие положительные значения усиливают уменьшение весов. Градиент задачи всё ещё может увеличить вес, если это улучшает предсказания. При снижении скорости обучения постепенно уменьшается шаг оптимизатора, тогда как weight decay воздействует на значения параметров.
Weight decay и L2-регуляризация#
L2-регуляризация добавляет к целевой функции обучения масштабированную сумму квадратов весов. При обычном стохастическом градиентном спуске дифференцирование этого штрафа приводит к такому же пропорциональному уменьшению весов при соответствующем подборе коэффициентов. В линейной регрессии обучение с таким штрафом за квадраты весов называется гребневой регрессией.
При использовании оптимизатора Adam добавление штрафа L2 передаёт градиент штрафа через экспоненциальные скользящие средние Adam и масштабирование, зависящее от параметров. AdamW применяет уменьшение весов отдельно от этого адаптивного расчёта градиента. Илья Лошчилов и Фрэнк Хаттер представили AdamW в статье 2017 года «Регуляризация с развязанным затуханием весов», опубликованной на ICLR 2019. Такое разделение делает силу затухания независимой от масштабирования градиента на основе его истории в Adam.
Как выбрать силу затухания#
Weight decay — это гиперпараметр, который выбирают с помощью валидационных данных. Слишком слабое затухание недостаточно ограничивает переобучение. Чрезмерное затухание приводит к недообучению: модель не может выявить полезные закономерности, из-за чего ошибки на обучающих и валидационных примерах оказываются высокими. Сравнение результатов на валидации при разных значениях затухания помогает определить подходящую силу регуляризации для конкретной модели и набора данных.
Накопленный эффект также зависит от расписания скорости обучения и числа обновлений оптимизатора. Изменение размера пакета или числа эпох обучения может изменить количество применений затухания; при накоплении градиентов несколько пакетов объединяются перед обновлением. Слой dropout выполняет регуляризацию, случайным образом обнуляя активации, а ранняя остановка ограничивает длительность обучения.
Ultralytics YOLO предоставляет параметр обучения weight_decay со значением по умолчанию 0.0005, который управляет регуляризацией при обучении таких моделей, как YOLO26. В группы параметров оптимизатора не включаются смещения и параметры слоёв нормализации, поэтому weight decay на них не распространяется.
Weight decay в PyTorch#
Оптимизатор torch.optim.AdamW реализует развязанный weight decay в PyTorch. Установи пакет командой pip install torch; в этом примере создаётся нулевой градиент задачи, чтобы вывод показывал только эффект weight decay:
import torch
weight = torch.nn.Parameter(torch.tensor([2.0]))
optimizer = torch.optim.AdamW([weight], lr=0.1, weight_decay=0.1)
before = weight.item()
# Create a zero gradient while keeping the parameter in the computation.
optimizer.zero_grad()
loss = (weight * 0).sum()
loss.backward()
optimizer.step()
print(f"Weight: {before:.2f} -> {weight.item():.2f}")Результат — Weight: 2.00 -> 1.98: одно обновление умножает вес на 1 - 0.1 × 0.1, то есть на 0,99, уменьшая его величину на 1%.










