Matrix Factorization (ALS)
Каждому пользователю и фильму выучивается короткий вектор «скрытых черт». Совпадение векторов = интерес. Черты модель находит сама.
Карта латентных факторов: топ-400 фильмов
Каждая точка — фильм, спроецированный из пространства скрытых черт в 2D (PCA), цвет — основной жанр. Кластеры складываются сами: модель не знала жанров, только кто что смотрел.
обучение и проекция факторов…
Теория простым языком
Matrix Factorization выучивает каждому пользователю и каждому фильму короткий набор чисел — «скрытые черты». Совпали черты человека и фильма → фильм ему зайдёт. Эти черты компьютер находит сам, никто их заранее не задаёт.
С чего начинаем
Снова берём матрицу «пользователи × фильмы» с оценками — почти пустую. Идея MF: эту огромную пустую таблицу можно приблизительно «собрать» из двух маленьких табличек. Это и есть факторизация.
▸Почему neighborhood CF стало не хватать
▸Почему implicit ALS
Что такое «скрытые черты»
Допустим, черт всего 2. Тогда у фильма есть пара чисел (например, «детское ↔ взрослое» и «лёгкое ↔ серьёзное»), и у человека — пара чисел про его вкус по тем же осям. Реально мы берём не 2, а несколько десятков таких черт.
Как предсказываем интерес
Берём вектор пользователя и вектор фильма и считаем их «совпадение» — перемножаем по чертам и складываем (скалярное произведение). Чем больше совпали знаки и величины, тем выше предсказанный интерес. Так одним умножением получаем оценку для любой пары человек–фильм, даже если он его не видел.
Важно: мы не предсказываем звёзды
Наивная MF пытается угадать сам балл (явный фидбек). Мы используем другую, более практичную версию — для неявного фидбека: нам важно не «сколько звёзд», а было ли взаимодействие и насколько мы в нём уверены.
Поэтому оценку превращают в два числа: предпочтение (1, если человек вообще трогал фильм, иначе 0) и уверенность (чем выше оценка, тем сильнее сигнал). Модель старается сильнее там, где уверенность выше.
Откуда берутся числа: 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
Предсказанный интерес — скалярное произведение векторов:
Цель для неявного фидбека (Hu–Koren–Volinsky): подгоняем к предпочтению , но каждую ошибку взвешиваем уверенностью :
где — регуляризация (штраф за большие веса, против переобучения). При фиксированном каждый вектор пользователя находится точно:
— диагональная матрица уверенностей пользователя . Симметрично считают при фиксированном . Это и есть «поочерёдность» ALS.
Визуализация рядом — зачем
Эмбеддинги фильмов многомерные, глазом не увидеть. Поэтому их сжимают в 2D и рисуют точками. Видно главное: фильмы сами собираются в кластеры по смыслу (мультики к мультикам, ужасы к ужасам) — хотя модель про жанры ничего не знала, только про то, кто что смотрел.
Сильные стороны
- Сильная персонализация и хорошее качество при разреженных данных.
- Сжатые векторы → быстрый поиск похожих и рекомендаций.
- Латентные черты обобщают: ловят вкус там, где «совпавших зрителей» в лоб нет.
Слабые стороны
- Холодный старт остаётся: новому пользователю/фильму вектор взять неоткуда.
- Черты трудно объяснить словами («почему именно это?»).
- Нужно подбирать гиперпараметры (число черт, регуляризацию, alpha).
⚠️ Что может пойти не так
- Путать с предсказанием оценки: implicit-MF учится «было/не было + уверенность», а не «сколько звёзд». Считать её регрессией на рейтинг — концептуальная ошибка.
- Слишком мало факторов → модель недоучивается; слишком много без регуляризации → переобучение под train.
- Эмбеддинги случайно инициализируются: оси сами по себе ничего не значат, а знаки/повороты от запуска к запуску разные — нельзя толковать «фактор 3 = комедийность».
- Популярность всё ещё протекает: без поправок частые фильмы получают вектор с большой нормой и всплывают у многих.
🧠 Проверь себя: Что на самом деле оптимизирует наша implicit-MF?