Как мы провели соревнование вместо тестового на стажировку в DS-команду
Привет! Я Дима Иванков, ML-разработчик из Контура, работаю в лаборатории компьютерного зрения. Контур ежегодно проводит летнюю стажировку, в том числе для датасайентистов. Конкуренция на стажировку высокая, поэтому отбор важно автоматизировать. Но и нужно выделяться среди других компаний, чтобы привлекать талантливых кандидатов. Так что процесс отбора должен быть увлекательным и оставлять место для творчества.
Обычный формат тестового задания — задача и датасет — требует много времени на проверку и не дает кандидату возможности проявить себя в открытой конкуренции. И с прошлого года мы начали проводить отбор в виде data science соревнования, о чем расскажем в этой статье.
Выбор задачи
В Центре ИИ Контура есть несколько направлений: NLP, speech, CV и классический machine learning. Мы набираем стажеров в каждое из них. Конечно, здорово было бы сделать несколько соревновательных треков, но это увеличивает организационную нагрузку, поэтому пока ограничиваемся одним.
Оба года подготовкой соревнования занималась Лаборатория компьютерного зрения и задачи были про изображениях: в прошлом — детекция объектов, в этом — классификация. Мы понимаем, что у кандидатов разные интересы и опыт, поэтому выбираем задачи, доступные широкому кругу участников (то есть никаких 3D-реконструкций).
Но простую классификацию котов и собак делать не хотелось и мы начали с вопроса «Что сейчас хайпует в CV?» — конечно же, генерации! В прошлом году мы уже генерили данные для задачи детекции. А в этом году решили пойти от проблем, которые принесла генерация изображений, и предложили участникам обучить модель отличать сгенерированные изображения от реальных фотографий.
Сбор датасета
Сначала мы планировали использовать реальные данные, но быстро отказались от этой идеи — найти нечувствительные данные сложно, а их анонимизация требует значительных усилий.
Поэтому мы выбрали тему «обычные сцены из жизни обычных людей» и нашли открытый датасет с реальными фото на Kaggle. Класс сгенерированных картинок собрали сами: написали промпты, которые описывают реальные фото из датасета, и сгенерировали картинки с помощью Stable Diffusion и DALL·E 3.
Итоговый датасет включал около 1500 изображений с дисбалансом классов примерно 2:1 в пользу реальных изображений. Данные разделили на train и test в соотношении 2:1 с одинаковой пропорцией реальных и сгенерированных изображений. Для оценки на лидерборде выбрали метрику log loss.
Часть сгенерированных изображений в нашем датасете легко распознать, но для других нужно напрячь свое реальное, а не компьютерное зрение. Конечно, получить идеальные результаты на открытой части тестовой выборки можно было и не обучая модель. Поэтому мы сразу предупредили участников, что нет смысла размечать тестовый датасет вручную, потому что будет проверка на private части датасета (сплит на public/private был 50/50), а лучшие решения будут проверяться дополнительно. Конечно, некоторых это не остановило, но метрики на private части датасета нам все рассказали :)
Чтобы проверить, насколько внимательно кандидаты проведут EDA и как справятся с проблемами, мы оставили в данных немного «грязной» разметки и некорректных файлов.
Мы не запрещали использовать сторонние данные, но поставили условие, что нужно быть готовым рассказать, откуда они взялись.
Какая интересная техника игры на гитаре — как думаете изображение сгенерировано или нет? :)
Проведение соревнования
В качестве платформы мы второй год выбираем Kaggle, потому что она бесплатная и удобна как для организации и для администрирования соревнований, так и для участников.
В прошлом году у нас были проблемы с метриками для CV-задач, но за прошедший год Kaggle добавил много новых готовых вариантов, и в этом году мы уже не сталкивались с трудностями. Но если вы планируете проводить соревнование, советуем заранее проверить, что на платформе есть готовые инструменты для вашей задачи. Особенно, если она отличается от задачи на табличных данных.
Подготовленные данные легко загрузить на платформу и настроить соревнование — установить ограничения на размер команды (для конкурса на стажировку мы разрешали только команды по одному человеку), количество сабмитов в сутки и период проведения.
Дальше просто: наблюдаешь за лидербордом, иногда отвечаешь на вопросы участников — и всё.
Следить за ходом соревнования особенно интересно, когда у тебя есть доступ к private части лидерборда :) Например, были участники, которые быстро получили идеальную метрику и привлекли к себе наше повышенное внимание, а потом мы наблюдали их полеты по результатам между public и private частью лидерборда.
Приятным доказательством, что мы подобрали интересную тему для соревнования, были для нас обсуждения подходов к нашей задаче в профильных чатах. И судя по отзывам участников (а мы просили дать нам обратную связь) им тоже понравилось:
Результаты
В этом году в нашем соревновании поучаствовало 182 кандидата, которые сделали в общей сложности около 2500 тысяч сабмитов. После подведения итогов соревнования мы отобрали 30 лучших участников, попросили их подготовить развернутое описание решения. Из них 12 человек пригласили на интервью, а 4 лучших из них — на стажировку. И они действительно оказались крутые — все успешно прошли стажировку и теперь работают с нами.
Подводя итоги, хочется выделить следующие, на наш взгляд, важные моменты:
Соревнование — это отличный формат для отбора кандидатов. Главное удачно подобрать тематику и задачу.
Именно этот формат позволяет полноценно и с разных сторон оценить кандидатов для стажировки.
Kaggle — по-прежнему одна из самых удобных платформ для организации и администрирования соревнований. Несмотря на временны́е затраты при первоначальной подготовке, сам процесс проведения прост, а результат легко переиспользовать — можно перезапустить соревнование для новых участников в любой момент, и для того не требуется никакой дополнительной подготовки.
В общем, для нас опыт показался исключительно положительным. Мы и в будущем планируем проводить один из этапов отбора на стажировку именно в таком формате.