Matrix Factorization (ALS)
Каждому пользователю и фильму выучивается короткий вектор «скрытых черт». Совпадение векторов = интерес. Черты модель находит сама.
Карта латентных факторов: топ-400 фильмов
Каждая точка — фильм, спроецированный из пространства скрытых черт в 2D (PCA), цвет — основной жанр; жанров модель не знала, только кто что смотрел. Цвета перемешаны — и это нормально: насколько структура по жанрам вообще есть, картинкой не решается. Замер — сразу под ней.
А кластеры-то есть? Проверяем счётом
Теория простым языком
Matrix Factorization выучивает каждому пользователю и каждому фильму короткий набор чисел — «скрытые черты». Совпали черты человека и фильма → фильм ему зайдёт. Эти черты компьютер находит сам, никто их заранее не задаёт.
С чего начинаем
Снова берём матрицу «пользователи × фильмы» с оценками — почти пустую. Идея MF: эту огромную пустую таблицу можно приблизительно «собрать» из двух маленьких табличек. Это и есть факторизация.
▸Почему neighborhood CF стало не хватать
▸Почему implicit ALS
Что такое «скрытые черты»
Допустим, черт всего 2. Тогда у фильма есть пара чисел (например, «детское ↔ взрослое» и «лёгкое ↔ серьёзное»), и у человека — пара чисел про его вкус по тем же осям. Реально мы берём не 2, а несколько десятков таких черт.
Как предсказываем интерес
Берём вектор пользователя и вектор фильма и считаем их «совпадение» — перемножаем по чертам и складываем (скалярное произведение). Чем больше совпали знаки и величины, тем выше предсказанный интерес. Так одним умножением получаем оценку для любой пары человек–фильм, даже если он его не видел.
Важно: мы не предсказываем звёзды
Наивная MF пытается угадать сам балл (явный фидбек). Мы используем другую, более практичную версию — для неявного фидбека: нам важно не «сколько звёзд», а было ли взаимодействие и насколько мы в нём уверены.
Поэтому оценку превращают в два числа: предпочтение (1, если человек вообще трогал фильм, иначе 0) и уверенность (чем выше оценка, тем сильнее сигнал). Модель старается сильнее там, где уверенность выше.
Тут зарыт подвох: 1★ — тоже «позитив»
Схему Hu–Koren–Volinsky придумали для неявного фидбека, где — это счётчик: сколько раз человек слушал трек, сколько минут смотрел. Там «больше » действительно значит «сильнее сигнал», а отрицательного сигнала в логе просто нет.
У нас — это звёзды, включая плохие. Единица тоже даёт , только с меньшим весом: фильм, который человеку не понравился, попадает в цель обучения как предпочтение. А оцениваем мы при этом строго обратное — релевантным считается таргет с оценкой ≥ 4. Модель учат на одном, а спрашивают другое.
Насколько это дорого — вопрос замера, а не мнения. Обучим ту же ALS ещё раз, оставив позитивами только лайки (оценка ≥ 4), и сравним на тех же пользователях и том же протоколе:
Откуда берутся числа: 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 = комедийность».
- Читать смысл с двумерной проекции: цвет на ней добавлен постфактум, а расстояния искажены сжатием. Утверждение «похожее рядом» проверяется счётом в полном пространстве и сравнением со случайной расстановкой меток — иначе это разглядывание облака.
- Популярность всё ещё протекает: без поправок частые фильмы получают вектор с большой нормой и всплывают у многих.
- Цель обучения и определение релевантности могут не совпадать: p_ui = 1 для любой выставленной оценки, а в метрике релевантно только ≥ 4. Схема из статьи рассчитана на счётчики (прослушивания), где плохих значений не бывает; на звёздах это надо проверять отдельно.
🧠 Проверь себя: Что на самом деле оптимизирует наша implicit-MF?
Конфигурация обучения
Всё, что нужно, чтобы повторить числа на этой странице. Значения читаются из самих обученных моделей, а не набраны в вёрстке, — разойтись с кодом они не могут.
Что дальше
Опирается на этот модуль — здесь он нужен как предпосылка
Можно читать параллельно — тот же блок, порядок между ними не важен
До финальной сборки не хватает ещё 11 модулей по этому пути.
Порядок здесь — рекомендация из карты курса, ничего не блокируется. Отметка «прочитано» хранится только в этом браузере.
Источники
- Matrix Factorization Techniques for Recommender SystemsY. Koren, R. Bell, C. Volinsky · 2009 · статьябазовая постановка MF и смысл латентных факторов
- Collaborative Filtering for Implicit Feedback DatasetsY. Hu, Y. Koren, C. Volinsky · 2008 · статьяpreference/confidence и шаг ALS — прямо эти формулы в нашей реализации
- Netflix Update: Try This at HomeS. Funk · 2006 · постисторический контекст: как MF попала в рекомендательные системы