Как мы заняли первое место в хакатоне ВК «Машинное обучение на графах», где не было графов |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2022-11-16 03:28 В сентябре 2022 проходил хакатон «Машинное обучение на графах» от компании ВК на платформе «Цифровой прорыв». В хакатоне участвовала команда Лаборатории машинного обучения Альфа-Банка: Александр Сенин, Георгий Смирнов и Валерий Смирнов. Мы заняли 1 место в хакатоне, далее подробно расскажем, как нам удалось победить. Контекст В хакатоне допускалось участие команд до 5 человек в каждой. Основная масса участников — студенты вузов МГУ, МФТИ, ИТМО, МИРЭА. Наша команда не была исключением, мы студенты последних курсов ВМК и мехмата МГУ. Особенности хакатона:
Склонность к благотворительности Задача заключалась в построении модели склонности пользователей социальной сети ВК к благотворительности. С точки зрения машинного обучения — это старая добрая задача бинарной классификации. Для построения модели были выданы данные реальных пользователей в анонимизированном виде. Данные органично распались на 3 домена:
Метрика качества — всем привычный ROC AUC. Локально оценивали модели по кросс-валидации. Обсудим каждый источник данных отдельно. Табличные данные Организаторы соревнования преисполнились в вопросе тщательной анонимизации данных — среди 1000 признаков было лишь два столбца с незашифрованными названиями: идентификатор клиента и дата. Однако, в названиях остальных признаков были оставлены подсказки. Примеры названий:
Напрашивалось разбить признаки на группы, например, все признаки с префиксом Не обошлось и без ликов. Наверное, самый популярный в соревнованиях по машинному обучению — это лик в идентификаторе объекта. Добавление признака идентификатора клиента в числовом виде улучшало качество модели на 2 пункта ROC AUC. Скорее всего, идентификатором выступал номер строки в таблице, причем в момент его создания строки не были упорядочены абсолютно случайно. Однако, формат хакатона подразумевает честное рабочее решение без читов с ликами, поэтому от использования такого признака пришлось отказаться. Последовательные данные Последовательности пользовательских состояний были представлены в виде списка хэшей, например
В этот момент многие команды бросились сразу учить сложные нейросетевые модели для построения эмбеддингов состояний, а по ним и последовательностей. Вообще говоря, мы в Лаборатории машинного обучения занимаемся именно обучением сложных нейросетевых моделей (от модели дефолта по последовательностям транзакций до чат-бота), но в этой ситуации выбрали другую тактику. Решили сперва построить простое MVP решение в стиле классического ML, а уже затем улучшать его. В NLP задачах существует популярный бейзлайн с использованием TF-IDF представлений, который часто бывает непросто побить. Применили в нашей задаче TF-IDF, получили 34 000 признаков для каждой последовательности. Понизили размерность через сингулярное разложение до 512 признаков. Это преобразование можно воспринимать как построение эмбеддинга пользователя по последовательности состояний. Такой бейзлайн улучшил итоговое качество на 2 пункта ROC AUC. Данные друзей По 81% пользователей были даны признаки их друзей, в среднем, по 76 друзей на пользователя. Признаки здесь те же самые, что и в признаковом описании самого пользователя — вновь признаки с префиксами вида Кроме этих признаков, был ещё один — идентификатор друга. Однако, множество идентификаторов друзей не пересекалось со множеством идентификаторов пользователей. Связать ребрами пользователей только по идентификаторам не получилось бы. Не было и данных по друзьям друзей. Организаторы объяснили это так: если брать данные по всем друзьям в окрестности больше 1, то пришлось бы выгружать весь граф ВК. К тому же, не был известен таргет у друзей.
Сам по себе идентификатор друга отличался по структуре от идентификатора пользователя: он получался конкатенацией идентификатора пользователя с некоторым двузначным числом. Участники хакатона из других команд предположили, что в этом двузначном числе есть информация о расстоянии от пользователя до его друга. Тем не менее, мы тоже сочли это ликом и не использовали в решении. На признаках друзей мы сгенерировали аналогичные признаки, что и на табличных данных основных пользователей. Следующий естественный шаг — отобрать топ признаков (мы взяли топ-100 по feature importance), а затем сделать агрегаты по топу признаков у друзей. Добавление таких усредненных по друзьям признаков увеличило качество еще на 1 пункт ROC AUC. Ансамбль из коробки После генерации признаков, добавления эмбеддинга по последовательности и агрегатов по друзьям, мы приступили к обучению модели. Хакатон длился меньше 2 суток, поэтому мы решили не тратить время на тюнинг гиперпараметров, а доверить это готовым фреймворкам. Выбрали LightAutoML, который часто используют в табличных соревнованиях на Kaggle. Из коробки LightAutoML выбивает хорошее качество, которое не так просто улучшить. Под капотом LightAutoML обучает самые популярные модели бустингов (CatBoost и LightGBM) и строит несколько уровней ансамблирования. К вечеру первого дня хакатона мы уже обучили первую модель. После этого наступило время улучшать бейзлайн, проверять идеи и привлекать более сложные модели, включая нейросетевые. А где же граф? Кейс хакатона назывался «Машинное обучение на графах», хотя в явном виде графов в этой задаче не было. Мы решили это исправить и самостоятельно восстановить ребра между пользователями. Нужно было:
Соседей разумно искать среди пользователей обучающей выборки, по которым известны и признаки, и таргеты. В качестве эмбеддинга пользователя вновь использовали TruncatedSVD разложение его признаков. В пространстве пониженной размерности искали ближайших соседей для пользователей обычной евклидовой метрикой.
Такой target encoding улучшил качество ещё на 1 пункт ROC AUC. Время нейросетей На сырых табличных данных нейросети обычно проигрывают бустингу. Другое дело – обработка последовательных данных (sequence processing) или графовых данных (graph processing). Основная идея графовых сетей — итеративное построение эмбеддингов вершин, где на каждой итерации учитывается информация с расширяющейся окрестности. В нашей задаче графовые данные оказались не совсем графовыми, у каждой вершины была только единичная окрестность. Однако, последовательные данные никак не пострадали от ограничений задачи. Для обучения эмбеддингов последовательности мы использовали библиотеку pytorch-lifestream. Эта библиотека не первый раз появляется в соревнованиях, например, в этом году ее использовали сразу несколько победителей и призеров в соревновании Data Fusion. С помощью pytorch-lifestream в self-supervised режиме построили эмбеддинги последовательностей (под капотом идея с маскированием, как в трансформерах). Финальная архитектура на рисунке. Кто победил? Особенность хакатона — необходимость защиты решения. Требовалось в 7-минутном формате запитчить модель. Здесь пригодился скилл грамотной подготовки слайдов и построения интересного устного рассказа. Организаторы определили шорт-лист из 5 команд по скору в лидерборде. Итоговые призовые места распределили жюри, опираясь на качество модели, оправданность и применимость архитектуры, а также проработанность устного доклада. В результате, наша команда заняла 1 место. Эпилог Что мы успели попробовать, но не зашло:
Из очевидных вещей, которые хотелось попробовать, но не успели — заменить TF-IDF по последовательностям на полноценный word2vec. Обучить трансформер на таких объемах данных проблематично, а обычный word2vec, кажется, вполне реально. Если смотреть на feature importance финальной модели, то хорошо зашли расстояния и таргеты ближайших соседей, некоторые агрегаты по друзьям и признаки по последовательностям после SVD. Что почитать?
Также подписывайтесь на Телеграм-канал Alfa Digital — там мы постим новости, опросы, видео с митапов, краткие выжимки из статей, иногда шутим. Источник: habr.com Комментарии: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||