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

Матричная факторизация

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

Матричная факторизация - вопрос «объясни механику»: как из разреженной матрицы кликов получаются вкусы. Дополнительно ловят на мифе про SVD и на метриках implicit-моделей.

// MF - прадед всех эмбеддингов рекомендаций: поймёшь её - поймёшь и two-tower сети.

Латентное пространство вкусов

MF (matrix factorization) раскладывает матрицу взаимодействий в произведение двух низкоранговых: каждый юзер и каждый айтем - вектор в общем латентном пространстве, предсказанный интерес - скалярное произведение.

Латентные оси никто не задаёт - они выучиваются: что-то вроде «сериальность», «ценовой сегмент», но интерпретация не гарантирована.

// Смещения обязательны: глобальный + юзерский + айтемный bias съедают «среднюю щедрость» и «общую популярность», иначе популярность утекает в факторы и вкусовая часть получается мусорной.

латентный фактор
выученная ось вкуса; скор = скалярное произведение
bias-члены
глобальный/юзерский/айтемный сдвиги - съедают популярность

Как обучают: ALS, implicit и BPR

Два пути: SGD (stochastic gradient descent) по наблюдаемым парам с регуляризацией - или ALS (alternating least squares), попеременное точное решение для юзеров и айтемов, которое отлично параллелится (Spark).

Implicit ALS - стандарт неявного фидбека: взаимодействия бинарны с весом уверенности (число кликов), нули участвуют с малым весом. Учить только на позитивах нельзя - модель заскорит всё высоко.

// BPR (bayesian personalized ranking) - попарный лосс: взаимодействованный айтем должен скорить выше невзаимодействованного. Оптимизирует ранжирование напрямую, а именно оно и нужно.

ALS
попеременные наименьшие квадраты; параллелится на кластере
BPR
попарный лосс «позитив выше негатива» - про ранжирование

Миф про SVD и наследники MF

Классический SVD (singular value decomposition) требует полной матрицы, а матрица взаимодействий пуста на 99%+. «SVD в рексисе» - исторически неточное имя факторизации по наблюдаемым значениям с регуляризацией.

Наследник MF - двухбашенные нейромодели: башня юзера и башня айтема с фичами (это решает cold start), сверху то же скалярное произведение.

// Скалярное произведение наверху - не случайность: оно совместимо с ANN-поиском (approximate nearest neighbors), и retrieval по миллионам айтемов остаётся миллисекундным.

two-tower
башни юзера/айтема с фичами; наследник MF, дружит с ANN

Как отвечать: «Как работает матричная факторизация и как её обучать на кликах?»

Раскладываем матрицу взаимодействий в произведение низкоранговых: юзеры и айтемы становятся векторами в общем латентном пространстве, интерес - скалярное произведение, плюс bias-члены на популярность и щедрость. Клики это implicit: отсутствие клика не негатив, поэтому либо implicit ALS с весами уверенности и малым весом нулей, либо BPR - попарный лосс «кликнутое выше некликнутого». Оценка - ранжирующими метриками @K на сплите по времени, не RMSE: рейтингов тут нет, задача - порядок.

Механика, правильный лосс под тип фидбека и правильная метрика - три места, где вопрос ловит выученное без понимания.

На чём валят

  • Учить MF только на позитивах - модель скорит всё высоко.
  • Оценивать implicit-модель по RMSE (root mean squared error) «рейтингов» - задача ранжирования, метрики @K.
  • Без регуляризации и биасов - популярность утекает в факторы.
  • «Негативы» из показанного-и-проигнорированного как случайные это сильный сигнал, сэмплируй осознанно.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.

  1. #matrix_factorization1 / 5
    Почему для неявного фидбэка берут ALS с confidence или BPR, а не обычный SVD по рейтингам?
    A)SVD технически сложно посчитать на матрице, где есть хотя бы одна пустая незаполненная ячейка данных
    B)ALS и BPR работают на GPU, а классический SVD — на CPU, поэтому выбирают по железу
    C)У неявного фидбэка нет явных оценок и пропуск ≠ негатив; ALS взвешивает уверенностью, BPR оптимизирует порядок пар
    D)BPR и ALS дают одинаковый результат с обычным SVD, и выбор между ними — вопрос личного вкуса
    показать ответ и разбор
    +C)У неявного фидбэка нет явных оценок и пропуск ≠ негатив; ALS взвешивает уверенностью, BPR оптимизирует порядок пар

    // разбор: SVD по рейтингам предполагает явные оценки в заполненных ячейках. В неявном фидбэке оценок нет, а нули двусмысленны (не видел ≠ не хочет). ALS для implicit вводит вес-уверенность: наблюдённые взаимодействия — сильный позитив, нули — слабый сигнал. BPR вообще уходит от восстановления значений к ранжированию: учит, что просмотренное должно стоять выше непросмотренного. Оба заточены под задачу, где важен порядок, а не оценка.

  2. #matrix_factorization2 / 5
    Матричная факторизация учит эмбеддинги только по ID взаимодействий. Как это бьёт по холодному старту нового товара?
    A)Никак не бьёт: MF придумает вектор новому товару сразу при добавлении, опираясь на его категорию
    B)У нового ID нет ни одного взаимодействия, значит нет и выученного фактора; нужен контент или гибрид с фичами (two-tower)
    C)Новый товар в MF получает вектор, равный среднему по всем товарам, и это решает проблему холодного старта
    D)Холодный старт нового товара лечится увеличением числа латентных факторов в модели факторизации
    показать ответ и разбор
    +B)У нового ID нет ни одного взаимодействия, значит нет и выученного фактора; нужен контент или гибрид с фичами (two-tower)

    // разбор: Чистая MF привязывает эмбеддинг к ID и учит его из истории взаимодействий. У только что добавленного товара истории нет — фактор неоткуда взять, и рекомендовать его нельзя (cold start). Лечат это выходом за пределы одних ID: контентные признаки товара, гибридные модели, two-tower/фичевые модели, где эмбеддинг строится из атрибутов, а не только из ID. Число факторов проблему не решает.

  3. #matrix_factorization3 / 5
    Почему к разреженной матрице оценок нельзя просто применить классический SVD из линала?
    A)Потому что SVD определён исключительно для строго квадратных матриц одинаковой стороны
    B)Потому что SVD выдаёт комплексные числа, непригодные для предсказания вещественных оценок пользователей
    C)Классический SVD требует полностью заполненной матрицы; тут почти всё — пропуски, а не нули
    D)Потому что SVD возвращает ровно два латентных фактора и этого мало для реальных данных
    показать ответ и разбор
    +C)Классический SVD требует полностью заполненной матрицы; тут почти всё — пропуски, а не нули

    // разбор: Классический SVD раскладывает ПОЛНОСТЬЮ заданную матрицу. В рекомендациях матрица почти пуста, и пропуск — это «не знаем», а не 0; заполнить дырки нулями и разложить — значит выучить, что пользователю всё безразлично. Поэтому берут MF-модели, которые минимизируют ошибку только по НАБЛЮДЁННЫМ ячейкам (плюс регуляризация), а не по всей матрице. Отсюда SGD/ALS вместо литерального SVD.

  4. #matrix_factorization4 / 5
    Зачем в матричной факторизации добавляют L2-регуляризацию на факторы?
    A)Чтобы факторы не раздувались и модель не переобучалась на пользователях с малым числом оценок
    B)Чтобы принудительно занулить часть латентных факторов и отобрать самые важные из них, как в Lasso
    C)Чтобы ускорить обучение: с регуляризацией каждый шаг оптимизации считается заметно быстрее
    D)Чтобы решить проблему холодного старта для новых товаров и пользователей
    показать ответ и разбор
    +A)Чтобы факторы не раздувались и модель не переобучалась на пользователях с малым числом оценок

    // разбор: Без штрафа MF легко переобучается: особенно у пользователей и товаров с малым числом взаимодействий факторы подгоняются под шум и раздуваются. L2-штраф на нормы векторов держит их компактными, улучшая обобщение на непросмотренные пары; сила λ подбирается по валидации. Это L2 (сжимает, не зануляет — в отличие от L1/Lasso), ускорения он не даёт и холодный старт не лечит.

  5. #matrix_factorization5 / 5
    Зачем в MF помимо скалярного произведения факторов вводят bias-члены (глобальный, юзера, товара)?
    A)Чтобы заменить латентные факторы: с bias-членами сами векторы становятся не нужны
    B)Чтобы отделить общие эффекты «щедрый юзер / популярный товар» от собственно взаимодействия вкусов
    C)Чтобы ускорить инференс, ведь bias-члены считаются на порядок быстрее скалярного произведения
    D)Чтобы сделать все предсказанные рейтинги положительными числами
    показать ответ и разбор
    +B)Чтобы отделить общие эффекты «щедрый юзер / популярный товар» от собственно взаимодействия вкусов

    // разбор: Часть сигнала объясняется не совпадением вкусов, а базовыми уровнями: средний рейтинг по системе, склонность юзера ставить высоко/низко, общая привлекательность товара. Прогноз μ + b_u + b_i + qᵢᵀpᵤ отделяет эти общие смещения от собственно взаимодействия факторов, разгружая векторы под истинные предпочтения и заметно повышая точность. Bias-члены дополняют факторы, а не заменяют и не про скорость/знак.

дальше

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

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