Лето — пора отпусков, каникул и, конечно же, стажировок. Будучи студентом третьего курса по направлению «Прикладная математика и информатика» Иркутского государственного университета, ими я интересовался больше всего. Мне посчастливилось на три месяца присоединиться к службе компьютерного зрения Яндекса. В этом посте я хочу рассказать, каково быть стажером в Яндексе, какие на самом деле задачи перед ними ставят, и что вам вообще за все это будет. Признаюсь, я прошел отбор не без труда, поэтому думаю, что мой пост может быть полезен тем, кто сейчас планирует свое лето.
Команда компьютерного зрения и я в серой футболке
Как это начиналось
Сложности подстерегали меня еще на этапе заполнения анкеты — несколько часов кропотливого труда по заполнению формочек были безжалостно уничтожены ночным обновлением системы. Не идеально, по моему мнению, решив тестовые задачи, я почти начал сомневаться в своих шансах. И вдруг мне ответили и предложили познакомиться с группой нейросетевых технологий, входящей в состав службы компьютерного зрения, так как я указал это направление в своих интересах. Поговорив с сотрудниками Яндекса «за жизнь» и обсудив возможные задачи, я принялся за работу над новым тестовым заданием — построением текстового классификатора.
Два финальных собеседования, месяц ожидания, и вот — заветный звонок с предложением пройти стажировку в период с 16 июня по 15 сентября. Единственное, что мне оставалось сделать, это собрать свой чемодан. Перелет и проживание — всё это было заблаговременно организовано кураторами летней стажировки, за что им большое спасибо. 16 июня я пришел в главный офис Яндекса, где вместе еще с парой стажеров прошел процесс трудоустройства и наконец-то смог начать плодить баги приступить к исполнению стажерских обязательств.
О работе
В начале пара слов о том, зачем Яндексу нужна служба компьютерного зрения. Во многих задачах нам бы хотелось понимать, что изображено на картинке: например, чтобы находить по запросу наиболее релевантные изображения или же, в случае покупок, похожие товары. Объем данных, которые надо учитывать, зачастую настолько большой, что нет никакой надежды найти достаточное количество людей для просмотра всех изображений, не говоря уже о затратах для подобной затеи. Так почему бы нам не научить компьютеры заниматься распознаванием картинок? Несмотря на то, что в 1966 году такая задача выглядела как проект на лето для группы студентов MIT, лучшие умы планеты до сих пор бьются над ней. Не секрет, что на данный момент в этой сфере правят бал искусственные нейронные сети, прекрасно подходящие для работы с изображениями, а также текстами, звуками и многим другим. Собственно разработкой и внедрением нейросетевых подходов к задачам с изображениями для нанесения непоправимого профита и занимается служба компьютерного зрения Яндекса.
Стоит отметить, что стажеры в Яндексе — это полноценные сотрудники, и задачи перед ними ставятся такие же, как если бы они уже были в штате. Конкретно в нашем отделе стажерам отдаются реально самые интересные задачи. Например, мне дали возможность не только поработать над внутренними инструментами, но и самому обучать нейросети для Яндекс.Маркета (распознавание не подходящих объявлений) и Авто.ру (определение ракурса автомобиля). Конечно, у меня также был ментор, который определял приоритетные задачи и следил за прогрессом, но в остальном дается очень большая свобода выполнения.
Вообще обучение нейросетей дело нехитрое, тем более сейчас, когда в интернете есть огромное количество различных курсов и материалов, посвященных машинному обучению и нейронным сетям. Это позволяет довольно быстро вникнуть в эту сферу и сразу же начать работать. В моем случае «сразу» — это примерно две недели, в течение которых я разбирался во всем разнообразии технологий компьютерного зрения внутри Яндекса, и еще две недели на то, чтобы отправить первый коммит на код-ревью. Огромное спасибо моему ментору и другим коллегам, которые тратили часы своего времени на то, чтобы объяснить мне, как сделать то, на что у них бы ушли минуты!
Когда задача поставлена и ясна метрика качества, наступает этап сбора данных. Обычно это сотни тысяч или даже миллионы картинок, на сбор которых уходят целые дни. Редко когда необходимо обучать нейросеть с нуля. Чаще всего берется уже хорошо обученная сеть для похожей задачи с надеждой на то, что она уже умеет извлекать какие-то полезные для нас признаки в каких-то слоях (без веры и здорового оптимизма в нашем деле никуда). На основе подсчитанных признаков обучается что-нибудь очень простое, скажем, несколько полносвязных слоев, и, если полученное качество удовлетворяет сервис, модель отправляется в продакшн. В теории подобный подход очень хорошо работает на типовых задачах — вроде тех, которыми занимался я. Но, как известно, «в теории нет разницы между теорией и практикой, а на практике — есть». Поэтому часто наша работа включает в себя чтение и разбор научных статей, подбор архитектуры нейросети, подбор параметров обучения и много других разных трюков и плясок с бубном. Обсуждение идей — важная часть процесса, поэтому в нашей команде проходило много внутренних и внешних встреч, чтобы все были в курсе того, чем занимаются их коллеги.
Отдельно хочется поговорить о коллективе и сотрудниках Яндекс. Первое, что бросилось мне в глаза, — это большой процент молодых людей в компании, в том числе среди разработчиков. Бытует мнение, что сюда в основном набирают суровых олимпиадников из топовых вузов, а на самом деле набирают только выпускников ШАДа, что не совсем правда, хотя таких людей здесь действительно много. Но Яндекс очень много занимается различными образовательными проектами и курсами повышения квалификации, так что много новых кадров приходит и оттуда.
Частично из своего опыта и в большей части из опыта текущих сотрудников могу сказать, что отсутствие хорошего университета в резюме или опыта участия в контестах не будет записано кандидату в минус, гораздо больший вес придается навыкам и знаниям, непосредственно имеющим отношение к деятельности разработчика. Возможно, мне постоянно везет на хороших людей, но за все время у меня ни разу не было плохого опыта в общении с кем бы то ни было в Яндексе, а это не только всевозможные разработчики и аналитики, но также охрана, врачи, служба поддержки, хозяюшки и другие. А уж свою команду я вообще считаю образцово-показательной как в плане достигаемых результатов, так и в плане того, насколько в ней комфортно работать.
Три месяца летней стажировки пролетели в одно мгновенье, и мне совсем не хотелось покидать свою уже полюбившуюся команду. К счастью, Яндекс набирает стажеров круглый год, поэтому я смог вернуться в ту же команду зимой, на период с 16 декабря по 3 марта. В общем-то, вторая стажировка ничем не отличалась от первой: я фактически продолжил заниматься всем тем же, разве что у меня поменялся ментор, и мы с ним теперь уже вместо картинок анализировали видео. Все-таки это был мой второй раз в качестве стажера, поэтому я был повышен до старшего стажера, a.k.a. Senior Intern. К этому моменту наша команда уже солидно разрослась, что вызывало определенные трудности в работе — теперь не так-то просто во время обеда всем усесться за соседними столами.
Жизнь и быт стажера
Летом меня вместе с другими стажерами и участниками образовательных проектов Яндекса поселили в центре Москвы, благодаря чему дорога до офиса занимала около получаса. Иногда для нас устраивались различные мероприятия, как например пешая прогулка по городу или совместное подписание NDA :) Больше всего мне запомнился день летнего стажера: куча беготни, решение логических пазлов, а в конце — пицца и футболки! Ну где еще вам предложат расшифровать сообщение на Whitespace? Конечно же, Яндекс устраивает мероприятия не только для своих стажеров, но и для всех сотрудников. Мне лето 2016 года также запомнилось летней Олимпиадой, для которой Яндекс подготовил несколько спецпроектов, некоторые из которых были придуманы на внутреннем хакатоне. Так уж вышло, что первую стажировку я практически закончил корпоративом, а вторую стажировку начал с празднования на новогоднем корпоративе. Зимой же мне удалось попасть на экскурсию по офису. Может показаться, что стажировка это сплошное веселье — так оно и есть!
Исходя из своего опыта, хочу отметить минусы и плюсы стажировки в Яндексе:
Те моменты, которые, на мой взгляд, можно назвать минусами:
- Специфичность опыта. Яндекс — это технологическая компания, и многие интересные задачи в ней уже решены. К сожалению, ценность опыта использования этих решений где-то за пределами Яндекса не всегда очевидна.
- Мотивация. Поработав над решением сложных и интересных задач, очень сложно заставить себя вернуться к обыденной учебе в университете. После запуска десятков, а то и сотен экспериментов на целом кластере машин, чтобы получить результат лучше, чем у кого-либо, энтузиазма для работы над курсовой работой едва ли хватает. Есть люди, для которых эта громадная пропасть между работой и академической деятельностью стала одной из причин ухода из аспирантуры. Хотя в Яндексе есть и группа исследователей, которые занимаются научной работой.
Плюсы:
- Опыт. Помимо приятной строчки в резюме, здесь можно получить важные профессиональные навыки: писать чистый код, планировать свои задачи, знать state-of-the-art подходы и продакшн решений. Яндекс поддерживает стремление сотрудников расти в профессиональном плане: здесь вам и различные мероприятия и воркшопы по программированию, и наличие собственной библиотеки, и регулярные командировки на конференции. В службе компьютерного зрения практически каждый сотрудник раз в год ездит на одну из топовых конференций, таких как NIPS, ICML, ICLR, CVPR и т.д. Но для того чтобы знать самые передовые разработки в своей области, не обязательно куда-то уезжать — регулярные семинары с разбором научных статей позволяют всегда оставаться в курсе последних результатов.
- Офис. Честно признаюсь, порой совсем не хочется уходить из офиса. И дело тут не в том, что у тебя вечно горят дедлайны и нужно срочно исправлять баги (ни разу не заметил подобного в нашем отделе), а в том, насколько здесь комфортно находиться. Благо, офис работает 24/7, и можно всегда прийти поиграть в пинг-понг или настольный теннис (или поработать).
Я считаю, что это крутой опыт. Яндекс набирает стажеров на лето каждый год. Сейчас еще есть возможность с пользой провести своё лето — прием заявок ребята закончат первого мая. Если вы хотите проходить стажировку в Москве, вам, как и мне год назад, оплатят проезд и проживание. А если в вашем городе есть офис разработки Яндекса, то можно никуда и не уезжать.