сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Рекомендательные системы

Коллаборативная фильтрация

Зачем это спрашивают

Коллаборативная фильтрация - азбука рексиса, и вопросы по ней проверяют продуктовое чутьё: холодный старт, неявный фидбек, попсовый бейзлайн. Формулы тут вторичны.

// Два слова, которые ждут в ответах: «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, остальные разбираются в тренажёре.

  1. #cf_basics1 / 5
    Memory-based CF (поиск ближайших соседей по матрице) плохо масштабируется и страдает от разреженности. Что даёт переход к латентным факторам?
    A)Латентные факторы устраняют саму проблему холодного старта для новых пользователей и товаров
    B)Переход к факторам просто увеличивает размер матрицы взаимодействий, зато делает рекомендации разнообразнее по случайности
    C)Латентные модели работают вообще без обучения и не требуют никаких данных о прошлых взаимодействиях пользователей
    D)Сжатие разреженной матрицы в плотное пространство факторов даёт обобщение на непросмотренные пары и меньше памяти
    показать ответ и разбор
    +D)Сжатие разреженной матрицы в плотное пространство факторов даёт обобщение на непросмотренные пары и меньше памяти

    // разбор: Memory-based CF хранит и сканирует огромную разреженную матрицу и не обобщает на пары без общих взаимодействий. Латентные факторы (через факторизацию) сжимают пользователей и предметы в низкоразмерное плотное пространство: близость в нём переносится и на непросмотренные пары, память падает, разреженность перестаёт быть стеной. Холодный старт при этом сам по себе не решается — новому ID всё ещё неоткуда взять фактор.

  2. #cf_basics2 / 5
    Чем косинусная мера похожести отличается от корреляции Пирсона в CF?
    A)Косинус применим к товарам, а корреляция Пирсона — к пользователям сервиса, поэтому эти две меры не получится сравнивать напрямую
    B)Это два разных названия одной и той же формулы, результат у них совпадает
    C)Пирсон центрирует оценки (убирает personal bias шкалы), косинус смотрит на угол без вычитания среднего
    D)Косинус работает с бинарными данными, а Пирсон — со звёздными рейтингами от 1 до 5
    показать ответ и разбор
    +C)Пирсон центрирует оценки (убирает personal bias шкалы), косинус смотрит на угол без вычитания среднего

    // разбор: Косинус меряет угол между векторами оценок, игнорируя их длину, но НЕ убирает сдвиг: «добряк», ставящий всем 4-5, и «строгий», ставящий 2-3, покажутся непохожими из-за разного среднего. Корреляция Пирсона предварительно вычитает средний рейтинг пользователя, снимая personal bias шкалы, — поэтому в user-based CF на явных оценках она обычно предпочтительнее. На неявном фидбэке чаще берут косинус.

  3. #cf_basics3 / 5
    Матрица взаимодействий заполнена на 0.1%. Чем это бьёт по memory-based CF?
    A)Ничем: чем разреженнее матрица, тем быстрее и точнее считается похожесть между пользователями
    B)Матрица просто занимает много места на диске, но на само качество рекомендаций это никак не влияет и на общее потребление оперативной памяти сервером рекомендаций
    C)Разреженность автоматически чинится тем, что все пустые ячейки надёжно заполняются нулями
    D)У пар часто нет общих оценок — похожесть считается по 1-2 точкам и шумит; охват рекомендаций падает
    показать ответ и разбор
    +D)У пар часто нет общих оценок — похожесть считается по 1-2 точкам и шумит; охват рекомендаций падает

    // разбор: При экстремальной разреженности у двух пользователей почти нет совместно оценённых товаров, и похожесть оценивается по горстке общих точек — она неустойчива и шумна, а для многих пар вообще не определена. Отсюда бедный охват и капризные соседи. Это ключевая слабость memory-based CF; её и лечат латентными моделями, которые обобщают на непросмотренные пары. Пустое ≠ ноль — трактовать пропуск как 0 неверно.

  4. #cf_basics4 / 5
    Рекомендации всё время выводят одни и те же хиты, «хвост» не показывается. Как называется эффект?
    A)Domain shift: распределение товаров в каталоге со временем уехало от обучающего набора
    B)Популярностный биас: частые товары набирают ещё больше сигнала и вытесняют нишевые из выдачи
    C)Переобучение модели на валидации, которое лечится увеличением числа латентных факторов
    D)Утечка таргета: в фичи просочилась будущая популярность товара на момент показа рекомендации
    показать ответ и разбор
    +B)Популярностный биас: частые товары набирают ещё больше сигнала и вытесняют нишевые из выдачи

    // разбор: Популярные товары накапливают больше взаимодействий, модель считает их «безопасно релевантными» и показывает чаще, отчего они набирают ещё больше сигнала — самоусиливающаяся петля, вытесняющая нишевые товары («хвост»). Страдают охват, новизна и персонализация. Борются down-weight популярности, exploration, метриками coverage/novelty и семплированием негативов с учётом популярности. Это не дрифт и не утечка.

  5. #cf_basics5 / 5
    Как размер соседства k влияет на качество kNN-рекомендаций?
    A)Маленький k — шумно и капризно, слишком большой — усреднение к популярному и потеря персонализации
    B)Чем больше k, тем лучше рекомендации — брать надо максимально возможный k, вплоть до включения в соседство всех пользователей сервиса сразу
    C)K вообще не влияет на качество, это чисто технический параметр скорости работы алгоритма
    D)Оптимальный k равен числу товаров в каталоге, делённому на число пользователей
    показать ответ и разбор
    +A)Маленький k — шумно и капризно, слишком большой — усреднение к популярному и потеря персонализации

    // разбор: k — сколько похожих соседей учитывать. Слишком маленький k делает прогноз шумным и чувствительным к случайным совпадениям; слишком большой затягивает в соседство далёких, «размывая» сигнал к среднему-популярному и теряя персонализацию. Оптимум — посередине, подбирается по валидации. Универсального «больше = лучше» нет, и с размером каталога k напрямую не связан.

дальше

Теорию прочитали. Навык ставится повторением

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