Learning Rate
learning rate — масштаб шага обновления параметров
Learning rate задаёт масштаб обновлений, которые делает оптимизатор. Слишком маленький шаг может не успеть за бюджет обучения, слишком большой — перескакивать полезную область или делать процесс нестабильным. Универсального значения нет.
Коротко
Learning rate, или LR, задаёт масштаб шага оптимизатора. Он не выбирает направление сам и не показывает «процент выученного». Направление формируется градиентом и правилами оптимизатора, а LR делает итоговое обновление крупнее или мельче.
На рельефной карте из инфографики маленькие шаги не успевают дойти до низины. Чрезмерные перескакивают её и колеблются между склонами. Подходящий для этого маршрута масштаб постепенно приводит к цели. В реальной нейросети ландшафт гораздо сложнее и меняется от batch к batch, но метафора передаёт главную роль LR.
Простая формула и её пределы
Для обычного градиентного спуска обновление записывают так:
θ_(t+1) = θ_t - η · ∇L(θ_t)
Здесь:
θ— параметры модели;L— функция ошибки;∇L— градиент, указывающий направление роста ошибки;η— learning rate.
Знак минус отправляет параметры в сторону уменьшения loss. Если η увеличить в два раза, шаг простого SGD при том же градиенте тоже станет вдвое больше.
Современный оптимизатор редко использует голый градиент. Momentum накапливает направление прошлых шагов, Adam оценивает первый и второй моменты градиента, другие методы вводят собственную нормировку и состояние. Поэтому общая запись выглядит точнее:
θ_(t+1) = θ_t - LR · update_t
update_t вычисляет оптимизатор. В оригинальной работе Adam обновление строится из адаптивных оценок моментов. Заданный LR остаётся важным глобальным масштабом, но фактическое изменение каждого параметра уже не равно LR × raw gradient.
Почему слишком маленький LR тоже может быть проблемой
Небольшой шаг обычно выглядит безопасным, но у обучения есть конечный бюджет. Если обновления слишком малы:
- loss улучшается медленно;
- нужный концепт не успевает сформироваться;
- scheduler может уменьшить LR раньше, чем модель дошла до полезной области;
- обновления могут стать сопоставимы с шумом градиента или точностью вычислений.
Такой запуск не обязательно «стабилен, просто требует времени». Изменение LR влияет на траекторию, взаимодействие с batch и состояние оптимизатора. Продлить обучение во много раз — не всегда то же самое, что выбрать больший шаг с начала.
Что происходит при чрезмерном LR
Слишком крупные обновления способны:
- заставить loss колебаться или расти;
- давать всплески нормы градиента и параметров;
- быстро разрушить полезные признаки базовой модели;
- сделать результаты соседних checkpoints резко разными;
- привести к численной нестабильности.
При этом ровный loss ещё не гарантирует подходящий LR. Адаптивный оптимизатор и gradient clipping могут скрыть часть симптомов, а качество на validation начнёт ухудшаться раньше очевидного взрыва.
Большой LR также не является синонимом overfitting. Переобучение — разрыв между train и новыми данными. Чрезмерный LR чаще создаёт проблему оптимизации, хотя оба эффекта могут появиться в одном запуске.
LR зависит от оптимизатора
Одинаковое число нельзя напрямую переносить между SGD, Adam, AdamW и другими алгоритмами. Они по-разному обрабатывают масштаб и историю градиентов. Дополнительно влияют:
- momentum и коэффициенты моментов;
- epsilon в знаменателе адаптивной нормировки;
- weight decay и способ его применения;
- gradient clipping;
- precision и loss scaling;
- разбиение параметров на группы.
Документация PyTorch подчёркивает, что оптимизатор хранит состояние и обновляет переданные ему параметры. LR — одна из настроек этого процесса, а не самостоятельный алгоритм обучения.
Некоторые оптимизаторы адаптируют относительный шаг для каждого параметра или группы. Это не означает, что внешний LR больше не важен. Скорее его смысл нужно читать вместе с формулой конкретного метода.
У одной тренировки может быть несколько LR
Параметры можно объединить в группы и назначить каждой собственные настройки. В персонализации изображений отдельно обновляются, например:
- адаптерные матрицы denoiser;
- текстовый энкодер;
- embedding нового токена;
- разные блоки одной сети.
Одна строка learning_rate в интерфейсе может быть лишь значением по умолчанию, поверх которого действуют групповые множители. Поэтому журнал с одним числом не всегда полностью описывает запуск.
Если текстовый энкодер и denoiser получают разные LR, их полезно логировать раздельно. Иначе сложно понять, какая часть менялась слишком быстро.
Learning-rate scheduler
LR не обязан оставаться постоянным. Scheduler меняет его по мере обучения. Общая схема:
LR_t = base_LR × multiplier(t)
Встречаются постоянные, линейно убывающие, cosine, ступенчатые и другие функции. Warmup в начале постепенно поднимает LR от малого значения; это уменьшает резкость первых обновлений, когда состояние оптимизатора ещё только формируется. Scheduler также может реагировать на plateau validation-метрики.
Форма расписания не имеет универсального победителя. Для короткого запуска длинный warmup способен занять большую часть обучения, а агрессивный decay — слишком рано почти остановить обновления. В длинной тренировке те же параметры ведут себя иначе.
Важно не путать LR scheduler с noise schedule. Первый управляет масштабом обновления весов при обучении. Второй связывает время диффузионного процесса с уровнем шума.
Batch size и правило линейного масштабирования
Больший batch обычно даёт менее шумную оценку градиента. Отсюда возникли эвристики, связывающие batch size и LR. Известное linear scaling rule использовалось в работе Accurate, Large Minibatch SGD: при масштабировании large-batch SGD для конкретной задачи LR увеличивали пропорционально batch и добавляли warmup.
Это полезный результат, но не закон для любого fine-tuning. Он не гарантирует ту же траекторию для:
- другого оптимизатора;
- очень малого датасета;
- адаптерного обучения;
- другого числа обновлений;
- накопления градиента;
- иной нормировки loss.
При gradient accumulation несколько microbatches предшествуют одному optimizer step. Effective batch растёт, а число обновлений при том же числе примеров уменьшается. Если одновременно скопировать LR и scheduler от другого запуска, меняется сразу несколько условий.
Как оценивать LR без магического числа
Полезнее не искать одно «правильное» значение, а сравнить небольшой диапазон в одинаковых условиях. Для каждого короткого пробного запуска сохраняются:
- кривая train loss;
- validation loss или целевая метрика;
- текущий LR каждой группы;
- нормы градиента и обновления, если они доступны;
- несколько одинаковых проверочных генераций;
- фактическое число optimizer steps.
Логарифмическая сетка удобнее линейной: различие между 1e-6 и 1e-5 по масштабу такое же, как между 1e-5 и 1e-4. Это не рекомендация конкретных значений, а способ сравнивать порядки величины.
Тест лучше повторять с несколькими seed обучения или хотя бы не делать вывод по одному случайному запуску. На малом датасете шум batch способен заметно изменить картину.
Научная запись маленьких чисел
Запись 1e-4 означает:
1 × 10⁻⁴ = 0.0001
А 5e-5 — это 0.00005. Чем более отрицательна степень, тем меньше число. Такая запись не несёт дополнительного смысла и нужна только для компактности.
Ноль — отдельный случай: при LR = 0 оптимизатор может обновлять внутреннее состояние, но параметры через LR-шаг не сдвинутся. Во время warmup нулевое начальное значение допустимо как точка расписания, а не как самостоятельный режим обучения.
С чем часто путают
- LR и loss. Loss измеряет ошибку, LR задаёт масштаб реакции оптимизатора.
- LR и epoch. Epoch считает проходы по данным, LR влияет на каждое обновление внутри них.
- LR и batch size. Batch определяет примеры для оценки градиента; универсальной формулы пересчёта LR нет.
- LR и weight decay. Weight decay меняет регуляризацию или отдельную часть обновления, в зависимости от оптимизатора.
- LR scheduler и noise schedule. Это расписания разных процессов.
- Base LR и фактический шаг. Оптимизатор, scheduler и параметрическая группа преобразуют базовое значение.
Частые вопросы
Какой LR выбрать для LoRA?
Одно значение для всех LoRA невозможно назвать честно. Оно зависит от архитектуры, оптимизатора, trainable-модулей, rank, batch, числа обновлений, scheduler и данных. Надёжнее взять воспроизводимую конфигурацию для той же связки и проверить небольшой диапазон на своём validation.
Cosine всегда лучше constant?
Нет. Это разные траектории LR. Результат зависит от длины запуска и того, когда модели нужны крупные или мелкие обновления. Сравнивать их стоит при одинаковом пиковом LR и бюджете вычислений.
Если loss почти не падает, нужно увеличить LR?
Возможно, но причина бывает и в данных, подписях, замороженных параметрах, ошибке загрузки, prediction target или слишком сильной регуляризации. Один симптом не определяет настройку однозначно.
Если loss скачет, LR слишком большой?
Это одна из частых причин. Также возможны выбросы в batch, численная нестабильность, неверное масштабирование loss и проблемы с данными. Нормы градиента и повторяемость всплесков помогают различить случаи.
Можно ли изменить LR при возобновлении обучения?
Да, если тренировочный код это поддерживает. Но новый LR продолжит работу с текущими весами и состоянием оптимизатора, поэтому это уже другая траектория. При точном resume сохраняются и scheduler, и счётчик шагов.
Главное
Learning rate — масштаб обновления, а не универсальная скорость «усвоения знаний». В SGD он напрямую умножает градиент, в адаптивных оптимизаторах — масштабирует более сложное обновление.
Подходящее значение существует только внутри конкретной связки модели, оптимизатора, групп параметров, batch и scheduler. Небольшие воспроизводимые пробы и честный validation говорят о нём больше, чем таблица значений для чужих запусков.