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