Социальные сети — это один из наиболее востребованных на сегодняшний день интернет-продуктов и один из основных источников данных для анализа. Внутри же самих социальных сетей самой сложной и интересной задачей в сфере data science по праву считается формирование ленты новостей. Ведь для удовлетворения всё возрастающих требований пользователя к качеству и релевантности контента необходимо научиться собирать информацию из многих источников, вычислять прогноз реакции пользователя и балансировать между десятками конкурирующих метрик в А/Б-тесте. А большие объемы данных, высокие нагрузки и жесткие требования к скорости ответа делают задачу ещё интереснее.
Казалось бы, задачи ранжирования на сегодня уже изучены вдоль и поперёк, но если присмотреться, то не всё так просто. Контент в ленте очень разнороден — это и фото друзей, и мемасики, вирусные ролики, лонгриды и научпоп. Для того, чтобы собрать всё воедино, необходимы знания из разных областей: компьютерное зрение, работа с текстами, рекомендательные системы, и, в обязательном порядке, современные высоконагруженные хранилища и средства обработки данных. Найти одного человека, обладающего всеми навыками, сегодня чрезвычайно сложно, поэтому сортировка ленты — это по-настоящему командная задача.
С разными алгоритмами ранжирования ленты в Одноклассниках начали экспериментировать еще в 2012-м году, а в 2014-м к этому процессу подключилось и машинное обучение. Это стало возможным, в первую очередь, благодаря прогрессу в области технологий работы с потоками данных. Только начав собирать показы объектов и их признаки в Kafka и агрегируя логи с помощью Samza, мы смогли построить датасет для обучения моделей и рассчитать самые «тянущие» фичи: Click Through Rate объекта и прогнозы рекомендательной системы «по мотивам» работы коллег из LinkedIn.
Очень быстро пришло понимание того, что рабочая лошадка логистической регрессии не может вывезти ленту в одиночестве, ведь у пользователя может быть очень разнообразная реакция: класс, комментарий, клик, сокрытие и т.д., а контент при этом может быть очень разный — фото друга, пост группы или заклашенный другом видосик. У каждой реакции для каждого типа контента своя специфика и своя бизнес-ценность. В итоге мы пришли к концепции «матрицы логистических регрессий»: для каждого типа контента и каждой реакции строится отдельная модель, а затем их прогнозы умножаются на матрицу весов, формируемую руками исходя из текущих бизнес-приоритетов.
Эта модель оказалась на редкость жизнеспособной и достаточно долго была основной. Со временем она обрастала всё более интересными признаками: для объектов, для пользователей, для авторов, для отношения пользователя с автором, для тех, кто взаимодействовал с объектом, и т.д. В результате первые попытки заменить регрессию нейросетью закончились грустным «фичи у нас слишком закрафченые, сетка буста не дает».
При этом часто наиболее ощутимый буст с точки зрения пользовательской активности давали технические, а не алгоритмические улучшения: зачерпнуть больше кандидатов для ранжирования, точнее отслеживать факты показа, оптимизировать скорость ответа алгоритма, углубить историю просмотров. Подобные улучшения часто давали единицы, а иногда даже десятки процентов прироста активности, тогда как обновление модели и добавление признака чаще давало десятые доли процента прироста.
Отдельную сложность при экспериментах с обновлением модели создавал ребаланс контента — распределения прогнозов «новой» модели часто могли значимо отличаться от предшественника, что приводило к перераспределению трафика и обратной связи. В итоге, сложно оценить качество новой модели, так как сначала нужно откалибровать баланс контента (повторить процесс настройки весов матрицы по бизнес-целям). Изучив опыт коллег из Facebook, мы поняли, что модель нуждается в калибровке, и сверху логистической регрессии пристроилась регрессия изотоническая :).
Часто в процессе подготовки новых контентных признаков мы испытывали фрустрацию — простая модель, использующая базовые коллаборативные техники, может дать 80 %, или даже 90 % результата, тогда как модная нейросетка, обучавшаяся неделю на супердорогих GPU, идеально детектит котиков и машинки, но даёт прирост метрик только в третьем знаке. Подобный эффект часто можно увидеть и при внедрении тематических моделей, fastText и других эмбедингов. Побороть фрустрацию удалось, взглянув на валидацию под правильным углом: производительность коллаборативных алгоритмов существенно улучшается по мере накопления информации об объекте, тогда как для «свежих» объектов контентные признаки дают ощутимый буст.
Но, конечно, когда-нибудь результаты логистической регрессии должны были быть улучшены, и добиться прогресса удалось, применив недавно вышедший XGBoost-Spark. Интеграция была непростой, но, в итоге, модель наконец-то стала модной-молодёжной, а метрики приросли на проценты.
Наверняка из данных можно извлечь гораздо больше знаний и вывести ранжирование ленты на новую высоту — и сегодня у каждого появилась возможность попробовать свои силы в этой нетривиальной задаче на конкурсе SNA Hackathon 2019. Соревнование проходит в два этапа: с 7 февраля по 15 марта загружайте решение одной из трех задач. После 15 марта будут подведены промежуточные итоги, и 15 человек из топа лидерборда по каждой из задач получат приглашения на второй этап, который пройдёт с 30 марта по 1 апреля в московском офисе Mail.ru Group. Кроме того, приглашения на второй этап получат три человека, оказавшиеся в лидерах рейтинга на конец 23 февраля.
Почему задачи три? В рамках онлайн-этапа мы предлагаем три набора данных, в каждом из которых представлен только один из аспектов: изображение, текст или информация о разнообразных коллаборативных признаках. И только на втором этапе, когда эксперты в разных областях соберутся вместе, будет раскрыт общий датасет, позволяющий найти точки для синергии разных методов.
Заинтересовала задача? Присоединяйтесь к SNA Hackathon :)
Комментарии (12)
lgorSL
02.02.2019 14:18Я бы как пользователь просто хотел несколько лент с возможностью самому настроить каждую из них. (В принципе, возможность подписать паблик только на одну из своих лент уже было бы удобна, не говоря уж о какой-нибудь фильтрации по тегам или количеству лайков)
Например, для себя я бы сделал одну ленту с развлекательным контентом (он не важен, смотреть его не обязательно), еще одну ленту с чем-то важным — например, посты от некоторых друзей, которые пишутся редко, но реально нужны. И еще одну с постами, связанными с учебой — все объявления о датах экзаменов, новостчх профкома и прочей фигне пускай идут туда.
В принципе, можно было бы и отдельно ленту с nsfw контентом запилить, потому что когда всё вышеперечисленное идет потоком в одной ленте, получается фигня — постов много, важные проходят мимо, неважные отвлекают, а окружающие люди начинают коситься в твой телефон.dmitrybugaychenko Автор
02.02.2019 21:53Есть такое — называется «вертикали». Но тут пока как — делать их руками под себя сможет 0.1% пользователей по самым оптимистичным оценкам. При этом процентов 10 попробуют настроить, но получится плохо и активность от них упадет. И автоматика пока получается достаточно сложная. На самом деле на данных конкурса вполне можно будет поробовать поиграться и с вертикалями.
S_A
03.02.2019 06:23Попробуйте приложение feedly, или другой какой RSS-агрегатор. Не соц. сети, но для меня задачу разделения лент решает.
Что касается «умности ленты», то с одной стороны она нужна, с другой не нужна… она не нужна, когда как у меня — 30 групп, из них в 20 контент раз в месяц появляется, а в оставшихся 10 — раз в день.
Умная лента нужна на других принципах. Нужно тематическое моделирование, извлечение концепций из контента (не текста!), и подписка на концепции. Нужно извлечение именованных сущностей из контента (не текста!), и подписка на них. И всё в таком духе.
При этом сервис фильтрации должен быть не аффилирован с источником контента. Либо на худой случай это должен быть агрегатор по типу: «сегодня в ваших подписках были следующие темы (8), следующие персоны (28)» с возможностью провалиться и посмотреть.dmitrybugaychenko Автор
04.02.2019 10:10Звучит классно, надеюсь вам удастся с успехом применить эти техники — контента на конкурсе будет много :)
S_A
04.02.2019 14:38Очень много работы для одного — придется на основную тогда не ходить :) Такая роскошь недоступна, а конкурс посмотрел — сделан интересно.
SiliconValleyHobo
02.02.2019 14:54+4Отключаю умность ленты везде, где можно. Мне нужно детерминорованное ее поведение, а не какая-то ненадежная дичь
Jeditobe
02.02.2019 15:13Зашел за этим комментариев. Большинство «умных» лент решают какие-то задачи владельцев соцсетей, а нее пользователей.
dmitrybugaychenko Автор
02.02.2019 22:03Для формирования ленты работает несколько тысяч серверов, все это стоит весьма недешево, поэтому соцсеть, конечно, должна приносить прибыль. Но при этом прибыль очень хорошо скоррелирована с удовлетворенностью пользователя, поэтому алгоритмы ленты работают в первую очередь на неё. Но они не идеальны и, как и все МЛ алгоритмы, идут по пути наименьшего сопротивления, что приводит к целому сонму проблем — кликбэйтный контент, разного рода накрутки, неадекватная работа для пользователей, относящихся к «редким видам» и т.д.
Собственно уже скоро появится возможность попробовать свои силы и сделать по настоящему умный алгоритм ;)sergeyns
03.02.2019 23:51Собственно уже скоро появится возможность попробовать свои силы и сделать по настоящему умный алгоритм ;)
Так сравнивать его будут все равно с уже имеющимся, у которогокликбэйтный контент, разного рода накрутки, неадекватная работа для пользователей
dmitrybugaychenko Автор
04.02.2019 10:09Сравнивать будут с другими энтузиастами, а за преодоление перечичленных выше проблем планируем сделать отдельную номинацию.
dmitrybugaychenko Автор
02.02.2019 21:55Это вполне расспространенный паттерн — есть пользователи, которые «ответственно» подходят к тому на кого подписываются, вдумчиво перевариваривают информацию — им алгоритмы пока чаще мешают чем помогают.
sannikovdmitry
огонь!