Скорость обучения (learning rate) – это главный параметр при тренировке любой нейросети. Он определяет, насколько сильно модель обновляет свои внутренние настройки (веса) после каждой попытки решить задачу. Практический смысл этого параметра прост: он задает размер шага, с которым нейросеть движется к правильному ответу. Если шаг слишком большой, модель проскочит верное решение. Если слишком маленький – обучение займет недели или остановится на полпути.
| Какой вопрос закроем | Что это даст на практике |
| Как выбрать стартовое значение скорости обучения | Сможете запускать тренировку модели без долгого перебора параметров |
| Как по графику ошибок понять, что шаг выбран неверно | Научитесь диагностировать проблемы обучения и не тратить часы на зависшую сеть |
| Как и зачем менять скорость в процессе тренировки | Сможете “дожать” точность модели на последних эпохах |
Главное правило выбора скорости обучения
В машинном обучении поиск правильного ответа часто сравнивают со спуском с горы в тумане. Ваша задача – найти самую нижнюю точку (минимум ошибки). Скорость обучения – это длина вашего шага.
На практике вам редко нужно искать идеальное значение с нуля. Выбор стартовой скорости обучения зависит от того, какой алгоритм оптимизации (оптимизатор) вы используете в коде.
- Для оптимизатора Adam: Стандартное и самое надежное стартовое значение – 0.001 (в коде часто пишется как 1e-3). В 80% стандартных задач (табличные данные, базовая классификация картинок) это значение позволит модели начать уверенно обучаться.
- Для оптимизатора SGD (Stochastic Gradient Descent): Стандартное значение – 0.1 или 0.01. SGD требует более крупных шагов на старте, чем Adam.
- При дообучении готовой сети (Transfer Learning): Если вы взяли готовую модель и обучаете ее на своих данных, стандартные значения использовать нельзя – они разрушат уже имеющиеся знания сети. Используйте значения от 0.0001 до 0.00001 (от 1e-4 до 1e-5).
Как распознать ошибку по графику функции потерь (Loss)
Главный инструмент контроля – это график функции потерь (Loss). Он показывает, как меняется ошибка модели со временем. По его форме можно точно определить, что не так со скоростью обучения.
Сценарий 1: Значение Loss резко уходит вверх или выдает NaN
Причина: Скорость обучения слишком высока. Шаг настолько большой, что модель перепрыгивает яму с правильным решением и улетает вверх по склону “горы”. Происходит взрыв градиентов.
Что делать: Остановите обучение. Уменьшите скорость обучения ровно в 10 раз (например, с 0.01 до 0.001) и запустите заново.
Сценарий 2: Loss снижается, но график выглядит как широкая “пила”
Причина: Скорость обучения высоковата. Модель добралась до области правильных решений, но шаг слишком велик, чтобы попасть в самую глубокую точку. Модель “скачет” вокруг минимума от стенки к стенке.
Что делать: Если график сильно скачет в начале – уменьшите стартовый шаг в 2-5 раз. Если скачки начались ближе к концу обучения – вам нужно настроить расписание снижения скорости (об этом ниже).
Сценарий 3: Loss падает, но очень медленно, почти по прямой линии
Причина: Скорость обучения слишком низкая. Модель движется в правильном направлении, но микроскопическими шагами. Обучение займет неоправданно много времени, либо модель застрянет в локальном минимуме (небольшой ямке), приняв его за финальную цель.
Что делать: Увеличьте скорость обучения в 5-10 раз. Убедитесь, что график стал более крутым на первых эпохах.
Развилки: как управлять скоростью в процессе обучения
Держать скорость обучения одинаковой от начала до конца тренировки – плохая практика. Чтобы модель сначала быстро нашла нужную область, а потом аккуратно “прицелилась” в самый минимум ошибки, скорость нужно снижать. Это называется расписанием (Learning Rate Scheduler). Выбор зависит от вашей задачи.
Вариант 1: Снижение при выходе на плато (ReduceLROnPlateau)
Самый практичный и безопасный метод. Вы указываете модели следить за метрикой (например, точностью на проверочной выборке). Если метрика не улучшается в течение нескольких эпох (это называется “терпением” или patience), скорость обучения автоматически снижается в заданное число раз.
Когда применять: В любых нестандартных или новых задачах. Это защита от ситуации, когда вы не знаете, на какой эпохе модель замедлит обучение.
Вариант 2: Ступенчатое снижение (StepLR)
Вы жестко задаете правило: уменьшать скорость обучения, например, в 10 раз каждые 30 эпох.
Когда применять: Когда вы работаете со стандартными датасетами и известными архитектурами, где поведение модели предсказуемо. Часто используется при обучении сетей для распознавания изображений (ResNet, YOLO).
Вариант 3: Прогревом (Warmup) + косинусное затухание
Скорость обучения сначала плавно возрастает от нуля до максимума за первые несколько эпох, а затем медленно снижается по кривой косинуса.
Когда применять: Обязательно при обучении трансформеров (например, BERT, GPT) или очень глубоких нейросетей с нуля. Без “прогрева” такие архитектуры в начале обучения накапливают огромные ошибки и ломаются.
Ограничения и неочевидные случаи
При настройке скорости обучения нужно учитывать неочевидные связи с другими параметрами сети. Без них правильный выбор скорости может оказаться ошибочным.
Связь с размером батча (Batch Size)
Скорость обучения напрямую зависит от размера батча (количества примеров, которые сеть обрабатывает за один раз). Принято использовать линейное правило масштабирования: если вы увеличили размер батча в 2 раза, вам нужно увеличить скорость обучения также в 2 раза (или использовать корень из двух, в зависимости от оптимизатора). Если вы увеличили батч, но оставили старую скорость обучения, модель будет учиться слишком медленно.
Оптимизатор Adam не прощает слишком высоких значений
В отличие от SGD, оптимизатор Adam сам адаптирует скорость обучения для каждого отдельного веса внутри сети. Из-за этого базовая скорость для него является лишь верхним пределом. Если вы поставите Adam стартовую скорость 0.1, модель с вероятностью 99% не сойдется. Не переносите настройки скорости от алгоритма к алгоритму.
Скорость обучения не исправит плохие данные
Если график Loss не падает, не спешите бесконечно менять скорость обучения. Убедитесь, что в данных нет критических ошибок (например, перепутаны метки классов), а архитектура сети соответствует задаче. Если Loss стоит на месте при любых значениях скорости от 1e-1 до 1e-6, проблема гарантированно не в скорости обучения.
Коротко о главном
- Если сомневаетесь со стартом, ставьте Adam со скоростью 0.001.
- Для дообучения готовых сетей (файн-тюнинга) снижайте скорость до 0.0001 или ниже.
- Если Loss улетает в космос или выдает NaN – шаг слишком большой, делите на 10.
- Если Loss падает по миллиметру в час – шаг слишком мал, умножайте на 10.
- Никогда не учите сложную модель со статической скоростью до конца. Используйте автоматическое снижение при остановке прогресса (ReduceLROnPlateau).