iTechArt logo

Как выиграть соревнования по исследованию данных на Kaggle? Рассказывает чемпион из iTechArt

Development & QA

Kaggle – это веб-платформа для специалистов по Data Science и Machine Learning, которая принадлежит самому Google. Она совмещает в себе сразу несколько полезных ресурсов: профессиональную социальную сеть, где специалисты по данным и ML- инженеры могут обмениваться опытом; обучающие материалы; облачные инструменты для обработки данных/машинного обучения. Также в системе часто организуются конкурсы по исследованию данных с солидными призовыми (размер награды может достигать нескольких тысяч долларов!).

ML Engineer iTechArt Евгения Кокошко можно отнести к числу завсегдатаев таких конкурсов – в течение последних 2-ух лет он принимал участие в различных соревнованиях и совсем недавно взял очередное «золото»! Почему очередное? На поверку оказалось, что в копилке нашего героя уже была высшая награда на Kaggle, равно как и «серебро» и «бронза». Специально для нашего блога Евгений рассказал о том, как устроена платформа, что даёт участие в такого рода конкурсах и свой алгоритм успеха.

Наш собеседник
Кокошко Евгений.jpg

Евгений Кокошко

ML Engineer iTechArt

Двукратный обладатель золотых наград на соревнованиях Kaggle.

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

Задача стояла такая: обучить модель/ансамбль моделей, которые бы отвечали на вопросы на двух индийских диалектах (tamil, hindi). То есть условно дан контекст+вопрос – твоя задача найти в этом контексте спан текста, содержащий ответ на вопрос. У меня это второе золото, кстати оба золота получил в области NLP (обработка естественного языка).

Как и когда ты вообще узнал про Kaggle и что в своё время побудило тебя участвовать? Новый опыт, ощутимые призовые, другое? 

Узнал я о платформе достаточно давно, т.к. часто можно встретить различные упоминания и отсылки к нему из различных DS/ML related статей, постов, но зарегистрировался на данной платформе года только 2 назад. Изначально попробовал себя в house pricing соревновании (что-то вроде «Hello, world» в мире Kaggle и на тот момент забросил данную платформу по причине загруженности на работе. 

Когда пришел в iTechArt, в качестве полезного упражнения мой ментор, Андрей Попов, предложил участие в одном из проходивших на тот момент Kaggle соревнований, CommonLit Readability Prize, где задачей было определить сложность отрывка текста в виде вещественного числа (задача регрессии). Довольно забавно было наблюдать со стороны за прогрессом ожиданий. Изначально они у меня не были высокими, ведь все участники – люди далеко не глупые, имеющие свой бэкграунд в DS/ML сфере, а определенный процент из них и вовсе профессионалы своего дела. Но в момент, когда я приблизился к бронзе на публичном лидерборде, нашей целью стало занять хотя бы её. К слову, каждая из градаций призовых мест (золото, серебро, бронза) являются интервалами, в сравнении со случаями, когда это просто три топ позиции.

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

Какие есть особенности у соревнований Kaggle? Сколько ты работал над решением, которое принесло тебе «золото»?

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

Уже по окончании упомянутого соревнования, я начал участие в другом, также на тему NLP. Мотивацией было обретение нового опыта и это чувство вовлеченности во что-то интересное, т.к. не будет лишним отметить, что kaggle задачи, как правило, увлекательнее обычных рабочих задач. За счет наличия форума для обсуждений к каждому из челленджей, Kaggle является очень подходящим местом для получения нового опыта. Хотя и не самым подходящим место для заработка :), т.к. какое-либо ваше «уникальное» решение, придуманное кем-либо еще, может быть описано на форуме, после чего несколько сотен людей вам покажут, что ваше решение уже не совсем уникальное, заодно поравнявшись с вами в итоговой таблице.

Какой уровень знаний должен быть у Data Scientist / ML Engineer, чтобы участвовать в соревнованиях, есть ли какой-то порог входа?

Я думаю, достаточно иметь базовые знания матчасти, статистики, тервера (прим. теории вероятности) и быть знакомым с основными ML-алгоритмами и их принципами работы для начала, т.к. саму платформу можно рассматривать как обучающую. То есть Junior уровня более, чем достаточно. Далее можно выбрать наиболее интересное вам соревнование, после чего ознакомиться с постановкой задачи, метрикой, используемой для оценки модели, сделать EDA (exploratary data analysis), чтобы представлять, чем вы кормите свою модель.

После этого я бы посоветовал заиметь какую-либо baseline модель и итеративно пробовать ее побить, пользуясь только знаниями, которые вы уже имеете (главное – не подсматривать форум в этом моменте). Далее, когда вы вроде как испробовали все идеи, идем на форум, сортируем топики по популярности и начинаем тщательное впитывание информации с последующей имплементацией только что постигнутых идей. После исследования форума можно зайти в ветку «Code» и сравнить свою реализацию с исполнением других участников, таким образом, возможно, почерпнув также новые знания по структуре кода. Плюс далеко не все фичи и подходы обсуждаются на форуме, поэтому вполне вероятно, что вы найдете какие-то инсайты именно там.

Опять же, повторюсь, желательно каждый раз, когда у вас появляются новые идеи, которые можно попробовать, их желательно отсортировать по сложности реализации (по возрастанию) и пробовать по одной за раз (ablation, только наоборот). Когда вот совсем не осталось больше идей, идете на arxiv.org, вбиваете в поиск ключевые слова по своей проблеме и листаете статьи, в поисках найти какой-то рабочий и реализуемый подход, чтобы улучшить вашу модель.

На Kaggle есть как индивидуальные, так и командные соревнования. Ты соревновался только в командном формате?

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

Разница в размере команды лишь одна – чем больше интеллектуальной силы в вашей команде, тем больше у нее потенциала, потому как тогда вы имеете больше источников для идей, больше человекочасов для имплементации этих самых идей, больше вычислительных возможностей в конце концов, особенно, если у ваших тиммейтов имеется RTX 3090. Единственный нюанс лишь в том, что если вы были до этого сами по себе и имели 5 попыток в день на сабмишны, то при тимминге с еще одним участником количество попыток не удваивается, что честно по отношению к командам, состоящих из одного человека, потому необходимо планировать общий расход попыток участниками команды.

Говорят, что компании обращают внимание на место в рейтингах Kaggle при найме на работу. Можешь рассказать подробнее про тамошний рейтинг?

На Kaggle существуют 4 категории, внутри которых есть свой рейтинг, а также по которым, даются статусы на основании различных достижений, а именно: competitions, datasets, notebooks, discussion. Говоря о статусах, они имеют следующие уровни по возрастанию: novice, contributor, expert, master и grandmaster. На текущий момент у меня есть мастер в категории соревнования (то, в чем я наиболее заинтересован) и мастер в ноутбуках. Моей целью является взятие статуса мастера в категории соревнований, после чего мой гештальт будет закрыт :). Для мастера мне нужно еще одно серебро, то есть, думаю, получу его я уже на следующем соревновании. 

Но прежде я планирую сделать небольшой апгрейд в виде той же RTX 3090. Проводить эксперименты на самом Kaggle либо Google Сolab не совсем удобно, потому как есть определенные баги и ограничения, связанные с запусками ноутбуков. По поводу рейтинга других участников я бы сказал: «Нет, не слежу» (если речь идет о глобальном рейтинге платформы). И «Да, слежу» (если это касается именно лидерборда внутри конкретного соревнования, в котором ты принимаешь участие). 

Как ты готовился к соревнованиям? Выработал ли ты для себя какой-то алгоритм успеха? Как победы повлияли на твоё ощущение себя как профессионала?

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

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

Опять же, из соревнований, где мы участвовали до самого конца (их было все два), мы взяли золото. Был лишь один компетишн, который мы забросили по причине того, что не могли извлечь какой-либо полезный сигнал из данных, то была задача классификации наличия определенной генетической последовательности в клетках мозга, которая повышает эффективность химиотерапии для пациентов, имеющих злокачественную опухоль мозга. По итогу первое место на финальном лидерборде заняла команда, занимавшая 1040 место на паблик лидерборде и имевшая итоговый roc-auc равный 0.621 (в то время, как данная метрика принимает значения от 0 до 1, где 0.5 – это просто рандом, и ваша модель не годна ни на что). Мы не сожалели о том, что прекратили участие в данном состязании, потому как, очевидно, данные были не особо репрезентативными по отношению к таргет классу, и между public и private лидербордами произошла огромная встряска.

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

Это что-то вроде:

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

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

По поводу влияния побед... Не знаю, приятно, но не более. Вот в последнем соревновании до самого завершения мы держались на 4 месте на public лидерборде, а на private мы в итоге заняли 6 место, и это когда первые 5 мест дополнительно к золоту получили $$. То есть чуть бы выше, и было бы еще чуть приятнее.

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