Как ответить
Обычно я передаю в оптимизатор три группы параметров: скорость обучения, моментум/беты и регуляризацию. Чаще всего использую AdamW с learning rate 1e-4–3e-4, weight decay 0.01–0.1 и betas=(0.9, 0.999). Для некоторых задач беру SGD с моментумом 0.9 и lr=0.01, но там обязательно нужен learning rate scheduler (например, CosineAnnealing или ReduceLROnPlateau). Конкретные значения подбираю по кривым обучения и валидационной loss.
Вот типичный код на PyTorch:
optimizer = torch.optim.AdamW(
model.parameters(),
lr=3e-4,
betas=(0.9, 0.999),
eps=1e-8,
weight_decay=0.05
)Параметры выбираю так:
- Learning rate — самый важный. Для Adam начинаю с 3e-4, для SGD — с 1e-2. Если loss не падает, уменьшаю в 10 раз.
- Betas — редко трогаю. Стандартные (0.9, 0.999) работают почти везде. На разреженных последовательностях иногда ставлю первый beta ближе к 0.99.
- Weight decay — обязательно для больших моделей (BERT, ResNet). Пробегаю по сетке [0.01, 0.05, 0.1] через early stopping.
- Eps — оставляю 1e-8, только если модель нестабильна, поднимаю до 1e-7.
- Nesterov — включаю при SGD с моментумом, даёт +1–2% точности на CIFAR.
- Scheduler — обязателен для долгой сходимости. Часто использую CosineAnnealingWarmRestarts с T_0=5, T_mult=2.
Ещё важный момент — передавать параметры слоёв с разными lr (например, embedding с меньшей lr для fine-tuning). Для этого собираю список параметров с разными 'params' и 'lr' в groups.
В итоге: без планировщика даже правильно подобранный lr перестаёт сходиться к концу обучения, поэтому scheduler — часть конфигурации оптимизатора.