Условие
Опишите early stopping: критерии, гиперпараметры, как избежать ложных стопов.
Решение
Подход
Early stopping: отслеживаем validation метрику; если она не улучшается patience эпох подряд — стоп, восстанавливаем best checkpoint.
Гиперпараметры:
patience— сколько эпох ждать без улучшения (5–30).min_delta— минимальное улучшение чтобы считать «улучшилось» (0.0001).mode—min(loss) илиmax(AUC).restore_best_weights— возврат к лучшим весам после стопа.
Реализация
class EarlyStopping:
def __init__(self, patience=10, min_delta=0.0, mode='min', restore_best=True):
self.patience = patience
self.min_delta = min_delta
self.mode = mode
self.restore_best = restore_best
self.best = None
self.counter = 0
self.best_weights = None
self.stopped = False
def step(self, score, model):
improved = (self.best is None or
(self.mode == 'min' and score < self.best - self.min_delta) or
(self.mode == 'max' and score > self.best + self.min_delta))
if improved:
self.best = score
self.counter = 0
if self.restore_best:
self.best_weights = {k: v.detach().clone() for k,v in model.state_dict().items()}
else:
self.counter += 1
if self.counter >= self.patience:
self.stopped = True
if self.restore_best and self.best_weights:
model.load_state_dict(self.best_weights)
return True
return FalseАльтернативные критерии
- Generalization Loss:
GL(t) = E_val(t)/min_E_val − 1. Стоп приGL > α. - Progress: окно с медленным train loss progress → нет смысла продолжать.
- PQ criterion:
GL/Progress > thresh.
В boosting
XGBoost / LightGBM имеют early_stopping_rounds: остановиться через k раундов без улучшения, отдать best_iteration.
import lightgbm as lgb
model = lgb.LGBMClassifier(n_estimators=10000)
model.fit(X_tr, y_tr,
eval_set=[(X_val, y_val)],
callbacks=[lgb.early_stopping(50)])Подводные камни
- Patience слишком мал: «шум» в val ведёт к stop в локальном максимуме. На neural nets patience обычно 20-50.
- Train shuffle нестабильный seed: val лосс с epoch-to-epoch шумом → ложные стопы. Зафиксируйте seed.
- Min_delta слишком большой → стоп слишком рано.
- Early stopping считается формой регуляризации. Можно вместо явной L2 на больших сетях.
- В CV: на каждом fold отдельный early stop, не сравнивайте напрямую n_iters между folds.
- Early stopping на test = leakage. Stop по val, финальная оценка на test.
Эталонный ответ
Stop через patience эпох без улучшения val (mode min/max, min_delta для шума). Восстанавливать best weights. Можно как замену L2 на больших сетях. Не использовать test для early stop — leakage.