Настройка автоматического переобучения модели (Model Retraining)
Модель, обученная один раз, неизбежно деградирует: данные меняются, поведение пользователей эволюционирует, появляются новые паттерны. Автоматическое переобучение — это система, которая отслеживает качество модели и запускает цикл обучения при обнаружении деградации или по расписанию.
Триггеры переобучения
Существует два подхода: schedule-based и trigger-based.
Schedule-based — переобучение по расписанию (ежедневно, еженедельно) независимо от качества модели. Прост в реализации, предсказуем, подходит для быстро меняющихся доменов (новостные рекомендации, динамическое ценообразование).
Trigger-based — переобучение при обнаружении дрифта или деградации метрик:
- Data drift: распределение входных данных изменилось (KS-тест, PSI > 0.2)
- Performance drift: метрики на labeled данных упали ниже порога
- Concept drift: связь между признаками и таргетом изменилась
На практике используют комбинацию: мягкие триггеры по дрифту + жёсткое расписание как fallback.
Архитектура системы переобучения
[Monitoring] → [Drift Detected / Schedule] → [Data Collection]
→ [Data Validation] → [Training Job] → [Evaluation]
→ [A/B Test / Canary] → [Promotion] → [Monitoring]
Оркестраторы: Airflow, Prefect, Kubeflow Pipelines, Vertex AI Pipelines.
Пример Airflow DAG:
from airflow import DAG
from airflow.operators.python import PythonOperator
dag = DAG(
'model_retraining',
schedule_interval='@weekly',
catchup=False
)
check_drift = PythonOperator(
task_id='check_data_drift',
python_callable=run_drift_detection,
dag=dag
)
collect_data = PythonOperator(
task_id='collect_training_data',
python_callable=prepare_dataset,
dag=dag
)
train = PythonOperator(
task_id='train_model',
python_callable=run_training,
dag=dag
)
check_drift >> collect_data >> train
Управление обучающими данными
Ключевой вопрос: какие данные включать в переобучение? Варианты:
- Full retrain: все исторические данные. Стабильно, но дорого по времени и вычислениям.
- Rolling window: только данные за последние N дней/недель. Модель забывает историю, но лучше адаптируется к текущим паттернам.
- Incremental learning: дообучение на новых данных без переобучения с нуля. Подходит не для всех алгоритмов.
- Weighted samples: старые данные с меньшим весом. Баланс между стабильностью и адаптацией.
Validation gate перед promotion
Автоматически переобученная модель не должна попадать в production без валидации:
def validate_new_model(new_model, current_model, test_dataset):
new_metrics = evaluate(new_model, test_dataset)
current_metrics = evaluate(current_model, test_dataset)
# Новая модель должна быть лучше текущей
if new_metrics['auc'] < current_metrics['auc'] * 0.99:
raise ValueError(f"New model AUC {new_metrics['auc']:.4f} "
f"worse than current {current_metrics['auc']:.4f}")
# Проверка latency
if new_metrics['p95_latency_ms'] > 100:
raise ValueError("Inference too slow")
return True
Управление экспериментами при автопереобучении
Каждый цикл переобучения логируется в MLflow с фиксацией: версии данных (DVC hash), гиперпараметров, метрик, времени обучения. Это позволяет ретроспективно проанализировать деградацию и найти момент, когда модель начала ухудшаться.
Типичный результат: команда переходит от ручного переобучения "когда вспомнят" (раз в 2-3 месяца) к автоматическому циклу с еженедельным обновлением и метриками качества, которые всегда актуальны.







