Какие критерии остановки в градиентном спуске вы знаете?

«Какие критерии остановки в градиентном спуске вы знаете?» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В градиентном спуске я использую несколько критериев остановки, которые комбинирую в зависимости от задачи:

Основные критерии:

  1. Достижение максимального числа итераций — самый простой гарантированный способ:

    max_iterations = 1000
    for i in range(max_iterations):
    # optimization step
    if i == max_iterations - 1:
        print("Достигнут лимит итераций")
  2. Норма градиента ниже порога — когда оптимизация близка к минимуму:

    import numpy as np
    gradient_norm = np.linalg.norm(gradient)
    if gradient_norm < 1e-6:
    print(f"Градиент достаточно мал: {gradient_norm:.2e}")
    break
  3. Изменение функции потерь незначительно — когда улучшения минимальны:

    loss_change = abs(prev_loss - current_loss)
    if loss_change < 1e-8:
    print(f"Изменение loss: {loss_change:.2e} < порога")
    break
  4. Ранняя остановка (Early Stopping) — для нейросетей отслеживаю валидационную ошибку:

    
    best_val_loss = float('inf')
    patience = 10
    no_improve_count = 0

for epoch in range(epochs): train_model() val_loss = evaluate_validation()

if val_loss < best_val_loss:
    best_val_loss = val_loss
    no_improve_count = 0
    save_best_model()
else:
    no_improve_count += 1

if no_improve_count >= patience:
    print(f"Ранняя остановка на эпохе {epoch}")
    break


**На практике** я часто комбинирую эти подходы. Для выпуклых задач с гарантированной сходимостью (например, линейная регрессия) использую критерий 2 или 3. Для глубокого обучения — обязательно раннюю остановку с мониторингом валидационной кривой.