Коллаборативная фильтрация
Коллаборативная фильтрация - азбука рексиса, и вопросы по ней проверяют продуктовое чутьё: холодный старт, неявный фидбек, попсовый бейзлайн. Формулы тут вторичны.
// Два слова, которые ждут в ответах: «cold start» и «implicit». Оба - про реальность, а не про учебник.
CF: рекомендации из поведения
Коллаборативная фильтрация рекомендует из поведения похожих - без признаков контента: «похожим на тебя зашло». Контентная - из атрибутов айтема; гибрид сочетает и лечит слабости обеих.
User-based против item-based: соседи-люди против соседей-товаров. Item-based стабильнее (профиль айтема меняется медленнее вкусов юзера) и кэшируется - блок «с этим покупают» живёт именно так.
// Похожесть считают косинусом по векторам взаимодействий, скорректированным на средние: у каждого юзера своя шкала «нравится», без центрирования «добрые» похожи на всех.
- item-based CF
- соседи-айтемы; стабильнее и кэшируемее user-based
Implicit: отсутствие клика - не негатив
Explicit-фидбек (оценки) редок и смещён - оценивают довольные и злые. Основной сигнал прода - implicit: клики, покупки, досмотры, дожитие.
Ключевая тонкость: отсутствие взаимодействия это missing, не negative. Юзер не кликнул, потому что не видел, трактовать это как «не нравится» значит заглушить всё непоказанное.
// Матрица взаимодействий заполнена на доли процента - отсюда факторизация и эмбеддинги вместо честных «соседей» на больших каталогах.
- implicit feedback
- клики/покупки/досмотры; отсутствие ≠ негатив
Холодный старт и тирания популярного
Новому юзеру коллаборативка слепа: спасают популярное, онбординг-опрос и контентные фичи. Новому айтему - контент и буст показов, чтобы набрать сигнал.
Popularity bias: без коррекции система рекомендует хиты всем, и хиты становятся ещё хитовее - self-fulfilling prophecy. При этом «популярное» - сильный бейзлайн, который модель обязана бить.
// Петля обратной связи всегда рядом: модель учится на кликах по своим же прошлым рекомендациям. Разрывают исследовательским трафиком и дебиасингом.
- cold start
- нет истории взаимодействий - CF (collaborative filtering) слепа
- popularity bias
- хиты рекомендуются всем и растут сами от себя
Как отвечать: «Что порекомендуешь новому пользователю без истории?»
Каскад по мере накопления сигнала. С нуля - популярное в его контексте: гео, платформа, источник трафика; это сильный бейзлайн, а не заглушка. Дальше дешёвый онбординг - пара вопросов о интересах даёт контентные фичи сразу. С первых же кликов - item-based соседство: «похожее на то, что ты только что смотрел» работает уже после одного взаимодействия. И слежу, чтобы холодным юзерам оставалась доля исследовательских показов, иначе система навсегда запрёт их в стартовом пузыре популярного.
Лестница по объёму сигнала плюс мысль про исследовательский трафик - продуктовое мышление, которое и проверяется.
На чём валят
- −Трактовать отсутствие взаимодействия как явный негатив - заглушишь всё непоказанное.
- −Косинус по сырым оценкам без центрирования - «добрые» юзеры похожи на всех.
- −Не побить популярный бейзлайн и рапортовать «модель работает».
- −Игнорировать петлю обратной связи - модель учится на кликах по своим же рекомендациям.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 17, остальные разбираются в тренажёре.
- Memory-based CF (поиск ближайших соседей по матрице) плохо масштабируется и страдает от разреженности. Что даёт переход к латентным факторам?A)Латентные факторы устраняют саму проблему холодного старта для новых пользователей и товаровB)Переход к факторам просто увеличивает размер матрицы взаимодействий, зато делает рекомендации разнообразнее по случайностиC)Латентные модели работают вообще без обучения и не требуют никаких данных о прошлых взаимодействиях пользователейD)Сжатие разреженной матрицы в плотное пространство факторов даёт обобщение на непросмотренные пары и меньше памяти
показать ответ и разбор
+D)Сжатие разреженной матрицы в плотное пространство факторов даёт обобщение на непросмотренные пары и меньше памяти// разбор: Memory-based CF хранит и сканирует огромную разреженную матрицу и не обобщает на пары без общих взаимодействий. Латентные факторы (через факторизацию) сжимают пользователей и предметы в низкоразмерное плотное пространство: близость в нём переносится и на непросмотренные пары, память падает, разреженность перестаёт быть стеной. Холодный старт при этом сам по себе не решается — новому ID всё ещё неоткуда взять фактор.
- Чем косинусная мера похожести отличается от корреляции Пирсона в CF?A)Косинус применим к товарам, а корреляция Пирсона — к пользователям сервиса, поэтому эти две меры не получится сравнивать напрямуюB)Это два разных названия одной и той же формулы, результат у них совпадаетC)Пирсон центрирует оценки (убирает personal bias шкалы), косинус смотрит на угол без вычитания среднегоD)Косинус работает с бинарными данными, а Пирсон — со звёздными рейтингами от 1 до 5
показать ответ и разбор
+C)Пирсон центрирует оценки (убирает personal bias шкалы), косинус смотрит на угол без вычитания среднего// разбор: Косинус меряет угол между векторами оценок, игнорируя их длину, но НЕ убирает сдвиг: «добряк», ставящий всем 4-5, и «строгий», ставящий 2-3, покажутся непохожими из-за разного среднего. Корреляция Пирсона предварительно вычитает средний рейтинг пользователя, снимая personal bias шкалы, — поэтому в user-based CF на явных оценках она обычно предпочтительнее. На неявном фидбэке чаще берут косинус.
- Матрица взаимодействий заполнена на 0.1%. Чем это бьёт по memory-based CF?A)Ничем: чем разреженнее матрица, тем быстрее и точнее считается похожесть между пользователямиB)Матрица просто занимает много места на диске, но на само качество рекомендаций это никак не влияет и на общее потребление оперативной памяти сервером рекомендацийC)Разреженность автоматически чинится тем, что все пустые ячейки надёжно заполняются нулямиD)У пар часто нет общих оценок — похожесть считается по 1-2 точкам и шумит; охват рекомендаций падает
показать ответ и разбор
+D)У пар часто нет общих оценок — похожесть считается по 1-2 точкам и шумит; охват рекомендаций падает// разбор: При экстремальной разреженности у двух пользователей почти нет совместно оценённых товаров, и похожесть оценивается по горстке общих точек — она неустойчива и шумна, а для многих пар вообще не определена. Отсюда бедный охват и капризные соседи. Это ключевая слабость memory-based CF; её и лечат латентными моделями, которые обобщают на непросмотренные пары. Пустое ≠ ноль — трактовать пропуск как 0 неверно.
- Рекомендации всё время выводят одни и те же хиты, «хвост» не показывается. Как называется эффект?A)Domain shift: распределение товаров в каталоге со временем уехало от обучающего набораB)Популярностный биас: частые товары набирают ещё больше сигнала и вытесняют нишевые из выдачиC)Переобучение модели на валидации, которое лечится увеличением числа латентных факторовD)Утечка таргета: в фичи просочилась будущая популярность товара на момент показа рекомендации
показать ответ и разбор
+B)Популярностный биас: частые товары набирают ещё больше сигнала и вытесняют нишевые из выдачи// разбор: Популярные товары накапливают больше взаимодействий, модель считает их «безопасно релевантными» и показывает чаще, отчего они набирают ещё больше сигнала — самоусиливающаяся петля, вытесняющая нишевые товары («хвост»). Страдают охват, новизна и персонализация. Борются down-weight популярности, exploration, метриками coverage/novelty и семплированием негативов с учётом популярности. Это не дрифт и не утечка.
- Как размер соседства k влияет на качество kNN-рекомендаций?A)Маленький k — шумно и капризно, слишком большой — усреднение к популярному и потеря персонализацииB)Чем больше k, тем лучше рекомендации — брать надо максимально возможный k, вплоть до включения в соседство всех пользователей сервиса сразуC)K вообще не влияет на качество, это чисто технический параметр скорости работы алгоритмаD)Оптимальный k равен числу товаров в каталоге, делённому на число пользователей
показать ответ и разбор
+A)Маленький k — шумно и капризно, слишком большой — усреднение к популярному и потеря персонализации// разбор: k — сколько похожих соседей учитывать. Слишком маленький k делает прогноз шумным и чувствительным к случайным совпадениям; слишком большой затягивает в соседство далёких, «размывая» сигнал к среднему-популярному и теряя персонализацию. Оптимум — посередине, подбирается по валидации. Универсального «больше = лучше» нет, и с размером каталога k напрямую не связан.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.