Что такое learning rate (скорость обучения) в нейронных сетях?

«Что такое learning rate (скорость обучения) в нейронных сетях?» — вопрос из категории Нейронные сети и Deep Learning, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Learning rate (LR, скорость обучения) — это, пожалуй, самый важный гиперпараметр при обучении нейронной сети. Он определяет размер шага, который делает оптимизатор (например, SGD, Adam) при обновлении весов модели на каждой итерации в направлении, противоположном градиенту функции потерь.

Аналогия: Представьте, что вы спускаетесь с холма с завязанными глазами, ощущая уклон ногами (градиент). Learning rate — это длина вашего шага.

  • Слишком большой LR (большой шаг): Вы можете перепрыгнуть через дно долины (глобальный минимум) и начать карабкаться вверх по другому склону. В обучении это приводит к расхождению — ошибка растет, веса «взрываются», модель не обучается.
  • Слишком маленький LR (крошечный шаг): Спуск будет очень медленным. Вы можете застрять в небольшой ямке (локальный минимум) или на пологом склоне (плато) и никогда не дойдете до самой низкой точки. Обучение занимает много эпох и может остановиться в неоптимальном состоянии.

Пример задания LR в PyTorch:

import torch
import torch.nn as nn
import torch.optim as optim

# Простая модель
model = nn.Linear(10, 1)

# Определяем оптимизатор и явно задаем learning rate
optimizer = optim.SGD(model.parameters(), lr=0.01)  # Классический SGD с LR=0.01
# Или адаптивный оптимизатор, который использует LR как базовую величину
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam с LR=0.001 (часто используемое значение по умолчанию)

Практические стратегии работы с LR:

  1. Поиск начального значения: Часто начинают с 0.01, 0.001 или 0.0001. Используют методы вроде learning rate range test, чтобы найти диапазон, где ошибка стабильно снижается.
  2. Использование расписаний (LR Scheduler): Динамическое изменение LR в процессе обучения — ключ к успеху.

    from torch.optim.lr_scheduler import StepLR, ReduceLROnPlateau
    
    # Снижаем LR в 10 раз каждые 30 эпох
    scheduler1 = StepLR(optimizer, step_size=30, gamma=0.1)
    
    # Снижаем LR, когда метрика (val_loss) перестает улучшаться
    scheduler2 = ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=5)
    
    # Внутри цикла обучения:
    for epoch in range(num_epochs):
        # ... шаг обучения (optimizer.step()) ...
        scheduler1.step()           # Для StepLR
        # ИЛИ
        val_loss = ...
        scheduler2.step(val_loss)   # Для ReduceLROnPlateau
  3. Теплый старт (Warm-up): В начале обучения используют очень маленький LR, постепенно увеличивая его до основного значения. Это помогает стабилизировать обучение, особенно для больших моделей (например, трансформеров).