ГоловнаШІ та Машинне навчанняРекомендаційна Система

🛒 Рекомендаційна Система — Колаборативна Фільтрація Наживо

Матриця оцінок користувач-товар розкладається на приховані вектори смаків — спостерігайте, як рекомендації оновлюються наживо, коли користувач оцінює більше товарів.

ШІ та Машинне навчання3DПросунутий60 FPS
ai-marketing-automation ↗ Відкрити окремо

Про колаборативну фільтрацію та факторизацію матриць

Рекомендаційні системи, як ті, що стоять за онлайн-магазинами, стрімінговими сервісами та платформами автоматизації маркетингу, рідко знають щось про те, *чому* клієнту подобається товар — вони бачать лише розріджену таблицю того, хто що оцінив. Факторизація матриць — це техніка, яка перетворює цю розріджену таблицю на прогнози: вона представляє кожного користувача й кожен товар як короткий вектор «прихованих факторів» у одному просторі, навчений так, щоб скалярний добуток вектора користувача і вектора товару відтворював оцінки, які справді спостерігались. Товари, які користувач ще не оцінив, отримують прогнозовану оцінку безкоштовно — просто тому, що їхній прихований вектор розташований поруч із товарами, які користувач уже оцінив високо.

Ця симуляція навчає справжню модель факторизації матриць рангу 2 методом стохастичного градієнтного спуску повністю в браузері. Десять синтетичних користувачів і дванадцять товарів генерують розріджену матрицю оцінок від 1 до 5 зірок на основі прихованих істинних факторів смаку плюс шум; модель ніколи не бачить ці істинні вектори — вона бачить лише розріджені зірки й має відтворити осмислений 2D-простір смаків з нуля. Натисніть на користувача, щоб побачити його спостережені оцінки та живі топ-N рекомендації моделі, потім додайте нову оцінку й подивіться, як кілька додаткових кроків градієнта зсувають точку цього користувача — та його список рекомендацій — у нову позицію.

Часті питання

Що таке колаборативна фільтрація?

Колаборативна фільтрація передбачає, що сподобається користувачу, на основі патернів оцінок усієї спільноти, а не заданих вручну атрибутів товару. Основна ідея в тому, що користувачі, які погоджувались у минулому (оцінювали ті самі товари схоже), ймовірно, погодяться знову. Факторизація матриць — це сучасна форма колаборативної фільтрації: вона стискає розріджену матрицю оцінок користувач-товар у дві невеликі щільні матриці прихованих векторів — один рядок на користувача, один рядок на товар — скалярний добуток яких відтворює спостережені оцінки і, що найважливіше, узагальнюється на неспостережені.

Що насправді означає прихований фактор?

Прихований фактор — це вимір, який модель винаходить під час навчання, щоб пояснити патерни збігу в даних оцінок — його не обирає і не підписує людина. У цій симуляції кожен користувач і товар отримує 2D-вектор; дві осі можуть умовно відповідати чомусь на кшталт «практичний проти грайливого» або «дешевий проти преміального» смаку покупця, але модель ніколи не бачить цих підписів. Вона бачить лише числа, а градієнтний спуск знаходить ту систему координат, яка найкраще передбачає спостережені зірки. Тому осі не мають фіксованого значення між різними запусками навчання — значення мають лише відносні позиції точок одна щодо одної.

У чому полягає проблема холодного старту для нових користувачів?

Абсолютно новий користувач без жодної оцінки має прихований вектор, що є лише випадковою ініціалізацією — він не несе жодного сигналу про смак, тож прогнози для нього не кращі за середню загальну оцінку плюс шум. Це і є проблема холодного старту: колаборативній фільтрації потрібні якісь спостережені взаємодії, перш ніж вона зможе осмислено розмістити користувача у прихованому просторі. У цьому симуляторі це можна побачити напряму — додайте одну оцінку для користувача, і його точка помітно стрибає до товарів, які він оцінив високо, а список рекомендацій одразу перебудовується.

Чому втрата обчислюється лише за спостереженими оцінками?

Матриця оцінок навмисно розріджена — кожен користувач оцінив лише жменьку каталогу, тож переважна більшість записів просто невідомі, а не нульові. Навчання моделі передбачати 0 або середнє значення для кожного неспостереженого запису активно навчило б її неправильному (що неоцінені товари не подобаються). Натомість функція втрат із квадратом похибки підсумовується лише за парами (користувач, товар), які справді мають зіркову оцінку: L = Σ(спостережені) (r_ui − r̂_ui)². Градієнти проходять лише через клітинки з реальним зворотним зв'язком, а приховані вектори для неоцінених пар підтягуються до розумних позицій виключно через спільні рядки й стовпці зі спостереженими клітинками.

Що робить член регуляризації?

Мета навчання додає λ(‖u‖² + ‖p‖²) до функції втрат із квадратом похибки, штрафуючи приховані вектори з великою величиною. Без цього користувач або товар із дуже малою кількістю спостережених оцінок може зміститись до екстремального вектора, який ідеально підганяється під ці одну-дві точки даних, але дає дикі прогнози для всього іншого — класичне перенавчання на розріджених даних. Регуляризація стискає вектори до нуля, якщо тільки дані не надають вагомих повторюваних доказів, щоб зсунути їх далі — жертвуючи трохи точністю на навчанні заради значно кращого узагальнення на неоцінені товари, від яких насправді залежать рекомендації.

Як додавання нової оцінки одразу змінює рекомендації?

Коли ви оцінюєте товар для обраного користувача, ця одна трійка (користувач, товар, оцінка) додається до набору спостережених, і оптимізатор запускає ще один пакет проходів SGD, зосереджений на оновлених даних. Оскільки вектори користувача й товару є спільними параметрами, кількох додаткових кроків градієнта достатньо, щоб зсунути прихований вектор користувача до товарів зі схожими факторами — ви можете побачити, як точка рухається на діаграмі розсіювання, а список топ-N прогнозів перебудовується протягом секунди, без повторного навчання з нуля.

Чому використовувати градієнтний спуск, а не розв'язувати рівняння для факторів напряму?

Якби кожен запис матриці оцінок був спостережений, сингулярний розклад (SVD) міг би обчислити оптимальні фактори низького рангу напряму у замкнутій формі. Але реальні матриці оцінок надзвичайно розріджені — користувач оцінив лише крихітну частку каталогу — тож класичний SVD не визначений для відсутніх записів. Стохастичний градієнтний спуск обходить це чисто: він торкається лише спостережених клітинок, масштабується до мільйонів оцінок, оскільки кожне оновлення має складність O(K) на оцінку, і природно підтримує інкрементні оновлення при надходженні нових оцінок — саме на це й спирається живе перенавчання в цій симуляції.

Чому RMSE виходить на плато, а не досягає нуля?

Синтетичні оцінки в цій симуляції генеруються з істинних прихованих факторів плюс випадковий шум, тож навіть ідеальна модель не може щоразу точно передбачити зашумлені зірки — існує незнижувана межа похибки, задана дисперсією шуму. Регуляризація також навмисно жертвує трохи точністю на навчальному наборі заради узагальнення, ще більше не даючи RMSE досягти нуля. На практиці це нормально: модель, яка доводить RMSE на спостереженому наборі до нуля лише з двома прихованими вимірами й жменькою оцінок на користувача, майже напевно запам'ятовує шум, а не вивчає смак.

⚙ Під капотом

Розріджена матриця оцінок 10×12 розкладається на дві матриці рангу 2 через SGD: прогнозована оцінка = глобальне зміщення + зміщення користувача + зміщення товару + u·p. Втрата й градієнти торкаються лише спостережених клітинок; L2-регуляризація не дає розрідженим користувачам і товарам перенавчатися.

WebGLCollaborative FilteringMatrix FactorizationSGDRecommender Systems

3D · рушій Three.js / WebGL · ціль 60 FPS · працює повністю на клієнті, без встановлення

Що ви знайшли?

Додати кроки відтворення (необов'язково)