«… осознание того, что я не хочу сужать свое обучение только до одного направления программирования, помогло мне сделать выбор в пользу MSE»
Интервью с выпускником программы
Анваром Тлямовым
Поговорили с выпускником 2023 года Анваром Тлямовым о его пути в программирование, решении уйти в академический отпуск, работе над рекомендательной системой для «Одноклассников» и обучении на нашей программе.
Анвар Тлямов, фото из личного архива
— Ты окончил бакалавриат по направлению «Физика». Как случилось, что ты решил перейти в программирование?
— Да, я окончил бакалавриат по физике в Академическом Университете. Попал туда случайно, практически ничего не зная о нем. Прошел на физику, но со временем понял, что мне не особо интересно. А параллельно с нами учились программисты, с которыми я много общался, и то, что делали они, мне нравилось. Я очень захотел в программирование, но все-таки опасался, что и там мне может не понравиться. В итоге я поступил в Computer Science Center, параллельно обучаясь физике в АУ. Со временем дошло до того, что на парах в университете я доставал книги по алгоритмам или делал домашние задания CS Центра. В таком формате я окончил бакалавриат и уже точно знал, что хочу в программирование, но для этого с моим бэкграундом мне нужна была очень мощная магистратура.
— Как ты выбрал именно «Разработку программного обеспечения» в ИТМО?
— Про «Разработку программного обучения» я узнал случайно: пришел как-то на занятия CS Центра и разговорился с парнем, который пришел на пары в магистратуре, проходившие в том же здании. Мы, кстати, до сих пор с ним общаемся, и даже так получилось, что в итоге выпустились вместе. От него и нескольких других ребят, учившихся тогда на программе, я узнал, что придется страдать, но это в итоге будет того стоить.

На самом деле я выбирал между еще одной программой — магистратурой по машинке в Питерской Вышке, но в итоге осознание того, что я не хочу сужать свое обучение только до одного направления программирования, помогло мне сделать выбор в пользу MSE. Тем более, что в итоге оказалось, что «Машинное обучение» здесь тоже читает Алексей Шпильман.
— Как прошел первый год обучения?
— Это было очень жестко, на самом деле. Из-за пандемии мы учились удаленно, я даже толком не знал своих однокурсников в лицо, потому что виделись мы один раз. Я постоянно сидел дома: работал и учился. Многие мои однокурсники тогда решили уйти, потому что достаточно высокая нагрузка вкупе с вынужденным затворничеством — тяжелое испытание. Но я решил, что уходить в первом семестре — это слишком, и задался целью окончить его на нормальные оценки. Со второго семестра стало уже легче, хотя иногда я все еще не высыпался, и с утра до ночи только и делал, что учился. В это время у нас шел курс «Программирование на Java», который читал Антон Михайлович Кузнецов, пожалуй, самый сложный курс этого семестра.
— А что с машинным обучением?
— Я сейчас работаю с машинкой. На самом деле началось это все с проектной деятельности на MSE. Во втором семестре я работал над проектом от «Одноклассников», отобрался я на него буквально за 10 минут, и в потом даже прошел на стажировку. Над проектом мы работали вчетвером, но к концу осталось двое: я поднимал backend, а второй человек — ML. И соглашаясь на стажировку, я думал, что так же буду работать с backendом, но оказалось, что теперь мне нужно было взять на себя ML. Для меня это стало вызовом: за три месяца мне нужно было закрыть очень много пробелов, чтобы и дальше остаться в компании. Спойлер — у меня все получилось.
— А как ты совмещал работу с учебой?
— Честно признаться — с трудом. У меня была работа на 20 часов, обучение в CS Центре и собственно на MSE. И уже в третьем семестре я понял, что слишком сложно совмещать, поэтому нужно решить: уходить с работы или брать академ. Я решил, что лучше приду доучиться, получив крутые скилы на работе. Я взял академ и вышел работать на 40 часов в неделю, работал много и вник в кучу деталей, и за полгода поднялся с позиции джуна до мидла. Осенью я вернулся к учебе и снова взял третий семестр, потому что как раз в нем не дозакрыл Java. Все остальные курсы я перезачел, а Java сдал на максимальный балл. По ощущениям учиться стало легче, потому что скиллы уже развились на работе. А в последнем семестре на некоторых парах мне удавалось даже поспорить с преподавателями о том, как те или иные вещи работают в конкретных случаях.
— Как тебе сейчас кажется, взять академический отпуск тогда было правильным решением?
— Я все еще считаю, что да. Несмотря на то, что я потерял год, приобрел я очень много. Однако такое решение нужно принимать с учетом всех рисков и полным пониманием того, что именно для тебя лучше в данный момент, а универсального средства нет. Для меня практический опыт в компании на тот момент был релевантнее, так как он открывал много дверей и укреплял теоретические знания.
— А твой диплом был связан с работой?
— Да, я пришел к своему тимлиду и предложил сделать то, что полезно и с научной точки зрения, и для «Одноклассников». Он предложил попробовать решить давно существовавшую проблему с рекомендательной системой: их модель работала очень некорректно и выдавала нерелевантные предложения. Этот проект как раз был достаточно объемным и подходил для диплома, а задача казалась интересной.
— То есть ты написал рекомендательный алгоритм для «Одноклассников», который они используют и сейчас?
— Да, мой алгоритм уже внедрен для неподписной ленты. Сейчас я уже не работаю в компании, но как раз перед моим уходом мы проводили финальные тестирования, которые прошли успешно, и сейчас алгоритм раскатан на всех пользователей.
Мои коллеги, которые остались в компании, рассказывали мне потом, что с этим алгоритмом они теперь выступают на различных конференциях, настолько классной получилась модель.
— А расскажи, пожалуйста, подробнее про задачу и старую модель?
— Моей задачей было создать максимально релевантную неподписную ленту, т. е. ту, в которой нет публикаций из сообществ, на которые подписан пользователь, или от его друзей. Главный показатель эффективности таких моделей — количество лайков и просмотров, это значит, что модель подобрала действительно интересные посты для этого пользователя.

Как правило для таких моделей берутся интересы человека и записываются через вектора, на одного пользователя — по три вектора. Затем три этих вектора раскидываются в n-мерном пространстве и ищутся ближайшие вектора постов. Соответственно самая сложная задача — правильно векторизовать посты. Эта система в старой модели очень плохо работала для текстов и изображений, а для видео ее вообще особо не было. Могло быть так, что на интерес «рыбалка» выдавались картинки с маникюром, например.
— А в чем заключался твой подход?
— Можно векторизовать пост несколькими способами. Например, достать фотографию, текст или какие-то другие данные, а потом при помощи моделей попытаться превратить все это в один вектор. А можно использовать коллаборативную рекомендательную систему, которая учитывает лайки, приближая вектора похожих постов. Я решил объединить оба этих подхода. Я разделил работу модели на две стадии: извлечение контента и использование лайков и дизлайков пользователей для приближения и отдаления векторов соответственно. Для того, чтобы понять, какие метрики вообще имеет смысл анализировать пришлось перебрать множество теорий и подходов, но в итоге все заработало. Постепенно я добавлял более сложные фичи, но базовый сценарий работал так.
— Как проходило тестирование и внедрение модели?
— На офлайн-тестах алгоритм показывал себя очень хорошо, но не было понятно, как отреагируют на него реальные пользователи. Но перед тем, как раскатать алгоритм на пользователей, нужно было намайнить данные за последние 6 месяцев, чтобы создать векторные пространства. Тут к моей работе подключился DevOps, до этого я занимался моделью один. Затем мы постепенно раскатывали модель на пользователей и наблюдали за тем, насколько эффективно она работает. Все шло отлично, поэтому сейчас этот алгоритм базовый для неподписной ленты «Одноклассников».
— А где ты работаешь теперь? Сейчас твоя работа связана с машинным обучением?
— После «Одноклассников» я почти полгода искал работу, потому что хотел в международную компанию, а опыта собеседований у меня толком не было. Я много «тренировался» на российских компаниях и быстро начал получать офферы, но моей целью было переехать в другую страну. Набравшись опыта, я уже намного увереннее шел на собеседования в международные компании. В трех случаях я дошел до финала, и все эти компании были из Сербии, где уже жили мои друзья. К сожалению, оффер ни из одной этой компании я не получил, но в Белград все же переехал и устроился в Rubbles. Я, конечно, погрустил, что это не совсем то, чем я бы хотел заниматься, но надеялся, что мне все же понравится. Однако проработал я там всего месяц, потому что достаточно быстро понял, что задачи мне не интересны совсем. В это время мой друг как раз уходил из стартапа, который занимается генерацией изображений, и порекомендовал меня на свое место. Я успешно прошел собеседование и теперь работаю в Majoritas. Пока мне очень нравится: и задачи интересные, и я наконец-то работаю в международной компании.

Я уже справился с первым челленджем в этой компании: за месяц написал генератор изображений, который заменил Mid Journey. Он работает сейчас на трех сайтах. Мои коллеги вообще думали, что это неосуществимая задача, но у меня все-таки получилось. Теперь они спрашивают, смогу ли я ChatGPT заменить. Заменить его целиком я пока не берусь, но уже работаю над моделью, которая умеет переписывать новостные статьи.
— Расскажи, пожалуйста, подробнее о своей текущей задаче?
— Текущий продукт мы делаем для СМИ. Например, какая-то новость появляется в Google News, и издания хотят разместить ее у себя, и тут есть два варианта — скопировать ее один в один или переписать. Как правило издания выбирают второй вариант, но это может быть очень трудозатратно, поэтому для решения этой задачи используется Chat GPT. Однако новости как правило нужна какая-то картинка, и вот наша моделька умеет в один клик делать и то, и другое. Если пользователю нужно изображение, то достаточно поставить об этом отметку, и тогда для текстовой части запрос отправится в Chat GPT, а для изображения — на наш сервер, где работает моя модель, которая создает картинку по заголовку статьи. По времени это все занимает меньше минуты. Также наш функционал может принять на вход несколько статей для генерации одной статьи, основываясь на всей информации.

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

Вторая проблема, которую уже много кто обсудил, — это руки и глаза, когда на сгенерированной картинке пальцев или глаз сильно больше чем нужно.

Третья проблема — это тексты на изображениях. Пока нейросети не умеют с этим работать. Например, если на изображении будет газета, то текст на ней будет просто набором символов. Я вот сейчас сосредоточился на том, чтобы обучить модель не вставлять вообще никакого текста. А над тем, как заставить модель писать что-то релевантное я пока еще работаю.
— Есть ли отличие между работой в стартапе и большой корпорации?
— Разница определенно чувствуется в темпе: в отличие от VK здесь все происходит очень быстро. Если в VK счет по задачам шел на месяцы, тот тут на дни. Мы чаще созваниваемся и обновляем статусы. Главная цель стартапа — как можно быстрее вывести продукт на окупаемость, мы действительно быстро принимаем решения. Нас, к тому же, не так много — около 50 человек, причем я единственный ML-специалист, т. е. я и определяю работу в этом направлении, и выступаю в роли тимлида. Мне такое развитие очень нравится.
— Давай поговорим еще немного о твоем обучении. Какие курсы в магистратуре запомнился тебе больше всего? И что оказалось самым полезным?
— Больше всего однозначно запомнилось «Программирование на Java». Но этот курс был действительно классным, с очень полезными домашками, типа написания собственного торрента или GitHub. Я сейчас смотрю на все курсы, которые у нас были, и мне кажется, что они отлично работают все вместе. На каждой дисциплине ты узнаешь какие-то детали, которые в итоге позволяют собрать полноценную картину. Так как я давно неравнодушен к машинному обучению мне был очень интересен курс Алексея Шпильмана, я вообще в восторге от его стиля преподавания — лекции как будто даются ему совершенно без напряжения. На этом курсе он осветил много базовых вещей, но при этом раскрыл и множество нюансов — все, о чем он говорил, пригодилось на собеседованиях, так что это еще и отличная подготовка к ним. Мне еще нравились наши хакатоны DevDays, потому что на них ты мог безболезненно примерить на себя различные роли в команде и понять, что тебе действительно ближе. К тому же, на таких хакатонах ты еще учишься очень быстро находить общий язык со всеми членами команды и слаженно работать вместе. Для будущей работы это очень нужный навык. Из полезного лично для меня — я там научился отчитываться, потому что в первые разы я сыпал много технической информации, а потом мне подсказали, что так делать не стоит. А еще за время магистратуры я научился объяснять что угодно о программировании кому угодно, это действительно очень важный навык.
— Что бы ты посоветовал людям, которые вот только сейчас собираются на MSE поступать?
— Не отчаиваться. Постарайтесь осознать, что первый семестр действительно сложный, и на него нужно будет потратить много сил и времени. Но потом станет проще. Я считаю, что для тех, кто хочет быть хорошим программистом, эта магистратура — очень сильный буст. Приведу метафору про мой путь: давайте представим корабль, который сначала плыл в сторону физики, но я понял, что туда плыть не хочу и взял курс на CS центр, это был такой небольшой поворот. А вот когда я решил пойти учиться в эту магистратуру, то это был такой прям резкий поворот на 90 градусов, а при такой смене курса очень важно проследить, чтобы корабль не рухнул в воду и не затонул. А если с этой задачей получится справиться, то дальше все уже будет хорошо.