Производственные системы ML: мониторинг конвейеров

Поздравляем! Вы применили модель единорога . Ваша модель должна работать круглосуточно и без проблем. Чтобы убедиться в этом, вы должны контролировать свой конвейер машинного обучения (ML).

Напишите схему данных для проверки необработанных данных.

Чтобы отслеживать свои данные, вам следует постоянно сверять их с ожидаемыми статистическими значениями, записывая правила, которым должны удовлетворять данные. Этот набор правил называется схемой данных . Определите схему данных, выполнив следующие действия:

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

  2. Закодируйте свое понимание в схему данных. Ниже приведены примеры правил:

    • Убедитесь, что оценки, представленные пользователями, всегда находятся в диапазоне от 1 до 5.
    • Убедитесь, что слово the встречается чаще всего (для текстовых функций на английском языке).
    • Убедитесь, что каждому категориальному признаку присвоено значение из фиксированного набора возможных значений.
  3. Проверьте свои данные на соответствие схеме данных. Ваша схема должна обнаруживать такие ошибки данных, как:

    • Аномалии
    • Неожиданные значения категориальных переменных
    • Неожиданное распределение данных

Напишите модульные тесты для проверки разработки функций.

Хотя ваши необработанные данные могут проходить через схему данных, ваша модель не обучается на необработанных данных. Скорее, ваша модель обучается на данных, которые были разработаны с помощью функций. Например, ваша модель обучается на нормализованных числовых характеристиках, а не на необработанных числовых данных. Поскольку разработанные функции могут сильно отличаться от необработанных входных данных, вы должны проверять разработанные функции отдельно от проверок необработанных входных данных.

Пишите модульные тесты, основываясь на своем понимании данных, разработанных с помощью функций. Например, вы можете написать модульные тесты для проверки следующих условий:

  • Все числовые функции масштабируются, например, от 0 до 1.
  • Векторы с горячим кодированием содержат только одну единицу и N-1 нулей.
  • Распределение данных после преобразования соответствует ожиданиям. Например, если вы выполнили нормализацию с использованием Z-показателей, среднее значение Z-показателей должно быть равно 0.
  • Выбросы обрабатываются, например, путем масштабирования или обрезки .

Проверьте метрики для важных фрагментов данных

Успешное целое иногда затмевает неудачное подмножество. Другими словами, модель с отличными общими показателями все равно может давать ужасные прогнозы для определенных ситуаций. Например:

Ваша модель единорога в целом работает хорошо, но плохо работает при прогнозировании пустыни Сахара.

Если вы относитесь к тому типу инженеров, которых устраивает в целом отличная AUC, то вы можете не заметить проблем модели в пустыне Сахара. Если важно делать хорошие прогнозы для каждого региона, вам необходимо отслеживать производительность для каждого региона. Подмножества данных, например, соответствующие пустыне Сахара, называются срезами данных .

Определите фрагменты данных, представляющие интерес. Затем сравните показатели модели для этих фрагментов данных с показателями всего набора данных. Проверка того, что ваша модель работает хорошо на всех срезах данных, помогает устранить предвзятость. Дополнительную информацию см. в разделе «Справедливость: оценка предвзятости» .

Используйте реальные показатели

Метрики модели не обязательно измеряют реальное влияние вашей модели. Например, изменение гиперпараметра может увеличить AUC модели, но как это изменение повлияет на взаимодействие с пользователем? Чтобы измерить реальное влияние, вам необходимо определить отдельные показатели. Например, вы можете опросить пользователей вашей модели, чтобы подтвердить, что они действительно видели единорога, когда модель предсказывала это.

Проверьте, нет ли перекоса в обслуживании обучения.

Неравномерность обслуживания при обучении означает, что входные данные во время обучения отличаются от входных данных при обслуживании. В следующей таблице описаны два важных типа перекоса:

Тип Определение Пример Решение
Перекос схемы Обучение и обслуживание входных данных не соответствуют одной и той же схеме. Формат или распределение обслуживающих данных меняется, пока ваша модель продолжает обучаться на старых данных. Используйте ту же схему для проверки данных обучения и обслуживания. Убедитесь, что вы отдельно проверяете статистику, не проверяемую вашей схемой, например долю пропущенных значений.
Перекос функций Инженерные данные различаются в зависимости от обучения и обслуживания. Код разработки функций различается при обучении и обслуживании, создавая разные инженерные данные. Подобно перекосу схемы, применяйте одни и те же статистические правила при обучении и предоставлении инженерных данных. Отслеживайте количество обнаруженных асимметричных объектов и соотношение асимметричных примеров на каждый объект.

Причины перекоса между обучением и обслуживанием могут быть незаметными. Всегда учитывайте, какие данные доступны вашей модели во время прогнозирования. Во время обучения используйте только те функции, которые будут вам доступны при обслуживании.

Упражнение: Проверьте свое понимание.

Предположим, у вас есть интернет-магазин и вы хотите спрогнозировать, сколько денег вы заработаете в определенный день. Ваша цель ML — спрогнозировать ежедневный доход, используя количество клиентов в качестве функции.

С какой проблемой вы можете столкнуться?
Нажмите здесь, чтобы увидеть ответ

Проверьте этикетку на предмет утечки

Утечка меток означает, что ваши основные истинностные метки, которые вы пытаетесь предсказать, случайно вошли в ваши обучающие функции. Утечку этикетки иногда очень сложно обнаружить.

Упражнение: Проверьте свое понимание.

Предположим, вы создаете модель бинарной классификации, чтобы предсказать, болен ли рак у нового пациента больницы. В вашей модели используются следующие функции:

  • Возраст пациента
  • Пол пациента
  • Предыдущие медицинские состояния
  • Название больницы
  • Жизненно важные признаки
  • Результаты испытаний
  • Наследственность

Этикетка выглядит следующим образом:

  • Логическое значение: Есть ли у пациента рак?

Вы тщательно распределяете данные, гарантируя, что ваш обучающий набор будет хорошо изолирован от вашего проверочного набора и тестового набора. Модель очень хорошо работает на проверочном и тестовом наборах; показатели фантастические. К сожалению, модель ужасно работает с новыми пациентами в реальном мире.

Почему эта модель, которая преуспела на тестовом наборе, с треском провалилась в реальном мире?
Нажмите здесь, чтобы увидеть ответ

Отслеживание возраста модели на протяжении всего конвейера

Если данные обслуживания со временем изменяются, но ваша модель не обновляется регулярно, вы увидите снижение качества модели. Отслеживайте время, прошедшее с момента переобучения модели на новых данных, и установите пороговый возраст для оповещений. Помимо отслеживания возраста модели при обслуживании, вы должны отслеживать возраст модели на протяжении всего конвейера, чтобы выявить зависания конвейера.

Проверьте, что веса и выходные данные модели численно стабильны.

Во время обучения модели ваши веса и выходные данные слоя не должны быть NaN (не числом) или Inf (бесконечным). Напишите тесты для проверки значений NaN и Inf ваших весов и выходных данных слоев. Кроме того, проверьте, что более половины выходных данных слоя не равны нулю.

Мониторинг производительности модели

Ваш предсказатель внешности единорога оказался популярнее, чем ожидалось! Вы получаете множество запросов на прогнозирование и еще больше обучающих данных. Вы думаете, что это здорово, пока не поймете, что вашей модели требуется все больше и больше памяти и времени для обучения. Вы решили отслеживать производительность своей модели, выполнив следующие действия:

  • Отслеживайте производительность модели по версиям кода, модели и данных. Такое отслеживание позволяет точно определить причину снижения производительности.
  • Проверьте количество шагов обучения в секунду для новой версии модели по сравнению с предыдущей версией и фиксированным пороговым значением.
  • Устраните утечки памяти, установив порог использования памяти.
  • Отслеживайте время ответа API и отслеживайте его процентили. Хотя время ответа API может находиться вне вашего контроля, медленные ответы потенциально могут привести к ухудшению реальных показателей.
  • Отслеживайте количество ответов на запросы в секунду.

Проверьте качество живой модели на предоставленных данных.

Вы подтвердили свою модель. Но что, если реальные сценарии, такие как поведение единорога, изменятся после записи данных проверки? Тогда качество вашей обслуживаемой модели ухудшится. Однако проверить качество обслуживания сложно, поскольку реальные данные не всегда маркируются. Если ваши данные о показах не помечены, рассмотрите следующие тесты:

  • Создавайте метки с помощью оценщиков .

  • Исследуйте модели, которые демонстрируют значительную статистическую погрешность в прогнозах. См. Классификация: смещение прогноза .

  • Отслеживайте реальные показатели вашей модели. Например, если вы классифицируете спам, сравните свои прогнозы со спамом, сообщаемым пользователями.

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

Используя эти тесты, не забывайте отслеживать как внезапное, так и медленное ухудшение качества прогнозирования.

Рандомизация

Сделайте свой конвейер генерации данных воспроизводимым. Предположим, вы хотите добавить функцию и посмотреть, как она повлияет на качество модели. Для честного эксперимента ваши наборы данных должны быть идентичными, за исключением этой новой функции. В этом духе убедитесь, что любая рандомизация при генерации данных может быть детерминированной:

  • Заполните свои генераторы случайных чисел (ГСЧ). Заполнение гарантирует, что RNG выводит одни и те же значения в одном и том же порядке каждый раз, когда вы его запускаете, воссоздавая ваш набор данных.
  • Используйте инвариантные хэш-ключи. Хеширование — это распространенный способ разделения или выборки данных. Вы можете хэшировать каждый пример и использовать полученное целое число, чтобы решить, в какое разделение поместить пример. Входные данные вашей хэш-функции не должны меняться каждый раз, когда вы запускаете программу генерации данных. Не используйте текущее время или случайное число в своем хэше, например, если вы хотите воссоздать свои хэши по требованию.

Предыдущие подходы применимы как к выборке, так и к разделению данных.

Рекомендации по хешированию

Представьте себе, что вы снова собираете поисковые запросы и используете хеширование для включения или исключения запросов. Если хеш-ключ использовал только запрос, то по данным за несколько дней вы либо всегда будете включать этот запрос, либо всегда его исключать. Всегда включать или всегда исключать запрос — это плохо, потому что:

  • В вашей обучающей выборке будет менее разнообразный набор запросов.
  • Ваши оценочные наборы будут искусственно сложными, поскольку они не будут пересекаться с вашими обучающими данными. На самом деле, во время обслуживания вы увидите часть живого трафика в своих обучающих данных, поэтому ваша оценка должна это отражать.

Вместо этого вы можете хешировать запрос + дату, что приведет к разному хешированию каждый день.

Рис. 7. Анимированная визуализация, показывающая, как хеширование исключительно по запросу приводит к тому, что данные попадают в одну и ту же корзину каждый день, но хеширование по запросу плюс время запроса приводит к тому, что данные каждый день попадают в разные корзины. Три сегмента: «Обучение», «Оценка» и «Игнорирование».
Рисунок 7. Хеширование по запросу в сравнении с хешированием по запросу + время запроса.