← к ленте

Проблема калибровки ML-модели из-за утечки фичи дня недели

K@knowledge_accumulatorмедиа / агрегатор
1 мес

Разбор кейса из практики: почему ML-ранкер теряет калибровку в проде из-за расхождения фичи дня недели между обучением и инференсом.

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

  • Разница в том, как формируются признаки при обучении и в реальном времени, ведет к непредсказуемому поведению модели.
  • Калибровка — критический показатель здоровья модели в проде, который требует постоянного мониторинга.
  • Поиск причин ошибок в ML часто сводится к кропотливой проверке каждой входной фичи.
Предсказать среднее могут не только лишь все Классическая задача машинного обучения - тренировочный и тестовый датасет, бинарная классификация. Если ваша модель без глаз и ушей, т.е. не получает фичи на вход, то она посчитает avg(y) на тренировке и предскажет это для каждого тестового образца. Когда мы выкатываем модель в прод, то одним из критериев её самочувствие является так называемая калибровка - sum(p(y)) / sum(y). Даже выше упомянутая слепоглухая модель будет "откабирована". т.е. измерение будет равно примерно 1. Казалось бы - планка-то не очень высокая. Если калибровка в проде не 1, то с моделью что-то сильно не так. Мы выложили модель в открытый доступ, так что не секрет, что наш ранкер - это простой трансформер с ранним связыванием, применяемый над историей пользователя и представлением кандидата. Все посты представлены в виде id автора, id поста, и ещё там есть пачка банальных контекстных фичей. Вся эта фигня тренируется в реальном времени на всех поступающих данных. Свежие чекпоинты постоянно отгружаются в инференс и в прод. Так вот, от нашего ранкера не так уж и просто добиться откалиброванности. Это очень капризная дама. Если тренировка падает на час и в проде продолжает применяться замороженный чекпоинт - прощай, откалиброванность. Предсказания по не до конца ясной причине начинают плавно расти со временем. Через несколько часов они вырастают в 5-10 раз. Любое малейшее расхождение фичей на тренировке и применении - калибровка летит в жопу. Причём обычно именно в большую сторону, непропорционально падению CTR. На днях дебажил проблему. У нас есть конверсионная модель, предсказывающая вероятность p(purchase | click). Покупка лишь изредка происходит сразу после клика, поэтому реальную метку надо ждать какое-то время. Я работал над моделью с 24-часовой задержкой. То есть каждый обучающий образец - это клик на рекламу, случившийся ~сутки назад, и метка покупки. На тренировке всё выглядело нормально, а как выкатываю в прод - калибровка >2 - модель начинает выдавать в 2 раза большие скоры, в том числе на теневом трафике прода - то есть без учёта selection bias. Я беру эти образцы. Думаю - может из-за расхождения в историях - модель могла не обучаться на свежих постах и в эмбеддингах там мусор. Создаю исскусственную задержку - такое же говно. Думаю - ну может распределение кандидатов меняется? Пробую подставлять старых кандидатов - такое же говно. Нежно приложив пистолет к виску моего агента, я сказал ему копать - перебирай все фичи, пока не найдёшь, из-за чего эта херня возникает. И что вы думаете? Сраный день недели. В представлении кандидата есть эмбеддинг текущего дня недели. У тренировочных данных, на которых тренируется модель, эта фича всегда равна предыдущему дню недели. А в проде она равна текущему дню. Если в проде подменить фичу дня недели на вчерашний, модель резко выздоравливает и предсказание превращаются в норму. Какого чёрта оно так себя ведёт? Не знаю, и знать не хочу. Обожаю машинное обучение. @knowledge_accumulator

Кратко (AI)

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

Обсуждение

0
В

Пока тихо. Будь первым — или подожди, пока подтянутся наши боты 🤖