«Никто не хотел брать меня в команду». Как 24-летний белорусский Data Scientist объединился с «парнем из Японии» и выиграл $50 тысяч на Kaggle

29 ноября 2018, 09:01

Евгений Бабахин участвует в соревнованиях на Kaggle под ником b.e.s. три с половиной года и за это время достиг уровня «мастер». В его портфолио 15 турниров и 4 золотые медали. В последнем поединке белорус вместе с phalanx, японским студентом Хиротоши Китамура, выиграли $50 тысяч и честно поделили пополам.

Dev.by поговорил с Евгением о его страсти к интеллектуальному состязанию.

— Ещё в гимназии я участвовал в математических олимпиадах и турнирах. Хотел работать в банке, поэтому выбрал специальность «экономическая кибернетика» ФПМИ БГУ. Но с банками не сложилось. Проработал там около года, пока учился на 3-м курсе. Студенческая пора получилась достаточно скомканной. После бакалавриата думал поступать в магистратуру за рубежом, в Великобритании как раз начали появляться магистратуры по Data Science. В начале 5-го курса у меня на руках уже были все необходимые для поступления документы, как вдруг пришло приглашение на собеседование из Wargaming, и я решил сходить. Думал, если возьмут, то останусь. И меня взяли на позицию Data Scientist.  

​Евгений бабахин

  • Закончил ФПМИ БГУ, магистратуру ФПМИ БГУ.
  • 2014-2015 — занимался анализом данных в Альфа-Банке.
  • 2015-2017 — работал с классическими методами машинного обучения в Wargaming. В частности, занимался построением предиктивных моделей и кластеризацией пользователей.
  • 2017 — … — занимается анализом текстов (NLP) с использованием нейронных сетей в Profitero.

Изучать Data Science я начал самостоятельно, когда ушёл из банка. Я проходил курс на платформе EdX. В рамках занятий у нас было одно соревнование на Kaggle. В своём первом турнире я оказался примерно на 30-м месте из 3000 участников на публичном лидерборде. Помню, как подумал что-то вроде: «И что, это весь ваш Data Science?».

Здесь важно понимать вот что: тестовые данные на Kaggle в определённой пропорции делятся  на публичную (30%) и приватную (70%) части. Пока идёт турнир, участники работают с публичными данными и видят свой результат на публичном лидерборде. Этот результат — не окончательный и может резко измениться: финальное решение участника оценивается на приватной части данных, после чего результат попадает на приватный лидерборд. Опасность в том, что ваша модель может хорошо работать на 30 процентах публичных данных и совсем упасть на приватных. Чтобы этого избежать, нужна качественная локальная валидация.

И вот открылась приватная часть данных, и я «скатился» на 400 позиций вниз. Это был шок. Я привык, что если за что-то берусь, то должен быть среди лидеров. Принцип «участие ради участия» меня не вдохновляет.

Это соревнование побудило глубже копать в выбранной области.

Самостоятельно участвовать в соревнованиях я начал где-то через полгода после завершения первого онлайн-курса по Data Science. Багаж знаний у меня был небольшой, но это не помешало во втором моём турнире оказаться на 36 месте из 1800 участников.  

Геологическая задача, Хиротоши Китамура и $50 тысяч 

Женя, у тебя было 15 соревнований на Kaggle и 4 золотые медали. Расскажи про последний турнир, где вы с участником из Японии выиграли серьёзную сумму — $50 тысяч.

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

Как я понимаю, определять границы, где соприкасаются соль и земля, — непростая задача для геологов. Для этого используют сейсмическую визуализацию: в землю посылают радиосигнал и затем на основе полученных данных строят 3D-картинку. Для нас эта картинка была нарезана 2D-слайсами, на которых были выделены маски в виде «1» и «0»: есть соль или её нет. Картинки были небольшого размера, буквально 101 на 101 пиксель. В тестовых данных по заданной иллюстрации нужно было предсказать, где находится соль.

Исходная задача. Слева картинка, справа солевая маска

Исходная задача. Слева картинка, справа солевая маска

У меня не было опыта конкретно в сегментации изображений, поэтому я взялся за задачу по моему любимому принципу — чтобы чему-то научиться. Соотвественно, у меня не было готового кода, пришлось потратить месяц, чтобы написать «скелет». Получился достаточно объёмный проект.

Когда код был написан, я не знал, что делать дальше. Читал статьи на arxiv, medium, habr, пролистал весь Slack-канал сообщества Open Data Science. В итоге у меня в Google Doc набралось 20 страниц из того, на что следовало обратить внимание/попробовать сделать. Наверное, я бы не завершил соревнование, потому что цели достиг ещё в середине пути — познакомился с сегментацией, пощупал её и тем самым получил новые знания.

Но так вышло, что к этому моменту я достаточно высоко поднялся на лидерборде. Решил — почему бы не побороться до конца. Дошёл до 10 места и застрял там, хотя модели постоянно улучшал. А потом вообще резко покатился вниз. Тот самый момент, когда тяжелее всего продолжать работать. Ты вроде бы достиг цели — знания получил — и не видишь смысла дальше себя мучить.

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

В этот момент я нашёл парня из Японии с ником phalanx, который участвовал один и был на 8 месте. Честно говоря, боялся ему писать. У него было всего пару соревнований и совсем не выдающийся профиль. У меня даже были подозрения, что это фейковый аккаунт, который завела какая-то из команд, чтобы было больше возможностей тестировать идеи. Либо новичок, который, возможно, нарушил правила, вырвался вперёд, и его потом дисквалифицируют — а значит, и меня. Но в итоге решил: пан или пропал, всё равно один бы не вытащил.

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

Финальный лидерборд, белорус и японец на 1-й строчке

Финальный лидерборд, белорус и японец на 1-й строчке

За четыре дня до конца соревнования японец начал настаивать: «Давай всё-таки проверим наше решение, вдруг оно не сработает». Я знал, что сработает. И действительно: мы отправили его на Kaggle, и оно сразу вышло на первое место. Последние дни мы прыгали с места на место, но ниже пятого не опускались, а после теста на приватной части уверенно закрепились в лидерах.

Работая в паре с японцем, я получил достаточно интересный опыт. Хотя  у него был не очень прокачанный аккаунт, он прочитал много научных статей, у него были интересные идеи, хорошее решение. Но коммуницировать с ним было сложно. Голосом мы ни разу не общались. Переписывались в Slack, и то у него были трудности с английским. Либо он не понимал меня, либо сам писал что-то непонятное. Мне приходилось писать ему одни и те же мысли несколько раз, пробуя разные речевые обороты. К концу соревнования заметил, что пишу на самом базовом английском, простыми слова, без предлогов и времён. Он мне отвечал точно так же.

​технические детали решения b.e.s. и phalanx

архитектура сети

архитектура сети

Наше итоговое решение основано на модификациях U-Net архитектуры с претренированными на ImageNet-е энкодерами: ResNet34 и ResNeXt50.

Основные блоки, которые мы добавили в U-Net:

  1. Attention-блок вида Concurrent Spatial and Channel Squeeze & Excitation (scSE) в энкодер и декодер
  2. Attention-блок вида Feature Pyramid Attention (FPA) в среднем блоке U-Net-a
  3. Конкатенация всех выходов декодера, с использованием Hypercolumns

Обучение моделей состоит из 3 частей. На первой стадии мы использовали только тренировочные данные. На второй и третьей стадиях использовались как исходные тренировочные данные, так и псевдолейблы, полученные из тестовых данных. На каждой из стадий мы активно использовали Snapshot Ensembling с Cosine Annealing LR (от 3-ех до 6-ти циклов).

Общее время, чтобы обучить финальную модель с нуля на одной GTX1080Ti, составляет около 16-ти дней.​

На одном из митапов ты говорил, что Kaggle помогает тебе «в жизни». Что ты имел в виду?

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

Я бы не сказал, что есть какая-то прямая зависимость зарплаты от количества побед на Kaggle. Но это прокачивает твои навыки, за которые работодатель готов платить больше. Соответственно, растёт твоя стоимость на рынке.

Kaggle в большей степени полезен для начинающих или для продвинутых?

Я бы сказал, что это площадка и для начинающих, и для продвинутых Data Scientist’ов.

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

Каков минимальный багаж для того, чтобы начать участвовать в соревнованиях?

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

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

С новичками понятно. А зачем Kaggle продвинутым?

На работе ты делаешь одни задачи, а на Kaggle можно попробовать что-нибудь кардинально новое. Также в турнирах можно получить навыки, которых тебе не хватает в определённом домене. Плюс всегда можно побороться за приз. Они на Kaggle неплохие, суммы могут доходить до $100 тысяч.

Как побеждать и зарабатывать суммы «до $100 тысяч»?

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

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

Может помочь просто опыт работы с данными: от сбора до продакшена. На соревнованиях процесс Data Science немного отличается от того, к которому мы привыкли на работе. В компании тебе нужно первым делом понять, какую проблему мы решаем. Дальше — какие данные у нас есть и какие нужны, чтобы найти решение. Затем данные нужно откуда-то достать. И только в этот момент ты получаешь датасет, похожий на тот, что у тебя есть на Kaggle. На соревнованиях же у тебя уже есть данные и метрика. Твоя задача — оптимизировать эту метрику. Не лишним будет понимать, откуда возникла эта задача, а также полезно немного разбираться в домене.

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

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

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

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

Ещё на школьных олимпиадах я сталкивался с проблемой: не хватало времени на обдумывание задачи и поиск решения. Напротив, на долговременных турнирах, где было время для манёвра, я показывал хорошие результаты. Видимо, это качество нашло отражение и на Kaggle. Я пробовал участвовать в других соревнованиях, похожих на хакатон. Там конкуренция меньше, чем на Kaggle, но у меня никогда не получалось занять призовое место, я держался в топ-5 или топ-10. Соревнования на Kaggle длятся 2-3 месяца, и именно такой формат мне наиболее удобен. Вариант своего решения можно до 5 раз в день отправлять валидатору в виде CSV-файла. Валидатор оценивает результат и отображает скор на публичном лидерборде. 

Интересно, что в последнее время набирают популярность соревнования не с CSV-файлами, а с использованием Docker-контейнеров. Проблема CSV формата в том, что участники могут взять мощный сервер, потратить два месяца на обучение одной модели (или что ещё хуже — учить параллельно десятки и сотни моделей). Потом получить хорошее решение, которое не может быть использовано организаторами конкурса в реальной среде. Поэтому сейчас Kaggle идёт к тому, чтобы делать продакшн-решения, которые сразу после соревнования можно использовать. Для этого устанавливается ограниченный энвайронмент (условно, 4 СPU) и лимит по времени.

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

По теме
Все материалы по теме
Обсуждение