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).