Зачем нужен learning rate и за что он отвечает?
Что проверяют
Понимаете ли вы, как шаг градиентного спуска влияет на сходимость, и умеете ли подбирать его на практике, а не только давать определение. Следом обычно спрашивают про расписания learning rate и про то, нужно ли его настраивать, если используется Adam.
Как отвечать
Learning rate задаёт размер шага при обновлении весов: w -= lr * grad. Градиент показывает направление, а learning rate решает, насколько далеко по нему шагнуть.
- слишком большой: loss скачет, растёт или уходит в
NaN, модель перепрыгивает минимум; - слишком маленький: обучение идёт медленно, loss надолго застревает на плато, бюджет эпох заканчивается раньше, чем модель вышла на хорошее качество;
- адаптивные оптимизаторы: Adam, AdamW и RMSprop масштабируют шаг для каждого параметра отдельно, но общий learning rate у них остаётся. У
torch.optim.Adamпо умолчанию1e-3, для дообучения трансформеров обычно берут от1e-5до5e-5; - расписания: разогрев (warmup) в начале и затухание дальше, например косинусное. В PyTorch это
CosineAnnealingLR,OneCycleLR,ReduceLROnPlateau; - связь с батчем: при увеличении батча learning rate обычно тоже увеличивают, для SGD часто пропорционально и с разогревом.
Подбирают по логарифмической сетке (1e-4, 3e-4, 1e-3) или через LR range test: learning rate плавно растёт за несколько сотен шагов, и берут значение примерно на порядок ниже точки, где loss перестаёт падать и начинает расти.
В градиентном бустинге тот же параметр уменьшает вклад каждого дерева: в XGBoost eta по умолчанию 0.3, в LightGBM learning_rate 0.1. Чем он меньше, тем больше нужно деревьев.
Где спотыкаются
Говорят, что Adam подбирает learning rate сам и настраивать ничего не нужно. Неудачное значение ломает обучение и с Adam.
Перебирают значения по линейной сетке вроде 0.01, 0.02, 0.03. Learning rate влияет по порядкам величины, поэтому сетка должна быть логарифмической.
Меняют размер батча или оптимизатор, оставляют прежний learning rate, а потом сравнивают модели и делают выводы про архитектуру.