Ответ
В градиентном спуске я использую несколько критериев остановки, которые комбинирую в зависимости от задачи:
Основные критерии:
-
Достижение максимального числа итераций — самый простой гарантированный способ:
max_iterations = 1000 for i in range(max_iterations): # optimization step if i == max_iterations - 1: print("Достигнут лимит итераций") -
Норма градиента ниже порога — когда оптимизация близка к минимуму:
import numpy as np gradient_norm = np.linalg.norm(gradient) if gradient_norm < 1e-6: print(f"Градиент достаточно мал: {gradient_norm:.2e}") break -
Изменение функции потерь незначительно — когда улучшения минимальны:
loss_change = abs(prev_loss - current_loss) if loss_change < 1e-8: print(f"Изменение loss: {loss_change:.2e} < порога") break -
Ранняя остановка (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. Для глубокого обучения — обязательно раннюю остановку с мониторингом валидационной кривой.