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

Поздравляем! Вы развернули модель «единорога» . Ваша модель должна работать круглосуточно и без проблем. Для этого необходимо отслеживать конвейер машинного обучения (МО).

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

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

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

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

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

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

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

Хотя ваши необработанные данные могут соответствовать схеме данных, ваша модель не обучается на необработанных данных. Вместо этого ваша модель обучается на данных, прошедших генеалогическое моделирование. Например, ваша модель обучается на нормализованных числовых данных, а не на необработанных числовых данных. Поскольку данные, прошедшие генеалогическое моделирование, могут сильно отличаться от необработанных входных данных, необходимо проверять данные, прошедшие генеалогическое моделирование, отдельно от проверок необработанных входных данных.

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

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

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

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

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

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

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

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

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

Проверьте наличие перекосов между обучением и обслуживанием

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

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

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

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

Предположим, у вас есть интернет-магазин, и вы хотите спрогнозировать, сколько денег вы заработаете в определённый день. Цель вашего МО — спрогнозировать ежедневный доход, используя количество покупателей в качестве признака.

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

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

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

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

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

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

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

  • Булева функция: Есть ли у пациента рак?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Описанные выше подходы применимы как к выборке, так и к разделению данных.

Соображения по хешированию

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

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

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

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