Это сообщение в блоге разбито на две части и восходит к урокам из предыдущего сообщения. Сумма всех этих частей - это все, что я сделал, чтобы дать вам представление о том, как вывести создание персонализированных новостных лент на новый уровень.

Часть 1: Теория, лежащая в основе очень простого алгоритма стиля EdgeRank, который использовался для создания моего собственного механизма обнаружения Instagram.
Часть 2: Понимание того, как использовать современные методы машинного обучения для оптимизации ранжирования в каналах

Часть 1. Как и почему я использовал эту функцию оценки

В моем последнем сообщении в блоге я рассказал, как создать собственный движок для поиска в Instagram. Он включал довольно много кода, но не много обсуждал теорию, по которой я выбрал приведенный ниже алгоритм для ранжирования постов.

Так что давайте углубимся в это еще немного. По сути, это просто вариация классического алгоритма EdgeRank в facebook:

Его можно разбить на 3 основных компонента: сродство, вес и временной спад.

Близость

Термин «родство» - это способ обозначить, насколько «привязан» к вам пользователь. Идея в том, что если у вас много общих друзей, с которыми вы общались в прошлом, вы с большей вероятностью захотите увидеть будущую запись этого пользователя.

В этом примере родство определяется двумя терминами:

Где PPR - мой личный рейтинг страницы для этого пользователя. Другие факторы могут включать, сколько раз я комментировал и сколько раз нажимал на сообщение этого пользователя.

В Python PPR был рассчитан путем создания графика NetworkX на основе того, за кем я подписан. Затем я проверил рейтинг страниц с указанным словарем персонализации. Словарь персонализации просто сообщает алгоритму NetworkX PageRank, что вероятность сброса на любой случайный узел равна нулю, за исключением узла, который вы «персонализируете».

Умножение PPR на натуральный логарифм количества раз, когда мне «нравились» сообщения пользователя, было способом повысить оценку близости пользователей, с которыми я ранее взаимодействовал.

Масса

Вес может определяться рядом различных факторов в зависимости от типа данных, к которым у вас есть доступ. Я основывал свой на количестве лайков и комментариев к посту.

Я использовал журналы, чтобы повысить важность первых нескольких лайков для поста, чем для поста, у которого уже много лайков. Мыслительный процесс, заключающийся в разнице между 10 и 100 лайками, должен быть гораздо более актуальным, чем 100-190, даже если у обоих есть разница в 90 лайков.

Время распада

Временной спад применяется к приложениям, которые очень заботятся о свежести товара. Важно продвигать новый контент, а не старый устаревший контент. Time Decay гарантирует, что новые статьи будут появляться в верхней части вашей ленты, даже если у них может быть не так много лайков… пока. Здесь, в Stream, мы основываем большинство наших функций распада на линейных, экспоненциальных и гауссовских функциях распада. Функция, которую вы решите использовать, во многом зависит от конечного приложения и того, насколько быстро вы хотите, чтобы старый контент стал неактуальным.

Ну, это было довольно просто, да? Умножение трех довольно простых функций вместе может дать нам довольно приличные результаты. Хотя настроить вручную только несколько параметров довольно просто, что происходит, когда вы хотите включить десятки, сотни или даже тысячи различных параметров, чтобы гарантировать, что ваш канал пользователя заполнен наиболее подходящим контентом (я знаю, я знаю, что большой до слова Машинное обучение). Давайте взглянем…

Часть 2: Переход от EdgeRank к усиленным деревьям и нейронным сетям

Хотя простой алгоритм стиля EdgeRank легко реализовать, у него есть несколько недостатков в зависимости от того, сколько данных имеет ваше приложение. Это может показаться очевидным, но оптимальный канал - это тот, который больше всего заинтересует пользователей. Достичь этого может быть сложно, если у вас есть много параметров, на которых вы хотите, чтобы ваш канал был основан. Вовлеченность может быть основана на множестве различных параметров в зависимости от приложения. Для ленты в стиле Instagram они могут быть основаны на кликах, лайках, комментариях, отправках, подписках и отписках. Мы можем рассматривать каждую из этих метрик как разные модели, оптимизировать каждую и, в конце концов, складывать их для получения окончательной оценки.

[1]
Общий балл = 30,6015

Итак, какую модель мы можем использовать для прогнозирования вероятности всех этих событий? Один из способов, который оказался успешным при ранжировании каналов в масштабе [1], - это усиленные деревья решений, объединенные с логистической регрессией. Использование усиленных деревьев решений позволяет нам добавить (почти) столько функций, сколько мы хотим в модель, и позволить ей решать, что важно. После обучения деревьев решений мы можем взять каждую входную характеристику и превратить ее в набор категориальных характеристик. Затем мы используем эти категориальные характеристики в качестве входных данных с горячим кодированием в логистической регрессии, чтобы повторно узнать веса листьев. Этот дополнительный шаг позволяет нам ускорить процесс обучения и приблизить его к модели, близкой к интерактивной, и в то же время воспользоваться преимуществами преобразования функций, которые предоставили нам усиленные деревья.

Совет: в производственной среде вы можете сократить количество функций, чтобы сократить время обучения и уменьшить переобучение.

(Желтые узлы представляют категориальные особенности, зеленые узлы представляют веса листьев, которые необходимо повторно изучить) Итак, какие функции мы можем использовать для ввода в расширенную модель дерева решений? Давайте разделим их на две подкатегории: контекстные и исторические.

Контекстные элементы - это элементы, из которых состоит контент. Например, всемогущий щенок на фотографии щенка с хэштегом #puppiesofinstagram.

Исторические особенности можно описать с помощью предварительных договоренностей между автором и зрителем. Понимание сетевой структуры человека здесь важно, поскольку оно позволяет увидеть, кто его близкие друзья, чьи фотографии им всегда нравятся, чьи фотографии им нравятся только тогда, когда они публикуют изображения кошек, и чьи фотографии они всегда комментируют, когда фотографии щенков опубликовал. Другие важные исторические особенности включают людей, которых вы можете знать в реальной жизни, и людей, которых вы ищете. Например, мне всегда нравятся сообщения из haystackpets, поэтому они должны появляться в моей ленте первыми. (Да, это была беспардонная пробка для аккаунта моего питомца в Instagram.)

Исторические особенности будут стимулировать взаимодействие, но контекстные особенности важны для проблемы холодного запуска. Хотя усиленные деревья являются фаворитом команды Stream (и долгое время находились в авангарде), есть ситуации, когда нейронные сети могут работать лучше. В основном, когда у вас есть МНОГО разреженных данных для ранжирования.

Что касается настройки, модель для нейронных сетей может быть настроена почти так же, как усиленные деревья. Если входные данные вашей нейронной сети представляют собой единый поток данных с функциями и метками обратной связи, а выходными данными будет единый узел с сигмоидной функцией для прогнозирования вероятности события.

Поскольку обучение нейронных сетей может быть дорогостоящим, мы можем использовать простой трюк, который часто используется при распознавании изображений. Вместо того, чтобы обучать всю нейронную сеть с нуля для каждой метрики, мы можем использовать трансферное обучение, чтобы обучить ее для одного, а затем повторно использовать дорогостоящие для обучения базовых слоев и точно настроить верхние плотные слои для каждой метрики, которую вы хотите оптимизировать. Пример того, как будет выглядеть нейронная сеть с прямой связью, показан ниже.

Это может быть довольно дорого в вычислении, в зависимости от количества каналов, которые вам нужно ранжировать каждый день. Facebook объединил нейронные сети с расширенными деревьями решений, чтобы снизить затраты на логический вывод в нейронных сетях и при этом получить прирост производительности [2].

После обучения нейронной сети вы можете использовать последний слой в качестве вектора признаков и ввести его в модель логистической регрессии для каждого события, чтобы мы могли ускорить обучение и быстро учесть новые данные. Кроме того, в качестве дополнительного бонуса у вас также будет отличная тема для вашей следующей коктейльной вечеринки.

Вау, я определенно коснулся многих тем. У нас также есть много полезной информации о том, как вы можете реализовать персонализированные ранжированные каналы в своем приложении. Не стесняйтесь обращаться ко мне или к кому-либо из нашей группы по анализу данных, чтобы рассказать, как это может улучшить ваше приложение!

[1] Ева Доминовска - Создание миллиарда личных новостных лент - MLconf SEA 2016
[2] Измерение и анализ моделей прогнозного ранжирования каналов в Instagram

Это результат совместной работы команды GetStream.io во главе с Балашем Хораньи, специалистом по анализу данных GetStream.io. Исходное сообщение в блоге можно найти по адресу https://getstream.io/blog/moving-beyond-edgerank-for-personalized-news-feeds/.