Социальные сети — это один из наиболее востребованных на сегодняшний день интернет-продуктов и один из основных источников данных для анализа. Внутри же самих социальных сетей самой сложной и интересной задачей в сфере 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)


  1. sannikovdmitry
    01.02.2019 16:35
    +2

    огонь!


  1. lgorSL
    02.02.2019 14:18

    Я бы как пользователь просто хотел несколько лент с возможностью самому настроить каждую из них. (В принципе, возможность подписать паблик только на одну из своих лент уже было бы удобна, не говоря уж о какой-нибудь фильтрации по тегам или количеству лайков)
    Например, для себя я бы сделал одну ленту с развлекательным контентом (он не важен, смотреть его не обязательно), еще одну ленту с чем-то важным — например, посты от некоторых друзей, которые пишутся редко, но реально нужны. И еще одну с постами, связанными с учебой — все объявления о датах экзаменов, новостчх профкома и прочей фигне пускай идут туда.
    В принципе, можно было бы и отдельно ленту с nsfw контентом запилить, потому что когда всё вышеперечисленное идет потоком в одной ленте, получается фигня — постов много, важные проходят мимо, неважные отвлекают, а окружающие люди начинают коситься в твой телефон.


    1. dmitrybugaychenko Автор
      02.02.2019 21:53

      Есть такое — называется «вертикали». Но тут пока как — делать их руками под себя сможет 0.1% пользователей по самым оптимистичным оценкам. При этом процентов 10 попробуют настроить, но получится плохо и активность от них упадет. И автоматика пока получается достаточно сложная. На самом деле на данных конкурса вполне можно будет поробовать поиграться и с вертикалями.


    1. S_A
      03.02.2019 06:23

      Попробуйте приложение feedly, или другой какой RSS-агрегатор. Не соц. сети, но для меня задачу разделения лент решает.

      Что касается «умности ленты», то с одной стороны она нужна, с другой не нужна… она не нужна, когда как у меня — 30 групп, из них в 20 контент раз в месяц появляется, а в оставшихся 10 — раз в день.

      Умная лента нужна на других принципах. Нужно тематическое моделирование, извлечение концепций из контента (не текста!), и подписка на концепции. Нужно извлечение именованных сущностей из контента (не текста!), и подписка на них. И всё в таком духе.

      При этом сервис фильтрации должен быть не аффилирован с источником контента. Либо на худой случай это должен быть агрегатор по типу: «сегодня в ваших подписках были следующие темы (8), следующие персоны (28)» с возможностью провалиться и посмотреть.


      1. dmitrybugaychenko Автор
        04.02.2019 10:10

        Звучит классно, надеюсь вам удастся с успехом применить эти техники — контента на конкурсе будет много :)


        1. S_A
          04.02.2019 14:38

          Очень много работы для одного — придется на основную тогда не ходить :) Такая роскошь недоступна, а конкурс посмотрел — сделан интересно.


  1. SiliconValleyHobo
    02.02.2019 14:54
    +4

    Отключаю умность ленты везде, где можно. Мне нужно детерминорованное ее поведение, а не какая-то ненадежная дичь


    1. Jeditobe
      02.02.2019 15:13

      Зашел за этим комментариев. Большинство «умных» лент решают какие-то задачи владельцев соцсетей, а нее пользователей.


      1. dmitrybugaychenko Автор
        02.02.2019 22:03

        Для формирования ленты работает несколько тысяч серверов, все это стоит весьма недешево, поэтому соцсеть, конечно, должна приносить прибыль. Но при этом прибыль очень хорошо скоррелирована с удовлетворенностью пользователя, поэтому алгоритмы ленты работают в первую очередь на неё. Но они не идеальны и, как и все МЛ алгоритмы, идут по пути наименьшего сопротивления, что приводит к целому сонму проблем — кликбэйтный контент, разного рода накрутки, неадекватная работа для пользователей, относящихся к «редким видам» и т.д.

        Собственно уже скоро появится возможность попробовать свои силы и сделать по настоящему умный алгоритм ;)


        1. sergeyns
          03.02.2019 23:51

          Собственно уже скоро появится возможность попробовать свои силы и сделать по настоящему умный алгоритм ;)

          Так сравнивать его будут все равно с уже имеющимся, у которого
          кликбэйтный контент, разного рода накрутки, неадекватная работа для пользователей


          1. dmitrybugaychenko Автор
            04.02.2019 10:09

            Сравнивать будут с другими энтузиастами, а за преодоление перечичленных выше проблем планируем сделать отдельную номинацию.


    1. dmitrybugaychenko Автор
      02.02.2019 21:55

      Это вполне расспространенный паттерн — есть пользователи, которые «ответственно» подходят к тому на кого подписываются, вдумчиво перевариваривают информацию — им алгоритмы пока чаще мешают чем помогают.