В прошлом уроке PCA раскладывала данные по немногим осям. Тот же приём низкого ранга работает и там, где таблица почти пустая: в рекомендациях. Мы дадим каждому пользователю и каждому фильму короткий вектор так, чтобы скалярное произведение предсказывало оценку, а близость векторов рисовала карту вкусов. Все числа ниже посчитаны на настоящих оценках MovieLens.
Почти пустая матрица
Пусть — оценка, которую пользователь поставил фильму . В таблице «пользователи × фильмы» заполнена лишь малая часть клеток: в наборе MovieLens 100K это оценок при пользователях и фильмах — меньше одной клетки из ста. Пустую клетку нельзя заменить нулём: пропуск означает «не смотрел», а не «не понравилось».
Поэтому модель учат только на наблюдаемых парах . Матричная факторизация приближает оценку так:
где — общая средняя оценка, — щедрость пользователя, — репутация фильма, а — короткие латентные векторы.
Сначала смещения, потом факторы
Прежде чем гнаться за латентными векторами, стоит выжать простое. Уже одни смещения учитывают, что один зритель ставит всем на балл выше, а иной фильм всем нравится сильнее среднего. Это сильный базовый уровень.

Реальный прогноз, разложенный на вклады: общая средняя, щедрость пользователя, репутация фильма и, наконец, совпадение вкусов . Латентные векторы берут на себя только то, что не объяснили смещения.
В таблице оценок клеток пусты. Почему нельзя просто записать в них ноль и обучить модель на всей матрице сразу, как делает обычный PCA?
Показать ответ
Ноль — это конкретная низкая оценка, а пропуск означает «не смотрел». Заполнив пропуски нулями, мы заставили бы модель предсказывать, что все неоценённые фильмы пользователю не нравятся, — прямая ложь про данных. Поэтому сумма ошибок берётся только по наблюдаемым парам ; в этом ключевое отличие от плотного PCA, который работает по всем клеткам.
Карта вкусов
Латентные векторы фильмов можно нарисовать. Обучим модель с двумя факторами на настоящих оценках и разложим фильмы на плоскости.

Двумерные векторы фильмов, обученные только по оценкам. «Звёздные войны» садятся рядом с фантастикой, «Крёстный отец» и «Криминальное чтиво» — в своём углу. Никто не задавал жанров: близость возникла из того, кто как оценивал.
Замечательно, что карта восстановила смысл, которого ей не сообщали: соседями оказываются продолжения и фильмы одного жанра. Это и есть сила низкого ранга — несколько чисел на объект улавливают структуру вкусов.
Среди всех матриц заданного ранга ближайшей к исходной по сумме квадратов является та, что оставлена её первыми главными компонентами; лучшего приближения этого ранга не существует.
Потрогай карту
Перетаскивайте свой вектор вкуса по настоящей карте MovieLens. Прогноз оценки каждого фильма — это средняя плюс репутация фильма плюс скалярное произведение вашего вектора на вектор фильма. Справа список меняется: система рекомендует то, что смотрит в сторону вашего вектора.
Оси карты можно повернуть
У красивой карты есть подвох: отдельная ось не имеет закреплённого смысла. Для любой ортогональной матрицы (поворота) скалярные произведения сохраняются:
Значит, всю карту можно повернуть — прогнозы не изменятся ни на йоту. Поэтому нельзя объявить «первая координата — это комедийность»: смысл проверяют соседями и корреляцией с известными атрибутами, а не подписью к одной оси.

Это та же неоднозначность, что у скрытого кода автокодировщика: смысл несёт геометрия представления, а не номер координаты.
После общего поворота всех векторов ортогональной матрицей прогнозы не изменились. Что ещё осталось прежним — расстояния между фильмами, знак отдельной координаты, порядок рекомендаций? Что не сохраняется?
Показать ответ
Сохраняется всё, что зависит только от скалярных произведений: попарные расстояния , углы, ближайшие соседи и, значит, весь порядок рекомендаций. Не сохраняется смысл отдельной оси: знак и величина конкретной координаты меняются при повороте, поэтому «первая координата — это комедийность» не может быть объективной характеристикой.
::::
Сколько факторов брать
Больше факторов — гибче модель, но и выше риск переобучения на редких объектах. Проверим на отложенных оценках, как ошибка зависит от числа факторов .

Ошибка на тесте падает с (одни смещения) до примерно и выходит на полку. Популярные фильмы всегда предсказываются точнее редких: у них больше оценок, и вектор устойчивее.
Обратите внимание: одни смещения уже дают , а факторы улучшают лишь до . Сложность обязана зарабатывать право на ответ — если персональный вектор не бьёт базовый уровень, он не нужен.
На карте RMSE редких фильмов (tail) держится около , а популярных (head) — около , при любом числе факторов. Почему у редких фильмов вектор предсказывает хуже, и помогает ли тут увеличение ?
Показать ответ
Вектор фильма оценивается по его оценкам: у популярного их тысячи, у редкого — единицы, поэтому его почти шум и легко переобучается. Увеличение не спасает, а вредит: больше параметров на тот же скудный сигнал усиливают переобучение (кривая tail даже слегка растёт). Помогают регуляризация, опора на смещение и контентные признаки — но не рост .
Популярные и редкие
Средняя ошибка почти целиком отражает частые объекты: у фильма с тысячей оценок вектор устойчив, у фильма с двумя — почти шум. Поэтому тест разбивают по числу известных взаимодействий на группы (популярные, хвост, холодные) и показывают ошибку каждой. Одно среднее число прячет, что каталог для редких фильмов работает хуже. Мало того, и среднее считать можно по-разному: усреднение по всем событиям неявно даёт больший вес активным пользователям, оставившим много оценок, а усреднение по пользователям отвечает на другой вопрос — как система обслуживает типичного человека, а не типичный клик.
Холодный старт
У совсем нового пользователя оценок нет — вектор не из чего оценить. Помогают несколько стартовых вопросов, популярный список и контекст. Новый фильм страдает так же: его начальный вектор берут из жанров, описания и обложки, а потом уточняют по просмотрам.

Холодный старт не смешивают с обычным тестом: пользователей и фильмы, полностью отсутствовавшие в обучении, честно выделяют и сообщают охват (coverage), а не выкидывают перед подсчётом метрики.
Что рекомендация измеряет на самом деле
Наблюдаемые оценки смещены: люди чаще оценивают то, что им показали и что заметно. Модель учится по следу прежней политики показа, поэтому высокий прогноз для популярного фильма может отражать экспозицию, а не самостоятельное предпочтение. Оффлайн-метрика не измеряет эффект нового интерфейса — для причинного вывода нужен онлайн-эксперимент. В школьном проекте достаточно назвать это ограничение и не выдавать корреляцию рейтингов за причину выбора.
Разбиение на обучение и тест здесь тоже тонкое: для явных оценок историю делят по времени (ранние в обучение, поздние в тест), иначе будущий вкус помогает предсказать прошлый — прямая утечка данных. А кроме точности измеряют разнообразие и охват: список из десяти почти одинаковых продолжений может иметь высокую метрику и быть бесполезным.
Существо задачи часто в том, чтобы сложный объект заменить простым приближением, сохранив главное; выбор наилучшего приближения сам есть задача оптимизации.
Русская линия ведёт к Л. В. Канторовичу — математику и экономисту, нобелевскому лауреату, создателю линейного программирования и теории оптимального распределения ресурсов. Рекомендация по духу и есть оптимальное распределение внимания, а низкий ранг — наилучшее простое приближение сложной таблицы, ровно в канторовичевом смысле.
Коротко о рекомендациях
Рекомендательная система раскладывает почти пустую таблицу оценок на короткие векторы: скалярное произведение предсказывает оценку, а близость векторов рисует карту вкусов. Смещения снимают простые эффекты, латентные факторы ловят взаимодействия, а их число подбирают по отложенной ошибке. Оси карты можно повернуть, поэтому смысл несёт геометрия, а не координата. И под всеми красивыми картами лежит трезвость: метрика смещена выбором показа, редкие объекты предсказываются хуже, а холодный старт требует отдельного режима. Дальше — эмбеддинги содержания, где близость строится не из оценок, а из самого объекта.
Задачи
Матрица оценок пользователей фильмам равна
;
восемь чисел наблюдаются, четыре знака ? пропущены. Найдите среднее по
наблюдаемым оценкам. При выполните ровно один упорядоченный проход:
сначала для каждого пользователя ,
затем для каждого фильма ,
используя уже найденные . Заполните четыре пропуска формулой
без обрезки, выпишите порядок вычислений и проверьте все
промежуточные числители.
Прогноз определён явно: . При , , , , вычислите каждое слагаемое и . Затем поверните оба вектора матрицей , пересчитайте прогноз и докажите для любой ортогональной (), что . Объясните, почему смещения и среднее при повороте не меняются.
В тесте оценок популярных фильмов с RMSE балла и оценок редких фильмов с RMSE балла. Восстановите сумму квадратов ошибок каждой группы и вычислите общую , а также macro-среднее . Округлите до трёх знаков и объясните, какое число одинаково взвешивает две группы, а какое — каждую отдельную оценку.
Почему в модели смещения обучают до и вместе с факторами? Рассмотрите пользователя, ставящего всем на балл выше среднего, и фильм, который всем нравится на полбалла сильнее. Покажите, что без членов скалярное произведение вынуждено кодировать эти два простых сдвига направлениями латентного пространства, и объясните, чем это вредит интерпретации и обобщению.
Используйте GroupLens MovieLens 100K, файл u.data (100 000 строк
user_id,item_id,rating,timestamp). Для временного разбиения отсортируйте строки по
и возьмите первые
в train, следующие в validation, последние в test. Сравните с
перестановочным разбиением тех же размеров через default_rng(17).permutation. В
каждом протоколе обучите baseline поочерёдным
пересчётом: — train-среднее, все стартуют нулём, ровно циклов
(с прошлого цикла), затем
. Неизвестному user/item ставьте
смещение . Выберите по validation-RMSE. На test
сообщите RMSE всех строк и только «известных», долю новых пользователей и фильмов,
охват и сравните временное разбиение с перестановочным.
На том же u.data для каждого пользователя отсортируйте оценки по
: первые в train,
остальные в test. Для и seed обучите
методом ALS: чередуйте пересчёт смещений и
гребневые решения для и при , сверток. Сообщите test-RMSE
всех известных пар, отдельно для верхней и нижней четверти фильмов по числу оценок, и
устойчивость -мерной карты между seed (средний угол между подпространствами
). Убедитесь, что RMSE падает от к и выходит на полку.
Докажите инвариантность прогноза к повороту строго: пусть все векторы заменены на , с ортогональной . Покажите, что не только каждое , но и все попарные расстояния сохраняются, а значит, ранжирование рекомендаций и ближайшие соседи не меняются. Выведите отсюда, что осям карты нельзя приписывать абсолютный смысл, и предложите, как проверять гипотезу «эта ось — жанр» через корреляцию с известными метками.
Постройте ранжирующую оценку на u.data. Для каждого пользователя candidate set —
все train-фильмы, кроме уже оценённых им в train; релевантные — его test-фильмы с
рейтингом . Обучите факторную модель (, ALS) и для каждого пользователя с
непустым релевантным множеством отранжируйте кандидатов по прогнозу. Сообщите
macro-Recall@10 и объясните, почему эта величина зависит от размера candidate set:
сравните ожидаемую вероятность случайного попадания в top-10 среди и среди
кандидатов.