← к модулям

Matrix Factorization (ALS)

Каждому пользователю и фильму выучивается короткий вектор «скрытых черт». Совпадение векторов = интерес. Черты модель находит сама.

    Карта латентных факторов: топ-400 фильмов

    Каждая точка — фильм, спроецированный из пространства скрытых черт в 2D (PCA), цвет — основной жанр. Кластеры складываются сами: модель не знала жанров, только кто что смотрел.

    обучение и проекция факторов…

    Теория простым языком

    Matrix Factorization выучивает каждому пользователю и каждому фильму короткий набор чисел — «скрытые черты». Совпали черты человека и фильма → фильм ему зайдёт. Эти черты компьютер находит сам, никто их заранее не задаёт.

    С чего начинаем

    Снова берём матрицу «пользователи × фильмы» с оценками — почти пустую. Идея MF: эту огромную пустую таблицу можно приблизительно «собрать» из двух маленьких табличек. Это и есть факторизация.

    Факторизацияразложение одного большого объекта на произведение нескольких поменьше. Как число 12 = 3 × 4, так и большую матрицу оценок приближаем произведением двух узких матриц.
    Почему neighborhood CF стало не хватать
    БылоItem-CF искал похожие айтемы через cosine/Pearson.
    ПроблемаSimilarity локальна, шумна на разреженных данных и плохо обобщает на неувиденные пары.
    ИдеяПредставить пользователя и айтем в общем скрытом пространстве и предсказывать интерес их скалярным произведением.
    Стало лучшеПлотные эмбеддинги, обобщение, можно находить неочевидные связи, один score для любой пары «известный пользователь × известный айтем».
    Осталось слабымХуже объяснимость, нужен тренинг/регуляризация, сам score — не вероятность.
    ДальшеBPR (ранжирование) и two-tower (нейро-retrieval).
    Почему implicit ALS
    ПроблемаЯвные оценки (звёзды) редки, а поведенческие логи массовые.
    ИдеяALS разделяет preference puip_{ui} (взаимодействие наблюдалось / нет) и confidence cuic_{ui} (сила уверенности, c=1+αrc = 1 + \alpha r). Важно: pui=1p_{ui}=1 значит «мы видели взаимодействие», а не «понравилось».

    Что такое «скрытые черты»

    Латентный фактор (скрытая черта)одно из чисел в коротком векторе пользователя или фильма. «Латентный» = скрытый: мы не говорим, что это «доля комедийности» — модель сама нащупывает полезные измерения. Но часто они получаются осмысленными.

    Допустим, черт всего 2. Тогда у фильма есть пара чисел (например, «детское ↔ взрослое» и «лёгкое ↔ серьёзное»), и у человека — пара чисел про его вкус по тем же осям. Реально мы берём не 2, а несколько десятков таких черт.

    Эмбеддинг (вектор-представление)короткий вектор скрытых черт объекта. «Эмбеддинг фильма» — это его координаты в пространстве вкусов. Похожие фильмы оказываются рядом.

    Как предсказываем интерес

    Берём вектор пользователя и вектор фильма и считаем их «совпадение» — перемножаем по чертам и складываем (скалярное произведение). Чем больше совпали знаки и величины, тем выше предсказанный интерес. Так одним умножением получаем оценку для любой пары человек–фильм, даже если он его не видел.

    Пример. У фильма черта «детское» большая, у взрослого зрителя она отрицательная → произведение уходит в минус → фильм не порекомендуем. У ребёнка та же черта положительная → совпадение → порекомендуем.

    Важно: мы не предсказываем звёзды

    Наивная MF пытается угадать сам балл (явный фидбек). Мы используем другую, более практичную версию — для неявного фидбека: нам важно не «сколько звёзд», а было ли взаимодействие и насколько мы в нём уверены.

    Явный → неявный фидбеквместо «оценка = 4.5» мы говорим: «факт интереса = да/нет» плюс «уверенность». Высокая оценка не делает целью «угадать 4.5» — она лишь усиливает уверенность в том, что взаимодействие положительное.

    Поэтому оценку rr превращают в два числа: предпочтение pp (1, если человек вообще трогал фильм, иначе 0) и уверенность c=1+αrc = 1 + \alpha r (чем выше оценка, тем сильнее сигнал). Модель старается сильнее там, где уверенность выше.

    Откуда берутся числа: ALS

    Числа подбирают так, чтобы предсказания как можно лучше совпадали с реальными предпочтениями. Делают это хитрым повторяющимся приёмом:

    ALS (Alternating Least Squares)«поочерёдный метод наименьших квадратов». Замораживаем векторы фильмов и идеально подбираем векторы людей; потом наоборот — замораживаем людей и подбираем фильмы. Повторяем туда-сюда, пока не сойдётся. На каждом шаге задача простая и решается точно.
    Псевдокод (implicit ALS)
    p[u][i] = 1, если u трогал i, иначе 0
    c[u][i] = 1 + alpha * r[u][i]      # уверенность
    
    инициализируем X (люди) и Y (фильмы) случайно
    повторяем N раз:
        при фиксированном Y подбираем каждый x[u] точно (МНК)
        при фиксированном X подбираем каждый y[i] точно (МНК)
    
    score(u, i) = x[u] · y[i]          # для рекомендаций
    Формулы: предсказание, цель, шаг ALS

    Предсказанный интерес — скалярное произведение векторов:

    r^ui=xuyi\hat{r}_{ui} = x_u^\top y_i

    Цель для неявного фидбека (Hu–Koren–Volinsky): подгоняем r^ui\hat{r}_{ui} к предпочтению puip_{ui}, но каждую ошибку взвешиваем уверенностью cui=1+αruic_{ui}=1+\alpha r_{ui}:

    minX,Y u,icui(puixuyi)2+λ(uxu2+iyi2)\min_{X,Y}\ \sum_{u,i} c_{ui}\,\big(p_{ui} - x_u^\top y_i\big)^2 + \lambda\Big(\sum_u \lVert x_u\rVert^2 + \sum_i \lVert y_i\rVert^2\Big)

    где λ\lambda — регуляризация (штраф за большие веса, против переобучения). При фиксированном YY каждый вектор пользователя находится точно:

    xu=(YCuY+λI)1YCupux_u = \big(Y^\top C^u Y + \lambda I\big)^{-1} Y^\top C^u p_u

    CuC^u — диагональная матрица уверенностей пользователя uu. Симметрично считают yiy_i при фиксированном XX. Это и есть «поочерёдность» ALS.

    Визуализация рядом — зачем

    Эмбеддинги фильмов многомерные, глазом не увидеть. Поэтому их сжимают в 2D и рисуют точками. Видно главное: фильмы сами собираются в кластеры по смыслу (мультики к мультикам, ужасы к ужасам) — хотя модель про жанры ничего не знала, только про то, кто что смотрел.

    Снижение размерности (PCA)способ сжать длинный вектор до 2 чисел так, чтобы максимально сохранить «кто от кого далеко». Нужен только чтобы нарисовать многомерное на плоскости.

    Сильные стороны

    • Сильная персонализация и хорошее качество при разреженных данных.
    • Сжатые векторы → быстрый поиск похожих и рекомендаций.
    • Латентные черты обобщают: ловят вкус там, где «совпавших зрителей» в лоб нет.

    Слабые стороны

    • Холодный старт остаётся: новому пользователю/фильму вектор взять неоткуда.
    • Черты трудно объяснить словами («почему именно это?»).
    • Нужно подбирать гиперпараметры (число черт, регуляризацию, alpha).

    ⚠️ Что может пойти не так

    • Путать с предсказанием оценки: implicit-MF учится «было/не было + уверенность», а не «сколько звёзд». Считать её регрессией на рейтинг — концептуальная ошибка.
    • Слишком мало факторов → модель недоучивается; слишком много без регуляризации → переобучение под train.
    • Эмбеддинги случайно инициализируются: оси сами по себе ничего не значат, а знаки/повороты от запуска к запуску разные — нельзя толковать «фактор 3 = комедийность».
    • Популярность всё ещё протекает: без поправок частые фильмы получают вектор с большой нормой и всплывают у многих.

    🧠 Проверь себя: Что на самом деле оптимизирует наша implicit-MF?