Learning rate: между медленно и расходится

Длина шага — самый важный гиперпараметр спуска: чуть мало — ползём, чуть много — улетаем в бесконечность.

Learning rate $\alpha$ — множитель длины шага. Слишком малый замедляет сходимость, слишком большой делает её расходящейся.

Три режима

Возьмём простейшую задачу $f(x)=x^2$, $\nabla f=2x$, дно в $x=0$. Шаг: $x_{k+1}=x_k-\alpha\cdot 2x_k=(1-2\alpha)x_k$. Поведение зависит от множителя $|1-2\alpha|$:

  • $0<\alpha<0.5$: $|1-2\alpha|<1$ — точка сходится к нулю.
  • $\alpha=0.5$: множитель $0$ — попадаем в минимум за один шаг.
  • $\alpha>1$: $|1-2\alpha|>1$ — точка расходится, улетает в бесконечность.

Эта простая модель даёт ключевой урок: существует критический шаг, после которого метод взрывается.

Демонстрация трёх режимов

def run(alpha, steps=8, x0=1.0):
    x = x0
    seq = [x]
    for _ in range(steps):
        x = x - alpha * 2 * x      # grad f = 2x
        seq.append(round(x, 4))
    return seq

print("alpha=0.1 (медленно): ", run(0.1))
print("alpha=0.5 (идеально): ", run(0.5))
print("alpha=0.9 (осцилляция):", run(0.9))
print("alpha=1.1 (расходится):", run(1.1))

Вывод:

alpha=0.1 (медленно):  [1.0, 0.8, 0.64, 0.512, 0.4096, 0.3277, 0.2621, 0.2097, 0.1678]
alpha=0.5 (идеально):  [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
alpha=0.9 (осцилляция): [1.0, -0.8, 0.64, -0.512, 0.4096, -0.3277, 0.2621, -0.2097, 0.1678]
alpha=1.1 (расходится): [1.0, -1.2, 1.44, -1.728, 2.0736, -2.4883, 2.986, -3.5832, 4.2998]

При $\alpha=0.9$ точка прыгает через минимум туда-сюда, но амплитуда тает — медленная сходимость с осцилляцией. При $\alpha=1.1$ прыжки растут — катастрофа.

Связь с кривизной

Критический шаг зависит от кривизны: для квадратичной функции спуск сходится при $0<\alpha<2/L$, где $L$ — максимальная кривизна (наибольшее собственное число гессиана, константа Липшица градиента). Чем круче стенки чаши, тем меньше допустимый шаг. Для $f=x^2$ кривизна $L=2$, отсюда порог $\alpha<1$, что мы и увидели.

Стратегии выбора шага

СтратегияСуть
Фиксированный $\alpha$Просто, но надо угадать
Расписание (decay)$\alpha_k=\alpha_0/(1+\gamma k)$ — уменьшать со временем
Line searchПодбирать $\alpha$ на каждом шаге (условие Армихо)
Адаптивный (Adam)Свой шаг для каждой координаты

Как работает под капотом

Условие Армихо — практичный способ выбрать $\alpha$ автоматически: уменьшать его вдвое, пока не выполнится $f(x_k-\alpha\nabla f)\le f(x_k)-c\,\alpha\lVert\nabla f\rVert^2$ с малым $c$ (например $10^{-4}$). Это гарантирует «достаточное» убывание и спасает от расходимости. В глубоком обучении line search дорог (нужно гонять весь датасет), поэтому там пользуются расписаниями и адаптивными методами вроде Adam.

Частые ошибки

  • Один и тот же $\alpha$ для разных функций. Подходящий шаг зависит от масштаба и кривизны.
  • Увеличивать $\alpha$ при медленной сходимости вслепую. Можно перешагнуть критический порог и взорваться.
  • Не нормировать данные. Сильно разномасштабные переменные делают чашу оврагом и режут допустимый шаг.

Итоги

  • $\alpha$ балансирует между «медленно» и «расходится»; есть критический порог $\sim 2/L$.
  • Большой шаг даёт осцилляцию, затем расходимость; идеальный — мгновенную сходимость.
  • Шаг подбирают расписанием, line search (Армихо) или адаптивно (Adam).
Проверьте себя
1. Что происходит при слишком большом learning rate?
AСходимость ускоряется без последствий
BТочка осциллирует и в итоге расходится
CФункция всегда убывает
DМетод находит глобальный минимум
2. От чего зависит критический (максимально допустимый) шаг?
AОт числа переменных
BОт кривизны: $\alpha&lt;2/L$, где $L$ — максимальная кривизна
CОт значения функции
DНи от чего, всегда 0.1
3. В чём идея условия Армихо при выборе шага?
AБрать максимальный шаг
BУменьшать $\alpha$, пока функция не уменьшится достаточно
CФиксировать $\alpha=1$
DИгнорировать градиент