В IT в 30. Как я стал solo Kaggle Grandmaster, устроился на работу, но так и не стал программистом

9729b92846f1f35f6760ecb7f21e3377.png

Всем привет, меня зовут Крамаренко Владислав. В этом году мне исполнилось 30 лет, а также случилось много событий, в том числе и позитивных. Во первых, я устроился на вторую в жизни работу (и первую в айти), а во вторых, стал грандмастером. Это сложный путь, на котором было несколько ключевых решений, которые привели меня к себе нынешнему. О нём я и поделюсь далее, начав с детства.

Детство

Я родился в селе на дальнем востоке в простой семье учителя и военного и первое время выживал только благодаря огороду. Но в 4 года, когда родители переехали в региональный центр, всё изменилось. И хоть это принесло в жизнь нотки криминальных 90-х (кражи, стрелки, расстрел машины на моих глазах и др), это так же дало доступ к учителям более высокого уровня, которые привили мне любовь к техническим наукам.

Следующее событие случилось в 5 классе, когда, на заработанные мною в музыкальном школе деньги, мне купили Денди. Тогда я проникся, какие же это крутые ребята — разработчики. Они написали тысячи строк кода, а получилось такое великолепие.

Mario Bros. Единственная игра, в которую я играл с отцомMario Bros. Единственная игра, в которую я играл с отцом

Через год мать взяла с собой на работу в университет, где был один из немногих ПК в городе, и я сразу залип. Не то, чтобы там было много игр, но хватало и поле чудес. (до сих пор жду миллиард, на котором зависал пк). Увидев интерес, родители решили меня порадовать и купить уже по-настоящему персональный компьютер. И я покатился по наклонной.

Первую винду я переустановил в 12 лет. Когда нахватало места на диске, емкостью в 40 гб, я удалил драйвера на видеокарту, после чего уменьшилось разрешение экрана и перестали запускаться игры. Я запаниковал, и не нашел ничего лучше, как переустановить 98ю винду.

Далее был момент, когда в 8 классе родители решили отдать меня в лучшую школу города, где были подготовительные курсы, в том числе, почему-то, по программированию на языке Pascal. Это первый и последний раз, когда я очно изучал в программировании что-то для себя новое. Важным было одно из последних занятий, где нужно было нарисовать и анимировать взлет ракеты. А это не современные движки, где можно просто двигать объект «картинка с ракетой», там надо было вручную рисовать и стирать каждую линию. В итоге я добавил еще и движущегося человечка и справился быстрее и лучше остальных и, помимо шоколадки, получил уверенность в своих силах.

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

Отрочество

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

Эта концепция и легла за основу моей первой игры. Писал на Паскале, так как ничего другого не знал. Все было хорошо, пока не дошел до части, где нужно было создать ИИ и серверную часть. В качестве ИИ выбрал следующую тактику. Каждый ПК выбирает направление согласно весов клеток. Уже посещенной клетке давалось большое число, и она выбиралась реже для следующего хода. Каждый ход веса всех клеток уменьшались. Таким образом ПК очень редко повторял один и тот же ходы и старался исследовать карту. Каждые n ходов ИИ анализирует k шагов других игроков и если есть похожая область на карте, то, с вероятностью p, начинает преследовать игрока (если новые шаги не противоречат его потенциальному расположению) и после убивает его. Параметры регулируются сложностью игры.

Новая версия, написанная на Unity3d. Версия на pascal не сохраниласьНовая версия, написанная на Unity3d. Версия на pascal не сохранилась

И, если ИИ я в итоге осилил, то с серверной частью не справился. Книжек по программированию у меня не было, да и где искать ответы в моем 64 кбитном интернете я не знал. На этом всё и закончилось. Игра работала, но за время разработки уже надоела.

Затем я начал учить Delphi. В качестве учебного проекта стал разрабатывать игру о персонаже, который просыпается дома с мертвой женой. Его сажают в тюрьму, из которой он и должен сбежать и найти виновных. Это RPG с квестами и выборами реплик, а в качестве экшен части были QTE, заимствуемые из игры фаренгейт. Графику рисовал одноклассник (хотя и не умел). Сложность в разработке опять была в ИИ. Нужно было чтобы противники честно шли за игроком, пока тот в поле видимости, патрулировали территорию и продолжали искать после потери игрока из обзора.

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

Черновая версия редактора картЧерновая версия редактора карт

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

Картинка, нарисованная в 10 лет и по совместительству скрин видеоигрыКартинка, нарисованная в 10 лет и по совместительству скрин видеоигры

Юность

Далее появилась задача поиска университета. Так как разработчиков игр тогда не готовили, а кроме создания сайтов, других отраслей я не знал, то выбор пал на направление инженера. Математику и информатику я знал тогда хорошо, так как выступал на олимпиадах, а вот с физикой были проблемы. Поэтому переехал в Питер и поступил на радиофизику. Изучал Wi-Fi, влияние 5G на коронавирус, занимался схемотехникой, программировал микроконтроллеры на Ассемблер, Verilog и тд. Не сказать, чтобы уровень программирования там был высокий, но общий кругозор сильно расширился.  Так как идти разрабатывать аппаратуру для военных подводных лодок мне не хотелось, то по специальности я почти не работал.

На втором курсе пошел на первое в жизни собеседование, причем в компанию Intel. Там был мой час позора, я даже не смог сказать, что такое преобразование Фурье. Мне сказали, что я втираю какую-то дичь, поэтому я решил, что вернусь уже после окончания вуза. Но наступил 2014 год, и intel в Питере закрылся.  

А так как мне всегда нравилось объяснять сложные темы простым языком, то когда предложили поработать в физцентре 239 лицея, который тогда только открылся, то я согласился. Я был третьим сотрудником, после основательницы и парня, который на следующий год ушел, поэтому пришлось формировать центр. В итоге, через 7 лет, там уже больше 20 человек, а число призеров по физике выросло в 10 раз. Там было много интересного, от организация региона и преподавание в сириусе в Сочи на всеросе на 200 человек, до участие в экспериментальном межнаре и премий правительства. Еще создал сайт с задачами и отслеживанием успехов детей (статья). Единственное, чего не было, это денег. И так как я не считаю себя хорошим педагогом, то через 7 лет, уже выпустив первую группу, я решил, что пора двигаться дальше.

Скриншот сайта с олимпиадными задачами по физике и меню формирования листа для печатиСкриншот сайта с олимпиадными задачами по физике и меню формирования листа для печати

Постепенно продолжал изучил базовый синтексис c#, javasript, php, c++, Unity. Начал делать так же мобильные игры, но все забрасывал после создания основных механик. Сделал умный дом на ардуино и автоматизировал рулонную штору. Но эта часть статьи была удалена.

Выживач. Реализовано: генерация карты, инвентарь, сундуки, строительство, враги(ежи, птицы) смена для и ночи и тд, Из дерева можно добыть яблоки(здоровье и можно посадить для нового дерева) и древесина для строительства. Люблю этот проект, как и все остальныеВыживач. Реализовано: генерация карты, инвентарь, сундуки, строительство, враги (ежи, птицы) смена для и ночи и тд, Из дерева можно добыть яблоки (здоровье и можно посадить для нового дерева) и древесина для строительства. Люблю этот проект, как и все остальныеКартинки, полученные классическими свертками из фото моим редактором изображенийКартинки, полученные классическими свертками из фото моим редактором изображений

Молодость

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

После школьной зарплаты я решил, что пора уже начать обеспечивать семью (которая, правда, пока состоит только из меня одного, пишите в личку) и пойти работать программистом. Из всех вариантов наиболее интересным был путь в датасайнтисты, так как он объединял в себе все мои интересы. Недолго думая, я начал изучать python, проходить курсы по ML и параллельно взялся за проект синтеза речи. Взял готовую реализацию Tacotron 2, начал изучать код, подкручивать гиперпараметры и обучил на русском языке, а потом и на нескольких голосах знаменитостей на небольшом датасете. Как «поет» Путин можно послушать тут. С самого начала у меня была какая-то тактика изучения МО, и я ее придерживался. Всем советую параллельно с теорией иметь какой-то пет-проект. Статья про это.

На второй месяц взялся за усовершенствование под двухязычную модель с клонированием. Пока это делал наткнулся на проект RTVC и перешел на него. Добавил двухязычный g2p с собственным алфавитом и обучил на русском и английском. В итоге получил кучу звезд на гитхабе и написал первую статью на хабр. Это дало некоторую известность и приглашение на второе в жизни собеседование (и первое в Айти). Там, помимо простых вопросов по подходам, нужно было рассказать и про SOTA архитектуры с чем я и не справился.

Архитектура синтеза речиАрхитектура синтеза речи

На третий месяц наткнулся на соревнование по машинному обучению от сбербанка AI Journey, в котором надо было научить машину решать ЕГЭ по русскому языку. Задания были разные. Где-то вставить слово на место пропуска и тут помогал BERT, где-то найти ошибку в слове с чем справлялись словари, а где-то требовались обширные знания, там были смесь кода с трансформерами, pymorphy, словарями и условиями. Все способы шли в бой, так что одно из заданий я вообще решил, просто написав 250 условий. И как-то так вышло, что тестовую часть у меня была лучше остальных участников.  Еще было сочинение, но его я пытался честно сгенерировать с помощью gpt2 у которой тогда не было русской версии, поэтому пришлось обучать самому на colab. Он постоянно отключал меня, а потом и вовсе переставал выдавать видеокарту. Остальные участники собирали сочинение из шаблонов, поэтому получали лучший резкльтат. Но это соревнование дало мне деньги и отсрочило мое устройство на работу еще на несколько месяцев.

У меня не было главной целью найти работу в IT. Я изначально стал этим заниматься так так как с детства любил программировать Если бы не это, то я бы точно всё забросил, потому, что самообучение требует колоссальной мотивации и запаса энергии, которые нужно от куда-то черпать.

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

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

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

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

Затем было соревнование по распознаванию рукописей Петра 1 от Сбера. Тут я использовал две модели. Первая это свертки и рекурентки с СТС лоссом. Идея такая, что после того, как мы применили свертки и сжали картинку по вертикали у нас получились по горизонтали набор векторов, но мы не знаем за какую букву отвечает каждый вектор, причем за каждую букву может отвечать и несколько векторов. Зато мы знаем, что в первом векторе будет, или первая буква, или пока еще слово не началось. Других вариантов быть не может. Во втором векторе может быть, или продолжение первой буквы, или слово еще не началось, или пропуск между буквами, или уже вторая буква. И так далее, а значит мы можем обучать такую сеть. Второй же подход это seq2seq модель, которая так же с помощью сверток получает набор векторов, а потом, с помощью трансформера, буква за буквой будет предсказывать строку с текстом. И такое уже можно обучать кросэнтропией. В итоге, у меня seq2seq модель генерируем несколько предложений, из которых я выбираю лучшее, Одним из критериев выбора, например, было похожесть на выход RNN сетки. Еще одно призовое место.

Далее было соревнование от VTB, где были даны чеки и две задачи по ним. Во первых, предсказать категорию товара (молочка, алкоголь, вода и тд), а во-вторых, найди бренд товара (кола, данон и тд). Лучше всего работали берты, регулярки, fasttext и тд. Еще одно денежное место.

Далее я угорел и начал участвовать сразу в 3–5 соревнованиях на Kaggle. Во-первых, это были соревнования по звуку, в которых у меня уже были наработки, а во вторых, соревнования на текстах, где почти всегда были лучше трансформеры. Единственное, хочу выделить соревнование по нахождению упоминания датасетов в текстах научных статей. Многие так же использовали Бертоподобные архитектуры, на что так же много сил потратил и я, но, оказалось, что регулярки работают лучше. В итоге моё решение это 20 строк, в которых в статье ищутся словосочетания, где все слова с большой буквы, а уже в них хорошие слова (study, dataset, и др) и плохие (university, и др). Ответ это словосочетания с хорошим словом, но без плохого. Это решению дало мне денежное место, так что не всегда нужно мощное железо и большие сети. Четыре месяца трудов дало мне 3 золота и несколько других медалей. Вместе с тем я устал от кагла, и решил, что пора искать работу.

Параллельно с поисками работы было еще одно соревнование — Яндекс cup. Там было три задачи,

  1. Звук. Спотер ключевых слов, решение это просто свёрточная сеть над спектрограммами. 1 место

  2. NLP. исправление токсичных комментариев. Решение — последовательная замена перебором токсичных слов, пока растут метрики. 3 место

  3. Картинки. обучить clip. 5 место

К этому моменту я стал уже более-менее известным, поэтому смог, по рекомендации, устроился в крупную компанию и путь в IT можно считать законченным. А еще через полгода я вернулся на Kaggle и получил 5 золото в еще одном соревновании по обнаружению птиц и стал solo Kaggle Grandmaster.

Если Вы спросите, как мне удавалось почти во всех соревнованиях достигать высоких позиций, в чем секрет успеха, то, к сожалению, у меня нет простого ответа. Надо много работать, и надеяться, что повезет. Поэтому я не уверен в ценности статьи, ведь у всех разный начальный опыт. Я ее писал для ностальгии и по просьбе нескольких людей. Надеюсь, вам было интересно читать. Советы по Kaggle можно почитать тут.

Итого:

  • 2 года пути

  • 2 отклика

  • 9 собеседований

  • 3 оффера

  • 2.5 млн руб выигрыша на соревнованиях

  • Звание Kaggle Grandmaster

Какие курсы я просматривал и могу рекомендовать

  1. ML от ODS

  2. DL от ODS

  3. DL от Deep Learning School

  4. ML от МФТИ и Яндекса на курсере (теперь тут платно)

  5. Курсы Samsung (NLP, CV) на Stepik

  6. Другие курсы на Stepik

Старость

Послесловие. Что-то случилось, и я уволился с работы. Я все еще не умею программировать, не знаю, что такое абстрактный класс, пугаюсь, когда вижу чужой код. Единственные map reduce которые я знаю это функции в python. Молюсь каждый раз, когда делаю каммит в git. А про Jira, Jenkins, Hadoop, даже говорить не буду. Если вы думаете, что за несколько месяцев платных курсов станете хорошими специалистами, то спешу вам разочаровать. Это тяжелый путь с массой проблем, и если сам процесс вам не нравиться, то дальше будет только хуже.

© Habrahabr.ru