Почему переобучение на основе календаря терпит неудачу в производственной среде и как практический подход к обнаружению сбоев может работать в реальных системах.
Делиться

Вкратце:
Большинство моделей машинного обучения, используемых в производственных условиях, не демонстрируют плавного затухания — они дают сбой при внезапных, непредсказуемых шоках. Когда мы подогнали экспоненциальную «кривую забывания» к 555 000 мошеннических транзакций, имитирующих производственную ситуацию, она показала R² = −0,31 , что означает, что она показала худшие результаты, чем прогнозирование среднего значения.
Прежде чем устанавливать (или доверять) какому-либо графику переобучения, выполните эту диагностику из 3 строк для ваших существующих еженедельных показателей:
report = tracker.report() print(report.forgetting_regime) # «гладкий» или «эпизодический» print(report.fit_r_squared) # < 0.4 → отказаться от предположений о расписании
- R² ≥ 0,4 → Плавный режим → плановые работы по переподготовке
- R² < 0,4 → Эпизодический режим → использовать обнаружение шоков, а не календари
Если ваш коэффициент детерминации R² ниже 0,4, ваша модель не «распадается», и все, что получено на основе оценки периода полураспада, скорее всего, вводит в заблуждение.
Всё началось с одной недели.
Это была 7-я неделя.
Показатель отзыва снизился с 0,9375 до 0,7500 за семь дней. Тревоги не сработали. Совокупный ежемесячный показатель изменился на несколько пунктов — в пределах допустимых значений. На панели мониторинга отобразился зеленый цвет.
Эта единственная неделя свела на нет три недели улучшения модели. Десятки случаев мошенничества, которые модель раньше выявляла, прошли незамеченными. И стандартная модель экспоненциального затухания — математическая основа каждого графика переобучения, который я когда-либо создавал, — не просто не смогла это предсказать.
Оно предсказывало обратное.
R² = −0,31. Хуже, чем прямая линия.
Эта цифра изменила мое представление о MLOps. Не кардинально. Тихо. Это такое изменение, которое заставляет вернуться и пересмотреть предположение, которое ты годами придерживался, никогда не подвергая его сомнению.
Эта статья посвящена данному предположению, тому, почему оно ошибочно для целого класса производственных систем машинного обучения, и что делать вместо этого — с подкреплением реальными цифрами на общедоступном наборе данных, который можно воспроизвести за один день.
Полный код: https://github.com/Emmimal/mlops-forgetting-curve/
Предположение, которое никто не подвергает сомнению
Вся индустрия переподготовки кадров построена на одной-единственной идее, заимствованной у немецкого психолога XIX века.
В 1885 году Герман Эббингаус провел серию самоэкспериментов над человеческой памятью — запоминал списки бессмысленных слогов, измерял собственную способность к запоминанию через фиксированные интервалы и строил графики результатов во времени [1]. Он задокументировал четкую экспоненциальную зависимость:
R(t) = R₀ · e^(−λt)
Память угасает плавно. Предсказуемо. Со скоростью, пропорциональной оставшемуся объему памяти. Эта кривая стала одним из наиболее часто воспроизводимых результатов в когнитивной психологии и до сих пор остается основополагающим ориентиром в исследованиях памяти.
Столетие спустя сообщество специалистов по машинному обучению полностью переняло эту идею. Логика казалась убедительной: производственная модель со временем подвергается воздействию новых шаблонов, на которых она не обучалась, поэтому ее производительность постепенно и непрерывно снижается. Установите частоту переобучения, исходя из скорости снижения производительности. Оцените период полураспада. Составьте соответствующее расписание.
Каждая крупная платформа MLOps, каждое эмпирическое правило «переобучения каждые 30 дней», каждый автоматизированный калькулятор снижения производительности основаны на этом предположении.
Проблема в том, что никто не проверил это на основе производственных данных.
Так я и сделал.
Эксперимент
Я использовал набор данных Kaggle Credit Card Fraud Detection, созданный Картиком Шеноем [2] — синтетический набор данных из 1,85 миллиона транзакций, сгенерированный с помощью инструмента Sparkov Data Generation [3], охватывающий период с января 2019 года по декабрь 2020 года. Тестовая выборка содержит 555 719 транзакций за период с июня по декабрь 2020 года, с 2145 подтвержденными случаями мошенничества (распространенность 0,39%).
Моделирование было разработано таким образом, чтобы имитировать реалистичное развертывание в производственной среде:
- Модель: LightGBM [4] обучена один раз на исторических данных, никогда не переобучалась в течение тестового периода
- Основной показатель: полнота — при обнаружении мошенничества пропущенное мошенничество обходится на порядки дороже, чем ложная тревога, поэтому полнота является оперативно корректной целью [5]
- Оценка: Еженедельные скользящие окна на контрольном тестовом наборе данных, каждое окно содержит от 15 000 до 32 000 транзакций.
- Фильтры качества: окна с менее чем 30 подтвержденными случаями мошенничества были исключены — ниже этого порога еженедельные оценки полноты данных статистически ненадежны из-за крайнего дисбаланса в классах.
Базовый уровень был установлен с использованием среднего значения трех лучших показателей по запоминанию за первые шесть недель квалификационного периода — метод, разработанный для того, чтобы игнорировать шум, возникающий на ранней стадии разминки, и отслеживать результаты, близкие к пиковым.
26 недель производственной эффективности
Вот результаты полного моделирования, полученные в течение 26 квалификационных еженедельных периодов:
Неделя 1 [21.06.2020] n=19 982 мошенничество = 68 R=0,7647 Неделя 2 [28.06.2020] n=20 025 мошенничество = 100 R=0,8300 Неделя 3 [05.07.2020] n=20 182 мошенничество = 83 R=0,7831 Неделя 4 [12.07.2020] n=19 777 мошенничество = 52 R=0,8462 Неделя 5 [19.07.2020] n=19 898 мошенничество = 99 R=0,8586 Неделя 6 [26.07.2020] n=19 733 мошенничество = 64 R=0,9375 ← пик Неделя 7 [02.08.2020] n=20 023 мошенничество = 152 R=0.7500 ← худший шок (−0.1875) Неделя 8 [2020-08-09] n=19 637 мошенничество = 82 R=0.7439 Неделя 9 [2020-08-16] n=19 722 мошенничество = 59 R=0.7966 Неделя 10 [2020-08-23] n=19 605 мошенничество = 102 R=0.8922 Неделя 11 [2020-08-30] n=18 081 мошенничество = 84 R=0.8690 Неделя 12 [2020-09-06] n=16 180 мошенничество = 67 R=0.7910 Неделя 13 [2020-09-13] n=16 087 мошенничество = 63 R=0.8413 Неделя 14 [2020-09-20] n=15,893 мошенничество= 90 R=0.7444 Неделя 15 [2020-09-27] n=16,009 мошенничество= 81 R=0.8272 Неделя 16 [2020-10-04] n=15,922 мошенничество= 121 R=0.8264 Неделя 17 [2020-10-11] n=15,953 мошенничество= 111 R=0.8559 Неделя 18 [2020-10-18] n=15,883 мошенничество= 53 R=0.9245 ← восстановление Неделя 19 [2020-10-25] n=15,988 мошенничество= 73 R=0.8630 Неделя 20 [2020-11-01] n=15,921 мошенничество= 70 R=0.7429 ← второй шок Неделя 21 [2020-11-08] n=16,098 мошенничество= 59 R=0.9322 ← восстановление Неделя 22 [2020-11-15] n=15,835 мошенничество= 63 R=0.9206 Неделя 23 [2020-11-22] n=15,610 мошенничество= 91 R=0.9121 Неделя 24 [2020-11-29] n=30,246 мошенничество= 57 R=0.8596 ← объем удваивается Неделя 25 [2020-12-06] n=31,946 мошенничество= 114 R=0.7895 Неделя 26 [2020-12-13] n=31 789, мошенничество = 67, R=0,8507
Из анализа были исключены два периода: неделя с 20 декабря (всего 20 случаев мошенничества) и 27 декабря (ноль зарегистрированных случаев мошенничества — артефакт данных, характерный для праздничного периода).
Источник: towardsdatascience.com




















