Что происходит при слишком большом learning rate?

Ответ

Слишком высокий learning rate (скорость обучения) нарушает процесс градиентного спуска, приводя к следующим проблемам:

  1. Расходимость (Divergence): Веса модели обновляются слишком агрессивно, заставляя функцию потерь не уменьшаться, а расти или бесконечно колебаться, никогда не достигая минимума.
  2. Пропуск оптимума: Шаг обновления настолько велик, что алгоритм постоянно "перепрыгивает" через глобальный или локальный минимум функции потерь.
  3. Нестабильность обучения: Потери на валидации и тренировочном наборе демонстрируют резкие, непредсказуемые скачки, а модель не может стабилизироваться.

Пример на 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 слишком высокий, чувак:

  1. Всё разъезжается к чертям (Divergence). Это не обучение, а какой-то цирк. Веса модели начинают скакать так агрессивно, что функция потерь не падает, а наоборот — растёт или мечется туда-сюда, как угорелая. Минимума она не увидит никогда, просто будет прыгать вокруг да около, как хуй с горы.
  2. Пролетает мимо цели. Шаг обновления такой здоровенный, что алгоритм каждый раз "перепрыгивает" через ту самую ямку (минимум), где ему надо бы остановиться. Представь, ты целишься в лужу, а шаг такой широкий, что переступаешь её полностью. И так раз за разом.
  3. Полная нестабильность. Кривые на обучении и валидации выглядят не как плавные склоны, а как кардиограмма паникующего слона — резкие скачки туда-сюда. Модель не может успокоиться и нормально сойтись, терпения ноль ебать.

Смотри, какой наглядный пиздец на 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 надо убавить. Волнение ебать, но без этого никак.