Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Примечание: Это первая статья из серии, в которой мы исследуем задачу обнаружения дрейфа данных. Мы разбираем не только, почему это очень важная часть мониторинга моделей, но также обсуждаем методы и подходы, которые следует взять на заметку. В первой части этой серии мы обсуждаем дрейф в контексте табличных данных и описываем одномерные и многомерные методы решения этой задачи. В следующих постах мы рассмотрим неструктурированные данные, такие как изображения и документы, и обсудим, как мы можем построить системы обнаружения дрейфа в этих более сложных данных.
Часть первая: Дрейф многомерных табличных данных
Мониторинг текущей результативности модели машинного обучения требует мониторинга данных, поступающих в эту модель. Это означает, что поступающие сегодня данные должны выглядеть точно так, как вы ожидаете. Прежде всего, вы хотите убедиться, что данные выглядят типично: похожи ли они на данные, которые использовались для обучения модели? Если данные значительно изменились, ваша уже обученная модель, скорее всего, устарела и будет давать неточные прогнозы. Идет ли речь о табличных числовых данных, изображениях или данных для NLP, задача мониторинга данных остается неизменной. В любом из случаев у нас будет некоторое представление о том, как должны выглядеть данные, и мы должны быть предупреждены, когда когда появляются какие-либо значительные отклонения. В технической терминологии это зачастую называют OOD-детектированием (OOD - out-of-distribution): мы хотим обнаружить момент, когда данные больше не соответствуют форме и распределению, которые они имели на момент обучения модели. Существует множество подходов к обнаружению дрейфа данных, но в этом посте мы остановимся на преимуществах многомерного и многопараметрического подхода.
Отправная точка для формирования любого подхода к обнаружению дрейфа данных, — это измерение схожести распределения данных, поступающих в модель сейчас, и тем, как данные должны выглядеть, например, каким было распределение обучающей выборки. Самым базовым подходом является отдельное рассмотрение каждой входной переменной модели (а также выходных данных). Для этого так называемого одномерного подхода к обнаружению дрейфа существует множество технических реализаций. Среди распространенных реализаций можно выделить проверки гипотез, такие как критерий Колмогорова-Смирнова (KS-test) и критерий хи-квадрат (ChiSquared-test), а также так называемые f-дивергенции, такие как расстояние Кульбака-Лейблера (KLDiverence), дивергенция Йенсена-Шеннона (JSDiverence) и т. д. Общим для всех этих подходов является то, что мы обычно применяем их одномерно к каждому входному признаку модели (смотрите рисунок 1).
Рисунок 1: Сравнение распределений. На этом графике мы исследуем один входной признак (возраст) и смотрим на распределение этой переменной в двух моментах времени: для обучающих данных (зеленое распределение) и для текущих реальных данных (фиолетовое распределение). На графике видно невооруженным глазом, что эти распределения отличаются достаточно сильно. Из-за этого модель может быть неточной.
Теоретически может быть рассчитан и многомерный вариант, но эти методы не всегда эффективны в многомерных приложениях из-за разреженности данных. Используя одномерные подходы для обнаружения дрейфа, мы делаем неявное предположение о независимости признаков. Хотя в некоторых случаях это может быть недалеко от истины, в большинстве случаев наш набор данных, скорее всего, будет иметь какие-либо сложные взаимосвязи между признаками и другими важными структурами. Поэтому важно отметить, что когда мы рассматриваем только один признак за раз, это может привести к пропущенным событиям. Следовательно, мы должны рассматривать многомерное распределение данных в совокупности.
В рамках многомерного подхода мы подгоняем вспомогательную многомерную модель к полному совместному распределению обучающей выборки. Эта вспомогательная модель будет представлять из себя модель плотности (density model), определяющую закономерности и структуру в наборе данных. Эта модель может количественно определить, насколько любая данная единица данных типична или нетипична по отношению к эталонному набору данных. Существует много потенциальных подходов к реализации модели плотности — среди распространенных примеров можно выделить вариационный автоэнкодер (Variational Autoencoder), нормализующие потоки (Normalizing Flow Models), модели плотности (Density Models), изолирующий лес (Isolation Forest) и т. д. Любая гибкая техника должна работать достаточно эффективно. Затем мы можем использовать обученную нами модель плотности, чтобы оценить насколько будущие единицы данных похожи на данные из обучающей выборки.
Этот подход хорошо проиллюстрирован на схеме ниже (на ней показано сильно упрощенное представление процесса). Слева у нас представлен обучающий набор данных; в этом примере он представляет собой только пару непрерывных переменных (X1 и X2). У нас есть небольшое количество выборочных точек данных, разбросанных по пространству, образуемому X1 и X2. Набор данных имеет некоторые специфические закономерности и структуру ( связь между X1 и X2 в виде кривой), скорее всего, неизвестные нам.
На втором этапе мы подгоняем модель плотности к этому набору данных. Чтобы сильно не раздувать этот пост, мы опустим детали реализации, но общая цель состоит в том, чтобы количественно определить, где в пространстве X1-X2 мы наблюдали большие скопления данных и где мы их точно не наблюдали. На этой иллюстрации это закрашенная область: закрашенное пространство указывает на области, где мы скорее всего увидим какие-то данные, а пустые области показывают, где мы вообще не видели никаких данных.
На третьем этапе мы можем использовать эту обученную модель плотности для оценки любых новых точек данных с точки зрения того, насколько вероятно, что они бы вписывались в набор данных, использованный для обучения нашей модели. Об этом можно рассуждать следующим образом — мы оцениваем новую точку данных на основе того, соответствует ли она типичной схеме/шаблону в обучающем наборе или является ненормальной. Например, одна из точек данных выделена зеленым цветом, потому что она вписывается в “типичные” области модели плотности. Эта точка данных очень похожа на другие данные в обучающем наборе. Напротив, красная точка данных находится в области, где никогда не было замечено никаких обучающих данных. Таким образом, эта точка данных является аномалией и не похожа ни на что мы закладывали в обучающем наборе. В технической терминологии говорят, что эта точка находится “вне распределения” (out-of-distribution) по отношению к обучающей выборке.
Обратите внимание, что в приведенном выше примере одномерные меры определения дрейфа, скорее всего, не заметят эту аномальную точку данных. При рассмотрении в одномерном смысле (только по X1 или по X2) эта аномальная точка данных является довольно типичной. Однако, поскольку X1 и X2 имеют сложную структуру, мы обнаруживаем, что в действительности красная точка данных сильно отличается от обучающих данных. Если мы не учитываем многомерные связи, мы можем упустить множество таких достаточно тонких сдвигов, когда реальные данные выпадают из множества ожидаемых данных.
Такого рода OOD-детектирование является важной частью мониторинга работоспособности системы машинного обучения. Становится очевидным, что модели машинного обучения должны уметь оценивать свою уверенность в собственных прогнозах. Во многих случаях пренебрежение этим равносильно неопределенности в отношении их прогнозов без учета входных данных. Однако с OOD-детектированием мы можем понять, как, по мнению модели, выглядит мир, и мы можем отследить, когда он отличается от того, к которому мы ее приспособили. Это очень полезно для нас, потому что сложные модели машинного обучения часто слишком самоуверенны в своих прогнозах, особенно на данных, которые отличаются от тех, на которых они были обучены. Рассматривая, является ли каждая единица входных данных в выборке или вне выборки, мы можем определить, когда мы можем доверять прогнозу модели, а когда нам следует быть более осторожным.
В этом посте мы рассмотрели идеи, стоящие за OOD-детектированием, в контексте табличных данных. Но эта проблема характерна для всех типов машинного обучения. В последующих постах мы углубимся в методы подходящие для моделей компьютерного зрения и NLP.
В задачах машинного обучения мы начинаем с небольших объемов табличных данных. С ними отлично справляется библиотека pandas, предоставляя API, к которому привыкли все, кто занимается ML. Но наступает момент, когда данных становится больше. Они всё еще влезают в память ноутбука (например, в 32 Гб), но время их обработки в pandas уже не устраивает. Тогда на помощь приходит параллельная обработка через multiprocessing напрямую или pandarallel. И мы всё еще работаем с pandas API. Время идет, и набор данных для нашей задачи уже не влезает в память ноутбука, однако еще помещается на жестком диске. И здесь на помощь приходит dask, который предоставляет pandas-like API и возможности по обработке данных с диска. Сегодня вечером состоится открытое занятие «DataFrame API: от Pandas к Dask». Регистрируйтесь по ссылке.