Ответ
Слишком высокий learning rate (скорость обучения) нарушает процесс градиентного спуска, приводя к следующим проблемам:
- Расходимость (Divergence): Веса модели обновляются слишком агрессивно, заставляя функцию потерь не уменьшаться, а расти или бесконечно колебаться, никогда не достигая минимума.
- Пропуск оптимума: Шаг обновления настолько велик, что алгоритм постоянно "перепрыгивает" через глобальный или локальный минимум функции потерь.
- Нестабильность обучения: Потери на валидации и тренировочном наборе демонстрируют резкие, непредсказуемые скачки, а модель не может стабилизироваться.
Пример на PyTorch, иллюстрирующий проблему:
import torch
import torch.nn as nn
# Модель и данные
model = nn.Linear(10, 1)
optimizer_too_high = torch.optim.SGD(model.parameters(), lr=1.0) # Слишком высокий LR
optimizer_reasonable = torch.optim.SGD(model.parameters(), lr=0.01) # Разумный LR
# При lr=1.0 обновления весов будут чрезмерными, что, скорее всего, приведёт к расходимости.
Как с этим бороться:
- Начинать с малых значений (например, 1e-3, 1e-4) и использовать поиск по сетке.
- Внедрять планировщики скорости обучения (
torch.optim.lr_scheduler), которые уменьшают LR по мере обучения. - Использовать адаптивные оптимизаторы (Adam, RMSProp), которые автоматически настраивают шаг для каждого параметра, но они также чувствительны к чрезмерно высокому начальному LR.
- Всегда визуализировать кривую обучения для отслеживания нестабильности.
Ответ 18+ 🔞
Ну, представляешь картину: сидишь ты, настраиваешь нейронку, и думаешь — а дай-ка я сделаю learning rate побольше, чтобы она быстрее училась, ёпта! И вот ты выкручиваешь эту скорость обучения на овердохуища, как будто на тракторе в космос собрался. А потом смотришь на график потерь и понимаешь — ядрёна вошь, всё накрылось медным тазом.
Вот что происходит, когда learning rate слишком высокий, чувак:
- Всё разъезжается к чертям (Divergence). Это не обучение, а какой-то цирк. Веса модели начинают скакать так агрессивно, что функция потерь не падает, а наоборот — растёт или мечется туда-сюда, как угорелая. Минимума она не увидит никогда, просто будет прыгать вокруг да около, как хуй с горы.
- Пролетает мимо цели. Шаг обновления такой здоровенный, что алгоритм каждый раз "перепрыгивает" через ту самую ямку (минимум), где ему надо бы остановиться. Представь, ты целишься в лужу, а шаг такой широкий, что переступаешь её полностью. И так раз за разом.
- Полная нестабильность. Кривые на обучении и валидации выглядят не как плавные склоны, а как кардиограмма паникующего слона — резкие скачки туда-сюда. Модель не может успокоиться и нормально сойтись, терпения ноль ебать.
Смотри, какой наглядный пиздец на PyTorch:
import torch
import torch.nn as nn
# Модель и данные
model = nn.Linear(10, 1)
optimizer_too_high = torch.optim.SGD(model.parameters(), lr=1.0) # Слишком высокий LR
optimizer_reasonable = torch.optim.SGD(model.parameters(), lr=0.01) # Разумный LR
# При lr=1.0 обновления весов будут чрезмерными, что, скорее всего, приведёт к расходимости.
Видишь? Поставил lr=1.0, и всё — можно идти пить чай, потому что модель уже понеслась в разнос, ебать мои старые костыли.
Так как же не облажаться?
- Начинай с малого. Не умничай — бери маленькие значения (типа 1e-3, 1e-4) и уже от них пляши. Можно поиск по сетке сделать, если совсем припекает.
- Используй планировщики. В
torch.optim.lr_schedulerесть штуки, которые сами понижают скорость обучения по ходу дела. Очень спасают, чтобы не перегреться. - Доверься адаптивным оптимизаторам. Adam или RMSProp — они умные, подбирают шаг для каждого параметра отдельно. Но и тут не выёбывайся с начальным LR, а то и они сломаются.
- Следи за графиками! Это самое главное. Визуализируй кривую обучения. Если она пляшет как хитрая жопа на дискотеке — сразу ясно, что что-то не так, и LR надо убавить. Волнение ебать, но без этого никак.