outputs = model(inputs) # Прямой проход

loss = criterion(outputs, labels) # Вычисление потерь

loss.backward() # Обратное распространение

optimizer.step() # Обновление весов

running_loss += loss.item()

# Обновление скорости обучения по планировщику

scheduler.step()

# Вывод информации об эпохе

print(f"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_loader):.4f}, LR: {scheduler.get_last_lr()[0]:.5f}")

```

Объяснение кода

1. Инициализация оптимизатора: Используется `SGD` (стохастический градиентный спуск) с начальной скоростью обучения ( 0.1 ) и моментом ( 0.9 ).

2. Планировщик скорости обучения: Планировщик `StepLR` уменьшает скорость обучения на фактор ( gamma = 0.5 ) каждые 5 эпох. Вывод текущего значения скорости обучения в конце каждой эпохи с помощью `scheduler.get_last_lr()`.

3. Прогресс скорости обучения: Сначала скорость обучения высокая (( 0.1 )) для быстрого уменьшения потерь, затем она постепенно уменьшается, что позволяет более точно достичь минимума функции потерь.

Этот подход показывает, как управлять скоростью обучения для повышения стабильности и эффективности процесса обучения.

2. Момент (Momentum)

 Момент (momentum) – это метод, используемый в алгоритмах оптимизации для улучшения процесса обновления весов модели. Он добавляет инерцию к изменениям параметров, что позволяет ускорять движение в правильном направлении и снижать влияние шумов в данных или градиентах. В традиционном стохастическом градиентном спуске (SGD) обновление весов выполняется только на основе текущего градиента, что может приводить к хаотичным движениям или замедлению в негладких областях функции потерь. Момент решает эту проблему, учитывая также направление предыдущих шагов, добавляя «память» об истории обновлений.

Главное преимущество использования момента заключается в ускорении сходимости, особенно в условиях, когда функция потерь имеет вытянутую форму (например, в долинах с высокой кривизной вдоль одной оси и малой вдоль другой). Без момента модель может двигаться слишком медленно в направлении с меньшим градиентом, расходуя значительное время на достижение минимума. С помощью момента обновления становятся более целенаправленными: модель быстрее движется по главной оси долины, не «петляя» в поперечных направлениях. Это также позволяет сгладить траекторию оптимизации, уменьшая колебания, которые могут возникать из-за шумов или изменений в мини-батчах данных.

В классической реализации SGD с моментом каждое обновление весов зависит как от текущего градиента, так и от накопленной скорости. Обычно момент задаётся коэффициентом (mu), который регулирует, насколько сильно предыдущие изменения влияют на текущие. Рекомендуемые значения коэффициента находятся в диапазоне от ( 0.9 ) до ( 0.99 ), что обеспечивает достаточную инерцию без чрезмерного накопления скорости. Например, значение ( mu = 0.9 ) часто используется на практике, так как оно позволяет ускорить обучение и стабилизировать модель даже при высокой скорости обучения.

Момент особенно эффективен при работе с глубокими нейронными сетями, где процесс оптимизации может быть сложным из-за большого числа параметров и глубоких локальных минимумов. Его использование делает модель менее чувствительной к случайным шумам и позволяет сохранять прогресс даже в условиях колеблющихся или изменяющихся градиентов. Такой подход улучшает общее поведение алгоритма, позволяя более быстро и стабильно достигать желаемой точности.

Пример использования момента в оптимизаторе SGD с библиотекой PyTorch. В данном коде показано, как момент влияет на процесс оптимизации и ускоряет сходимость.