Разбор статей конференции RecSys 2020
Привет, Хабр! Несмотря на все невзгоды года текущего, интересные мероприятия и статьи с них никуда не деваются. Поэтому ML команда Одноклассников подготовила разборы работ коллег из Google, Microsoft, Tencent и др. представленных на прошедшей этой осенью конференции по рекомендательным системам RecSys 2020.
Спектр вопросов поднимаемых в понравившихся нам статьях включает в себя как разборы новых алгоритмов рекомендаций, так и подходы к уточнению оценки старых. Вдобавок к этому мы рассмотрим очередной вариант решения задачи multi-task learning, замолвим слово о causal inference в разрезе рекомендеров, а также коснемся темы того, почему пользователи оказываются в «пузырях рекомендаций».
Are We Evaluating Rigorously? Benchmarking Recommendation for Reproducible Evaluation and Fair Comparison от@netcitizen
ADER: Adaptively Distilled Exemplar Replay Towards Continual Learning for Session-based Recommendation от @sdll
Neural Collaborative Filtering vs. Matrix Factorization Revisited от @goodamigo
Deconstructing the Filter Bubble: User Decision-Making and Recommender Systems от @anokhinn
Debiasing Item-to-Item Recommendations With Small Annotated Datasets от @AndreySklyarevskiy
Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations от @pkorobov
Короткие разборы коротких статей
Are We Evaluating Rigorously? Benchmarking Recommendation for Reproducible Evaluation and Fair Comparison
Авторы явно впечатлились нашумевшей статьей с прошлого RecSys, где хорошенько прошлись по новым алгоритмам рекомендаций и показали, что они систематически проигрывают простым затюненным бейзлайнам на популярных датасетах. В своей работе авторы попытались пойти по ортогональному пути для решения проблем воспроизводимости и честной оценки качества - созданию качественного бенчмарка качества для рексистем.
Для этого они обработали 85 статей последних лет по рекомендательным системам и выделили наиболее часто используемые бейзлайны, метрики, лоссы, датасеты и подходы к предобработке данных. Затем в разных конфигурациях затюнили отобранные модели на отобранных датасетах и таким образом зафиксировали честные, воспроизводимые метрики, снимая вопросы правильности/неправильности подготовки данных, черри-пикинга и т.д. Весь процесс задокументировали и оформили фреймворком.
Инсайты:
Фильтрация юзеров с малым числом интеракций (в статьях обычно берут >5 или >10), то есть снижение разреженности не всегда позитивно влияет на метрики.
Pair-wise лоссы всегда лучше point-wise.
Для задачи negative sampling простой uniform sampling всегда лучше хитрых popularity-based подходов.
Гиперпараметры подобранные для оптимизации одной метрики не всегда дают оптимум для другой метрики.
Промахи академиков:
Больше 80% работ допускают data leak по времени, то есть при разбивании трейн-тест делают простой random split. Использование стратегии разбиения данных без заглядывания в будущее ожидаемо просадило результаты моделей.
Почти все работы подбирают гиперпараметры модели по всему тренировочному датасету, а валидируются на тестовом, хотя в реальности для валидации нужно брать отложенную выборку из тренировочного.
Некоторые работы вообще не описывают препроцессинг, в каких-то используются разные данные под одним названием.
Уже давно наблюдается неакадемический подход к оценке результатов именно в рексистемах (такого бардака в CV, NLP даже близко нет). Результаты, полученные в этой работе, могут стать опорой для новых исследований. Некоторые инсайты очень понравились, так как они вообще не соответствует привычным представлениям и некоторым ранее выходившим статьям.
P.S. После онлайн-выступления на конференции авторам задали вопрос: «А как у вас с оценкой novelty и diversity?». Надеюсь, что вскоре кто-то доберется и до нормальной оценки этих параметров, а также их связи с классическими метриками.
ADER: Adaptively Distilled Exemplar Replay Towards Continual Learning for Session-based Recommendation от @sdll
Допустим, что вы хотите повысить пользу своего сервиса для пользователей, основываясь только на сессиях: вы, например, решили отказаться от хранения персональных данных, чтобы не заморачиваться с GDPR. Как персонализировать выдачу? Вы поделили вашу коллекцию по категориям и хотите решить, какая подборка подойдет для пользователя в моменте больше всего.
Было бы здорово сессии осмысленно кодировать: так вы могли бы осмысленно реагировать на самые распространенные паттерны поведения. Однако модели зачастую учатся на статических сплитах, а это не годится по двум причинам. Во-первых, по мере появления новых кандидатов метрики скорее всего будут только ухудшаться, потому что старые рекомендации со временем приедаются. Во-вторых, предпочтения самих пользователей могут меняться по разным причинам, от выборов президентов до прихода Нового года. А если на новых данных периодически модель подучивать, избежав дорогого повторного пробега по всей истории, высок риск выйти в новый локальный минимум, который никак не отражает старые инсайты.
Wiewel & Yang Чтобы с этим справиться, авторы ADER предлагают отбирать репрезентативные экземпляры из уже увиденного, и на каждой эпохе дообучения снова показывать их модели, по-умному варьируя их важность.
Так как вы не можете хранить бесконечное количество экземпляров, ограничьтесь подходящим N (в дальнейшем окажется, что положительный эффект выходит на плато после 10к экземпляров, поэтому можно и не хранить больше). Сколько представителей каждой категории стоит хранить на каждом шаге?
Авторы статьи решили взять пропорционально количеству кандидатов данной категории в новых данных и предыдущих экземплярах. Таким образом, для наиболее популярных категорий у вас и экземпляров будет линейно больше.
Отбирать сами экземпляры будем отталкиваясь от среднего представления сессии пользователей, которые смотрели конкретную категорию. Для каждого нового экземпляра проведем своеобразную ортогонализацию, исключая вклад предыдущих экземпляров данной категории:
Обучение на экземплярах устроим по схеме knowledge distillation: будем минимизировать разницу (кросс-энтропию) между выходами предыдущей версии модели на всех старых данных и выходами тренируемой модели на экземплярах. Этот штраф за разницу в предсказаниях мы добавляем к обычной кросс-энтропии над новыми данными с адаптивным коэффициентом, который учитывает два фактора: прирост кандидатов для рекомендаций и отношение размера новых данных и количества экземпляров (это важно, потому что на каждом периоде дообучения может выпасть как значительно больше данных, и потому нам менее важно помнить что было раньше, так и попасться разное количество новых категорий, которых мы еще не учитывали).
Как ADER ведет себя на практике?
Авторы использовали Recall@k и MRR(mean reciprocal ranks)@k для оценки качества на двух открытых датасетах, сравнив свой подход с другими трюками обучения на новых данных: обычным файнтюном, дропаутом, EWC (популярным лекарством от амнезии) и повторным обучением на всей истории. Удивительный факт: на обоих датасетах ADER показывает себя лучше, чем обучение на полном историческом архиве. Перформанс вы можете проверить сами: авторы выложили свой TensorFlow 2.1 код на GitHub.
Что можно улучшить?
Авторы обходят стороной подход с адаптивной архитектурой, но ссылаются на примеры работ, где они были реализованы: было бы интересно проверить действительно ли большие нужны накладные затраты для значительных улучшений в таком формате.
Можно попробовать более гибко менять количество отбираемых кандидатов каждой категории, попутно выучивая их важность.
В качестве основы для своей реализации авторы взяли трансформерный SASRec (2018) без указания особых причин – есть пространство для экспериментов со свежими архитектурами.
Так как MRR лучше подходит для задач, когда пользователю нужно что-то конкретное, а Recall одинаково взвешивает все релевантные выдачи, было бы здорово увидеть поведение ADER на других метриках – в случае сервиса рекомендации мемов, например, NDCG подошло бы лучше, будь у нас размеченный датасет.
Causal Inference for Recommender Systems
Чем зацепила
Статья обещает применение causal inference к задаче рекомендаций. Causal рекомендер может обеспечить более полезные пользователю рекомендации по сравнению со стандартной predictive моделью. Среди авторов статьи уважаемый человек David Blei.
Краткое изложение
Традиционная постановка задачи в рекомендациях – предсказать рейтинг/скор данного айтема для данного пользователя. Пользуясь этим подходом, мы рискуем рекомендовать айтемы, которые не принесут реального прироста. Например, обычный рекомендер предскажет, что пользователь, который высоко оценивает фильмы про супергероев, высоко оценит и «Мстителей». Но рекомендовать этому пользователю «Мстителей» не нужно – пользователь и так их посмотрит. В этом примере рекомендер не является причиной прироста метрики, он просто предсказал неизбежное. Идеально было бы порекомендовать фильм, который понравится пользователю, но при этом он вряд ли посмотрит этот фильм без рекомендера. Такое обещает causal recommender.
Статья использует терминологию causal inference: рекомендация – treatment, рейтинг – outcome. Разница между potential outcomes – causal effect рекомендации. Последнее мы хотим максимально точно оценить. Традиционные рекомендеры правильно оценивают causal effect, если при сборе данных пользователи оценивали случайные фильмы а-ля A/B эксперимент. На практике это не так: пользователь оценивает только те фильмы, которые посмотрел. При выборе фильмов пользователь руководствуется своими внутренними склонностями, то есть выбирает фильмы не случайно. Из-за этого оценка эффекта получается смещенная. Основная проблема в переменных - confounders: тех, что влияют и на выбор фильма (treatment assignment) и на рейтинг (outcome). Чтобы убрать смещенную оценку, такие переменные нужно включать в модель (но мы их не знаем). Авторы предлагают воспользоваться результатом их же статьи The Blessings of Multiple Causes. В ней авторы показывают, как можно выучить замену для неизвестных confounders, в задачах с множественными параллельными воздействиями. То есть как раз в задачах типа рекомендаций.
В итоге предлагается такой алгоритм:
Обучаем exposure model, которая учится предсказывать, какой фильм пользователь посмотрит. Результат применения этой модели и есть та самая замена неизвестных confounders. Модель представляет из себя Байесовскую матричную факторизацию с парой Гамма-Пуассон. Обучается с помощью приближенного вариационного вывода. Физический смысл этой модели в том что она выучивает «внутренние склонности» пользователя, контролируя которые, получим несмещенную оценку эффекта.
Добавляем предсказания exposure model в outcome model как признак. Таким образом авторы предлагают контролировать counfounders. Модель – матричная факторизация с признаком:
Модель обучается с помощью MAP оценки (я интерпретировал это как MSE + регуляризация). Почему и при каких предположениях это работает, рассказано в статье, упоминавшейся выше.
По сути, модель пытается скорректировать смещение предсказанных рейтингов, вызванное нерандомностью сбора данных. Поэтому сравнивается она в основном с другим корректировщиком смещения - inverse probability weighted matrix factorization. В экспериментах на симулированных и реальных данных предложенный подход побеждает.
Что можно применить
Предложенный подход простой и реализовать его было бы несложно. Для exposure model не обязательно использовать Байесовскую факторизацию – подойдет и другая модель, например автоэнкодер. Другое дело, что нужно будет переформулировать это в терминах implicit feedback. Например, обучать exposure model на просмотрах товаров, а outcome model на покупках. Было бы интересно понять в A/B, как causal model ведет себя по сравнению с обычной.
Что насторожило/не понравилось:
Статья не добавляет новых идей по сравнению с 2018 годом. Добавились только эксперименты, но мало.
Результаты экспериментов не сильно улучшают бейзлайны. Это уменьшает желание заводить новую модель ради совсем крошечного улучшения.
Neural Collaborative Filtering vs. Matrix Factorization Revisited
В данной статье проводится сравнение двух способов измерения схожести векторных представлений (эмбеддингов) объектов - скалярного произведения и подходов на основе многослойного персептрона.
Со стороны многослойных персептронов авторы рассматривают два подхода: их применение к конкатенации эмбеддингов (MLP) и нейронную факторизацию матриц (neural matrix factorization - NeuMF).
Также рассматривается Generalized Matrix Factorization (GMF) - сигмоиды от скалярного произведения вектора весов на вектор, получившийся в результате поэлементного умножения эмбеддингов. NeuMF - это применение персептрона только к части индексов эмбеддингов с прибавлением к оставшимся индексам GMF и суммированием результатов.
Рассматриваются наборы данных Pinterest и бинаризованный Movielens 1M. Для модели скалярного произведения выполнялся поиск гиперпараметров, гиперпараметры MLP и NeuMF были взяты из оригинальной статьи. На обоих наборах данных для всех размерностей пространства эмбеддингов и метрик NDCG@10, HR@10 скалярное произведение показывает себя лучше, чем нейросетевые подходы. Исключением является всего одна конфигурация, где результаты сравнялись.
Однако теоретически многослойный персептрон может аппроксимировать скалярное произведение. Так почему же он не показал хотя бы такие же результаты? Авторы выдвигают гипотезу, что причиной этому является большое количество шагов обучения, требуемое для аппроксимации скалярного произведения с нужной точностью. Теоретически оно составляет
Авторы не пытаются принизить использование нейронных сетей в рекомендациях. Они проводят параллель между скалярным произведением и сверточными и рекуррентными сетями, которые персептрон тоже теоретически может выучить, но на практике так не происходит. Поэтому авторы призывают воспринимать скалярное произведение как один из этих шаблонов. Авторы указывают на то, что скалярное произведение гораздо быстрее вычисляется, чем выход многослойного персептрона, а также на существование моделей эффективного поиска среди векторов (ANN), которые завязаны на скалярном произведении. Эти факторы делают скалярное произведение более применимым на практике в индустриальных задачах с высокой нагрузкой. Авторы рекомендуют аккуратно подбирать гиперпараметры и использовать нейросетевые меры схожести с осторожностью, сначала проверив качество скалярного произведения для поставленной задачи.
Практический вывод
Хороший подбор гиперпараметров может существенно влиять на результаты модели. В качестве функции схожести для эмбеддингов по умолчанию стоит брать скалярное произведение - оно с большой вероятностью может работать быстрее и эффективнее прочих подходов, которые следует использовать с осторожностью.
Достоинства и недостатки статьи
Авторы не просто показали, что функции схожести на основе многослойного персептрона уступают скалярному произведению, но и выдвинули теоретическую гипотезу о причине этого, подтвержденную практикой. Было сделано важное замечание о лучшей применимости скалярного произведения в индустрии. Также интересна параллель с другими шаблонами в нейронных сетях.
Недостатки статьи:
В статье, которая завязана на воспроизведении подходов, не используется построение доверительных интервалов. При этом для небольшого количества конфигураций возникли результаты, которые сложно однозначно трактовать в пользу той или иной модели. Эти случаи могли бы точнее разрешить доверительные интервалы.
Постановка задачи аппроксимации скалярного произведения с шумом может не совсем корректно отображать способность аппроксимировать данную функцию, не было показано как она аппроксимируется без шума.
Deconstructing the Filter Bubble: User Decision-Making and Recommender Systems
Чем зацепила
Статья исследует механизм filter bubble в рекомендациях. Предлагается свежий взгляд на задачу рекомендаций – статья не про построение рекомендера, а про то, как пользователи потребляют то, что им рекомендует сервис.
Краткое изложение
Авторы статьи предлагают модель, которая объясняет, как пользователи потребляют рекомендации. Модель основана на теории игр и исследованиях в экономике, поэтому можно считать, что она согласуется с реальным поведением пользователей. Здесь нет смысла рассказывать технические подробности модели, только основные положения:
Пользователь получает некоторый фиксированный monetary value от потребления каждого item-а. Этот value складывается из двух компонентов: общего для всех пользователей и персонального для конкретного пользователя. Первый можно считать неким универсальным качеством item-a – рекомендер может его выучить, используя данные многих пользователей. Второй компонент – специфичен для каждого пользователя и поддается только персонализированным рекомендерам.
Пользователь не знает свой value для item-ов. Вместо этого у него есть некоторое убеждение (belief) об общем и персонализированном компонентах value. Это убеждение выражается через вероятностные распределения.
На основании своих убеждений пользователь выбирает следующий item: берет item с максимальным матожиданием utility function по распределениям компонентов value. Функция utility устроена так, что пользователь предпочитает item с большим матожиданием value и маленькой дисперсией. Внутри utility есть параметр, который отвечает за рискованность пользователя. Осторожный пользователь сильно штрафует item за дисперсию value, а рискованный не сильно. Получается как бы anti-exploration: пользователи предпочитают «знакомые» item-ы даже если у них ожидаемое value меньше, чем у незнакомых.
После выбора item-а пользователь наблюдает его действительное value и обновляет свои убеждения. При этом обновляются распределения не только выбранного item-а, но и ближайших к ним.
Рекомендации помогают пользователю уточнить свои убеждения. В статье этот пункт раскрыт не очень глубоко. Понятно, что рекомендации рассматриваются как дополнительные байесовские апдейты распределений компонентов value.
В отличии от обычных статей по МЛ, модель не выучивается, а постулируется. Основные выводы в статье сделаны на основании симулированных данных из этой модели. Выводов довольно много, вот то, что мне показалось самым интересным:
Пользователи сами замыкают себя в пузыре. Это следует из пунктов 3 и 4 выше: они не любят неизвестные item-ы, и знают больше всего про item-ы, которые похожи на те, что они уже видели. Рекомендации на самом деле помогают пользователям выбраться из пузыря, заставляя их больше эксплорить.
Рекомендации заставляют пользователей потреблять похожие item-ы. Это объясняется тем, что модели легко выучить общий компонент value. Таким образом рекомендер вносит popularity bias.
Что можно применить
Авторы говорят, что нужно собирать данные про убеждения пользователей и учитывать их при проектировании рекомендательных систем. Не очень понятно, как это делать на практике. Тем не менее, я бы советовал прочитать эту статью ради осознания влияния рекомендаций на пользователя. И ради альтернативного взгляда.
Что насторожило/не понравилось
Не понятно, насколько модель отражает реальность. Например, в ней заложено, что пользователи не эксплорят самостоятельно. Это кажется сильным упрощением.
Debiasing Item-to-Item Recommendations With Small Annotated Datasets
Коротко
Item-to-item рекомендации страдают от предвзятости в пользу популярных объектов. Авторы предлагают дискриминировать популярные объекты путём учёта оценки обратной склонности (Inverse Propensity Scoring), выученную по ограниченному количеству размеченных пар. Делают рекомендации исходя из counterfactual перспективы: «что, если item не встречался бы так часто?».
В статье заявляют, что для item-to-item рекомендаций, подход существенно (до +16% без указания доверительных интервалов) превосходит такие бэйзлайны как ItemKNN, различные матричные факторизации и SLIM по Recall@K и по средней позиции релевантного объекта.
Механизм
Inverse Propensity Score (IPS) -- оценка обратной склонности -- величина, обратная вероятности того, что два объекта встретились вместе исключительно в силу своей популярности, а не из-за фактической схожести между собой.
Далее авторы описывают проблему недостатка наблюдений и предлагают способ предсказания IPS на основе рейтинга релевантности вещей между собой, предоставленном пользователями. Далее строят item-to-item связи, ранжируя весь набор целиком относительно объекта по предложенной формуле.
Сомнения
В статье ни разу не упоминается data leak, при этом выглядит так, что IPS обучался на основе меры релевантности, оцененной пользователями, а результат сравнивался с решениями по мере релевантности, так же оцененной пользователями. Кода нет, но возможно, что конкретная реализация могла показать хорошие результаты просто из-за выученных подсказок о релевантности в данных.
Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations от @pkorobov
Краткое содержание
Удовлетворенность и вовлеченность пользователя может оцениваться множеством факторов: кликами, просмотрами, лайками, шерами и т. д., MTL же как раз предполагает оптимизацию нескольких задач в рамках одной модели. В сравнении с одиночными моделями Multi-Task Learning выигрывает за счет использования информации от разных задач, при этом бонусом мы можем получить большую эффективность по числу параметров модели.
Увы, часто задачи слабо коррелируют или вовсе конфликтуют. Авторы утверждают, что на данных со сложным task correlation существующие MTL-модели склонны жертвовать перфомансом на одних задачах ради других (так называемый феномен качелей) и не могут повысить качество сразу во всех задачах в сравнении с одиночными моделями.
Главным образом, это демонстрируется на большом (но, увы, закрытом) датасете для рекомендаций видео компании Tencent. Модель должна оптимизировать метрики VCR (View Completion Ratio) и VTR (View-Through Rate). VCR показывает отношение длины просмотренной части видео ко всей его длине, а под VTR здесь подразумевается доля валидных просмотров, т. е. таких, где просмотренная часть видео больше некоторого порога. Оптимизация VCR - задача регрессии, а VTR - классификации.
Эти показатели сложно коррелируют, и поэтому, по утверждениям авторов, сложно добиться прироста сразу на всех задачах. На картинке видно, что в сравнении с Single-Task моделями ни один из бейзлайнов не смог существенно выиграть в качестве сразу на двух задачах. Но их модель, конечно же, смогла!
Предложенная модель
За основу авторы взяли модель MMOE (Multi-gate Mixture-of-Experts). В ней имеется несколько сетей, называемых экспертами, выходы которых суммируются в softmax-гейтах для каждой задачи. Каждый полученный взвешиванием в гейтах вектор идет дальше в сеть, отвечающую за свой таск.
Появляется разумная идея: разделить обязанности экспертов, распределив их на тех, которые учат фичи для отдельных специфических задач, и тех, выходы которых могут нести полезную информацию сразу для всех. Для этого мы явно удаляем из MMOE избыточные соединения от выходов экспертов к гейтам, что видно на картинке ниже: на каждый гейт уже идут выходы не от всех экспертов, а только от shared и task specific. Таким образом, мы получим предложенную авторами модель Customized Gate Control.
Пойдем чуть дальше: сделаем на основе CGC-подобных блоков многослойную модель. Extraction network - это CGC с дополнительным shared гейтом, агрегирующим выходы со всех возможных экспертов. Shared гейт нужен, так как на нижних уровнях находятся абстрактные признаки, и маловероятно, что они являются специфичными для какой-то задачи. Таким образом, в нижних слоях сети практически нет какого-то разделения на специфичность задач, но, как говорят авторы, это разделение прогрессивно происходит в более верхних слоях, откуда и название модели: Progressive Layered Extraction.
Таким образом, архитектура гораздо лучше структурирована и лучше выучивается за счет отсутствия в гейтах входов от нерелевантных экспертов.
Несмотря на то, что предложенные архитектуры кажутся частным случаем MMOE и её многослойного аналога, авторы показывают, что MMOE не сходится к подобному виду.
Польза
Главный результат заключается в том, что эта модель, согласно статье, существенно меньше страдает от перекоса качества в сторону одной из задач. Это рисует хорошие перспективы для MTL, который довольно актуален для рекомендательных систем.
Что не понравилось
Хотелось бы больше экспериментов на открытых данных и побольше бейзлайнов.
Короткие разборы коротких статей
Taking advantage of images and texts in recommender systems: semantics and explainability
Авторы попытались описать различные подходы к использованию информации с картинки и текста, для рекомендательных систем.
Картинки:
Базовый подход. Использование фичей с последних слоев сеток обученных на ImageNet. Такой подход содержит минус, потому что он не отражает «отношения или связь» пользователя к изображению.
Предлагаемый подход. Обучить модель, которая будет оценить вероятность того, что изображение сделано самим пользователем.
Текст:
Базовый подход. Использование Doc2vec, Word2vec, BERT.
Предлагаемый подход. Сами не сделали, но идея такая же, как и с картинками.
Behavior-based Popularity Ranking on Amazon Video
Автор предлагает строить вкладку «трендовые видео» не на основе просмотров/лайков/CTRов, а предсказывать их с помощью деревьев, используя агрегированные фичи юзера, видео метадату, и информацию о его новизне. Вообще идея хоть и банальная, но интересная, можно попробовать поэкспериментировать с этим.
Статья слишком короткая, без выводов по метрикам, расчета эффекта на пользователей и тд.
Investigating Multimodal Features for Video Recommendations at Globoplay
Авторы рассказывают о том, что оказывается можно использовать аудио- и видео- фичи из видео для рекомендаций. Привет Youtube8M и 2017 году. В качестве видео экстрактора C3D, в качестве аудио экстрактора предобученный VGG. Полный аналог решений из Youtube8M с единственным отличием в том, что они отрезают голову и используют эмбеддинг для поиска похожих. Ну и future work порадовал: провести А/Б на пользователей и посчитать эффект на бизнес метрики. Качество статьи заставляет добавить GloboPlay в черный список.
Выводы
Исследователи все чаще обращаются к описанию подходов к применению глубокого обучения не только для генерации фичей, но и решения самой задачи рекомендаций. Это дает простор для экспериментов с моделями, которые у нас уже есть в продакшене.
Помимо описаний прикладных решений нам очень нравятся тенденции к появлению статей на общее понимание того, что выдают нам модели и как ведут себя пользователи.
Авторы одной из статей утверждают, что пользователи сами замыкают себя в «пузыре рекомендаций». Из этого можно сделать главный вывод-совет этого разбора: нам нужно следить за балансом exploration/exploitation и не только в рекомендациях.