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

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

Евгений Бабахин участвует в соревнованиях на 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) и лимит по времени.

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

По теме
Все материалы по теме

Хотите сообщить важную новость? Пишите в Телеграм-бот.

А также подписывайтесь на наш Телеграм-канал.

Читайте также

10 айтишных профессий, которым можно не бояться AI и автоматизации
10 айтишных профессий, которым можно не бояться AI и автоматизации
10 айтишных профессий, которым можно не бояться AI и автоматизации
1 комментарий
Кто такой Data Scientist. Обзор изнутри от Арсения Кравченко
Кто такой Data Scientist. Обзор изнутри от Арсения Кравченко
Кто такой Data Scientist. Обзор изнутри от Арсения Кравченко
dev.by запускает цикл материалов про ИТ-специальности. Каждую из них опишет «типичный представитель» — опытный специалист. Мы надеемся, что цикл поможет школьникам, студентам, переквалификантам, джуниорам и сочувствующим выбрать специальность в ИТ, оценить свои перспективы или просто сверить часы с авторитетным коллегой. Можно обсуждать и дополнять материал в комментариях, чтобы сделать его ещё полезней. Автор поддержит дискуссию и ответит на вопросы. Сегодня представитель сообщества Open Data Science, ML инженер и автор Telegram-канала partially unsupervised Арсений Кравченко рассказывает про Data Scientist. 
27 комментариев
LinkedIn опубликовал список самых перспективных профессий
LinkedIn опубликовал список самых перспективных профессий
LinkedIn опубликовал список самых перспективных профессий
«Технические вопросы не задавали». Единственный Grandmaster-белорус на Kaggle — о проекте, который предпочёл Фэйсбуку
«Технические вопросы не задавали». Единственный Grandmaster-белорус на Kaggle — о проекте, который предпочёл Фэйсбуку
«Технические вопросы не задавали». Единственный Grandmaster-белорус на Kaggle — о проекте, который предпочёл Фэйсбуку

Обсуждение

2

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

Спасибо! 

Получать рассылки dev.by про белорусское ИТ

Что-то пошло не так. Попробуйте позже