Русский
Русский
English
Статистика
Реклама

Рекомендательные системы

Крупнейший видеохостинг мира отбивается от критики обсудим, как продвигается этот процесс

17.01.2021 20:13:46 | Автор: admin

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

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

Фотография: Ali Saadat. Источник: Unsplash.comФотография: Ali Saadat. Источник: Unsplash.com

Что происходит

Есть разные точки зрения на то, как обстоят дела с качеством рекомендательных систем крупных видеохостингов. Одни считают, что площадки вроде YouTube помогают находить действительно полезный контент среди сотен тысяч роликов по программированию, учебным и научным дисциплинам. Другим каждый раз приходится сдерживаться, чтобы случайно не включить ролик о теориях заговора и не испортить свой рекомендательный портрет. Третьи уже привыкли регулярно чистить историю просмотров, смотреть видео в режиме private browsing и пользоваться адблокерами, позволяющими прятать разделы с related-рекомендациями.

Другое дело, что площадки редко реагирует на подобную критику и, что называется, продолжают гнуть свою линию. Часто это выливается в достаточно нелепые конфликты не только на почве фичреквестов, но и банального закручивания гаек. Так, в год, когда множество музыкантов были вынуждены сидеть дома и пытаться заработать хотя бы что-то в онлайне, крупные соцсети решили ввести новые правила использования аудиотреков в роликах. Конечно же, это привело к необоснованным блокировкам. Но на этот раз гнев общественности обошел стороной YouTube, который принял похожие правки пользовательского соглашения гораздо раньше Facebook и Twitch, плюс сразу предоставил контент-мейкерам доступ к открытой фонотеке.

Однако громкие скандалы с участием соседей по рынку видеостриминга не оттянули на себя внимание общественности. Дошло до того, что жалобами на выдачу рекомендательного движка YouTube заинтересовались в Mozilla, но на этот раз в компании решили не ограничиваться подборкой фейлов и разработали расширение для репортинга странных рекомендаций. С учетом сложной эпидемиологической ситуации, породившей не только новые теории заговора, но множество других категорий видео из рубрики черная дыра ютуба, такой Regret Reporter действительно может поспособствовать улучшению ситуации на площадке. Как минимум, в Mozilla планируют предоставить YouTube отчет по промежуточным итогам сбора отзывов.

Ответные действия

Руководство платформы скорее всего хорошо представляло себе уровень раздражения пользователей, да и, вероятно, не было застигнуто врасплох инициативой Mozilla. В ответ на критику YouTube продолжил придерживаться собственной тактики выпускать точечные обновления для авторов вроде специальной метрики [Revenue per mille, отражает доход на тысячу показов рекламы после вычетов площадки], предположительно, чтобы повысить уровень прозрачности взаимоотношений с пользователями. А потом начал чуть активнее разбираться с нежелательным контентом и даже ввел автоматическую премодерацию комментариев.

Фотография: Taras Chernus. Источник: Unsplash.comФотография: Taras Chernus. Источник: Unsplash.com

Этот год просто не мог обойтись без политических скандалов, давления регуляторов разных стран и критики действий площадки во время и после завершения выборов президента США. Очевидно, что представителям платформы приходилось уделять урегулированию этих процессов существенный объем времени и сил. Возможно, поэтому они сосредоточились на локальных апдейтах и не смогли ответить на многочисленные вопросы о работе рекомендательных систем.

За дымовой завесой

Пока другие соцсети Facebook, Instagram и TikTok делились хоть и общими, но все-таки подробностями о работе их рекомендательных движков, крупные видеохостинги предпочли не менять тактику. Пользователи, оставшиеся один на один с проблемой и старыми способами борьбы с ней, были вынуждены искать собственные решения. Стали предлагать альтернативы действующему рекомендательному алгоритму и чаще пользоваться сервисами вроде PeerTube как минимум для дублирования там новых роликов, публикуемых на собственных YT-каналах.

Сможет ли площадка обойтись без публичного обсуждения принципов фильтрации контента и выдержит ли шквал критики и вопросов со стороны профильных организаций [вроде EFF], регуляторов и аудитории, покажет ближайшее будущее. Мы продолжим анализировать ход событий, связанных с этой контент-платформой и делиться с вами значимыми моментами.


Что еще почитать у нас на Хабре и в Мире Hi-Fi:


Подробнее..

The Wisdom of Crowds

03.01.2021 16:15:06 | Автор: admin
Всем привет!
Во время прохождения одного из образовательных курсов по анализу данных и рекомендательным системам наткнулся на интересную вещь, о которой совсем мало материала на русском языке и решил данное недоразумение исправить.
Хотел бы рассказать об одном из методов коллаборативной фильтрации, корни которого уходят в историю. Его задача состоит в том, чтобы дать наиболее правильный ответ, используя коллективный разум.

Алгоритм The Wisdom of Crowds (Мудрость Толпы) является одной из реализаций коллаборативной фильтрации. Его работа основывается на том, что группа людей обладает большими знаниями, чем индивид, в то время как каждый отдельно взятый человек может улучшить производительность группы за счет своего конкретного ввода информации.

Возьмем пример из истории. В 1906 году, во время выставки жирного скота и птицы в Западной Англии, Фрэнсис Гальтон открыл математические и статистические закономерности групповых средних оценок и их преимущества перед индивидуальными. На этом мероприятии группа оценщиков успешно обеспечила среднее значение веса быка, удивительно близкое к реальному значению.

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

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

Математических моделей, реализующих на практике данный метод я нашел всего 2, указал в источниках. Одна из них применяется для предсказания цены акции на рынке и еще не зарекомендовала себя на длительном временном интервале, но продолжает использоваться и дальше.
Если есть уточнения или интересные примеры использования подобной методики пишите к комментариях :)

Источники


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

Культурные рекомендации опыт московского хакатона

23.02.2021 00:18:51 | Автор: admin

В конце прошлого года я поучаствовал в хакатоне "Лидеры цифровой трансформации" при поддержке Правительства Москвы. Мы решали задачу от Департамента культуры - рекомендательную систему для его услуг, то есть книг в библиотеках, а также кружков и мероприятий в культурных центрах. Особая пикантность в том, что по одним из этих сервисов нужно было рекомендовать другие. Наше решение заняло только второе место, но делать его было познавательно.

Принцип работы нашей системы - и пример кусочка её выдачиПринцип работы нашей системы - и пример кусочка её выдачи

О хакатоне

Вообще, хакатон состоял из 10 направлений, и по каждому направлению первое место получало в награду миллион, а второе - ничего. Так что второе место занять было очень обидно. Сам формат хакатона был стандартный - два дня напряжённой работы в команде, потом презентация. Приятно, что в ходе этих двух дней было несколько регулярных созвонов с организаторами хакатона и авторами задачи. Неприятно, что на всех этих созвонах организаторы наотрез отказывались озвучить критерии оценки или какие-то ожидания от хорошего решения. Довольно сложно соревноваться, когда не понимаешь, чем именно вы соревнуетесь. И ещё не хватило открыть API с этими самыми сервисами, на что изначально организаторы намекали - вместо этого пришлось пользоваться данными, выгруженными в Excel, где, например, не было актуальных мероприятий. Впрочем, список мероприятий мы в итоге сами научились вытягивать с сайта.

Наша команда

Команду мы собрали в соцсетях чисто под этот хакатон: MLщики Тима и Андрей, фронтэндер Игорь, и ваш покорный слуга. Назвались Artificial Intelligentsia. Поскольку типов рекомендуемого контента было несколько, то разделились мы очень органично: Тима сел учиться рекомендовать книги на основе прочитанных книг же, Андрей - рекомендовать кружки по кружкам, а я стал рекомендовать мероприятия. Но поскольку данных по посещению мероприятий людьми нам не дали, рекомендации я строил тоже на основе прочитанных книг. Игорь сделал для всего этого простенький сайтик, и, как водится, к последнему моменту мы собрали всё это воедино. Очень понравилось, что трое из четырех членов команды были в Москве, и мы, несмотря на карантин, смогли собраться в одной квартире - вместе работается гораздо продуктивнее.

Наше решение

По истории взятия книг в библиотеках данных было очень много, едва ли не миллионы. Поэтому Тима реализовал алгоритм коллаборативной фильтрации, когда модель выучивает вкусы читателя на основе прочитанных им книг, а выводы об особенностях книг делает по людям, которые их читают. Звучит как несколько подозрительная рекурсия, но если данных достаточно, такой подход вполне успешен. Чисто математически это работает так: и книги, и читатели представлены числовыми векторами, которые получаются из разложения разреженной матрицы, где каждая строка - читатель, каждый столбец - книга, и единички стоят в клетках, соответствующих реально прочитанным книгам. Тима ещё добавил какую-то хитрую байесовскую функцию потерь, и рекомендации стали довольно осмысленными. В принципе, можно было ещё вместо простых линейных проекций обучить нейронки, но важнее было выкатить полноценный продукт, чем перебирать алгоритмы. Для чистого решения не хватило умной дедупликации: единицей учитываемого контента является печатная книга, и некоторые книги могут содержать одни и те же произведения, но иметь разные заголовки. Важно не порекомендовать "Войну и мир" в первой строке, и "Войну и мир, том 1" - во второй.

Андрей пробовал делать нечто похожее для кружков, но получилось хуже. Во-первых, по кружкам данных меньше: книги люди читают десятками и сотнями, а кружки посещают в единицах. Во-вторых, кружки имеют иерархию: условно, "Аккордеон базовый" можно проходить только после "Аккордеона начального", а "Аккордеон продвинутый 2" - после них обоих и первого продвинутого. В исходных данных такой разметки нет, и, по-хорошему, её надо выучивать из данных самостоятельно. Та же проблема есть и в книгах (трилогии надо читать последовательно), но там она менее выражена.

Для мероприятий я решил делать content-based рекомендации, потому что о них нам известно немного: название, описание, место и время. Из названия и описания я тоже слепил векторные представления, усреднив fasttext-эмбеддинги всех их слов. Справка: fasttext - это векторная модель слов, как word2vec, только ещё способная угадывать смысл незнакомых слов по их написанию, и за счёт этого сжимаемая до весьма малых размеров без существенной потери в точности. Для книг я скачал в интернете базу аннотаций, и слепил из них точно такие же векторные представления. Теперь книги и мероприятия представлены в одном и том же пространстве, и их можно сравнивать друг с другом. Например, если юзер любит исторические книги, их векторы окажутся геометрически близкими к вектору фестиваля реконструкторов, и юзеру можно предложить посетить этот фестиваль. И, конечно, при ранжировании мероприятий надо учитывать географию, отдавая предпочтения тем, что проходят рядом с домом пользователя. К кружкам это тоже относится, а ещё для кружков важен возраст юзера. Поэтому и адрес, и возраст перед началом работы мы спрашиваем.

Чем всё закончилось

К этому решению можно было добавить ещё миллион плюшек: тонкую настройку рекомендаций под лайки/дизлайки юзера или введённое им текстовое описание своих предпочтений, умный текстовый поиск, гибридный рекомендер для кружков Но два дня, отведенные на хакатон, протекли слишком уж быстро, и пришло время представлять нашу работу. На небольшое демо нашей системы можно посмотреть в коротком видосе. Как я уже сказал, мы заняли второе место, но чем именно наше решение оказалось хуже, чем у победителей, нам не объяснили. Впрочем, всем участникам подарили неплохие толстовки и термосы с термометром, так что совсем ни с чем мы не ушли.

После хакатона нас позвали на буткэмп - допиливать наше решение и, собственно, внедрять его. Забавно, что от сотрудничества с победителями организаторы в итоге по какой-то причине отказались. А мы в итоге отказались от сотрудничества сами: с одной стороны, мы все были загружены, с другой - оставалась обида на непрозрачность в хакатоне, с третьей, не очень понятны были сроки, размер, и порядок оплаты нашего труда. В итоге после непродолжительного общения мы с депкультом окончательно разошлись. Но смутное желание довести всё это до какого-то работающего приложения осталось, ибо и датасет библиотечный чудесен, и сама идея персонализированных культурных рекомендаций зело благородная.

Заключение

В целом, хакатон мне понравился: ворвался в целом новую для меня тему рекомендательных систем (и притащил туда свое любимое NLP), поработал с бодрой командой и довольно интересными данными. Оказалось, что стандартные алгоритмы collaborative filtering действительно работают, это не миф. Оказалось, что систему мультидоменных рекомендаций несложно собрать из подручных материалов. Оказалось, что если собрать команду незнакомых программистов и посадить в одну комнату с неограниченным количеством снеков, то за два дня можно накодить нечто прикольное.

Будем хакатонить дальше!

Подробнее..

А контент они за меня тоже выберут? Как умная система рекомендаций студентам советы по учёбе даёт

06.05.2021 10:07:53 | Автор: admin

Весной 2021 проходит шестой запуск проектно-образовательных интенсивов Университета 20.35: студенты из 40+ вузов объединились в команды вокруг собственных идей или бизнес-задач от компаний и разрабатывают технологические решения. Звучит уже круто, а на практике ещё лучше. За три месяца участники проходят путь от идеи будущего продукта к его прототипу: знакомятся с экспертами рынков НТИ, питчат первые версии решений на хакатоне, знакомятся с другими участниками из университетов со всей страны, от Архангельска до Владивостока. В итоге каждая команда получает возможность развивать идею и дальше: защищать курсовые или дипломные работы по теме проекта, получать поддержку от вуза, входить в акселераторы, искать гранты и инвесторов, участвовать в конференциях.

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

Помимо проектной работы всем участникам открывается доступ в сетевое пространство непрерывного обучения с образовательными подборками и онлайн-курсами. Сегодня подход я не знаю, этого не было в программе, у меня лапки всё больше вызывает недоумение, поэтому студенты интенсивов сразу учатся мыслить в логике мне нужно чему-то научиться, чтобы сделать шаг развития. До этой весны участники выстраивали индивидуальную образовательную траекторию, либо пользуясь материалами Университета 20.35, либо самостоятельно подыскивая нужные курсы, лекции, книги. Но кто сказал, что систему Lifelong Learningа нельзя прокачать ещё больше? Ведь осознанный выбор с каждым днём делать всё труднее, особенно с учётом возросших объёмов контента на удаленке: количество открытых вкладок становится несоразмерно добываемым знаниям.

Умная система рекомендаций: сама найдёт, выберет, предложит

Платформа Университета 20.35 может автоматически подбирать и рекомендовать образовательный контент на основе

  • тем и целей, на которых хочет сфокусироваться пользователь,

  • задач, зафиксированных в таск-трекерах Trello или MS Teams.

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

Система уже умеет вытаскивать текст из:

  • карточек канбан-досок Trello и планировщика MS Teams в них работают команды, размечая свой прогресс в колонках To do, Doing и Done;

  • мессенджеров (slack, discord, zulip) коммуникативных пространств;

  • раздела Фокусы развития на платформе Университета 20.35 во время работы над проектом каждый может столкнуться с областями, которые ему не знакомы и интересны для изучения, например: agile или UX/UI дизайн. С помощью Фокусов пользователь целенаправленно фиксирует, чему хочет научиться, добавляя к записи специальные теги из тематических областей.

С помощью машинного обучения система анализирует запросы и задачи и автоматически подтягивает контент как из закрытых библиотек, доступных У20.35, так и открытых ресурсов.

https://drive.google.com/drive/u/0/search?q=фокус%20развития

Студентом можешь ты не быть, но получить рекомендацию обязан

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

Чтобы посмотреть полезный контент для ваших бизнес-процессов и проектов на досках Trello, зарегистрируйте проект на платформе Университета 20.35 в модуле People&Teams. Проектом будет тот комплекс задач, который требует образовательных рекомендаций.

Во время регистрации не забудьте прикрепить ссылку на таск-трекеры.

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

Задавайте вопросы про персональные рекомендации в комментариях и делитесь опытом работы с нашей платформой.

Подробнее..

Одно неловкое движение, и сразу целый вал ненужных рекомендаций за что критикуют видеохостинги

10.01.2021 14:07:00 | Автор: admin

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

Осада related-блоков и персонализацияглавной будет продолжается неделями, пока вы снова не зацепитесь за очередную теорию заговора или новостные сводки. В умеренных объемах они безвредны смысл и содержание всех этих роликов забывается через час после просмотра.

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

Фотография: Kevin Grieve. Источник: Unsplash.comФотография: Kevin Grieve. Источник: Unsplash.com

Метрики вместо развития

Универсальный характер проблемы достаточно точно описал Даниел Канеман, известный психолог и лауреат многочисленных премий по экономике. Он констатировал, что основная масса соцсетей вовсе не стремятся вооружить нас инструментами для саморазвития и поиска качественного контента среди сотен тысяч и миллионов ежедневных публикаций. Их задача максимизировать уровень вовлеченности пользователей, чем и заняты соответствующие алгоритмы и рекомендательные движки, в том числе и популярных видеохостингов. С их помощью мы незаметно для себя день за днем строим персональный инфококон, из которого потом придется выбираться: Воззрения, которыми вы обладали несколько лет назад, становятся все более экстремальными за счет влияния соцсетей, замечает Канеман.

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

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

Фотография: Christopher Ott. Источник: Unsplash.comФотография: Christopher Ott. Источник: Unsplash.com

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

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

Слабые рекомендации

Сегодня все чаще можно встретить критику алгоритмов YouTube. Вот так на эту тему высказываются на Hacker News: Болею, целую неделю сижу дома. Фактически обновляю главную каждые пятнадцать минут, но видео, которые я пропускаю уже сотый раз, остаются на месте. Снова и снова нужно скроллить, чтобы найти что-то другое. Базовая рекомендация в таких ситуациях самостоятельно редактировать, чистить или замораживать историю просмотров. Если избавиться от пары записей с роликами об условных теориях заговора, алгоритм пессимизирует это тематическое направление и не будет рекомендовать подобный контент. Более радикальный подход режим приватного просмотра [инкогнито или private browsing], если возникает спонтанное желание провалиться в черную дыру с кучей сомнительных сюжетов. Так можно будет и не тратить время на чистку watch history.

Резиденты HN отмечают и другие особенности рекомендательного движка этой площадки: Помню, как в далеком 2009-м искал электронную музыку и в related к трекам с условной тысячью просмотров были аналогичные по популярности композиции. Их мало кто слушал, поэтому и я всего за несколько часов открыл для себя кучу новых исполнителей. Сегодня все иначе алгоритм выдает похожие видео, но это почти всегда стотысячники.

Фотография: Glenn Carstens-Peters. Источник: Unsplash.comФотография: Glenn Carstens-Peters. Источник: Unsplash.com

Стоит признать, что встречаются и мнения в защиту YouTube, хотя по большей части ключевую роль в примерах играют не алгоритмы, а пользовательский опыт: На моем ноуте слушал музыку чуть ли не весь дом, но ситуацию спас хороший вкус окружающих теперь сервис радует меня шикарными рекомендациями. Они круче, чем у Spotify. На HN говорят и о других видеохостингах вроде Netflix, но даже в случае этой стриминговой площадки пользователи сожалеют о низком качестве действующих алгоритмов фильтрации контента по сравнению с временами, когда компания работала с DVD-дисками и предлагала качественные рекомендации.

Отсутствие точечных настроек

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

Еще один лайфхак пригодится тем, кто не успевает изучать ролики, отложенные для последующего просмотра. Часть из них рано или поздно пропадают с площадки либо за нарушения правил, либо по желанию авторов, решивших обновить канал. В таком случае стоит заранее воспользоваться youtube-dl одним из наиболее популярных менеджеров загрузок [более 87 тыс. звезд на GitHub на момент публикации]. Либо выбрать более доступный вариант закинуть ссылку на видео в Wayback Machine. Однако в этом случае гарантированной архивации ждать не стоит снэпшот могут и не сделать по единственному запросу [хотя общее число захватываемых сервисом роликов еще в 2018-м оно доходило до 800 тыс. в неделю].

Фотография: Dodi Achmad. Источник: Unsplash.comФотография: Dodi Achmad. Источник: Unsplash.com

По мнению резидентов HN, чтобы не отвлекаться на рекомендации, иногда стоит полностью скрывать related-секции с помощью адблокеров. Или настроить автоматический редирект с главной к ленте тех каналов, на которые вы подписаны. Вообще говоря, среди аудитории площадки уже давно сформировался запрос на подобный функционал и точечные возможности вроде белых и черных списков, которые позволили бы прятать из выдачи ролики с определенными ключевыми словами, тегами и параметрами. Однако зрители вынуждены делать все это с помощью сторонних сервисов например, RSS-ридеров. Хотя и эту возможность, кажется, уже ограничили, так что довольствоваться остается лишь расширениями для браузеров.

Что будет происходить дальше

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

Следует признать, что перекос в строну исключения человеческого фактора из рекомендательного процесса пока не принес выдающихся результатов, поэтому маятник уже начал движение в обратную сторону. Мы продолжим рассказывать о том, как развиваются альтернативные способы поиска интересных видеороликов и музыки здесь и в нашем Мире Hi-Fi, а пока предлагаем несколько материалов для дополнительного чтения по теме:


Подробнее..

Рекомендательные системы, основанные на графах

06.11.2020 14:12:14 | Автор: admin
Всем привет! Меня зовут Александра Зенченко, я Lead Software Engineer в ЕРАМ. Занимаюсь разработкой решений, которые помогают нашим клиентам повышать эффективность работы и, в основном, включают в себя часть машинного обучения. В последнем проекте я работала над построением рекомендательной системы в сфере логистики. Хочу поделиться своим опытом и рассказать, как при помощи алгоритмов помочь довезти груз из Мюнхена в Женеву.

image

Пару слов о рекомендательных системах


Наверняка, с ними встречался каждый и не раз. Рекомендательные системы это программы и сервисы, которые пытаются предсказать, что может быть интересно/нужно/полезно конкретному пользователю, и показывают им это. Понравились эти беговые кроссовки? Возможно, Вам также понадобятся ветровка, пульсометр и еще 15 товаров для спорта. В последние годы бренды очень активно внедряют рекомендательные системы в свою работу, так как от этого решения выигрывают и продавец, и покупатель. Потребители получают инструмент, который помогает им за короткий срок сделать выбор в бесконечном множестве товаров и услуг, а у бизнеса растут продажи и аудитория.

Что нам дано?


Я работала на проекте для крупной мировой компании, которая предоставляет своим клиентам SaaS-решение обмена грузами или freight exchange платформу.

Звучит непонятно, а как происходит на деле: с одной стороны, на платформе зарегистрированы пользователи, у которых есть грузы и которым нужно их куда-то отправить. Они размещают заявку по типу Есть партия декоративной косметики, ее нужно отвезти завтра из Амстердама в Антверпен и ждут ответ. С другой стороны, у нас есть люди или компании с грузовиками грузоперевозчики. Допустим, они уже совершили свой стандартный еженедельный рейс, доставив йогурты из Парижа в Брюссель. Им нужно возвращаться и, чтобы не ехать с пустым грузовиком, найти какой-то груз для перевозки по дороге назад. Для этого грузоперевозчики заходят на платформу моего заказчика и выполняют серчи (от англ. search), указывая направление и, возможно, тип груза (или фрейта, от англ. freight), походящий грузовику. Система собирает заявки от грузоотправителей и показывает их грузоперевозчикам.

image

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

  • Замкнутые связи грузоперевозчика и клиента. Когда водитель часто работает только с определенным заказчиком, это не очень хорошо сказывается на платформе. Если грузоотправитель уйдет с рынка, то сервис может потерять и грузоперевозчика, потому что он станет клиентом другой логистической компании.
  • Наличие грузов, которые никто не хочет перевозить. Так случается, когда мелкие компании размещают заявки на перевозку, а потом их не обновляют и, соответственно, быстро выходят из числа активных.

Компания хотела улучшить функционал своей freight exchange платформы и повысить user experience пользователей, чтобы они видели все возможности системы и широкий диапазон грузов, а также не теряли лояльность. Это могло бы удержать целевую аудиторию от перехода на конкурентный сервис и показать грузоперевозчикам, что подходящие заказы можно найти не только у компаний, с которыми они привыкли работать.

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

Как гадать будем?


Наша рекомендательная система, как и другие, работает на анализе данных о пользователях. И есть несколько источников, которыми можно оперировать:

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

В приложении, куда решили внедрять рекомендательную систему, уже был механизм поиска грузов по предыдущим запросам. Поэтому мы решили сконцентрироваться на выявлении схем или паттернов, по которым пользователь ищет товары для перевозки. То есть мы не рекомендуем груз, а подбираем направление, наиболее подходящее этому пользователю сегодня. А грузы уже будем находить при помощи стандартного поискового механизма.

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

image

Видно, что у этого пользователя есть конкретные предпочтения в странах и провинциях. Но так не у всех и не всегда. Очень часто перевозчик указывает только страну назначения или не обозначает регион отправления, к примеру, он находится в Бельгии и может приехать в любую провинцию, чтобы забрать груз. В общем, типы запросов бывают разные: страна-страна, страна-регион, регион-страна либо регион-регион (самый лучший вариант).

Пробы алгоритмов


Как известно, стратегии создания рекомендательных систем, в основном, делят по фильтрации на основе содержания (сontent-based) и коллаборативной фильтрации (сollaborative filtering). На этой классификации я и стала строить варианты решений.

image
Картинку взяла с hub.forklog.com

Во многих источниках говорится, что сollaborative filtering система работает лучше. Все просто: мы пытаемся найти пользователей, похожих на нашего, с подобными паттернами поведения, и рекомендуем нашему пользователю такие же запросы, как у них. В общем-то, это решение было первым вариантом, которые я представила заказчикам. Но они с ним не согласились и сказали, что это не будет работать. Ведь все очень сильно зависит от того, где сейчас находится грузовик, куда он отвез груз, где он живет и куда ему удобнее ехать. Обо всем этом мы не знаем, поэтому так тяжело опираться на поведение других пользователей, пусть даже они, на первый взгляд, подобны.

Теперь о сontent-based системах. Они работают так: сначала определяется и создается профиль пользователя, а после на основании его характеристик делается подборка рекомендаций. Вполне хороший вариант, но в нашем случае есть пара нюансов. Во-первых, за одним пользователем может скрываться целая группа людей, которые ищут грузы для многих грузовиков и заходят с различных IP. Во-вторых, из точных данных у нас есть только страна перевозчика, а информация о количестве грузовиков и их типах примерно проявляется только в запросах, которые делает пользователь. То есть, чтобы построить сontent-based систему для нашего проекта, нужно смотреть на запросы каждого пользователя и пытаться найти среди них самые популярные.

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

Я продолжила разбираться, с чем же мы тут имеем дело. Фактически, это скрытая марковская модель, где за каждым пользователем может стоять группа людей. Причем пользователи могут находиться в различных скрытых состояниях: нет данных, где сейчас у них грузовик, сколько человек на одном аккаунте и когда в следующий раз им нужно будет куда-то ехать. На тот момент я не знала готовых решений продукционализации скрытой марковской модели, поэтому решила найти что-то более простое.

Знакомьтесь, PageRank


Так я обратила внимание на алгоритм PageRank, созданный когда-то основателями Google Сергеем Брином и Ларри Пейджем, который по сей день используется этой поисковой системой для рекомендаций сайтов пользователям. PageRank представляет все интернет-пространство в виде графа, где каждая веб-страничка является его узлом. С его помощью можно рассчитать важность (или rank) для каждого узла. PageRank принципиально отличается от алгоритмов поиска, существовавших до него, так как основывается не на содержании страниц, а на ссылках, которые находятся внутри них. То есть rank каждой страницы зависит от количества и качества ссылок, указывающих на нее. Брин и Пейдж доказали сходимость этого алгоритма, а значит мы всегда можем рассчитать rank любого узла направленного графа и придем к значениям, которые не будут меняться.

Посмотрим на его формулу:

image

  • PR(P) rank конкретной страницы
  • N количество страниц
  • i остальные страницы
  • O количество исходящих ссылок
  • d понижающий фактор. Когда пользователь ищет что-то, в определенный момент он останавливается, перестает переходить по ссылкам со страницы на страницу и начинает поиск чего-то другого. Понижающий фактор говорит нам о том моменте, когда произойдет переход к новому поиску. 0 d 1 обычно d равен 0,85. В нашей модели я сохранила это значение.

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

image

Можно увидеть, что самым важным здесь стал узел А вопреки тому, что на него, как и на С, указывают всего лишь два узла. Но rank узлов, указывающих на А, больше, чем у узлов, ведущих к С.

Предположения и решение


Итак, PageRank описывает марковский процесс без скрытых состояний. Используя его, мы всегда найдем окончательный вес каждого узла, но не сможем отслеживать изменения в графе. Алгоритм действительно хороший, нам удалось его адаптировать и повысить точность результатов. Для этого мы взяли модификацию PageRank алгоритм Personalized PageRank, который отличается от базового тем, что переход всегда осуществляется на какое-то ограниченное число узлов. То есть, когда пользователь устает ходить по ссылкам, то переключается не на случайный узел, а на один из заданного множества.

Узлами графа в нашем случае будут запросы пользователя. Так как наш алгоритм должен давать рекомендации на предстоящий день, я разбила все запросы каждого перевозчика по дням. Теперь строим граф: узел А соединяется с узлом В, если поиск вида В следует за поиском вида А, то есть поиск вида А осуществлялся пользователем перед днем, когда искали маршрут В. Например: Париж Брюссель во вторник (А), а в среду Брюссель Кёльн (B). А некоторые пользователи делают много запросов за день, поэтому сразу несколько узлов соединяются друг с другом, и в результате мы получаем довольно сложные графы.

Чтобы добавить информацию о важности перехода от одного серча к другому, мы добавили веса ребер графа. Вес ребра А-В это число случаев, когда пользователь осуществил поиск B после поиска А. Еще очень важно учитывать давность запросов, ведь пользователь меняет свой шаблон: он может переехать или реорганизовать основной вид перевозок, после которого не захочет ехать с пустым грузовиком. Поэтому нужно следить за историей маршрутов мы добавляем переменную reсency, которая также будет влиять на вес узла.

Стоит учитывать сезонность: мы можем знать, что, например, в сентябре перевозчик чаще ездит во Францию, а в октябре в Германию. Соответственно, больший вес можно предавать серчам, популярным в определенный месяц. Кроме того, мы опираемся на информацию о том, что пользователь искал в последний раз. Это помогает косвенным образом предположить, где может находиться грузовик.

Результат


image

Все реализовано на платформе Google. У нас есть OLTP-приложение, откуда идут данные о запросах и поступают в BigQuery, где формируются дополнительные представления и таблицы, содержащие уже обработанную информацию. Для ускорения и параллелизации обработки больших объемов данных использовалась библиотека DASK. В нашем решении все данные переносятся в Cloud Storage, потому что DASK работает только со ним и не взаимодействует с BigQuery. В Kubernetes были созданы две Job, одна из которых переносит данные из BigQuery в Cloud Storage, а вторая делает рекомендации. Это происходит так: Job берет данные о парах серчей из Cloud Storage, обрабатывает, формирует рекомендации на предстоящий день и отправляет их назад в BigQuery. Оттуда, уже в формате .json, мы можем передавать рекомендации на OLTP-приложение, где их будут видеть пользователи. Точность рекомендаций оценивается в Tableau, где сравниваются наши рекомендации и то, что потом реально искал пользователь, а еще его реакция (понравилось или нет).

Конечно же, хочется поделиться результатами. Вот, например, пользователь, который ежедневно делает по 14 серчей страна-страна. Такое же количество мы ему и порекомендовали:

image

Оказалось, наши варианты полностью совпали с тем, что он искал. Граф этого пользователя состоит из около 1000 различных запросов, но нам удалось очень точно угадать, что его заинтересует.

Второй пользователь в среднем делает 8 различных запросов каждые 2 дня, причем ищет и как формате страна-страна, так и с указанием конкретного региона отправления. Кроме того, страны отправления и доставки совершенно разные. Поэтому, мы не смогли угадать все и точность результатов получилась ниже:

image

Замечу, что у пользователя 2 графа с разными весами. В одном точность достигала 38%, а значит где-то 3 из 8 вариантов, рекомендованных нами, оказались релевантными. И, возможно, если мы найдем грузы на этих направлениях, то пользователь их и выберет.

Последний и самый простой пример. Человек каждый день делает примерно 2 поиска. У него очень устойчивые паттерны, не слишком много предпочтений и простой граф. Точность наших предсказаний в результате 100%.

image

Performance в фактах


  • Наши алгоритмы работают на 4 стандартных CPU и 10 GB памяти.
  • Объемы данных составляет до 1 миллиарда записей.
  • Создание рекомендаций для всех пользователей, которых около 20 000, занимает 18 минут.
  • Библиотека DASK используется для параллелизации, а библиотека NetworkX для алгоритма PageRank.

Могу сказать, что наши поиски и эксперименты дали очень хорошие результаты. Представление поведения пользователей freight exchange платформы в виде графа и применение PageRank позволяет с высокой точностью угадывать их будущие предпочтения и, таким образом, строить эффективные рекомендательные системы.
Подробнее..

Рекомендательный движок за 2 строчки кода

04.02.2021 10:09:11 | Автор: admin

История

Некоторое время назад IT в Леруа Мерлен претерпело довольно много изменений. Было перепилено довольно много систем, практически всё писались с нуля. Одной из таких систем была Публикационная Платформа, которая занималась передачей данных о продуктах на сайт и пришла на замену старой системе OPUS. Помимо всего прочего, в этой системе были микросервисы, отвечающие за рекомендации. Я не буду тратить время читателя на объяснение старой логики наполнения рекомендаций, скажу лишь, что первую половину 2020 года на официальном сайте крупнейшего ритейлера можно было увидеть следующее.

Как замену для

рихтовочного набора

Рихтовочный набор набор молотков и наковален для исправления деформаций кузова автомобиля.

сайт на полном серьёзе предлагал прикупить заготовку для выпиливания лобзиком.

А к мусорному мешку предлагалось прикупить защитный комбинезон и респиратор, и это ещё до пандемии)

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

Проблематика

У нас есть много специалистов, которые любят свою работу и хорошо знают свой товар. Они на 100% знают, что можно предложить в качестве замены, если искомого товара нет в наличии
(похожие товары) или что ещё может понадобиться дополнительно (сопутствующие товары). Большинство этих сотрудников работает в магазинах и ежедневно консультирует наших клиентов как раз по этим вопросам, но мы не можем попросить их составлять для нас рекомендации: им есть чем заняться. Специфика ритейла заключается в том, что за год меняется до 20% ассортимента. А товаров очень много. Вбивать всё это руками не вариант, нужен другой подход.

Мы подумали, что наш клиент, совершая покупку, каждый раз сам решает, подходят ли эти обои именно к такому плинтусу или это зеркало к тумбе для ванной. А в сложных моментах его консультируют наши профессионалы. И он голосует за своё решение рублём, покупая у нас товар, почему бы не использовать эти данные? Таким образом, мы переформулировали нашу задачу так:

как из массива чеков получить информацию о том, какой товар к какому подходит?

Word2Vec

Алгоритм, который мы использовали, был разработан Google в 2013 году и называется Word2Vec.
Как следует из его названия, он переводит слово в вектор на основании контекста, на котором его обучают. При этом после обучения схожие по контексту слова будут иметь близкие векторы, а различные далёкие.

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

Допустим, есть 2 машины, BMW и Запорожец. Рассмотрим их с точки зрения габаритных характеристик. Возьмём ширину и высоту каждого и построим на двухмерной плоскости векторы, соответствующие этим машинам. Получится примерно следующее:

Расстояние между двумя векторами это степень похожести двух автомобилей. Тут мы видим, что 2 машины не так уж и сильно отличаются друг от друга, если просто стоят и занимают место в гараже.

Если же мы добавим к контексту скорость, то получим совершенно другую картину:

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

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

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

Word2Vec в рекомендациях

Как я уже говорил, наш контекст, т. е. то, на чём мы будем обучать нашу модель, это чеки. А именно текстовые файлы, каждая строчка в которых это набор артикулов товаров через пробел, которые в одном чеке были куплены:

Возникает вопрос: как в этих чеках наша модель сможет найти какие-то закономерности?
Можно представить себе следующую аналогию. Допустим, есть 2 чека:

В этих чеках все товары одинаковые, кроме 13227536 и 33444222. Что это означает?
С некой долей вероятности мы можем предположить, что было 2 клиента, которые решали одну и ту же задачу (т. к. все, кроме одного, товары одинаковые), и они её решили, но решили по-разному. Т. е. с некой долей вероятности можно предположить, что товар 13227536 может быть заменён на 33444222, т. е. это похожие товары.

Теперь рассмотрим другой случай:

Тут чек номер 2 включает в себя чек номер 1. С некой долей вероятности мы можем предположить, что также были 2 клиента, решавшие одну задачу, но клиент, оформивший второй чек, решил купить больше товаров. Тут мы можем предположить, что товары, отмеченные фиолетовым, 12355478 78856433 являются сопутствующими товарами к товарам, которые отмечены жёлтым.

Теперь перейдём к обещанным двум строчкам кода.

Код

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

model = gensim.models.Word2Vec( rаw_сhecks, size=200, window=100, min_count=10, workers=4 )

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

similars = model.similar_by_word( product_id, 2000 )

Это весь движок. На этой строчке модель вернёт 2000 продуктов, но, как показано выше, там будут и похожие товары, и товары сопутствующие. Для того, чтобы отделить зёрна от плевел, нам придётся написать ещё 2 строчки:

substitutes = filter_same_type( similars, product_id_type )complements = filter_different_type( similars, product_id_type )

Исходя из нашей доменной области, мы можем предположить, что один товар может заменить другой, только если у него тот же тип. Т. е. молоток мы можем заменить молотком, а не микроскопом. Поэтому из similar нужно взять товары, тип которых совпадает с типом product_id. Сопутствующие же товары, наоборот, должны быть другого типа. Вот и вся любовь.

Итоги

А/Б-тест движка для похожих товаров показал общий прирост конверсии аж на 10% и на следующий же день был установлен в продакшн на 100% трафика. Хотелось бы заметить, что это не потому, что подход какой-то революционный, просто скорее всего то, что было раньше, никуда не годилось.

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

Из вышенаписанного мы можем сделать вывод, что эксперимент был удачный. А также из-за простоты модели понятно, что этому всему ещё есть куда расти.

Минусы подхода

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

Из минусов подхода можно перечислить:

  • Word2Vec вряд ли подойдёт для рекомендаций фильмов, музыки, книг и т. д. Это не про предпочтение определённого автора или жанра. В специфике DIY товары покупаются комплектом и под проект: купил обои тебе точно нужен клей. Необходимость в клее не исчезнет, а вот боевики могут в какой-то период разонравиться, и хорошая рекомендательная система должна это как можно раньше диагностировать.

  • Клиент, оказывается, не всегда прав. Есть хороший пример пары товаров, которые не подходят друг другу, но которые клиент всё равно покупает вместе, потому что названия похожие. Потом, конечно, возвращает (наш движок, кстати, не учитывает возврат), но рекомендовать эти товары на официальном сайте компания себе позволить не может. Такие моменты нужно обходить в ручном режиме.

  • Голый Word2Vec в данной статье учитывает только историю продаж. И не учитывает ничего больше. Это плохо. Например, существует много других способов находить похожие товары по схожести фотографий, похожему названию и т. д.

Подробнее..

Рекомендации Друзей ВКонтакте ML на эго-графах

13.04.2021 14:10:30 | Автор: admin

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

Меня зовут Женя Замятин, я работаю в команде Core ML ВКонтакте. Хочу рассказать, как устроены рекомендации, которые делают ближе пользователей самой крупной социальной сети рунета.

Обзор

Современные рекомендательные системы зачастую состоят из двух уровней, и наша не исключение. Задача первого уровня искать наиболее релевантных кандидатов среди всего множества пользователей (у нас их сотни миллионов). Такая постановка задачи подразумевает высокую скорость работы. Обычно здесь используют простые в применении модели вроде матричных факторизаций или эвристики на базе числа общих друзей. Полученные на первом уровне кандидаты отправляются на второй. Здесь на модель уже не накладываются такие жёсткие ограничения по скорости, её главная задача обеспечить максимальную точность предсказаний и сформировать список, который увидит пользователь. В этой статье мы рассмотрим только первый этап уровень отбора кандидатов.

Прежде всего сформулируем задачу, которую будем решать: для каждого пользователя необходимо найти k кандидатов, которых он с наибольшей вероятностью добавит в друзья. Метрика, на которую будем ориентироваться, recall@k. Она идеально описывает задачу: на первом уровне нам не интересен порядок кандидатов, но важна их релевантность.

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

Ещё один важный метод рекомендаций Adamic/Adar. В его основе лежит всё тот же анализ общих друзей, но с модификацией: авторы предлагают учитывать число друзей у общего друга. Чем больше это значение, тем меньше информации о релевантности он несёт.

Кроме методов на основе анализа общих друзей, довольно распространены рекомендации на базе эмбеддингов. В Лаборатории искусственного интеллекта ВКонтакте в МФТИ мы провели исследование: сравнили эффективность разных подходов к задаче предсказания дружб в VK. Результаты совпали с нашим опытом решения на базе графовых эмбеддингов у нас работают плохо. Учитывая это, мы стали развивать систему отбора кандидатов по пути анализа общих друзей.

EGOML

Общая схема нашего метода продолжает идеи числа общих друзей и Adamic/Adar. Финальная мера релевантности E(u, v), с помощью которой мы будем отбирать кандидатов, всё так же раскладывается в сумму по общим друзьям u и v. Ключевое отличие в форме слагаемого под суммой: в нашем случае это мера ez_c(u, v).

Сначала попробуем понять физический смысл меры ez_c(u, v). Представим, что мы взяли пользователя c и спросили у него: Насколько вероятно, что два твоих друга, u и v, подружатся? Чем больше информации для оценки он учтёт, тем точнее будет его предсказание. Например, если c сможет вспомнить только число своих друзей, его рассуждения могут выглядеть следующим образом: Чем больше у меня друзей, тем менее вероятно, что случайные двое из них знакомы. Тогда оценка вероятность дружбы u и v (с точки зрения c) может выглядеть как 1/log(n), где n число друзей. Именно так устроен Adamic/Adar. Но что если c возьмёт больше контекста?

Прежде чем отвечать на этот вопрос, разберёмся, почему ez_c(u, v) важно определять через пользователя c. Дело в том, что в таком виде очень удобно решать задачу распределённо. Представим, что теперь мы разослали всем пользователям платформы анкету с просьбой оценить вероятность дружбы в каждой паре их друзей. Получив все ответы, мы можем подставить значения в формулу E(u, v). Именно так выглядит вычисление E(u, v) с помощью MapReduce:

  • Подготовка. Для каждого c выделяется тот контекст, который он будет учитывать для вынесения оценок. Например, в Adamic/Adar это будет просто список друзей.

  • Map. Спрашиваем у каждого c, что он думает про возможность дружбы в каждой паре его друзей. По сути, вычисляем ez_c(u, v) и сохраняем в виде (u, v) ez_c(u, v) для всех u, v in N(c). В случае Adamic/Adar: (u, v) 1/log|N(c)|.

  • Reduce. Для каждой пары (u, v) суммируем все соответствующие ей значения. Их будет ровно столько, сколько общих друзей у u и v.

Таким образом мы получаем все ненулевые значения E(u, v). Заметим: необходимое условие того, что E(u, v) > 0, существование хотя бы одного общего друга у u и v.

Эго-граф ХоппераЭго-граф Хоппера

Контекстом пользователя c в случае меры ez_c будет тот же список друзей, но дополненный информацией о связях внутри этого списка. Такую структуру в науке называют эго-графом. Если более формально, эго-граф вершины x это такой подграф исходного графа, вершинами которого являются все соседи x и сама x, а рёбрами все рёбра исходного графа между этими вершинами. Коллеги из Одноклассников написали подробную статью об эго-графах и затронули в ней вопрос их эффективного построения.

Ключевая идея меры ez_c в том, что её можно сделать обучаемой. Для каждого пользователя c, его эго-графа и всех пар пользователей u, v внутри него мы можем посчитать много разных признаков, например:

  • число общих друзей u и v внутри эго-графа c;

  • число общих друзей u и c;

  • интенсивность взаимодействий между v и c;

  • время, прошедшее с последней дружбы между u и кем-либо из эго-графа c;

  • плотность эго-графа c;

  • и другие.

Таким образом мы получим датасет с признаками. Но для обучения нужны ещё и метки. Пусть датасет был построен по состоянию графа на момент времени T. Тогда в качестве положительных примеров возьмём те пары пользователей, которые не были друзьями на момент T, но подружились к T + T. А как отрицательные все остальные, не подружившиеся, пары пользователей. Заметим: поскольку мы решаем задачу предсказания новых дружб, те пары пользователей, которые уже дружат на момент T, учитывать не нужно ни на обучении, ни на применении.

В конечном счёте мы получаем датасет следующего вида:

  • для каждой пары пользователей u и v, а также их общего друга c, посчитаны признаки по эго-графу c;

  • пара пользователей u и v встречается в датасете ровно столько раз, сколько у них общих друзей;

  • все пары пользователей в датасете не являются друзьями на момент времени T;

  • для каждой пары u и v проставлена метка подружились ли они в течение определённого промежутка времени начиная с T.

По такому датасету мы и будем обучать нашу меру ez_c. В качестве модели выбрали градиентный бустинг с pairwise функцией потерь, где идентификатором группы выступает пользователь u.
По сути, мера ez_c(u, v) определяется как предсказание описанной выше модели. Но есть один нюанс: при pairwise-обучении распределение предсказаний модели похоже на нормальное. Поэтому, если в качестве определения меры ez_c(u, v) взять сырое предсказание, может возникнуть ситуация, когда мы будем штрафовать финальную меру E(u, v) за общих друзей, так как значения предсказаний бывают отрицательными. Это выглядит не совсем логично хочется, чтобы с ростом числа общих друзей мера E(u, v) не убывала. Так что поверх предсказания модели мы решили взять экспоненту:

Такой подход хорошо себя показывает на небольших графах. Но чтобы применить его на реальных данных, необходимо выполнить ещё одно действие. Суть проблемы такая: мы не можем вычислять признаки и применять модель для каждой пары пользователей всех эго-графов это слишком долго. Для решения мы придумали специальный трюк. Представим, что наш градиентный бустинг обучился таким образом, что каждое дерево использует признаки только одного пользователя: либо u, либо v. Тогда мы могли бы разделить весь ансамбль на две группы: к группе A мы бы отнесли деревья, которые используют только признаки пользователя u, к B пользователя v. Предсказание такой модели можно представить в виде:

Имея такую модель, мы могли бы получить предсказания для всех пар пользователей одного эго-графа быстрее. Достаточно применить модели A и B для каждого пользователя, а затем сложить соответствующие парам предсказания. Таким образом, для эго-графа из n вершин мы могли бы сократить число применений модели с O(n^2) до O(n). Но как получить такую модель, каждое дерево которой зависит только от одного пользователя? Для этого сделаем следующее:

  1. Исключим из датасета все признаки, которые одновременно зависят и от u и от v. Например, от признака число общих друзей u и v внутри эго-графа c придётся отказаться.

  2. Обучим модель A, используя только признаки на базе u, c и эго-графа c.

  3. Для обучения модели B оставим только признаки на базе v, c и эго-графа c. Также в качестве базовых предсказаний передадим предсказания модели A.

Если объединим модели A и B, получим то что нужно: первая часть использует признаки u, вторая признаки v. Совокупность моделей осмысленна, поскольку B была обучена корректировать предсказания A. Эта оптимизация позволяет ускорить вычисления в сотни раз и делает подход применимым на практике. Финальный вид ez_c(u, v) и E(u, v) выглядит так:

Вычисление меры E в онлайне

Заметим, что E(u, v) можно представить в виде:

Эта формула скалярное произведение разреженных векторов, индексами которых являются пользователи, а значениями экспоненты предсказаний модели. Ненулевые значения здесь проставлены только у друзей u по сути это просто списки друзей с дополнительными значениями.

При построении рекомендаций мы уже вычислили предсказания моделей для всех существующих дружб. Поэтому для каждого пользователя мы можем собрать векторы и сложить их в доступное онлайн key-value хранилище. После этого сможем получать значение E(u, v) для любой пары пользователей в онлайне простой операцией перемножения векторов. Это даёт возможность использовать E(u, v) как лёгкую функцию релевантности в нагруженных местах либо как дополнительный признак финальной модели ранжирования.

Итог

В результате система EGOML позволяет:

  1. Распределённо отбирать кандидатов для каждого пользователя в офлайне. Асимптотическая сложность оптимизированного алгоритма составляет O(|E|) вычислений признаков и применений модели, где |E| число связей в графе. На кластере из 250 воркеров время работы алгоритма составляет около двух часов.

  2. Быстро вычислять меру релевантности E(u, v) для любой пары пользователей в онлайне. Асимптотическая сложность операции O(|N(u)| + |N(v)|).

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

В конечном счёте мы перешли со способа отбора кандидатов с использованием Adamic/Adar к системе EGOML и внедрили в модель второй уровень признаков на основе меры E(u, v). И это позволило увеличить количество подтверждённых дружб со всей платформы на несколько десятков процентов.

Благодарность

Хочу сказать спасибо руководителю команды Core ML Андрею Якушеву за помощь в разработке метода и подготовке статьи, а также всей команде Core ML за поддержку на разных этапах этой работы.

Подробнее..

Перевод Автоматическое обучение взаимодействию функций с помощью самонастраиваемых нейронных сетей

27.01.2021 20:23:33 | Автор: admin

Аннотация

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

В этой статье мы предлагаем эффективный и действенный методAutoIntдля автоматическогоанализавзаимодействий объектов высокого порядка входных объектов. Предлагаемый нами алгоритм является очень общим и может быть применен как к числовым, так и к категориальным входным признакам. В частности, мы сопоставляем как числовые, так и категориальные признаки в одном и том же низкоразмерном пространстве. Затем предлагается многоцелеваясамонастраиваемаянейронная сеть с остаточными связями для явного моделирования взаимодействий признаков в низкоразмерном пространстве. С помощью различных слоев многоцелевыхсамонапряженных нейронных сетей можно моделировать различные порядки комбинаций признаков входных признаков. Вся модель может быть эффективноприменена ккрупномасштабнымнеобработаннымданнымсквозным способом. Экспериментальные результаты на четырех реальных наборах данных показывают, что предложенный нами подход не только превосходит существующие современные подходы к прогнозированию, но и обеспечивает хорошую объясняющую способность сети. Код доступен по адресу:https://github.com/DeepGraphLearning/RecommenderSystems.

  1. Введение

Прогнозирование вероятностей кликов пользователей по объявлениям или товарам (также известное как прогнозированиекликабельности) является критической проблемой для многихвеб-приложений, таких какинтернет-реклама и рекомендательные системы [8, 10, 15]. Эффективность прогноза оказывает непосредственное влияние на конечную выручку бизнес-провайдеров. Благодаря своей важности она вызывает растущий интерес,как в академических кругах, так и вкоммерческихкругах.

Машинное обучение играет ключевую роль в прогнозировании скорости кликов, которое обычно формулируется как контролируемое обучение с профилями пользователей и атрибутами элементов в качестве входных функций. Эта проблема очень сложна по нескольким причинам. Во-первых, входные объекты чрезвычайно разрежены и многомерны [8, 11, 13, 21, 32]. В реальных приложениях,значительная часть демографических характеристик пользователя и атрибутов элемента обычно дискретнаяи/или категориальная. Чтобы сделатьприменимымиметоды контролируемого обучения, эти функции сначала преобразуются в вектор однократного кодирования, который может легко привести к объектам с миллионами измерений. Если взять в качестве примера хорошо известные данные прогнозирования CTRCriteo, то размерность объекта составляет примерно 30 миллионов с разреженностью более 99,99%. С такими разреженными и многомерными входными функциями модели машинного обучения легко перестраиваемы (настраиваемы). Во-вторых, как показано в обширной литературе [8, 11, 19, 32], взаимодействие функций высокого порядка имеет решающее значение для хорошей производительности. Например, целесообразно рекомендовать Марио,изизвестнойвидео-игры, Давиду, десятилетнему мальчику. В этом случае комбинаторный признак третьего порядка <Gender=Male,Age=10,productCategory=VideoGame> очень информативен для прогнозирования. Однако поиск таких значимых комбинаторных функций высокого порядка в значительной степени зависит от экспертов предметной области. Более того, практически невозможно вручную создать все значимые комбинации [8, 26]. Можнозадаться вопросом:можем ли мы перечислить все возможные функции высокого порядка и позволить моделям машинного обучения выбрать значимые?Однако перечисление всех возможных объектов высокого порядка приведет к экспоненциальному увеличению размерности и разреженности входных объектов, что приведет к более серьезной проблеме переоснащения модели. Поэтому в сообществахпредпринимались обширные усилияпо поиску низкоразмерных представлений разреженных и высокомерных входных объектов и,одновременно,моделированию различных порядков комбинаций объектов.

Например,факторизационныемашины (ФМ) [26], сочетающие полиномиальные регрессионные модели с методами факторизации, разработаны для моделирования взаимодействий признаков и доказали свою эффективность для различных задач [27, 28]. Однако, ограниченный полиномиальным временем подгонки, он эффективен только для моделирования взаимодействий объектов низкого порядка и непрактичен дляучетавзаимодействий объектов высокого порядка. В последнее время,во многих работах [8, 11, 13, 38],на основе глубоких нейронных сетей было предложено моделировать взаимодействия признаков высокого порядка. В частности, несколько слоев нелинейных нейронных сетей обычно используются для захвата взаимодействий объектов высокого порядка. Однако такие методы имеют два ограничения. Первый,какбыло показано,-полностью связанные нейронные сети неэффективны при обучении мультипликативным взаимодействиям признаков [4]. Во-вторых, поскольку эти модели изучают взаимодействие признаков неявным образом, им не хватает хорошего объяснения того, какие комбинации признаков имеют смысл. Поэтому мы ищем подход, способныйявно моделировать различные порядки комбинаций признаков, представлять все объекты в низкоразмерных пространствах и в то же время предлагать хорошую объяснимость модели.

В данной работе мы предлагаем такой подход, основанный на многослойноммеханизме само-внимания [36]. Предложенный нами подход изучает эффективные низкоразмерные представления разреженных ивысокоразмерныхвходных признаков,и применим как к категориальным, так и к числовым входным признакам. В частности, как категориальные, так и числовые признаки сначала внедряются в низкоразмерные пространства, что уменьшает размерность входных признаков и в то же время позволяет различным типам признаков взаимодействовать друг с другом с помощью векторной арифметики (например, суммирования и внутреннего произведения). Затем мы предлагаем новый взаимодействующий слой, способствующий взаимодействию различных объектов. Внутри каждого взаимодействующего слоя,каждому объекту разрешено взаимодействовать со всеми другими объектами и он способен автоматически идентифицировать соответствующие объекты для формирования значимых объектов более высокого порядка с помощью механизма многоцелевоговнимания [36]. Более того, механизм с несколькимицелями (слоями)проецирует объект на несколько подпространств, и, следовательно, он может фиксировать различныевзаимодействия объектов в разных подпространствах. Такой слой взаимодействий моделирует одношаговое взаимодействие между объектами. Накладываянесколько взаимодействующих слоев, мы можем моделировать различные порядки взаимодействия объектов. На практике к взаимодействующему слою добавляется остаточная связь [12], что позволяет комбинировать различные порядки комбинаций признаков. Мы используем механизм внимания для измерения корреляций между признаками, что обеспечивает хорошую объяснимость модели.

Подводя итог, в этой статье мы делаем следующие выводы:

  • предлагаем изучить проблему явного обучения взаимодействий признаков высокого порядка и одновременно найти модели с хорошей объяснимостью для этой задачи;

  • предлагаем новый подход, основанный на самообучающейсянейронной сети, которая может автоматически изучать взаимодействия объектов высокого порядка и эффективно обрабатывать крупномасштабные высокомерные разреженные данные;

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

Наша работа организована следующим образом. В разделе 2. мы анализируем соответствующие работы.В разделе3приводитсяформальная постановка нашейпроблемы. В разделе 4. предложен подход к изучению взаимодействия признаков. В разделе 5 представлены результаты экспериментов и их детальный анализ. Мы завершаемстатью,указываяна будущие исследования в разделе 6.

2.Сопутствующие работы

Наше исследование относится к трем направлениям работы: 1)прогнозированиекликабельностив рекомендательных системах и онлайн-рекламе;2) методы обучения взаимодействиям признаков; 3) механизм самоконтроля и остаточные сети в литературе по глубокому обучению.

2.1Прогнозирование рейтингакликабельности

Прогнозированиекликабельностиважно для многих интернет-компаний, и различные системы были разработаны разными компаниями [8-10, 15, 21, 29, 43]. Например,Googleразработала систему обученияWide&Deep[8] для рекомендательных систем, которая сочетает в себе преимущества линейных неглубоких моделей,а такжеглубоких моделей. Система достигает замечательной производительности в рекомендательных системах. Эта проблема также получает большое внимание в академических кругах. Например,Шанисоавт. [31] предложили контекстно-зависимыйметод прогнозированиякликабельности, которые раскладывает тензор на множители по трем направлениям <пользователь, объявление, контекст>.Oentaryoисоавт. [24] разработана машина факторизации с иерархическойподчиненностьюдля моделирования динамического воздействия рекламы.

2.2Взаимодействие Функций Обучения

Изучение взаимодействия признаков является фундаментальной проблемой,поэтому широко изучается в литературе. Хорошо известным примером являютсяфакторизационныемашины (ФМ) [26], которые были предложены в основном для захвата взаимодействий признаков первого и второго порядка и доказали свою эффективность для многих задач в рекомендательных системах [27, 28]. Впоследствии были предложены различные вариантыфакторизационныхмашин. Например, полевыефакторизационныемашины (FFM) [16] моделировали мелкозернистые взаимодействия между объектами разных полей. GBFM [7] и AFM [40] рассматривали важность различных взаимодействий признаков второго порядка. Однако все эти подходы сосредоточены на моделировании взаимодействийобъектов низкого порядка.

Есть некоторые недавние работы, которые моделируют взаимодействия объектов высокого порядка. Например, NFM [13] укладывал глубокие нейронные сети поверх выходных данных взаимодействий объектов второго порядка для моделирования объектов более высокого порядка. Аналогично, PNN [25], FNN [41],DeepCrossing[32],Wide&Deep[8] иDeepFM[11] использовали нейронные сети обратной связи для моделирования взаимодействий признаков высокого порядка. Однако все эти подходы изучают взаимодействия признаков высокого порядка неявным образом,поэтому не имеют хорошей объясняющей способностимодели. Напротив, есть три направления работ, которые изучают взаимодействие признаков в явном виде. Во-первых, Deep&Cross[38] иxDeepFM[19] использовали внешнее произведение признаковна битовом и векторном уровнях соответственно. Хотя они выполняют явные взаимодействия признаков, объяснить, какие комбинации полезны нетривиально. Во-вторых, некоторые древовидные методы [39, 42, 44] сочетали в себе мощь моделей, основанных на внедрении и древовидных моделей, но должны были разбить процедуру обучения на несколько этапов. В-третьих, HOFM [5] предложил эффективные обучающие алгоритмы для машин факторизации высокого порядка. Однако HOFM требует слишком большого количества параметров, и практически можно использовать только егонизкопорядковую(обычно менее 5) форму. В отличие от существующей работы, мы явно моделируем взаимодействие признаков с механизмом внимания сквозным образом ивизуализируемизученные комбинации признаков.

2.3Внимание и остаточные сети

Предложенная нами модель использует новейшие методы в литературе по глубокому обучению: внимание [2] и остаточные сети [12].

Внимание впервые предложено в контексте нейронного машинного перевода [2] и доказало свою эффективность в различных задачах, таких как ответы на вопросы [35], обобщение текста [30] и рекомендательные системы [14, 33, 43].Васвании др. [36] далее предложили многоцелевоесамо-внимание для моделирования сложных зависимостей между словами в машинном переводе.

Остаточные сети [12] достигли высочайшего уровня производительности в конкурсеImageNet. Поскольку остаточная связь, которую можно просто формализовать как y = F (x) + x, способствует градиентному потоку через интервальные слои, она становится популярной сетевой структурой для обучения очень глубоких нейронных сетей.

3.Определение проблемы

Сначала мы формально определим задачу прогнозирования рейтинга кликов (CTR) следующим образом:

Определение 1. (Прогноз CTR) Пусть x R n обозначает конкатенацию функций пользователя u и характеристик элемента v, где категориальные особенности представлены с помощью однократного кодирования, а n - размерность объединяемыхфункций. Задача прогнозирования рейтинга кликов направлена на прогнозирование вероятности того, что пользователь u нажмет на элемент v в соответствии с вектором признаков x.

Простое решение для прогнозирования CTR состоит в том, чтобы рассматривать x как входные характеристики и развертывать готовыеклассификаторы, такие как логистическая регрессия. Однако, поскольку исходный вектор признаков x очень разрежен и многомерен, модель будет легкоадаптирована. Поэтому желательно представлять исходные входные объекты в низкоразмерных непрерывных пространствах. Кроме того, как показано в существующей литературе, крайне важно использовать комбинаторные функции более высокого порядка для получения хорошей производительности прогнозирования [6, 8, 11, 23, 26, 32].

Рисунок 1: Обзор предлагаемой нами модели AutoInt. Подробности встраиваемого слоя и взаимодействующего слоя показаны на рисунках 2 и 3 соответственно. Рисунок 1: Обзор предлагаемой нами модели AutoInt. Подробности встраиваемого слоя и взаимодействующего слоя показаны на рисунках 2 и 3 соответственно.

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

Определение 2(комбинаторная функция p-порядка).При заданном входном векторе признаков xR n комбинаторный признак p-го порядка определяется как g (xi1 , ...,xip), где каждый признакзадан надотдельнымполем, p-число задействованных полей признаков, а g () - неаддитивная комбинированная функция, такая как умножение [26] и внешнее произведение [19, 38]. Например, xi1 xi2-это комбинаторная функция второго порядка, включающая xi1 и xi2.

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

Определение 3(определение проблемы).Учитывая входной вектор признаков xRn для прогнозирования рейтинга кликов, наша цель - изучить низкоразмерное представление x, которое моделирует комбинаторные признаки высокого порядка.

4.Autoint: функция автоматическогообеспечениявзаимодействий

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

4.1Обзор

Цель нашего подхода состоит в том, чтобы отобразить исходный разреженный и высокоразмерный вектор признаков в низкоразмерные пространства и одновременно смоделировать взаимодействия объектов высокого порядка. Как показано на Рис.1, предлагаемый нами метод принимает в качестве входных данных разреженный вектор признаков x, за которым следует слой вложения, проецирующий все признаки (т. е. как категориальные, так и числовые) в одно и то же низкоразмерное пространство. Затем мы вводим вложения всех полей в новый взаимодействующий слой, который реализуется как многоцелевая (многослойная) самонапряженная нейронная сеть. Для каждого взаимодействующего слоя объекты высокого порядка объединяются с помощью механизма внимания, различные виды комбинаций могут быть оценены с помощью многослойныхмеханизмов, которые отображают объекты в различные подпространства. Путем наложения нескольких взаимодействующих слоев можно моделировать различные порядки комбинаторных объектов.

Результатом последнего взаимодействующего слоя является низкоразмерное представление входного объекта, которое моделирует комбинаторные признаки высокого порядкаидалее используется для оценки рейтинга кликов с помощью сигмоидальной функции. Далее мы познакомим вас с деталями предлагаемого нами метода.

Рисунок 2: Иллюстрация входного и встраиваемого слоев, где как категориальные, так и числовые поля представлены низкоразмерными плотными векторами. Рисунок 2: Иллюстрация входного и встраиваемого слоев, где как категориальные, так и числовые поля представлены низкоразмерными плотными векторами.

4.2Входной слой

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

где M - общее количество полей признаков, аxi- представление признаков i-го поля.xi-это одномерный вектор, если i-е поле категориально (например, x1 на Рис. 2).xi-скалярное значение, если i-е поле числовое (например,xMна Рис. 2).

4.3Встраиваемый слой

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

гдеVi- матрица вложения для поля i, аxi- одноразовый вектор. Часто категориальные признаки могут быть многозначными, то естьxi- это многозначный вектор. Возьмем в качестве примера прогнозирование просмотра фильмов. Может существовать функциональное поле Жанр, которое описывает типы фильма, и оно может быть многозначным (например, Драма и Романтика для фильма Титаник). Для совместимости с многозначными входными данными мы дополнительно модифицируем уравнение 2 и представляем многозначное поле признаков как среднее значение соответствующих векторов внедрения признаков:

где q - количество значений, которые имеет выборка для i-гополя, аxi- мульти-горячее векторное представление для этого поля.

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

гдеvm- вектор вложения для поля m, аxm- скалярное значение.

Таким образом, выход слоя встраивания будет представлять собой конкатенацию нескольких векторов встраивания, как показано на Рис.2.

4.4Взаимодействующий слой

Как только числовые и категориальные признакиперенесеныв одно и то же низкоразмерное пространство, мы переходим к моделированию комбинаторных признаков высокого порядка в этом пространстве. Ключевая проблема состоит в том, чтобы определить, какие признаки должны быть объединены для формирования значимых признаков высокого порядка. Традиционно это делается экспертами по предметной области, которые создают значимые комбинации на основе своих знаний. В этой статье мы решаем эту проблему с помощью нового метода - многослойного механизма само-внимания [36].

Многослойнаяясамосознательнаясеть (Multi-head self-attentive network) [36] в последнее время достигла замечательных результатов в моделировании сложных отношений. Например, он показывает превосходство для моделирования произвольной зависимости слов в машинном переводе [36] и встраивании предложений [20], а также был успешно применен для захвата сходства узлов при встраивании графов [37]. Здесь мы расширяемэтот новейший метод для моделирования корреляций между различными полями признаков.

В частности, мы применяем механизм вниманияключ-значение[22], чтобы определить, какие комбинации функций имеют смысл. Взяв в качестве примера функцию m, далее мы объясним, как идентифицировать несколько значимых функций высокого порядка, включающих функцию m. Сначала мы определяем корреляцию между признаком m и признаком k в рамках особого внимания головы(слоя)h следующим образом:

где (h) (, ) - функция внимания, определяющая сходство между характеристикой m и k. Его можно определить как нейронную сеть или просто как внутренний продукт, то есть, . В этой работе мы используем внутренний продукт из-за его простоты и эффективности.

W(h)Query, W(h)KeyRd dв уравнении 5 - это матрицы преобразования, которые отображают исходное пространство вложенияRdв новое пространствоRd. Затем мы обновляем представление признака m в подпространстве h, комбинируя все соответствующие признаки, руководствуясь коэффициентами (h)m, k:

поскольку результат (6) представляет собой комбинацию признака m и его соответствующих признаков (под заголовком h), он представляет собой новую комбинаторную особенность, изученную с помощью нашего метода. Кроме того, функция также может быть задействована в различных комбинаторных функциях, мы достигаем этого с помощью нескольких заголовков, которые создают разные подпространства и изучают различные взаимодействия функций отдельно. Мы собираем комбинаторные особенности, изученные во всех подпространствах, следующим образом:

где- оператор конкатенации, а H - количество общих голов.

Рисунок 3: Архитектура взаимодействующего уровня. Комбинаторные свойства обусловлены весами внимания, т.е. (h) m. Рисунок 3: Архитектура взаимодействующего уровня. Комбинаторные свойства обусловлены весами внимания, т.е. (h) m.

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

гдеW ResR d H d - матрица проекции в случае несовпадения размерностей [12], а ReLU(z) = max (0, z) - нелинейная функция активации.

С таким взаимодействующим слоем представление каждого объектаemбудет обновлено до нового представления объекта eResm, котороеявляется представлением объектов высокого порядка. Мы можем складывать несколько таких слоев с выходом предыдущего взаимодействующего слоя в качестве входа следующего взаимодействующего слоя. Делая это, мы можем моделировать комбинаторные особенности произвольного порядка.

4.5Выходной слой

Выход взаимодействующего слоя представляет собой набор векторов признаков {eResm}Mm=1, который включает в себя необработанные индивидуальные признаки, зарезервированные остаточным блоком, и комбинаторные признаки, изученные с помощью многоголового (многослойного)механизмасамовнимания. Для окончательного прогнозирования CTR мы просто объединяем их все, а затем применяем нелинейную проекцию следующим образом:

где wR d H M - вектор проекции столбца, который линейно объединяет сцепленные функции, b - смещение, а (x) = 1 / (1 + ex) преобразует значения в вероятности нажатия пользователем.

4.6Обучение

Наша функция потерь - это журнал потерь, который определяется следующим образом:

гдеyjиyj- достоверные данные о кликах пользователя и оцененном CTR соответственно, j индексирует обучающие выборки, а N - общее количество обучающих выборок. Параметры, которые необходимо изучить в нашей модели:

которые обновляются путем минимизации общейloglossс использованием градиентного спуска.

4.7АнализAutoInt

Моделирование комбинаторных признаков произвольного порядка. Учитывая оператор взаимодействия функций, определенный уравнением 5-8, мы теперь анализируем, как комбинаторные особенности низкого и высокого порядка моделируются в предлагаемой нами модели.

Для простоты предположим, что имеются четыре поля функций (т.е. M = 4), обозначенных как x1, x2, x3 и x4 соответственно. Внутри первого взаимодействующего уровня каждая отдельная функция взаимодействует с любыми другими характеристиками через механизм внимания (например, уравнение 5) и, следовательно, набор комбинаций функций второго порядка, таких как g (x1, x2), g (x2, x3) и g(x3, x4)применяетсяс различными весами корреляции, где неаддитивное свойство функциивзаимодействия g () (Определение2) может быть обеспечено нелинейностью функции активацииReLU(). В идеале комбинаторные признаки, которые включают x1, могут быть закодированы в обновленное представление первого поля признака eRes1. Поскольку то же самое может быть полученоидля других полей объектов, все взаимодействия объектов второго порядка могут быть закодированы в выходных данных первого взаимодействующего слоя, где веса внимания отбирают полезные комбинации объектов.

Затем мы докажем, что взаимодействия функций высшего порядка можно моделировать во втором взаимодействующем слое. Учитывая представление первого поля признаков eRes1 и представление третьего поля признаков eRes3, сгенерированного первым взаимодействующим слоем, комбинаторные признаки третьего порядка, которые включают x1, x2 и x3, можно смоделировать, разрешив eRes1 присутствовать на eRes3, потому что eRes1 содержит взаимодействие g (x1, x2), а eRes3 содержит индивидуальный признак x3 (из остаточной связи). Более того, максимальный порядок комбинаторных свойств растет экспоненциально по отношению к количеству взаимодействующих слоев. Например, взаимодействие характеристик четвертого порядка g (x1, x2, x3, x4) может быть захвачено комбинацией eRes1и eRes3, которые содержат взаимодействия второго порядка g (x1, x2) и g (x3 , x4) соответственно. Следовательно, нескольких взаимодействующих слоев будет достаточно для моделирования взаимодействий функций высокого порядка.

Основываясь на приведенном выше анализе, мы можем видеть, чтоAutoIntизучает взаимодействия функций с механизмом внимания иерархическим образом, то есть от низкого порядка к высокому, и все взаимодействия функций низкого порядка осуществляются остаточными связями. Это многообещающе и разумно, потому что обучение иерархическому представлению оказалось довольно эффективным в компьютерном зрении и обработке речи с помощью глубоких нейронных сетей [3, 18].

Используемое пространство

Слой внедрения, который является общим компонентом в методах на основе нейронных сетей [11, 19, 32], содержитndпараметров, где n - размер разреженного представления входного объекта, а d - размер внедрения. Поскольку взаимодействующий уровень содержит следующие весовые матрицы: {W (h)Query, W (h)Key, W (h)Value,WRes}, количество параметров в сети L-уровня равно L (3dd + d Hd),и ононе зависит от количества полей признаков M. Наконец, в выходном слое есть d HM + 1параметров. Что касается взаимодействующих слоев, сложность пространства равна O (LddH). Обратите внимание, что H и d обычно малы (например, H = 2 и d = 32 в наших экспериментах), что делает взаимодействующий слой эффективным с точки зрения памяти.

Используемое время

Внутри каждого взаимодействующего слоя вычислительные затраты удваиваются. Во-первых, вычисление веса внимания для одной головы(одного слоя)занимает O(Mdd' + M2d')времени. Впоследствии формирование комбинаторных признаков под одной головкой также занимает O(Mdd' + M2d') времени. Поскольку у нас есть H голов(слоев), это занимает O(MHd' (M + d)) времени в целом. Поэтому он эффективен, потому чтоH,dи d ' обычно малы. Мы приводим время работыAutoIntв разделе 5.2.

5.Эксперимент

В этом разделе мы переходим к оценке эффективности предлагаемого нами подхода. Мы стремимся ответить на следующие вопросы:

RQ1)Как предлагаемый намиAutoIntрешает проблему прогнозирования CTR?Эффективен ли он для крупномасштабных разреженных и многомерных данных?

RQ2)На что влияют разные конфигурации моделей?

RQ3)Каковы структуры зависимостей между различными функциями?Объяснима ли предложенная нами модель?

RQ4)Будет ли интеграция неявного взаимодействия функций улучшать производительность? Прежде чем отвечать на эти вопросы, мы сначала опишем экспериментальные настройки.

Таблица 1: Статистика наборов оценочных данных. Таблица 1: Статистика наборов оценочных данных.

5.1Настройка эксперимента

5.1.1Наборы данных. Мы используем четыре общедоступных набора реальных данных. Статистика наборов данных сведена в Таблицу 1.

Criteo.Это эталонный набор данных для прогнозирования CTR, в котором 45 миллионов пользователейкликают по отображаемой рекламе. Он содержит 26категорийныхполей признаков и 13 числовых полей признаков.

Avazu.Этот набор данных содержит данные о поведении пользователей на мобильных устройствах, в том числе о том, нажимает ли пользователь на отображаемое мобильное объявление. Он имеет 23 поля функций, от функций пользователя/устройства до атрибутов рекламы.

KDD12. Этот набор данных был выпущенKDDCup2012, изначально предназначавшимся для прогнозирования количества кликов. Поскольку наша работа сосредоточена на прогнозировании CTR, а не на точном количестве кликов, мы рассматриваем эту проблему как проблему двоичной классификации (1 для кликов> 0, 0 для кликов без кликов), которая аналогична FFM [16].

MovieLens-1M.Этот набор данных содержит оценки пользователей фильмов. Во время бинаризации(бинарного представления)мы обрабатываем образцы с рейтингом менее 3 как отрицательные, потому что низкий балл указывает на то, что пользователю не нравится фильм. Мы обрабатываем образцы с рейтингом выше 3 как положительные и удаляемобразцынейтральныес рейтингом, равным 3.

Подготовка данных. Во-первых, мы удаляем редко встречающиеся функции (появляющиеся в экземплярах ниже порогового значения) и рассматриваем их как одну функцию <неизвестно>, где порог установлен на {10, 5, 10} для наборов данныхCriteo,Avazuи KDD12 соответственно. Во-вторых, поскольку числовые характеристики могут иметь большую дисперсию и вредить алгоритмам машинного обучения, мы нормализуем числовые значения, преобразуя значение z вlog2(z) если z> 2,какпредложенопобедителем конкурсаCriteoCompetition. В-третьих, мы случайным образом выбираем 80% всех выборок для обучения и случайным образом разделяем остальные навалидационныеи тестовые наборы равного размера.

5.1.2Показатели Оценки. Мы используем две популярные метрики для оценки эффективности всех методов:

Область AUC под кривой ROC (AUC)измеряет вероятность того, что предсказатель CTR присвоит более высокий балл случайно выбранному положительному элементу, чем случайно выбранному отрицательному элементу. Более высокий AUC указывает на лучшую производительность.

Logloss.Поскольку все модели пытаются минимизироватьloglossпотери, определяемые уравнением 10, мы используем его в качестве простой метрики.

Замечено, что несколько более высокий AUC или более низкийLoglossна уровне 0,001 считается значимым для задачи прогнозирования CTR, на что также указывалось в работах [8, 11, 38].

5.1.3Конкурирующие Модели. Мы сравниваем предложенный подход с тремя классами предыдущих моделей:A) линейный подход, который использует только индивидуальные особенности;Б) методыфакторизации на основе машин, учитывающие комбинаторные особенности второго порядка;C) методы, которые могут захватывать взаимодействия объектов высокого порядка. Мы связываем классы моделей с именами моделей соответственно.

LR (А). LR моделирует только линейную комбинацию необработанных функций.

FM [26] (B). FM использует методы факторизации для моделирования взаимодействия функций второго порядка.

АFМ [40] (B). AFM - одна из самых современных моделей, которые фиксируют взаимодействия функций второго порядка. Он расширяет FM, используя механизм внимания, чтобы различать важностикомбинаторных свойств второго порядка.

DeepCrossing[32] (C).DeepCrossingиспользует глубокиеполносвязныенейронные сети с остаточными связями для изучения нелинейных взаимодействий признаков неявным способом.

NFM [13] (C). NFM укладывает глубокие нейронные сети поверх слоя взаимодействия объектов второго порядка. Взаимодействия признаков высокого порядка неявно фиксируются нелинейностью нейронных сетей.

CrossNet[38] (С). Кросс-сеть, являющаяся ядром моделиDeep&Cross, использует внешнее произведение сцепленного вектора признаков на битовом уровне для явного моделирования взаимодействий признаков.

CIN [19] (C). Сжатая сеть взаимодействия, являющаяся ядром моделиxDeepFM, принимает внешнее произведение сложенной матрицы признаков на векторном уровне.

HOFM[5] (С). HOFM предлагает эффективные алгоритмы на основе ядра для обучения машин факторизации высокого порядка. Следуянастройкам вBlondeletal. [5] иЧуа[13], мы строим машину факторизации третьего порядка, используя публичную реализацию.

Позже мы сравним с полными моделямиCrossNetи CIN, то естьDeep&CrossиxDeepFM, при настройке совместного обучения сplainDNN (т. е. раздел 5.5).

5.1.4Деталиреализации. Все методы реализованы вTensorFlow[1]. ДляAutoIntи всех базовых методов мы эмпирически установили размерность вложения d равным 16, а размер пакета - 1024.AutoIntимеет три взаимодействующих слоя, а количество скрытых блоков d по умолчанию равно 32. Внутри каждого взаимодействующего слоя число внимания головы(по слою)- два. Чтобы предотвратить переоснащение, мы используем поиск по сетке для выбора коэффициента отсева [34] из {0.1 - 0.9} для набора данных MovieLens-1M, и мы обнаружили, что отсев неявляется необходимым для других трех больших наборов данных. Для базовых методов мы используем один скрытый слой размером 200 поверх слоя Би-взаимодействия для NFM, как это рекомендовано в их статье. Для CN и CIN мы используем три уровня взаимодействия после AutoInt.DeepCrossingимеет четыре слоя обратной связи и количество из скрытых единиц получается 100, потому что она плохо работает при использовании трех нейронных слоев. Как только все сетевые структуры будут исправлены, мы также применим сеточныйпоиск к базовым методам для получения оптимальных параметров шума. Наконец, мы используемAdam[17] для оптимизации всех моделей, основанных на глубоких нейронных сетях.

Таблица 2: сравнение эффективности различных алгоритмов. Мы подчеркиваем, что предложенная нами модель почти превосходит все базовые показатели по четырем наборам данных и обеим метрикам. Дальнейший анализ представлен в разделе 5.2. Таблица 2: сравнение эффективности различных алгоритмов. Мы подчеркиваем, что предложенная нами модель почти превосходит все базовые показатели по четырем наборам данных и обеим метрикам. Дальнейший анализ представлен в разделе 5.2.

5.2Количественные результаты (RQ1)

Оценка эффективности.Мы суммируем результаты, усредненные по 10 различным прогонам, в Таблицу 2. У нас есть следующие наблюдения: 1) FM и AFM, которые исследуют взаимодействия функций второго порядка, последовательно превосходят LR с большим отрывом по всем наборам данных, что указывает на то, что отдельные функции недостаточны для прогнозирования CTR;2)интересное наблюдение - неполноценность некоторых моделей, которые фиксируют взаимодействия функций высокого порядка;например, хотяDeepCrossingи NFM используют глубокую нейронную сеть в качестве основного компонента для изучения взаимодействий функций высокого порядка, они не гарантируют улучшения по сравнению с FM и AFMи это может быть связано с тем, что они изучают взаимодействие функций неявным образом(напротив, CIN делает это явно и последовательно превосходит модели более низкого порядка);3) HOFM значительно превосходит FM по наборам данныхCriteoи MovieLens-1M, что указывает на то, что моделирование взаимодействий функций третьего порядка может быть полезным для производительности прогнозирования;4)AutoIntобеспечивает наилучшую производительность общих базовых методов на трех из четырех реальных наборов данных.

В наборе данныхAvazuCIN работает немного лучше, чемAutoIntв оценке AUC, но мы получаем более низкийLogloss. Обратите внимание, что предлагаемый намиAutoIntимеет те же структуры, что иDeepCrossing, за исключением слоя взаимодействия функций, который указывает на то, что использование механизма внимания для изучения явных комбинаторных функций имеет решающее значение.

Рисунок 4. Сравнение эффективности различных алгоритмов с точки зрения времени выполнения. "DC и CN - это DeepCrossing и CrossNet для краткости, соответственно. Поскольку HOFM не может быть помещен на одну графическую карту для набора данных KDD12, дополнительные затраты на связь делают его наиболее трудоемким. Дальнейший анализ представлен в разделе 5.2.Рисунок 4. Сравнение эффективности различных алгоритмов с точки зрения времени выполнения. "DC и CN - это DeepCrossing и CrossNet для краткости, соответственно. Поскольку HOFM не может быть помещен на одну графическую карту для набора данных KDD12, дополнительные затраты на связь делают его наиболее трудоемким. Дальнейший анализ представлен в разделе 5.2.

Оценка эффективности моделиМы представляем результаты выполнения различных алгоритмов для четырех наборов данных на рисунке 4. Неудивительно, что LR является наиболее эффективным алгоритмом из-за его простоты. FM и NFM работают одинаково с точки зрения времени выполнения, потому что NFM только накладывает один скрытый уровень прямых связейповерх уровня взаимодействия второго порядка. Среди всех перечисленных методов CIN, который обеспечивает лучшую производительность для прогнозирования среди всех базовых линий, требует гораздо больше времени из-за своего сложного пересекающегося слоя. Это может сделать его непрактичным в промышленных сценариях. Обратите внимание, что AutoInt достаточно эффективен, что сопоставимо с эффективными алгоритмамиDeepCrossingи NFM.

Мы также сравниваем размеры разных моделей (то есть количество параметров) как еще один критерий оценки эффективности. Как показано в таблице 3, по сравнению с лучшей моделью CIN в базовых моделях количество параметров вAutoIntнамного меньше.

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

Таблица 3: сравнение эффективности различных алгоритмов с точки зрения размера модели на наборе данных Criteo. DC и CN - это DeepCrossing и CrossNet для краткости, соответственно. Подсчитанные параметры исключают слой встраивания. Таблица 3: сравнение эффективности различных алгоритмов с точки зрения размера модели на наборе данных Criteo. DC и CN - это DeepCrossing и CrossNet для краткости, соответственно. Подсчитанные параметры исключают слой встраивания.

5.3Анализ (RQ2)Для дальнейшей валидации и получения глубокого понимания предложенной модели,мы проводим абляционное исследование и сравниваем несколько вариантовAutoInt.

5.3.1Влияние остаточной структуры. СтандартныйAutoIntиспользует остаточные связи, которые переносят все изученные комбинаторные функции и, следовательно, позволяют моделировать комбинации очень высокого порядка. Чтобы оправдать вклад остаточных единиц, мы отделяем их от нашей стандартной модели и оставляем другие структуры такими, какие они есть. Как показано в Таблице 4, мы видим, что производительность снижается для всех наборов данных при удалении остаточных соединений. В частности, полная модель превосходит вариантс большим отрывом по данным KDD12 и MovieLens-1M, что указывает на то, что остаточные связи имеют решающее значение для моделирования взаимодействий функций высокого порядка в предлагаемом нами методе.

Таблица 4: Исследование абляции, сравнение эффективности AutoInt с остаточными соединениями и без них. AutoInt w это полная модель, в то время как AutoInt w/o модель без остаточного соединения. Таблица 4: Исследование абляции, сравнение эффективности AutoInt с остаточными соединениями и без них. AutoInt w это полная модель, в то время как AutoInt w/o модель без остаточного соединения.

5.3.2Влияние глубины сети.Наша модель изучает комбинации объектов высокого порядка путем укладки нескольких взаимодействующих слоев (введено в разделе 4). Поэтому нас интересует, как изменяется производительностьотносительноколичествавзаимодействующих слоев, то есть порядок комбинаторных признаков. Заметим, что когда нет взаимодействующего слоя (то есть количество слоев равно нулю), наша модель принимает в качестве входных данных взвешенную сумму необработанных индивидуальных признаков, то есть комбинаторные признаки не рассматриваются.

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

Рисунок 5: Производительность относительно количества взаимодействующих слоев. Результаты на Criteo, и Avazu наборов данных, аналогичны и, следовательно, опущено. Рисунок 5: Производительность относительно количества взаимодействующих слоев. Результаты на Criteo, и Avazu наборов данных, аналогичны и, следовательно, опущено. Рисунок 6: производительность относительно количества размеров вложения. Результаты на Criteo, и Avazu наборов данных, аналогичны и, следовательно, опущено. Рисунок 6: производительность относительно количества размеров вложения. Результаты на Criteo, и Avazu наборов данных, аналогичны и, следовательно, опущено.

5.3.3влияние различных измерений. Далее мы исследуем производительностьотносительнопараметраd, который является выходным размером слоя вложения. На наборе данных KDD12 мы видим, что производительность постоянно увеличивается по мере увеличения размера измерения, поскольку для прогнозирования используются более крупные модели. Результаты отличаются в наборе данных MovieLens-1M. Когда размер измерения достигает 24, производительность начинает снижаться. Причина в том, что этот набор данных невелик, и модель переоснащается, когда используется слишком много параметров.

5.4Объяснимые рекомендации (RQ3)

Хорошая рекомендательная система может не только дать хорошие рекомендации, но и предложить хорошую объяснимость. Поэтому в этой части мы представляем, как нашAutoIntможет объяснить результаты рекомендаций. В качестве примера возьмем набор данных MovieLens-1M.

Рассмотрим результат рекомендации, предложенный нашим алгоритмом, то есть пользователь любит товар. На рис. 7 (а) представлены корреляции между различными полями входных признаков, полученные с помощью оценки внимания.Мы видим, чтоAutoIntспособен идентифицировать значимый комбинаторный признак <Gender=Male,Age=[18-24),MovieGenre=Action&Triller> (т. е. красный пунктирный прямоугольник).Это очень разумно, так как молодые люди, скорее всего, предпочтут боевики и триллеры.

Таблица 5: Результаты интеграции неявных взаимодействий функций. Мы указываем базовую модель каждого метода. Последние два столбца представляют собой средние изменения AUC и Logloss по сравнению с соответствующими базовыми моделями (+: увеличение, -: уменьшение). Таблица 5: Результаты интеграции неявных взаимодействий функций. Мы указываем базовую модель каждого метода. Последние два столбца представляют собой средние изменения AUC и Logloss по сравнению с соответствующими базовыми моделями (+: увеличение, -: уменьшение).

Нас также интересует, каковы корреляции между различными полями признаков в данных. Поэтому мы измеряем корреляции между полями признаков в соответствии с их средним показателем внимания во всех данных. Корреляции между различными полями суммированы на рис. 7 (б). Мы видим, что <Gender,Genre>, <Age,Genre>, <RequestTime,ReleaseTime> и <Gender,Age,Genre> (т. е. сплошная зеленая область) сильно коррелируют, что является объяснимыми правилами рекомендации в этой области.

Рисунок 7: Тепловые (фазовые) карты весов внимания для взаимодействия функций на уровне случая и глобального уровня на MovieLens-1M. Оси представляют поля функций <Пол, Возраст, Занятие, Почтовый индекс, RequestTime, RealeaseTime, Genre>. Мы выделяем некоторые изученные комбинаторные функции в прямоугольниках. Рисунок 7: Тепловые (фазовые) карты весов внимания для взаимодействия функций на уровне случая и глобального уровня на MovieLens-1M. Оси представляют поля функций <Пол, Возраст, Занятие, Почтовый индекс, RequestTime, RealeaseTime, Genre>. Мы выделяем некоторые изученные комбинаторные функции в прямоугольниках.

5.5 Интеграция неявных взаимодействий (RQ4)

Нейронные сети с обратным влияниемспособнымоделировать неявные взаимодействия признаков и широко интегрированыв существующие методы прогнозирования CTR [8, 11, 19]. Чтобы исследовать, улучшает ли интеграция неявных взаимодействий признаков дальнейшую производительность, мы объединяемAutoIntс двухслойной нейронной сетью обратной влияния путем совместного обучения. Мы называем совместную модельAutoInt+ и сравниваем ее со следующими алгоритмами:

  • Wide&Deep[8].Wide&Deepинтегрирует результаты логистической регрессии и нейронных сетей обратного влияния;

  • DeepFM[11].DeepFMсочетает в себе обучающие машиныфакторизации второго порядка и нейронную сеть обратнойсвязи с общим слоем встраивания;

  • Deep&Cross[38].Deep&Cross-эторасширениеCrossNetза счет интеграции нейронных сетей с обратной связью;

  • xDeepFM[19].xDeepFM- это расширение CIN путем интеграции нейронных сетей с прямой связью.

В таблице 5 представлены усредненные результаты (более 10 прогонов) моделей совместного обучения.У нас есть следующие наблюдения: 1) производительность нашего метода улучшается при совместном обучении с нейронными сетями обратного влиянияна всех наборах данных, чтоуказывает на то, что интеграция неявных взаимодействий признаков действительно повышает прогностическую способность предлагаемой нами модели, но, как видно из последних двух столбцов, величина улучшения производительности довольно мала по сравнению с другими моделями, что показывает, что наша индивидуальнаямодельAutoIntдовольно мощна;2) после интегрирования неявного характеристика взаимодействия,AutoInt+ превосходит все конкурентные способы, и достигаетновыхсовременныххарактеристик используемых наборов данных прогнозирования CTR.

6.Заключение и будущая работа

В этой работе мы предлагаем новую модель прогнозирования CTR, основанную на механизме само-внимания, который может автоматически изучать взаимодействия признаков высокого порядка в явном виде. Ключом к нашему методу являетсявновьвводимыйвзаимодействующий слой, который позволяет каждой функции взаимодействовать с другими и определять релевантность посредством обучения. Экспериментальные результаты на четырех наборах реальных данных демонстрируют эффективность и действенность предложенной нами модели. Кроме того, мы обеспечиваем хорошую объяснимость модели с помощью визуализации изученных комбинаторных функций. Интегрируясь с неявными взаимодействиями признаков,охватываемыминейронными сетями обратного влияния, мы достигаем лучших автономных оценок AUC иLoglossпо сравнению с предшествующимисовременными методами.

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

Ссылки

[1] Martn Abadi, Paul Barham, Jianmin Chen, Zhifeng Chen, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghemawat, Geoffrey Irving, et al. 2016. TensorFlow: A System for Large-Scale Machine Learning.. In OSDI, Vol. 16. 265283.

[2] Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. 2015. Neural machine translation by jointly learning to align and translate. In International Conference on Learning Representations.

[3] Yoshua Bengio, Aaron Courville, and Pascal Vincent. 2013. Representation learning: A review and new perspectives. IEEE transactions on pattern analysis and machine intelligence 35, 8 (2013), 17981828.

[4] Alex Beutel, Paul Covington, Sagar Jain, Can Xu, Jia Li, Vince Gatto, and Ed H Chi. 2018. Latent Cross: Making Use of Context in Recurrent Recommender Systems. In Proceedings of the Eleventh ACM International Conference on Web Search and Data Mining. ACM, 4654.

[5] Mathieu Blondel, Akinori Fujino, Naonori Ueda, and Masakazu Ishihata. 2016. Higher-order factorization machines. In Advances in Neural Information Processing Systems. 33513359.

[6] Mathieu Blondel, Masakazu Ishihata, Akinori Fujino, and Naonori Ueda. 2016. Polynomial Networks and Factorization Machines: New Insights and Efficient Training Algorithms. In International Conference on Machine Learning. 850858.

[7] Chen Cheng, Fen Xia, Tong Zhang, Irwin King, and Michael R Lyu. 2014. Gradient boosting factorization machines. In Proceedings of the 8th ACM Conference on Recommender systems. ACM, 265272.

[8] Heng-Tze Cheng, Levent Koc, Jeremiah Harmsen, Tal Shaked, Tushar Chandra, Hrishi Aradhye, Glen Anderson, Greg Corrado, Wei Chai, Mustafa Ispir, et al.Wide & deep learning for recommender systems. In Proceedings of the 1st Workshop on Deep Learning for Recommender Systems. ACM, 710.

[9] Paul Covington, Jay Adams, and Emre Sargin. 2016. Deep neural networks for youtube recommendations. In Proceedings of the 10th ACM Conference on Recommender Systems. ACM, 191198.

[10] Thore Graepel, Joaquin Quionero Candela, Thomas Borchert, and Ralf Herbrich. 2010. Web-scale Bayesian Click-through Rate Prediction for Sponsored Search Advertising in Microsofts Bing Search Engine. In Proceedings of the 27th International Conference on International Conference on Machine Learning. 1320.

[11] Huifeng Guo, Ruiming Tang, Yunming Ye, Zhenguo Li, and Xiuqiang He. 2017. DeepFM: A Factorization-machine Based Neural Network for CTR Prediction. In Proceedings of the 26th International Joint Conference on Artificial Intelligence. AAAI Press, 17251731.

[12] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. 2016. Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition. 770778.

[13] Xiangnan He and Tat-Seng Chua. 2017. Neural factorization machines for sparse predictive analytics. In Proceedings of the 40th International ACM SIGIR conference on Research and Development in Information Retrieval. ACM, 355364.

[14] Xiangnan He, Zhankui He, Jingkuan Song, Zhenguang Liu, Yu-Gang Jiang, and Tat-Seng Chua. 2018. NAIS: Neural attentive item similarity model for recommendation. IEEE Transactions on Knowledge and Data Engineering 30, 12 (2018), 23542366.

[15] Xinran He, Junfeng Pan, Ou Jin, Tianbing Xu, Bo Liu, Tao Xu, Yanxin Shi, Antoine Atallah, Ralf Herbrich, Stuart Bowers, et al. 2014. Practical lessons from predicting clicks on ads at facebook. In Proceedings of the Eighth International Workshop on Data Mining for Online Advertising. ACM, 19.

[16] Yuchin Juan, Yong Zhuang, Wei-Sheng Chin, and Chih-Jen Lin. 2016. Fieldaware factorization machines for CTR prediction. In Proceedings of the 10th ACM Conference on Recommender Systems. ACM, 4350.

[17] Diederick P Kingma and Jimmy Ba. 2015. Adam: A method for stochastic optimization. In International Conference on Learning Representations.

[18] Honglak Lee, Roger Grosse, Rajesh Ranganath, and Andrew Y Ng. 2011. Unsupervised learning of hierarchical representations with convolutional deep belief networks. Commun. ACM 54, 10 (2011), 95103.

[19] Jianxun Lian, Xiaohuan Zhou, Fuzheng Zhang, Zhongxia Chen, Xing Xie, and Guangzhong Sun. 2018. xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems. In Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 1754 1763.

[20] Zhouhan Lin, Minwei Feng, Cicero Nogueira dos Santos, Mo Yu, Bing Xiang, Bowen Zhou, and Yoshua Bengio. 2017. A structured self-attentive sentence embedding. In International Conference on Learning Representations.

[21] H. Brendan McMahan, Gary Holt, D. Sculley, Michael Young, Dietmar Ebner, Julian Grady, Lan Nie, Todd Phillips, et al. 2013. Ad Click Prediction: A View from the Trenches. In Proceedings of the 19th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 12221230.

[22] Alexander Miller, Adam Fisch, Jesse Dodge, Amir-Hossein Karimi, Antoine Bordes, and Jason Weston. 2016. Key-Value Memory Networks for Directly Reading Documents. In Proceedings of the 2016 Conference on Empirical Methods in Natural Language Processing. Association for Computational Linguistics, 14001409.

[23] Alexander Novikov, Mikhail Trofimov, and Ivan Oseledets. 2016. Exponential machines. arXiv preprint arXiv:1605.03795 (2016).

[24] Richard J Oentaryo, Ee-Peng Lim, Jia-Wei Low, David Lo, and Michael Finegold. Predicting response in mobile advertising with hierarchical importanceaware factorization machine. In Proceedings of the 7th ACM international conference on Web search and data mining. ACM, 123132.

[25] Yanru Qu, Han Cai, Kan Ren, Weinan Zhang, Yong Yu, Ying Wen, and Jun Wang.Product-based neural networks for user response prediction. In Data Mining (ICDM), 2016 IEEE 16th International Conference on. IEEE, 11491154.

[26] Steffen Rendle. 2010. Factorization machines. In Data Mining (ICDM), 2010 IEEE 10th International Conference on. IEEE, 9951000.

[27] Steffen Rendle, Christoph Freudenthaler, and Lars Schmidt-Thieme. 2010. Factorizing personalized markov chains for next-basket recommendation. In Proceedings of the 19th international conference on World wide web. ACM, 811820.

[28] Steffen Rendle, Zeno Gantner, Christoph Freudenthaler, and Lars Schmidt-Thieme. Fast context-aware recommendations with factorization machines. In Proceedings of the 34th international ACM SIGIR conference on Research and development in Information Retrieval. ACM, 635644.

[29] Matthew Richardson, Ewa Dominowska, and Robert Ragno. 2007. Predicting clicks: estimating the click-through rate for new ads. In Proceedings of the 16th international conference on World Wide Web. ACM, 521530.

[30] Alexander M. Rush, Sumit Chopra, and Jason Weston. 2015. A Neural Attention Model for Abstractive Sentence Summarization. In Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing. Association for Computational Linguistics, 379389.

[31] Lili Shan, Lei Lin, Chengjie Sun, and Xiaolong Wang. 2016. Predicting ad clickthrough rates via feature-based fully coupled interaction tensor factorization. Electronic Commerce Research and Applications 16 (2016), 3042.

[32] Ying Shan, T Ryan Hoens, Jian Jiao, Haijing Wang, Dong Yu, and JC Mao. 2016. Deep crossing: Web-scale modeling without manually crafted combinatorial features. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 255262.

[33] Weiping Song, Zhiping Xiao, Yifan Wang, Laurent Charlin, Ming Zhang, and Jian Tang. 2019. Session-based Social Recommendation via Dynamic Graph Attention Networks. In Proceedings of the Twelfth ACM International Conference on Web Search and Data Mining. ACM, 555563.

[34] Nitish Srivastava, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever, and Ruslan Salakhutdinov. 2014. Dropout: A simple way to prevent neural networks from overfitting. The Journal of Machine Learning Research 15, 1 (2014), 19291958.

[35] Sainbayar Sukhbaatar, Jason Weston, Rob Fergus, et al. 2015. End-to-end memory networks. In Advances in neural information processing systems. 24402448.

[36] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, ukasz Kaiser, and Illia Polosukhin. 2017. Attention is all you need. In Advances in Neural Information Processing Systems. 60006010.

[37] Petar Velickovic, Guillem Cucurull, Arantxa Casanova, Adriana Romero, Pietro Lio, and Yoshua Bengio. 2018. Graph Attention Networks. In International Conference on Learning Representations.

[38] Ruoxi Wang, Bin Fu, Gang Fu, and Mingliang Wang. 2017. Deep & Cross Network for Ad Click Predictions. In Proceedings of the ADKDD17. ACM, 12:112:7.

[39] Xiang Wang, Xiangnan He, Fuli Feng, Liqiang Nie, and Tat-Seng Chua. 2018. TEM: Tree-enhanced Embedding Model for Explainable Recommendation. In Proceedings of the 2018 World Wide Web Conference on World Wide Web. International World Wide Web Conferences Steering Committee, 15431552.

[40] Jun Xiao, Hao Ye, Xiangnan He, Hanwang Zhang, Fei Wu, and Tat-Seng Chua. Attentional factorization machines: learning the weight of feature interactions via attention networks. In Proceedings of the 26th International Joint Conference on Artificial Intelligence. AAAI Press, 31193125.

[41] Weinan Zhang, Tianming Du, and Jun Wang. 2016. Deep learning over multi-field categorical data. In European conference on information retrieval. Springer, 4557.

[42] Qian Zhao, Yue Shi, and Liangjie Hong. 2017. GB-CENT: Gradient Boosted Categorical Embedding and Numerical Trees. In Proceedings of the 26th International Conference on World Wide Web. International World Wide Web Conferences Steering Committee, 13111319.

[43] Guorui Zhou, Xiaoqiang Zhu, Chenru Song, Ying Fan, Han Zhu, Xiao Ma, Yanghui Yan, Junqi Jin, Han Li, and Kun Gai. 2018. Deep Interest Network for ClickThrough Rate Prediction. In Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 10591068.

[44] Jie Zhu, Ying Shan, JC Mao, Dong Yu, Holakou Rahmanian, and Yi Zhang. 2017. Deep embedding forest: Forest-based serving with deep embedding features. In Proceedings of the 23rd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 17031711.

Подробнее..

Как я перестал бояться и научился любить нейронные сети

05.11.2020 10:06:30 | Автор: admin

В рекомендательных системах нет доминирующего класса моделей. Матричные разложения, графовые и контентные рекомендеры активно развиваются: про них пишут научные статьи, их используют в продакшене. Пять лет назад на волне интереса к нейронным сетям стали популярны нейросетевые рекомендеры, но довольно быстро наступило разочарование. На RecSys 2019 лучшей выбрали статью с критикой нейросетевого подхода (в этом году его тоже пинают). Стоит ли практикам забыть о нейронных сетях в рекомендациях? Я уверен, что нет. Мой рекомендер уже год работает в продакшене и помогает пользователям Одноклассников заказывать интересные товары. Я расскажу, почему построил рекомендер на основе нейронной сети. После прочтения статьи у вас не останется причин не сделать также в вашем сервисе.

В научных статьях по рекомендательным системам главная мера успеха точность модели рекомендера. Модель, которая улучшает SOTA на стандартных данных, имеет больше шансов на публикацию, чем просто научная идея. Применимость на практике желательна, но не обязательна. Поэтому в качестве SOTA выступают монстры вроде Deep Variational Autoencoder with Gated Linear Units and VampPriors [kim] (Шишков, прости: не знаю, как перевести). Авторы вышеупомянутой статьи с RecSys 2019 выяснили, что большинство подобных работ невозможно повторить [dacrema]. А значит, их результатам нельзя доверять. Это бросило тень на репутацию целого класса рекомендеров нейросетевые модели.

Рекомендер, работающий в продакшене, сложная инженерная система. Инженер не станет добавлять еще больше сложности ради едва заметного улучшения метрик. Поэтому в индустриальных рекомендерах простота выходит на первый план вместе с точностью. Пять лет назад я был уверен, что нейронные сети слишком сложные, чтобы работать в продакшене. В 2019 я разработал нейросетевой рекомендер товаров в Одноклассниках и продолжаю поддерживать и улучшать его. У меня нет сомнений в практичности этого подхода и со мной согласны инженеры Google [chen,covington] и Airbnb [haldar].

Я приведу аргументы в пользу нейросетевых рекомендеров. Сначала обсудим, как нейронные сети помогают улучшить архитектуру сервисов. Потом поговорим о том, как удобно добавлять новые данные в нейросетевую модель. После этого разберемся, как архитектура нейронных сетей дает исследователю возможность экспериментировать с различными предположениями. Наконец, заглянем в будущее рекомендательных систем. Я расскажу про идеи, которые применимы в любой задаче рекомендаций. А иллюстрировать их буду такими вставками про рекомендер товаров в Одноклассниках.

Сервис Товары это интернет-магазин внутри Одноклассников. Пользователи ежедневно делают 8000 заказов из каталога AliExpress, не выходя из социальной сети. Чтобы пользователям было проще ориентироваться в стомиллионом каталоге, сервис показывает им персонализированные рекомендации. Алгоритм анализирует активность пользователя в Товарах и Одноклассниках в целом и строит витрину рекомендаций наподобие этой:

Сервис постоянно улучшается. За последний год я провел 33 A/B эксперимента по улучшению рекомендера. 23 эксперимента были успешными, 8 неуспешными и 2 техническими.

Нейросетевой рекомендер помогает упростить архитектуру сервиса

Рассмотрим задачу коллаборативной фильтрации: на основании данных о прошлых покупках предложить пользователям товары, которые они захотят купить в будущем. Допустим, мы решили применить стандартный рекомендательный подход: собираем датасет с покупками пользователей, тренируем на этих данных модель и доставляем ее в прод. Периодически повторяем эти шаги, чтобы поддерживать актуальность модели.

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

В Товарах ОК проблема холодного старта реальна. Только 6% аудитории Одноклассников регулярно пользуются сервисом Товаров оставшиеся 94% могут о нем вообще ничего не знать. Им коллаборативная модель не может ничего предложить. Но именно их важно привлечь для этого мы показываем им персонализированные рекомендации товаров в ленте. За это отвечает модель холодного старта. Она строит рекомендации на основе пола и возраста пользователей и списка групп, на которые они подписаны. В A/B эксперименте персонализация холодного старта добавила +8% к нажатиям кнопки купить и +3% к пользователям сервиса.

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

Архитектура рекомендера с отдельными моделями холодного и теплого стартаАрхитектура рекомендера с отдельными моделями холодного и теплого старта

Из картинки выше видно, как сложно будет поддерживать два связанных пайплайна:

  1. Готовить две зависимые обучающие выборки.

  2. Обучать модель теплого старта после модели холодного старта.

  3. Одновременно заводить модели в продакшен.

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

Нейронная сеть это функция, дифференцируемая по обучаемым параметрам. В примере с рекомендациями выбор между моделью холодного и теплого старта выражается дифференцируемой операцией. И если сами модели тоже дифференцируются, то все компоненты можно упаковать в одну нейронную сеть. С помощью современных deep learning фреймворков эту нейронную сеть можно обучить end-to-end и завести в продакшен.

Архитектура сервиса с моделью, в которую упакованы компоненты холодного и теплого стартаАрхитектура сервиса с моделью, в которую упакованы компоненты холодного и теплого старта

Проблемы с воспроизводимостью один из основных аргументов против нейросетевых рекомендеров. Мои коллеги разработали ML платформу, которая обеспечивает воспроизводимость экспериментов. Она построена на фреймворках Airflow, DVC и MLflow. С помощью ML платформы мы обучаем нейросетевые (и не только) модели, следим за их метриками и выкатываем их в продакшен. До переезда на платформу, чтобы обновить модель товаров, я вручную запускал сложный пайплайн из Spark-джоб и скриптов. Сейчас я делаю это в несколько кликов. Подробности об ML платформе в докладе @mikhail_mar.

У упаковки нескольких моделей в одну нейронную сеть есть ограничения:

  1. Сложно совместить модели, которые получают на вход разные типы объектов. Например, персонализированный рекомендер, у которого на входе пользователь, не упакуешь вместе с item-to-item рекомендером, у которого на входе товар.

  2. Логику модели придется писать руками: скорее всего, понадобится нейронная сеть, состоящая из нескольких компонентов с отдельными выходами и собственной функцией потерь. Использовать готовое решение не получится.

  3. Усложняется подготовка обучающих данных по сравнению с одиночным рекомендером. Теперь в один датасет нужно будет складывать данные для обучения всех компонентов модели.

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

В нейросетевой рекомендер легко добавлять новые признаки

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

Нейросетевые рекомендеры не оправдали ожиданий академии: оказалось, что они не гарантируют выигрыша в точности по сравнению "классикой. Но это верно, если сравнивать на одних и тех же простых user-item данных. Как только данные становятся разнообразнее, нейронные сети обходят классических конкурентов. Вот какие гипотезы я проверял при работе над рекомендером товаров: стоит ли учитывать в модели покупки друзей пользователя?, будет ли модель точнее, если дать ей информацию о городе, в котором живет пользователь?, имеет ли значение последовательность, в которой пользователь просматривал товары?. Попробуйте проверить эти идеи, если ваша модель SLIM [ning]. В лучшем случае вы обрастете пайплайнами Spark-джоб и кучей эвристик. В худшем уволитесь и откроете кофейню.

Из тридцати трех A/B экспериментов, которые я провел с рекомендером товаров, семь измеряли эффект от добавления новых признаков. Пять из них показали значимый прирост в ключевых метриках. Подготовка эксперимента с добавлением новых признаков всегда занимала меньше недели. В том числе из-за того, что добавлять новые признаки в нейросетевой рекомендер очень просто. Самым успешным экспериментом с признаками был эксперимент по добавлению в рекомендер товаров друзей. Он увеличил выручку сервиса на +7%.

Категориальные признаки кодируются эмбедингами. Пример такого признака ID товара. В каталоге восемь миллионов товаров, но по большинству из них нет коллаборативных данных. Поэтому собственный эмбединг получают только самые частотные. Остальные можно закодировать значением out-of-vocabulary.

Числовые признаки кодируем их значением. Числовые признаки могут быть одномерными (поставил ли пользователь класс товару), либо многомерными (посчитанный заранее эмбединг фотографии товара).

Модели нужны представления товаров и пользователей, собранные из признаков. Например, представление товара, с которым взаимодействовал конкретный пользователь, может состоять из:

  • идентификатора товара (категориальный признак),

  • идентификатора категории товара (категориальный признак),

  • места товара в последовательности товаров, с которыми взаимодействовал пользователь (категориальный признак)

  • наличия класса (числовой признак)

  • факта покупки товара пользователем (числовой признак).

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

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

Итак, из последовательности векторов-представлений нужно получить один вектор. Проще всего усреднить векторы из последовательности. А можно добавить немного интерпретируемости [pruthi] и использовать усреднение с весами. Веса будем вычислять механизмом query-key-value attention [uzay].

В рекомендере товаров я использовал признаки пользователя в качестве query и представления товаров в качестве key и value. Модель выучила понятные человеку закономерности:

- Купленный товар имеет больший вес, чем товар, который пользователь просто посмотрел.

- Чем дальше в прошлом пользователь взаимодействовал с товаром, тем меньше модель обращает на него внимания.

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

Кроме товаров пользователя в модели используются и другие последовательности:последовательность групп, на которые пользователь подписан и последовательность товаров друзей. Эти последовательности важны для компонента холодного старта.

В этом разделе мы научились укладывать в модель-коробку любые виды данных. Выбрав простой механический подход к добавлению признаков, мы в какой-то степени отказались от feature engineering, который называют искусством [duboue]. Но за это получили скорость экспериментирования. В следующем разделе добавим креатива.

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

Теперь, когда у рекомендера есть данные, нужно дать ему возможность их использовать. Мы представили признаки просто, поэтому модель должна быть достаточно экспрессивной, чтобы выучить сложные зависимости. Можно придумать собственную архитектуру, но проще оттолкнуться от проверенной. Например, от первых двух уровней SVD++ [koren] (третий уровень не используем, потому что он требует O(Nitems2) параметров).

r_{ui} = \mu + b_u + b_i + q_i^T \left( p_u + |N(u)|^{-\frac 1 2} \sum_{j \in N(u)} y_j \right)

SVD++ моделирует скор rui насколько товар i подходит пользователю u как линейную комбинацию обучаемых параметров:

  1. Пользователь u представлен эмбедингом puи смещением bu. Смещение показывает, насколько пользователю характерны высокие скоры в общем. Кроме того, используются эмбединги yj множества товаров N(u), с которыми взаимодействовал пользователь. Они полезны для пользователей, у которых недостаточно данных, чтобы получить точный эмбединг pu.

  2. Товар представлен аналогично пользователю эмбедингом qi и смещением bi.

  3. Общее смещение отражает базовый уровень скоров в системе безотносительно пользователя и товара.

Такие архитектуры хорошо себя показывают в рекомендациях: кроме семейства SVD на похожих идеях основана библиотека LightFM [kula]. Выразим SVD++ с помощью нейронной сети.

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

Изменения архитектуры отражают представления исследователя о связи между входными данными и целью предсказания. Эти представления, реализованные в модели, называют inductive bias (пример сверхуспешного inductive bias свертки в computer vision [ulyanov]). Воспользуемся инструментами которые мы обсудили в предыдущих разделах, чтобы добавить полезный inductive bias к SVD++.

Изменение

Inductive bias

Реализация

Добавление признаков товаров и пользователей

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

SVD++ представляет товары эмбедингами ID. В разделе о представлении признаков мы обсудили, как расширить это представление категориальными и числовыми признаками.

Добавление нелинейных преобразований

Избавимся от предположения о линейной зависимости между данными и целью предсказания.

Нелинейные преобразования реализованы с помощью feed-forward сетей с полносвязными и residual блоками. С их помощью можно не только добавить нелинейность, но и подогнать размерности данных, где это необходимо.

Добавление компонента холодного старта

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

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

Минутная анимация показывает, как можно применить эти идеи для улучшения SVD++:

Это GIF длиной 1 минуту Это GIF длиной 1 минуту

Финальная архитектура, которую я показал на анимации, отражает состояние рекомендера Товаров на февраль 2020. Я постоянно экспериментирую с моделью и с тех пор архитектура ушла вперед. Четыре A/B эксперимента дали статистически значимые улучшения метрик.

1. Нелинейное преобразование предобученных эмбедингов товаров: +7% к выручке.

2. Замена полносвязных слоев residual-блоками: +4.3% к покупающим пользователям.

3. Добавление переранжирующего компонента после отбора товаров-кандидатов: +4% к пользователям, нажимающим кнопку купить.

4. Добавление модели новых выходов, предсказывающих клики на карточки товаров: +2.4% к кликам.

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

Расширяемость преимущество нейросетевой архитектуры над классическими рекомендерами. Можно начать с простой модели и показать ее эффективность. А потом планомерно экспериментировать с улучшениями и проверять, что именно окажется эффективным в конкретной задаче. Вдохновение легко черпать в научных статьях. Предполагаем, что некоторые признаки работают по-разному для разных категорий пользователя? Используем deep & cross network [wang]. Хотим использовать информацию о товарах друзей? Добавляем нужный компонент [fan]. Считаем, что одно и то же внутреннее представление может предсказать классы и покупки? Заводим модель с несколькими экспертами [zhao]. За гибкость мы заплатим добавлением гиперпараметров, но эксперименты показывают, что рекомендеры не очень чувствительны к их выбору [haldar]. Мы обсудили, как с помощью нейронных сетей можно решить задачу рекомендаций в классической постановке. Настало время копнуть глубже.

Нейрорекомендеры изменят постановку задачи рекомендаций

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

Выбор и ранжирование end-to-end. В индустрии устоялся подход, в котором рекомендации строятся с помощью двух моделей: первая отбирает небольшой топ товаров-кандидатов, а вторая перемешивает их, подстраиваясь под интересы пользователя [covington]. Модель для выбора кандидатов имеет дело с миллионами товаров и оптимизирует полноту. А модель-ранкер учится оценивать конкретный товар для конкретного пользователя в конкретном контексте. Эти модели можно совместить в одну архитектуру, но тогда применять ранкер придется к миллионам кандидатов, а не к небольшому топу. В Google эту проблему решили end-to-end для задачи обработки текстов с использованием attention и алгоритма поиска приближенных соседей [guu]. Этот подход применим и в задаче рекомендаций.

В предыдущем разделе я упоминал эксперимент с добавлением переранжирующего компонента. Идея в том, чтобы модифицировать скор товара, полученный скалярным произведением представления пользователя на представление товара. За это отвечает отдельный компонент ранкер. Он приклеивается к выходу модели и обучается вместе с ней. У ранкера свой набор признаков. Этот эксперимент мой первый шаг в направлении выбора товаров-кандидатов и их ранжирования end-to-end. Я планирую идти дальше в этом направлении.

Разнообразие рекомендаций. Современные сервисы показывают рекомендации списком. Это не учитывается при обучении модели. В результате рекомендации в списке могут оказаться однообразными. Разнообразия рекомендаций добиваются хитрым пост-процессингом предсказаний [bridge]. И снова кажется, что эту логику можно упаковать внутрь модели. Команда поиска из Airbnb уже показала такой результат [abdool].

В Товарах ОК пользователи видят целую витрину рекомендаций. В каталоге миллионы доступных товаров, среди которых много похожих. Если выбирать товары по релевантности, предсказанной рекомендером, то топ рекомендаций будет очень однообразным. Например пользователь, который интересовался удочкой, увидит в топе несколько видов лески подряд. Сейчас эта проблема решена смешиванием нескольких рекомендеров, но в будущем я добавлю компонент разнообразия напрямую в нейросетевую модель.

Обучение с подкреплением. Задача коллаборативной фильтрации, с которой я начал эту статью, поставлена как задача обучения с учителем: дана обучающая выборка хотим выучить, как по признакам получить значения целевой переменной. Эта постановка не включает в себя многие проблемы индустриальных рекомендательных систем, например exploration-exploitation tradeoff, filter bubbles, selection bias. Эти проблемы хорошо ложатся на постановку обучения с подкреплением [munemasa], в которой агент (рекомендер) взаимодействует со средой (пользователями) и получает награду (клики, покупки). Развитие нейронных сетей привело к возрождению обучения с подкреплением. Но использование этого подхода в рекомендациях отдельная большая тема за рамками этой статьи.

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

Пора задуматься о применении нейросетевого подхода в рекомендациях

Как видите, нейрорекомендеры можно не только ругать в научных статьях, но и использовать в продакшене. Я старался раскрыть практические стороны этого подхода и теперь рискну дать практический совет. В какой ситуации нейронные сети оправдают время и труд, которые вы в них инвестируете? Вот мой список критериев.

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

  2. В одном рекомендере нужно учитывать разные виды данных: коллаборативные, признаковые, социальные и так далее.

  3. Есть возможность вкладывать время в инфраструктуру и обеспечение воспроизводимости в начале проекта. Впоследствие это упростит жизнь: будет удобно экспериментировать с архитектурой сети и признаками.

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

Если в вашей задаче эти критерии выполнены, то есть смысл строить рекомендер на основе нейронной сети. Пять лет назад я скептически относился к этой идее, но попробовал и не разочаровался.

Литература

[abdool] Managing Diversity in Airbnb Search

[bridge] A comparison of calibrated and intent-aware recommendations

[chen] Improving Recommendation Quality in Google Drive

[covington] Deep Neural Networks for YouTube Recommendations

[dacrema] Are We Really Making Much Progress? A Worrying Analysis of Recent Neural Recommendation Approaches

[duboue] The Art of Feature Engineering Essentials for Machine Learning

[fan] Deep Social Collaborative Filtering

[guu] REALM: Retrieval-Augmented Language Model Pre-Training

[haldar] Applying Deep Learning To Airbnb Search

[kim] Enhancing VAEs for Collaborative Filtering: Flexible Priors & Gating Mechanisms

[koren] Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model

[kula] Metadata Embeddings for User and Item Cold-start Recommendations

[liu] Related Pins at Pinterest: The Evolution of a Real-World Recommender System

[maryufich] Воспроизведение - это не мучение!

[munemasa] Deep reinforcement learning for recommender systems

[ning] SLIM: Sparse Linear Methods for Top-N Recommender Systems

[pruthi] Learning to Deceive with Attention-Based Explanations

[ulyanov] Deep Image Prior

[uzay] https://github.com/uzaymacar/attention-mechanisms

[wang] Deep & Cross Network for Ad Click Predictions

[zhao] Recommending what video to watch next: a multitask ranking system

Благодарности

Спасибо коллегам, которые помогали готовить эту статью: @gltrinix, @netcitizen, @m0nstermind, @lvoursl, @AndreySklyarevskiy, @mikhail_mar, @fanatique, Саша Белоусова. Без ваших советов и комментариев получилось бы намного хуже. Автор титульной картинки Richard Galpin.

Подробнее..

Разбор статей конференции RecSys 2020

11.12.2020 18:19:05 | Автор: admin

Привет, Хабр! Несмотря на все невзгоды года текущего, интересные мероприятия и статьи с них никуда не деваются. Поэтому ML команда Одноклассников подготовила разборы работ коллег из Google, Microsoft, Tencent и др. представленных на прошедшей этой осенью конференции по рекомендательным системам RecSys 2020.

Спектр вопросов поднимаемых в понравившихся нам статьях включает в себя как разборы новых алгоритмов рекомендаций, так и подходы к уточнению оценки старых. Вдобавок к этому мы рассмотрим очередной вариант решения задачи multi-task learning, замолвим слово о causal inference в разрезе рекомендеров, а также коснемся темы того, почему пользователи оказываются в пузырях рекомендаций.

  1. Are We Evaluating Rigorously? Benchmarking Recommendation for Reproducible Evaluation and Fair Comparison от@netcitizen

  2. ADER: Adaptively Distilled Exemplar Replay Towards Continual Learning for Session-based Recommendation от @sdll

  3. Causal Inference for Recommender Systems от @anokhinn

  4. Neural Collaborative Filtering vs. Matrix Factorization Revisited от @goodamigo

  5. Deconstructing the Filter Bubble: User Decision-Making and Recommender Systems от @anokhinn

  6. Debiasing Item-to-Item Recommendations With Small Annotated Datasets от @AndreySklyarevskiy

  7. Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations от @pkorobov

  8. Короткие разборы коротких статей

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. Как персонализировать выдачу? Вы поделили вашу коллекцию по категориям и хотите решить, какая подборка подойдет для пользователя в моменте больше всего.

Было бы здорово сессии осмысленно кодировать: так вы могли бы осмысленно реагировать на самые распространенные паттерны поведения. Однако модели зачастую учатся на статических сплитах, а это не годится по двум причинам. Во-первых, по мере появления новых кандидатов метрики скорее всего будут только ухудшаться, потому что старые рекомендации со временем приедаются. Во-вторых, предпочтения самих пользователей могут меняться по разным причинам, от выборов президентов до прихода Нового года. А если на новых данных периодически модель подучивать, избежав дорогого повторного пробега по всей истории, высок риск выйти в новый локальный минимум, который никак не отражает старые инсайты.

Как на деле может выглядеть catastrophic forgettingКак на деле может выглядеть catastrophic forgetting

Wiewel & Yang Чтобы с этим справиться, авторы ADER предлагают отбирать репрезентативные экземпляры из уже увиденного, и на каждой эпохе дообучения снова показывать их модели, по-умному варьируя их важность.

Отбираем экземпляры, используя knowledge distillation и адаптивную регуляризацию для контроля их влиянияОтбираем экземпляры, используя knowledge distillation и адаптивную регуляризацию для контроля их влияния

Так как вы не можете хранить бесконечное количество экземпляров, ограничьтесь подходящим 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, в задачах с множественными параллельными воздействиями. То есть как раз в задачах типа рекомендаций.

В итоге предлагается такой алгоритм:

  1. Обучаем exposure model, которая учится предсказывать, какой фильм пользователь посмотрит. Результат применения этой модели и есть та самая замена неизвестных confounders. Модель представляет из себя Байесовскую матричную факторизацию с парой Гамма-Пуассон. Обучается с помощью приближенного вариационного вывода. Физический смысл этой модели в том что она выучивает внутренние склонности пользователя, контролируя которые, получим несмещенную оценку эффекта.

  2. Добавляем предсказания exposure model в outcome model как признак. Таким образом авторы предлагают контролировать counfounders. Модель матричная факторизация с признаком:

Модель обучается с помощью MAP оценки (я интерпретировал это как MSE + регуляризация). Почему и при каких предположениях это работает, рассказано в статье, упоминавшейся выше.

По сути, модель пытается скорректировать смещение предсказанных рейтингов, вызванное нерандомностью сбора данных. Поэтому сравнивается она в основном с другим корректировщиком смещения - inverse probability weighted matrix factorization. В экспериментах на симулированных и реальных данных предложенный подход побеждает.

Что можно применить

Предложенный подход простой и реализовать его было бы несложно. Для exposure model не обязательно использовать Байесовскую факторизацию подойдет и другая модель, например автоэнкодер. Другое дело, что нужно будет переформулировать это в терминах implicit feedback. Например, обучать exposure model на просмотрах товаров, а outcome model на покупках. Было бы интересно понять в A/B, как causal model ведет себя по сравнению с обычной.

Что насторожило/не понравилось:

  1. Статья не добавляет новых идей по сравнению с 2018 годом. Добавились только эксперименты, но мало.

  2. Результаты экспериментов не сильно улучшают бейзлайны. Это уменьшает желание заводить новую модель ради совсем крошечного улучшения.

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

Однако теоретически многослойный персептрон может аппроксимировать скалярное произведение. Так почему же он не показал хотя бы такие же результаты? Авторы выдвигают гипотезу, что причиной этому является большое количество шагов обучения, требуемое для аппроксимации скалярного произведения с нужной точностью. Теоретически оно составляет O(d4/2) где d - размерность пространства эмбеддингов, - граница ошибки аппроксимации. Это проверяется путем выучивания скалярного произведения через сэмплирование векторов из нормально распределенной генеральной совокупности, вычислением их скалярных произведений с добавлением шума с низким отклонением и обучении аппроксимирующей модели. В результате несколько различных конфигураций персептрона не смогли выучить функцию скалярного произведения с нужной точностью за допустимое количество шагов.

d - размерность векторов, серая и черная прямые обозначают допустимые отклонения 0.01 и 0.001 соответственно.d - размерность векторов, серая и черная прямые обозначают допустимые отклонения 0.01 и 0.001 соответственно.

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

Практический вывод

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

Достоинства и недостатки статьи

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

Недостатки статьи:

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

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

Deconstructing the Filter Bubble: User Decision-Making and Recommender Systems

Чем зацепила

Статья исследует механизм filter bubble в рекомендациях. Предлагается свежий взгляд на задачу рекомендаций статья не про построение рекомендера, а про то, как пользователи потребляют то, что им рекомендует сервис.

Краткое изложение

Авторы статьи предлагают модель, которая объясняет, как пользователи потребляют рекомендации. Модель основана на теории игр и исследованиях в экономике, поэтому можно считать, что она согласуется с реальным поведением пользователей. Здесь нет смысла рассказывать технические подробности модели, только основные положения:

  1. Пользователь получает некоторый фиксированный monetary value от потребления каждого item-а. Этот value складывается из двух компонентов: общего для всех пользователей и персонального для конкретного пользователя. Первый можно считать неким универсальным качеством item-a рекомендер может его выучить, используя данные многих пользователей. Второй компонент специфичен для каждого пользователя и поддается только персонализированным рекомендерам.

  2. Пользователь не знает свой value для item-ов. Вместо этого у него есть некоторое убеждение (belief) об общем и персонализированном компонентах value. Это убеждение выражается через вероятностные распределения.

  3. На основании своих убеждений пользователь выбирает следующий item: берет item с максимальным матожиданием utility function по распределениям компонентов value. Функция utility устроена так, что пользователь предпочитает item с большим матожиданием value и маленькой дисперсией. Внутри utility есть параметр, который отвечает за рискованность пользователя. Осторожный пользователь сильно штрафует item за дисперсию value, а рискованный не сильно. Получается как бы anti-exploration: пользователи предпочитают знакомые item-ы даже если у них ожидаемое value меньше, чем у незнакомых.

  4. После выбора item-а пользователь наблюдает его действительное value и обновляет свои убеждения. При этом обновляются распределения не только выбранного item-а, но и ближайших к ним.

  5. Рекомендации помогают пользователю уточнить свои убеждения. В статье этот пункт раскрыт не очень глубоко. Понятно, что рекомендации рассматриваются как дополнительные байесовские апдейты распределений компонентов 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 и не только в рекомендациях.

Подробнее..

Рекомендуем город для путешествия при помощи нейросетей с вниманием

24.05.2021 18:21:26 | Автор: admin

В конце прошлого года, Booking.com запустил соревнование по построению рекомендательного алгорима для путешественников. Задача наилучшим образом предсказать следующий город для пользователя, основывываясь на предыдущих посещенных городах.



Рекомендации городов в booking.com, картинка отсюда


В этой статье мы опишем наше решение задачи, которое заняло 5е место на соревновании. Наше решение основано на нейросетевом механизме внимания, а так же на основе listwise-метода обучения ранжированию LambdaRank. Наше решение выбирает правильный город в четыре рекомендованных города с вероятностью 55.5%, что есть довольно неплохой результат, учитывая что алгоритму необходимо было выбирать 4 города из практически 40000 возможных.


Эта статья расширенная версия нашей статьи, которая была принята и опубликована на воркшопе по web-туризму в рамках конференции WSDM.


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


Описание задачи


Задача, предложенная на соревновании, состояла в том, чтобы разработать рекомендательный алгоритм, который рекомендовал бы следующий город пользователю на основании уже посещенных им городов. Для разработки рекомендательного алгоритма, организаторы предложили датасет состоящий из двух частей train и test. Каждая строчка датасета содержит следующие данные:


Колонка Описание
user_id Id пользователя
checkin Дата въезда в отель
checkout Дата выезда из отеля
affiliate_id Анонимизированный Id источника трафика (Например поисковая система)
device_class Desktop/Mobile
booker_country Страна из которой было выполнено бронирование
hotel_country Страна отеля (анонимизированно)
city_id Город отеля (анонимизированно)
utrip_id Идентификатор путешествия

Пример данных из части train датасета
user_id checkin checkout city_id device_class affiliate_id booker_country hotel_country utrip_id
0 1006220 2016-04-09 2016-04-11 31114 desktop 384 Gondal Gondal 1006220_1
1 1006220 2016-04-11 2016-04-12 39641 desktop 384 Gondal Gondal 1006220_1
2 1006220 2016-04-12 2016-04-16 20232 desktop 384 Gondal Glubbdubdrib 1006220_1
3 1006220 2016-04-16 2016-04-17 24144 desktop 384 Gondal Gondal 1006220_1
4 1010293 2016-07-09 2016-07-10 5325 mobile 359 The Devilfire Empire Cobra Island 1010293_1
5 1010293 2016-07-10 2016-07-11 55 mobile 359 The Devilfire Empire Cobra Island 1010293_1
6 1010293 2016-07-12 2016-07-13 23921 mobile 359 The Devilfire Empire Cobra Island 1010293_1
7 1010293 2016-07-13 2016-07-15 65322 desktop 9924 The Devilfire Empire Cobra Island 1010293_1
8 1010293 2016-07-15 2016-07-16 23921 desktop 9924 The Devilfire Empire Cobra Island 1010293_1
9 1010293 2016-07-16 2016-07-17 20545 desktop 10573 The Devilfire Empire Cobra Island 1010293_1

В тестовой части датасета, последний город в путешествии и страна последнего города были замаскированы; остальные параметры, например дата въезда и дата выезда, доступны. Задача участников соревнования для каждого путешествия из тестовой части датасета порекомендовать 4 варианта последнего города. Участники оценивались по метрике Accuracy@4. По сути, эта метрика показыват сколько процентов рекомендаций содержали правильный город.


Переранжирующая модель на основе механизма внимания.


Метрика Accuracy@4 по своей сути является метрикой ранжирования: мы можем сгенерировать скор для всех возможных городов, отсортировать их и оценить вероятность с которой целевой город окажется среди топ-4х городов. Так как наша целевая метрика является метрикой ранжирования, мы решали задачу как задачу ранжирования.
Сама по себе метрика Accuracy@4 не очень удобна для оптимизации напрямую, тал как она учитывает выставленный скор только для четырех городов и никак не учитывает взаимный порядок между этими четыремя городами. Для того, чтобы облегчить себе задачу, мы заменили эту метрику другой популярной метрикой ранжирования, а именно метрикой NDCG@40.


Описание метрики NDCG

Метрика NDCG расшифровывается как Normalized Discounted Cumulative Gain. Эта метрика подходит для оценки порядка внтури списка документов; в нашем случае один документ это один рекомендуемый город.


Для того, чтобы посчитать NDCG нам сначала надо посчить другую метрику, Dicounted Cumulative Gain (DCG).


Пусть у нас есть список из K документов, и мы знаем, что релевантность i-го документа равна ri
Тогда, метрика DCG@K считается по формуле:


$DCG@K = \sum_{i=1}^{k}\frac{2^{r_i} - 1}{log_2(i+1)}$


Теперь мы можем определить NDCG:


$NDCG@K = \frac{DCG@K}{IDCG@K}$


где IDCG (Ideal DCG)- это DCG для того же списка документов, переупорядоченных в соответствии с релевантностью документов.


Метрика NDCG в идеальном случае всегда равна единице. Ее значение зависит только от порядка документов.


Так как метрика NDCG@K зависит не только от элементов, включенных в список рекомендаций, но и от их относительного порядка, ее значение более стабильно по сравнению с метрикой Accuracy@K. Кроме того, мы увеличили стабильность метрики за счет того, что выбрали большее значение K (40 вместо 4).


Еще одной проблемой метрик ранжирования, таких как NDCG@K или Accuracy@K, является тот факт, что их значение изменяется скачкообразно при изменении порядка элементов в списке рекомендаций. Это означает, что такие метрики не являются гладкими и дифференцируемыми и их нельзя напрямую оптимизировать классическим методом градиентного спуска.


Градиентный спуск и его вариации служат основой для оптимизации нейросетевых алгоритмов. Так как он не работает напрямую с метриками ранжирования, на практике при решении задачи ранжирования часто оптимизируют прокси-метрики, такие как log loss, в надежде, что их оптимизация приведет к улучшению качества ранжирования. Нам не очень понравилась такая идея, и мы решили все-таки попытаться оптимизировать саму метрику NDCG напрямую.


Для прямой оптимизации метрики NDCG существует метод LambdaMART[1]. Это метод, работающий на основе градиентного бустинга над деревьями принятия решений. Например, он реализован в популярных библиотеках LightGBM и XGboost и является рабочей лошадкой для решения задач ранжирования. Например, этот метод работает в Bing для ранжирования поисковых результатов, применяют в Amazon, да и Яндексовый YetiRank является близким родственником данного подхода.
В основе метода лежит идея замены градиента лосс-функции специально сконструированными значениями, называемыми лямбда-градиент, используя которые в методе градиентного спуска можно оптимизировать метрику NDCG. Мы реализовали этот метод для обучения нейросетей и применили для решения нашей задачи. В итоге, верхнеуровнево, наше решение выглядит следующим образом:


  1. Выбрать города-кандидаты для рекомендаций при помощи простых эвристических алгоритмов.
  2. Сгенерировать матрицу C фичей для кандидатов.
  3. Сгенерировать векторные представления T предыдущих городов в текущей поездке при помощи Transformer-like архитектуры.
  4. Сгенерировать векторное представление F целевого города на основе доступных фичей. Несмотря на то что мы не знаем идентификатор города, мы можем использовать такие параметры как дата въезда и выезда, тип устройства и т.д.
  5. Сгенерировать скор для кандидатов и отсортировать их в соответствии с этим скором. Для этого, мы применяем механизм внимания между кандидатами и посещенными городами. Результат этой операции скалярно умножаем на векторное представление фичей и получаем результат.

$Scores = MultiHeadAttention(C, T) \cdot F$


Теперь разберем нашу модель подробнее.


Генерация лейблов


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


1) Сортируем города из путешествия по времени
2) Несколько последних городов в путешествии объявляем "целевыми". Конкретное количество целевых городов определяем случайным образом для каждого путешествия
3) Назначаем для i-го города в целевой части скор 2-i. Идея назначать экспоненциально уменьшающийся вес базируется на том, что чем на более далекое будущее приходится посещение города, тем меньше влияние предыдущих городов и тем больше влияние других факторов, которые наша модель не может учесть.


Отбор кандидатов для ранжирования


Наша подход основан на методе оптимизации LambdaRANK.
Этот подход требует довольно тяжелых вычислений, и поэтому мы можем его применять только на ограниченном количестве кандидатов. Поэтому, нам необходимо было отобрать города-кандидаты используя более простой подход. Для того, чтобы тренировать нашу модель за разумное время мы решили ограничиться 500 городами-кандидатами для каждого путешествия из 39870 возможных. Мы использовали смесь простых моделей для того, чтобы выбрать эти 500 кандидатов.


В течении каждой из эпох на этапе обучения, мы выбирали 10000 путешествий для обучения нашей основной нейросети, а оставшиеся путешествия из датасета использовали для обучения простых моделей, использованных для отбора кандидатов. Такое разделение необходимо, так как результаты работы простых моделей мы подавали на вход нейросети в качестве входных данных. Без разделения данных на две части наша нейросеть бы переобучилась.


Вот список простых моделей и правил, которые мы использовали для генерации 500 кандидатов:


1. Все предыдущие посещенные города из путешествия

Мы обратили внимание на то, что в датасете довольно часто внутри одного путешествия несколько раз встречается один и тот же город. Это можно объяснить тем, что люди приезжают в "базовый" город и из этого базового города посещают несколько соседних городов.


2. Transition chain

Данная модель использует последовательную природу посещений городов в модели.
Предположим, что в нашем датасете всего $M$ городов, и каждое путешествие представляет из себя последовательность из $K$ городов, где $K$-й город в последовательности это наш целевой город. Мы можем создать матрицу переходов в последний город $T \in R^{M \times M}$, которую мы заполним, используя следующую процедуру:


procedure fillTransitionMatrix     T  zero matrix with size M  M      for current_trip in trips do:     last_city  current_trip [1]         prev_cities  current_trip [: 1]         for city in prev_cities do:             T [city][last_city] += 1.         end for     end forend procedure

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


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


3. BookerTripCountryTop

Данный метод представляет из себя простую эвристику. Мы отбираем самые популярные города для путешествий, среди пользователей из страны, совпадающей со страной текущего пользователя, которые путешествовали в страну, которая совпадает со страной последнего города из текущего путешествия.
Используя данную эвристику мы добавляли города в множество кандидатов, до тех пор, пока его размер не достиг 350.


4. LastCityCountryTop

Используя эту эвристику мы отбирали самые популярные города в стране последнего города текущего путешествия. Данная эвристика похожа на предыдущую, но мы считаем топ без учета страны пользователя.
Используя данную эвристику мы добавляли города в множество кандидатов, до тех пор, пока его размер не достиг 500.


Используя эвристики описанные выше, мы зачастую могли полностью заполнить множество кандидатов. Однако, в некоторых ситуациях, нам не хватало городов. Например, такое могло случится, когда пользователь из редкой страны путешествует в другую редкую страну в этом случае алгоритмы TransitionChain, BookerTripCountryTop и LastCityCountryTop могут сгенерировать лишь небольшое количество городов-кандидатов с ненулевым скором. В такой ситуации мы использовали два дополнительных метода отбора кандидатов, используя следующие эвристики:


5. BookerCountryTop Самые популярные города среди путешественников из страны, совпадающей со страной текущего пользователя.


6. GlobalTop Самые популярные города в датасете.


Используя описанные шесть эвристик мы могли гарантированно заполнить массив из 500 городов-кандидатов. Наши эксперименты показали, что используя данные эвристики, вероятность включения нужного города в список кандидатов (метрика recall@500) составляет примерно 90%.


Генерируем фичи для кандидатов.


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


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

Генерируем векторе представление путешествия


Наша модель использует нейросетевую архитектуру, похожую на архитектуру Transformer[2] для того, чтобы закодироияя. Архитектура Transformer хорошо подходит для обработки текстов. Использование данной архитектуры базируется на том факте, что последовательность городов в путешествии похожа на последовательность слов в тексте.


Мы сгенерировали векторное представление каждого города в путешествии используя следующие признаки:


  • Эмбеддинг города, 32 обучаемых параметра.
  • Эмбеддинг страны пользователя, 32 обучаемых параметра.
  • Эмбеддинг страны города 32 обучаемых параметра. Данный эмбеддинг использует те же веса, что и эмбеддинг страны пользователя.
  • Эмбеддинг источника траффика(affiliate id) 5 обучаемых параметров
  • Некоторое количество фичей, разработанных нами вручную, включая:
    Количество ночей между въездом и выездом в отель.
    Захватывает ли остановка в отеле выходные? (хороший признак для того, чтобы отличать командировки)
    Совпадает ли страна города с предыдущими со страной предыдущих городов в путешествии.
    День недели и неделя в году для даты въезда и выезда.
    Совпадает ли страна пользователя и страна города?
    Год въезда. 3 параметра, one-hot encoded. В датасете представлены путешествия только за 3 года.
    Месяц въезда. 12 параметров, one-hot encoded.

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


Для того, чтобы получить более качественное семантическое представление городов в путешествии, мы закодировали их используя один полносвязный слой нейросети размерности 115. Для того, чтобы учесть позицию города в путешествии, мы так же умножили этот вектор на эмбеддинг позиции. В оригинальной архитектуре Transformer, авторы используют фиксированные эмбеддинги, основанные на функциях $sin$ и $cos$ Вместо этого, мы использовали два обучаемых эмбеддинга, представляющих собой позицию города относительно начала и конца путешествия. Мы сконкатенировали эти эмбеддинги и пропустили их через один полносвязный слой для того, чтобы получить финальный эмбеддинг города в путешествии.



Transformer-like блок. По сравнению с оригинальным блоком transformer, мы заменили сложение на умножение в residual-связи


Для того, чтобы смоделировать взаимодействия городов друг с другом, мы воспользовались архитектурой Transformer. Оригинальный блок архитектуры Transformer состоит из одного Self-Attention слоя, Dense-слоя, Residual-связи и нормализации. На хабре уже неоднократно разбирали архитектуру Transformer, поэтому мы не будем описывать ее тут. Единственная разница нашего transformer-like блока с оригинальным, заключается в том, что для residual связи мы используем не сложение, а умножение. Наши эксперименты показали, что на данном датасете, умножение позволяет обучиться быстрее и позволяет достичь более высокого результата.


На выходе из Transformer-like части нашей нейросети, мы получили представления городов обогащенные информацией о других городах из того же путешествия. Затем, мы моделировали взаимодействия этих представлений с нашими городами-кандидатами. Для этого мы использовали следующие шаги:


  1. Закодировали матрицу городов-кандидатов, используя один полносвязный слой нейросети.
  2. Полученные представления городов-кандидатов мы пропустили через один Transformer-like блок. Интуитивно города кандидаты не являются независимыми и, зная какие есть другие кандидаты, нейросети будет легче подобрать правильный скор для текущего города.
  3. При помощи одного слоя MultiHeadAttention смоделировали взаимодействия с предыдущими городами из путешествия. На выходе мы получили эмбеддинги городов-кандидатов в контексте текущего путешествия.

reference link
Архитектура нашей нейросети.


Финальный скор для каждого города-кандидата мы генерировали при помощи умножения (dot product) эмбеддинга города-кандидата на закодированное представление фичей последнего города. По условиям задачи, нам не известен последний город, но известные некоторые характеристики поездки в этот город, например время въезда и выезда и источник трафика. Мы закодировали эти параметры, используя те же самые процедуры, которые мы использовали для кодирования фичей городов в путешествии. Дополнительно, мы пропустили эти фичи через один полносзвязный слой нейросети, для того чтобы получить проекцию в то же пространство, в которое мы спроектировали эмбеддинги городов-кандидатов.


Обучаем модель


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


Мы взяли имплементацию метода из библиотеки lightgbm в качестве референсной и написали собственную имплементацию, которая подходит для обучения нейросетей. Как показали наши эксперименты, использование метода LambdaRANK позволило нам намного быстрее обучать нашу нейросеть ранжировать города, по сравнению с использованием бинароной кроссэнтропией. Кроме того, метрика NDCG, которую оптимизирует LambdaRANK показала практически идеальную корелляцию с метрикой Accuracy@4, поэтому в целом обучая модель получать хороший скор NDCG, мы автоматом получали хорошее значение Accuracy@4.


Для тренировки мы использовали оптимизатор Adam с ранней остановкой после 50 эпох без улучшения метрики Accuracy@40



Метрики Accuracy@4 и NDCG@40. Видно что метрики кореллируют практически идеально. Такой выскоий уровень корреляции подсказывает что оптимизируя одну метрику, мы автоматом оптимизируем и другую


Для имплементации нашей нейросети мы использовали библиотеки Tensorflow и Keras. Тренировка заняла примерно 7 часов на GPU Nvidia RTX 3090.


Оценка качества модели и результаты


Схема валидации нашей модели была основана на отдельных путешествиях. Так как с нашей точки зрения большой разницы между частями train и test датасета не было, мы объединили эти части и использовали обе из них как для тренировки модели, так и для оценки качества. Мы случайным образом отобрали 4000 путешествий в тестовое множество (наше тестовое, не путать с частью test датасета) и еще 4000 в валидационное. Остальные путешествия из обоих датасетов мы поместили в тренировочную выборку. На этапе валидации и тестирования модели мы использовали все города кроме последнего для того, чтобы предсказать один последний город в каждом путешествии (стратегия leave one out).


Метрики


Для оценки качества нашей модели мы использовали следующие метрики:


  • Accuracy@4 Метрика использованная организаторами соревнования для оценки моделей.
  • NDCG@40 Метрика которую мы использовали в для оптимизации нашей нейросети. Как мы показали выше, данная метрика хорошо кореллирует с метрикой Accuracy@4.
  • Leaderboard По сути, это та же самая метрика Accuracy@4, измеренная организаторами соревнования на закрытой части датасета. По условиям соревнования, мы могли померять эту метрику лишь дважды: один раз для "предварительной" модели, и один раз для финальной модели.

Сравнение метрик с простыми моделями:


Для оценки качества нашей модели мы использовали следующие бейзлайны:


  • GlobalTop, LastCityCountryTop, TransitionChain простые эвристические алгоритмы которые мы использовали для отбора кандидатов.
  • TruncatedSVD Популярный подход для решения задачи построения рекомендательных систем на основе матричного разложения. Мы использовали реализацию TruncatedSVD из библиотеки sklearn.
  • SelfAttention end-to-end версия нашей модели. Архитектура данной модели похожа на нашу финальную модель. Отличие в том, что мы рассчитываем скор для всех городов, а не для топ-500 кандидатов. Из-за этого модель была более тяжеловесной, и мы не могли использовать фичи, которые мы генерировали вручную (например похожесть на предыдущие города из путешествия). По сути, при помощи Transformer-like части нашей модели мы генерировали эмбеддинг путешествия, и сравнивали с выученными эмбеддингами городов. Эту модель мы использовали для промежуточной оценки результата.
  • LambdaMART Так как мы использовали подход LambdaRANK, мы хотели попробовать сравнить нашу имплементацию с классической реализацией данного подхода на деревьях принятия решений. Мы использовали имплементацию LambdaRANK из библиотеки lightgbm. Подход базировался тольк о на вручную сгенерированных фичах (описанных в секции "генерируем фичи для кандидатов" выше).

Результаты сравнения моделей представлены в следующей таблице:


Модель Accuracy@4 NDCG@40 Leaderboard
GlobalTop 0.058 0.091 -
TransitionChain 0.440 0.429 -
SelfAttention 0.509 0.491 0.514
LambdaMART 0.514 0.485 -
RerankingAttention 0.542 0.513 0.555

Заключение


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


Ссылки:
[1] Burges CJ. From ranknet to lambdarank to lambdamart: An overview
[2] Vaswani A, Shazeer N, Parmar N, Uszkoreit J, Jones L, Gomez AN, Kaiser L, Polosukhin I. Attention is all you need. arXiv preprint arXiv:1706.03762. 2017 Jun 12.


(https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.180.634&rep=rep1&type=pdf). Learning. 2010 Jun 23;11(23-581):81.

Подробнее..

Рекомендательные системы как помочь пользователю найти то, что ему нужно?

16.10.2020 10:22:46 | Автор: admin

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

Что такое рекомендательные системы?

Рекомендательная система комплекс алгоритмов, программ и сервисов, задача которого предсказать, что может заинтересовать того или иного пользователя. В основе работы лежит информация о профиле человека и иные данные.

Яркий пример рекомендательной системы Tik-Tok, о котором в последнее время говорят очень много. Первые несколько дней пользователи видят в ленте все подряд, но потом приложение показывает пользователю только интересующее его видео на основе предыдущих оценок.

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

Типы рекомендательных систем

Существует 4 чипа рекомендательных систем:

  • Коллаборативная фильтрация (collaborative filtering).

  • Основанные на контенте (content-based).

  • Основанные на знаниях (knowledge-based).

  • Гибридные (hybrid).

Давайте подробнее рассмотрим каждый из них.

Коллаборативная фильтрация (collaborative filtering)

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

Простой пример: Гена и Витя любят рыбачить и заказывать пиццу по вечерам. А еще они оба любят BMW и ездят на машинах этой марки. Еще есть Олег, который тоже не прочь посидеть с удочкой на выходных и заказать пиццу после тяжелого рабочего дня. Но о покупке BMW он никогда не задумывался. Так как его интересы (оценки) совпадают с Геной и Витей, ему можно порекомендовать BMW.

По такому принципу работает много сервисов, например, Имхонет или last.fm. Главное преимущество этого типа высокая теоретическая точность. Но есть и минус: показывать хорошие рекомендации новым пользователям не получится, ведь о них нет никакой информации. Из-за этого будет большой процент отказов.

Основанные на контенте (content-based)

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

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

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

Основанные на знаниях (knowledge-based)

Этот тип работает на основе знаний о какой-то предметной области: о пользователях, товарах и других, которые могут помочь в ранжировании. Как и в случае с content-based, оценки других пользователей системы не учитывают. Есть несколько разновидностей: case-based, demographic-based, utility-based, critique-based, whatever-you-want-based и т.д.

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

Например, магазин техники Apple reStore подбирает потенциальным покупателям наборы, в зависимости от просматриваемого товара:

Неплохо работает аналогичная система в интернет-магазине М.Видео:

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

Очевидное преимущество системы высокая точность. Рекомендательная система М.Видео показывает товары, которые могут реально заинтересовать посетителя. Было бы странно, если при выборе PlayStation 4 магазин советовал докупить человеку кухонный гарнитур.

Но есть и минус для разработки этой системы требуется много времени и ресурсов. Но результат оправдывает средства.

Гибридные (hybrid)

Наверно, нет такой сферы деятельности, в которой не нашлось бы энтузиастов собрать все в одно. Рекомендательные системы не стали исключением. У всех описанных ранее типов есть определенные недостатки. Комбинирование нескольких алгоритмов в рамках одной платформы позволяет если не устранить их полностью, то хотя бы минимизировать.

Крупные сервисы и интернет-магазины используют гибридные варианты. Чуть-чуть там, немного здесь и получается уникальная система. Универсальной инструкции и рекомендаций по реализации такого инструмента нет. Все ограничивается возможностями и фантазией разработчиков. Например, у Netflix в рекомендательной системе объединено 27 (!) алгоритмов.

Есть несколько распространенных типов комбинирования:

  • реализация по отдельности коллаборативных и контентных алгоритмов и объединение их предположений;

  • включение некоторых контентных правил в коллаборативную методику;

  • включение некоторых коллаборативных правил в контентную методику;

  • построение общей модели, включающей в себя правила обеих методик.

Обычно эти варианты берут в качестве основы и дополняют по собственному желанию и по критериям сферы деятельности. Как и в случае с knowledge-based, основной недостаток гибридных систем сложность разработки.

Как работают рекомендательные системы

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

Рекомендательные системы работают на двух уровнях:

  • Глобальные оценки; особенности и предпочтения, не меняющиеся месяцами или годами; интересные страницы; зависимость от характерных пользовательских черт: пол, место проживания и т.п.

  • Кратковременные тренды и быстрые изменения интересов во времени.

Данные собирают явным и/или неявным способами. В первом случае посетителю предлагают заполнять анкеты, проходить опросы и т.п. для определения его предпочтений. Метод эффективный, только пользователи не всегда соглашаются на заполнение анкет и прохождение опросов. Поэтому придумывают, как заинтересовать их этим (обычно предлагают какую-то выгоду в обмен).

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

Как и в случае с типами рекомендательных систем, по отдельности способы используют редко. Для получения наилучших результатов их комбинируют.

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

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

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

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

Мифы о рекомендательных системах

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

Сложно собрать и подготовить данные для ИИ

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

ИИ не способен давать качественный результат

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

Нужно много денег на реализацию

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

Во-первых, все зависит от размеров бизнеса. Если сервис, интернет-магазин или другие предприятия небольшие, то и денег на реализацию потребуется немного. Во-вторых, необязательно создавать собственную систему с нуля. Достаточно воспользоваться готовым фреймворком (TensofFlow, Apple Core ML) или внешним решением (Google ML Kit). Это позволит существенно сократить расходы.

На практике уже не раз было доказано, что рекомендательные системы увеличивают продажи и повышают количество вернувшихся клиентов. Инвестиции на реализацию и внедрение могут вернуться через 3-6 месяцев.

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

Ваша задача понять пользу инструмента и запланировать его внедрение в своей проект (не важно, работает он уже или вы только собираетесь заняться реализацией). Он поможет повысить объем продаж и, как следствие, прибыль, поэтому не откладывайте рекомендательные системы в долгий ящик.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru