Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Разработка персонализированной системы ранжирования для более чем 2 миллиардов человек (учитывая, что у всех разные интересы) и обилием контента на выбор представляет собой серьёезные и сложные задачи. Это то, чем мы занимаемся каждый день с системой ранжирования News Feed. Без машинного обучения новостные ленты людей могут быть переполнены контентом, который они не считают актуальным или интересным (включая чрезмерно рекламный контент или постоянные публикации от знакомых), который будет выше в ленте, чем публикации от близких друзей или родственников. Ранжирование существует, чтобы помочь решить эти проблемы, но как создать систему, которая представляет такое количество различных типов контента таким образом, чтобы он был персонализирован для каждого человека в Facebook? Мы используем машинное обучение, чтобы предсказать, какой контент будет иметь наибольшее значение для каждого человека, чтобы сделать его более интересным и позитивным для пользовательского опыта. Мы делимся новыми подробностями о том, как в Facebook разработали систему ранжирования лент новостей на основе машинного обучения.
Модели коструктивных взаимодействий и качественного контента основаны на современном машинном обучении, таком как многозадачное обучение на нейронных сетях, встраивание и автономные системы обучения.
Чтобы понять, как это работает, давайте начнём с гипотетического человека, который входит в Facebook: назовём его Хуаном. С тех пор как Хуан вошёл в систему, его хороший друг Вэй опубликовал фотографию своего кокер-спаниеля. Другая подруга, Саанви, опубликовала видео с утренней пробежки. Его любимый паблик опубликовал интересную статью о том, как лучше всего рассматривать Млечный Путь ночью, а его любимая кулинарная группа на Facebook опубликовала четыре новых рецепта закваски.
Поскольку Хуан связан с производителями этого контента или решил подписаться на них, всё это, вероятно, будет для него актуально или интересно. Чтобы поставить некоторые из этих публикаций выше, чем другие в ленте Хуана, нам нужно узнать, что наиболее важно для Хуана и какой контент имеет для него наибольшую ценность. С математической точки зрения, нам нужно определить целевую функцию для Хуана и выполнить однокритическую оптимизацию.
Возьмём, к примеру, видео с пробежки Саанви. В Facebook есть один конкретный наблюдаемый сигнал о том, что пост имеет ценность для кого-то, – это нажатие кнопки «Нравится». Учитывая различные атрибуты, которые известны о публикации (кто отмечен на фотографии, когда она была опубликована и т. д.), мы можем использовать характеристики публикации по отношению к зрителю (j) в момент времени (t) и спрогнозировать (понравится ли Хуану публикация). Математически для каждой публикации (i) мы оцениваем , где C представляет характеристику c(1..C), такую как тип публикации или отношения между пользователями и автором поста (например, отметили ли они друг друга как членов семьи), а функция f(.) объединяет атрибуты в одно значение.
Например, если Хуан часто взаимодействует с Саанви или делится контентом, который Саанви публикует, а текущее видео было совсем недавним (например, с сегодняшнего утра), мы можем увидеть высокую вероятность того, что Хуану понравится такой контент. С другой стороны, возможно, Хуан раньше больше интересовался видеоконтентом, чем фотографиями, поэтому аналогичный прогноз для фотографии кокер-спаниеля Вэй может быть ниже. В этом случае наш алгоритм ранжирования поставит видео с пробежки Саанви выше, чем фото кокер-спаниеля Вэй, потому что прогнозирует более высокую вероятность того, что Хуану понравится этот контент.
Но разве Хуан выражает свои предпочтения, только когда ставит лайки? Конечно, нет. Он может делиться статьями, которые ему интересны, смотреть трансляции своих любимых стримеров или оставлять осмысленные комментарии к публикациям друзей. Математически всё усложняется, когда нам нужно оптимизировать это для нескольких целей, каждая из которых вносит вклад в нашу общую цель (создание наиболее долгосрочной ценности для людей). У вас может быть несколько значений (), например, лайков, комментариев и репостов, каждое для разного значения k, которые все должны каким-то образом агрегировать до одного значения Vijt. Ещё больше усложняет ситуацию то, что для каждого человека в Facebook есть тысячи сигналов, которые нам нужно оценить, чтобы определить, что для этого человека может оказаться наиболее актуальным, поэтому алгоритм становится очень сложным на практике.
Как выбрать общую ценность для экосистемы размером с Facebook? Мы хотим предоставить людям, которые пользуются нашими услугами, долгосрочную ценность. Насколько ценны для Хуана просмотр видеоролика друга или чтение интересной статьи? Мы думаем, что лучший способ оценить, создаёт ли что-то долгосрочную ценность для кого-то, – это выбрать показатели, соответствующие тому, что пользователи считают важным для них. Поэтому мы опрашиваем пользователей о том, насколько значимым они считают общение со своими друзьями и стоит ли публикация их времени, чтобы убедиться, что наши ценности (Y_{ijtk}) отражают то, что пользователи считают значимым.
Множественные модели предсказаний дают нам множество предсказаний для Хуана: вероятность, с которой он будет взаимодействовать (например, поставит лайк или оставит комментарий), фото кокер-спаниеля Вэя, видео с пробежки Саанви, статья, опубликованная в паблике, и публикации в группе кулинарии. Каждая из этих моделей будет пытаться оценить каждый из этих фрагментов контента для Хуана. Иногда модели расходятся во мнениях (например, Хуану может понравиться видео с пробежки Саанви с большей вероятностью, чем статья с паблика, но с большей вероятностью он может поделиться статьёй, чем видео Саанви), и то, как мы учитываем каждый прогноз для Хуана, основано на действиях, которые люди говорят нам (с помощью опросов), являются более значимыми и стоят их времени.
Теперь, когда мы знаем теорию ранжирования на примере ленты новостей Хуана, нам нужно определить, как построить систему для этой оптимизации. Нужно оценить все публикации, доступные для более чем 2 миллиардов человек (в среднем более 1000 публикаций на пользователя в день), что является сложной задачей. И нам нужно делать это в режиме реального времени, поэтому нам нужно знать, получила ли статья много лайков, даже если она была опубликована всего несколько минут назад. Нам также нужно знать, нравился ли Хуану другой контент последнее время, чтобы мы могли оптимально использовать эту информацию при ранжировании.
Наша системная архитектура использует уровень Web/PHP, который запрашивает агрегатор фидов. Роль агрегатора фидов состоит в том, чтобы собрать всю релевантную информацию о публикации и проанализировать все функции (например, сколько людей оценили этот пост ранее), чтобы предсказать ценность публикации Y{ijt} для пользователя, а также итоговый рейтинг Vijt путём агрегирования всех прогнозов.
Когда кто-то открывает Facebook, независимо от внешнего интерфейса (iPhone, Android, веб-браузер), интерфейс отправляет запрос на уровень Web/PHP (фронтенд), который затем запрашивает агрегатор фидов (бэкенд). После принятия запроса от фронтенда агрегатор фидов извлекает действия и объекты вместе со сводкой по объектам из конечных баз данных фидов, чтобы обрабатывать, агрегировать, ранжировать и возвращать результирующий список ранжированных FeedStories на внешний интерфейс для рендеринга.
А теперь давайте посмотрим, как работает агрегатор.
Более пристальный взгляд на первый этап: большая часть персонализации происходит на первом этапе. Мы хотим оптимизировать то, как мы комбинируем в . Для некоторых оценка может быть выше за «лайки», чем за комментарии, поскольку некоторым людям нравится выражать себя больше через «лайки», чем за комментарии. Для простоты и управляемости мы оцениваем наши прогнозы линейным способом,
. Обратите внимание, что у этой линейной формулировки есть преимущество: любое действие, в котором редко участвует человек (например, предсказание по «лайкам», которое очень близко к 0), автоматически получает минимальную роль в рейтинге, поскольку для этого события очень низкое. Чтобы персонализировать публикации за пределами этого измерения, мы продолжаем исследования персонализации на основе данных наблюдений. Люди с более высокой корреляцией получают большую ценность от этого конкретного события, если мы делаем этот метод инкрементным и контролируем возможные мешающие переменные.
После того как мы завершим все этапы ранжирования, у нас будет лента новостей для Хуана (и всех людей, использующих Facebook) в режиме реального времени, готовая к использованию и потреблению.
Теперь, когда вы лучше понимаете теорию, архитектуру ранжирования и инженерные разработки, лежащие в основе новостной ленты, вы можете увидеть, как наш алгоритм ранжирования помогает создавать ценный опыт для людей в ранее невообразимых масштабах и скорости. Хуан выигрывает от того, что видит более значимый и интересный контент, когда он заходит в Facebook, как и миллиарды других людей. Мы постоянно совершенствуем нашу систему ранжирования, повторяя наши модели прогнозирования, улучшая персонализацию и многое другое, чтобы помочь людям найти контент, который создаёт ценность и помогает им оставаться на связи с друзьями и семьёй.
Пока в Fecebook постоянно совершенствуют систему ранжирования, повторяя модели прогнозирования, улучшая персонализацию и многое другое, мы в SkillFactory продолжаем обучать машинному обучению. Для хабравчан постоянно действует промокод HABR, прибавляющий 10% к скидке на баннере.
Модели коструктивных взаимодействий и качественного контента основаны на современном машинном обучении, таком как многозадачное обучение на нейронных сетях, встраивание и автономные системы обучения.
Построение алгоритма ранжирования
Чтобы понять, как это работает, давайте начнём с гипотетического человека, который входит в Facebook: назовём его Хуаном. С тех пор как Хуан вошёл в систему, его хороший друг Вэй опубликовал фотографию своего кокер-спаниеля. Другая подруга, Саанви, опубликовала видео с утренней пробежки. Его любимый паблик опубликовал интересную статью о том, как лучше всего рассматривать Млечный Путь ночью, а его любимая кулинарная группа на Facebook опубликовала четыре новых рецепта закваски.
Поскольку Хуан связан с производителями этого контента или решил подписаться на них, всё это, вероятно, будет для него актуально или интересно. Чтобы поставить некоторые из этих публикаций выше, чем другие в ленте Хуана, нам нужно узнать, что наиболее важно для Хуана и какой контент имеет для него наибольшую ценность. С математической точки зрения, нам нужно определить целевую функцию для Хуана и выполнить однокритическую оптимизацию.
Возьмём, к примеру, видео с пробежки Саанви. В Facebook есть один конкретный наблюдаемый сигнал о том, что пост имеет ценность для кого-то, – это нажатие кнопки «Нравится». Учитывая различные атрибуты, которые известны о публикации (кто отмечен на фотографии, когда она была опубликована и т. д.), мы можем использовать характеристики публикации по отношению к зрителю (j) в момент времени (t) и спрогнозировать (понравится ли Хуану публикация). Математически для каждой публикации (i) мы оцениваем , где C представляет характеристику c(1..C), такую как тип публикации или отношения между пользователями и автором поста (например, отметили ли они друг друга как членов семьи), а функция f(.) объединяет атрибуты в одно значение.
Например, если Хуан часто взаимодействует с Саанви или делится контентом, который Саанви публикует, а текущее видео было совсем недавним (например, с сегодняшнего утра), мы можем увидеть высокую вероятность того, что Хуану понравится такой контент. С другой стороны, возможно, Хуан раньше больше интересовался видеоконтентом, чем фотографиями, поэтому аналогичный прогноз для фотографии кокер-спаниеля Вэй может быть ниже. В этом случае наш алгоритм ранжирования поставит видео с пробежки Саанви выше, чем фото кокер-спаниеля Вэй, потому что прогнозирует более высокую вероятность того, что Хуану понравится этот контент.
Но разве Хуан выражает свои предпочтения, только когда ставит лайки? Конечно, нет. Он может делиться статьями, которые ему интересны, смотреть трансляции своих любимых стримеров или оставлять осмысленные комментарии к публикациям друзей. Математически всё усложняется, когда нам нужно оптимизировать это для нескольких целей, каждая из которых вносит вклад в нашу общую цель (создание наиболее долгосрочной ценности для людей). У вас может быть несколько значений (), например, лайков, комментариев и репостов, каждое для разного значения k, которые все должны каким-то образом агрегировать до одного значения Vijt. Ещё больше усложняет ситуацию то, что для каждого человека в Facebook есть тысячи сигналов, которые нам нужно оценить, чтобы определить, что для этого человека может оказаться наиболее актуальным, поэтому алгоритм становится очень сложным на практике.
Как выбрать общую ценность для экосистемы размером с Facebook? Мы хотим предоставить людям, которые пользуются нашими услугами, долгосрочную ценность. Насколько ценны для Хуана просмотр видеоролика друга или чтение интересной статьи? Мы думаем, что лучший способ оценить, создаёт ли что-то долгосрочную ценность для кого-то, – это выбрать показатели, соответствующие тому, что пользователи считают важным для них. Поэтому мы опрашиваем пользователей о том, насколько значимым они считают общение со своими друзьями и стоит ли публикация их времени, чтобы убедиться, что наши ценности (Y_{ijtk}) отражают то, что пользователи считают значимым.
Множественные модели предсказаний дают нам множество предсказаний для Хуана: вероятность, с которой он будет взаимодействовать (например, поставит лайк или оставит комментарий), фото кокер-спаниеля Вэя, видео с пробежки Саанви, статья, опубликованная в паблике, и публикации в группе кулинарии. Каждая из этих моделей будет пытаться оценить каждый из этих фрагментов контента для Хуана. Иногда модели расходятся во мнениях (например, Хуану может понравиться видео с пробежки Саанви с большей вероятностью, чем статья с паблика, но с большей вероятностью он может поделиться статьёй, чем видео Саанви), и то, как мы учитываем каждый прогноз для Хуана, основано на действиях, которые люди говорят нам (с помощью опросов), являются более значимыми и стоят их времени.
Аппроксимация идеальной функции ранжирования в масштабируемой системе ранжирования
Теперь, когда мы знаем теорию ранжирования на примере ленты новостей Хуана, нам нужно определить, как построить систему для этой оптимизации. Нужно оценить все публикации, доступные для более чем 2 миллиардов человек (в среднем более 1000 публикаций на пользователя в день), что является сложной задачей. И нам нужно делать это в режиме реального времени, поэтому нам нужно знать, получила ли статья много лайков, даже если она была опубликована всего несколько минут назад. Нам также нужно знать, нравился ли Хуану другой контент последнее время, чтобы мы могли оптимально использовать эту информацию при ранжировании.
Наша системная архитектура использует уровень Web/PHP, который запрашивает агрегатор фидов. Роль агрегатора фидов состоит в том, чтобы собрать всю релевантную информацию о публикации и проанализировать все функции (например, сколько людей оценили этот пост ранее), чтобы предсказать ценность публикации Y{ijt} для пользователя, а также итоговый рейтинг Vijt путём агрегирования всех прогнозов.
Когда кто-то открывает Facebook, независимо от внешнего интерфейса (iPhone, Android, веб-браузер), интерфейс отправляет запрос на уровень Web/PHP (фронтенд), который затем запрашивает агрегатор фидов (бэкенд). После принятия запроса от фронтенда агрегатор фидов извлекает действия и объекты вместе со сводкой по объектам из конечных баз данных фидов, чтобы обрабатывать, агрегировать, ранжировать и возвращать результирующий список ранжированных FeedStories на внешний интерфейс для рендеринга.
А теперь давайте посмотрим, как работает агрегатор.
- Собираем данные. Сначала нам нужно собрать все публикации-кандидаты, которые мы можем ранжировать для Хуана (фото кокер-спаниеля, видео с пробежки и другие публикации). Первая часть довольно проста: соответствующие данные включают в себя все неудалённые публикации, которыми поделился с Хуаном друг, паблики или группы, на которые он подписан с момента его последнего входа в систему. Но как насчёт публикаций, появившихся перед входом Хуана в систему, которые он ещё не видел? Возможно, они будут более качественными или более актуальными, чем более старые публикации, но у него просто не было времени их просмотреть. Чтобы убедиться, что непросмотренные публикации также будут просмотрены, у нас есть логика кеширования непрочитанных публикаций: свежие публикации, которые Хуан ещё не видел, но которые были ранжированы для него в его предыдущих сессиях, снова могут быть просмотрены им. У нас также есть логика действий: если в какой-либо публикации, которые Хуан уже видел, возникла интересная беседа среди его друзей, Хуан может иметь право снова увидеть этот пост как публикацию с комментариями.
- Оценка для Хуана для каждого прогноза (). Теперь, когда у нас есть собранные данные для Хуана, мы оцениваем каждую публикацию с помощью многозадачных нейронных сетей. Есть очень много функций (), которые мы можем использовать для прогнозирования , включая тип публикации, встраивания (то есть представления функций, генерируемые моделями глубокого обучения) и то, с чем обычно взаимодействует пользователь. Чтобы рассчитать это для более чем 1000 публикаций, для каждого из миллиардов пользователей (всё в реальном времени), мы запускаем эти модели для всех историй кандидатов параллельно на нескольких машинах, называемых предикторами.
- Подсчитайте один результат из множества прогнозов: . Теперь, когда у нас есть все прогнозы, мы можем объединить их в один результат. Для этого необходимо несколько проходов для экономии вычислительной мощности и применения правил, таких как разнообразие типов контента (т. е. тип контента должен быть разнообразным, чтобы пользователи не видели повторяющиеся типы контента, такие как несколько видео, одно за другим), зависящих от начального рейтингового балла. Во-первых, к каждому посту применяются определённые процессы целостности. Они предназначены для определения того, какие меры по обнаружению целостности, если таковые имеются, необходимо применить к историям, выбранным для ранжирования. Затем на этапе 0 запускается облегчённая модель, чтобы выбрать примерно 500 наиболее релевантных публикаций для Хуана, которые имеют право на ранжирование. Это помогает нам ранжировать меньше историй с высокой степенью запоминания на более поздних этапах, чтобы мы могли использовать более мощные модели нейронных сетей. Первый проход – это основной проход для подсчёта очков, где каждая история оценивается независимо, а затем все ~500 подходящих публикаций упорядочиваются по количеству баллов. Наконец, у нас есть проход 2, который является контекстным проходом. Здесь добавлены контекстные функции, такие как правила разнообразия типов контента, чтобы помочь разнообразить ленту новостей Хуана.
Более пристальный взгляд на первый этап: большая часть персонализации происходит на первом этапе. Мы хотим оптимизировать то, как мы комбинируем в . Для некоторых оценка может быть выше за «лайки», чем за комментарии, поскольку некоторым людям нравится выражать себя больше через «лайки», чем за комментарии. Для простоты и управляемости мы оцениваем наши прогнозы линейным способом,
. Обратите внимание, что у этой линейной формулировки есть преимущество: любое действие, в котором редко участвует человек (например, предсказание по «лайкам», которое очень близко к 0), автоматически получает минимальную роль в рейтинге, поскольку для этого события очень низкое. Чтобы персонализировать публикации за пределами этого измерения, мы продолжаем исследования персонализации на основе данных наблюдений. Люди с более высокой корреляцией получают большую ценность от этого конкретного события, если мы делаем этот метод инкрементным и контролируем возможные мешающие переменные.
После того как мы завершим все этапы ранжирования, у нас будет лента новостей для Хуана (и всех людей, использующих Facebook) в режиме реального времени, готовая к использованию и потреблению.
Теперь, когда вы лучше понимаете теорию, архитектуру ранжирования и инженерные разработки, лежащие в основе новостной ленты, вы можете увидеть, как наш алгоритм ранжирования помогает создавать ценный опыт для людей в ранее невообразимых масштабах и скорости. Хуан выигрывает от того, что видит более значимый и интересный контент, когда он заходит в Facebook, как и миллиарды других людей. Мы постоянно совершенствуем нашу систему ранжирования, повторяя наши модели прогнозирования, улучшая персонализацию и многое другое, чтобы помочь людям найти контент, который создаёт ценность и помогает им оставаться на связи с друзьями и семьёй.
Пока в Fecebook постоянно совершенствуют систему ранжирования, повторяя модели прогнозирования, улучшая персонализацию и многое другое, мы в SkillFactory продолжаем обучать машинному обучению. Для хабравчан постоянно действует промокод HABR, прибавляющий 10% к скидке на баннере.
- Курс по Machine Learning
- Курс «Алгоритмы и структуры данных»
- Курс «Математика и Machine Learning для Data Science»
Другие профессии и курсы
ПРОФЕССИИ
КУРСЫ
- Профессия Data Scientist
- Профессия Data Analyst
- Профессия Java-разработчик
- Профессия QA-инженер на JAVA
- Профессия Frontend-разработчик
- Профессия Веб-разработчик
- Профессия Этичный хакер
- Профессия C++ разработчик
- Профессия Разработчик игр на Unity
- Профессия iOS-разработчик с нуля
- Профессия Android-разработчик с нуля
КУРСЫ
- Курс по Data Engineering
- Курс по JavaScript
- Курс «Python для веб-разработки»
- Курс по аналитике данных
- Курс по DevOps