Как я работаю: Владимир Кубицкий, Head of AI в ЛУН
[В рубрике «Как я работаю» мы приглашаем гостя рассказать о своей работе, организации воркспейса, полезных инструментах и лайфхаках]
Владимир Кубицкий возглавляет команду искусственного интеллекта в ЛУН, украинской продуктовой компании, которая разрабатывает интернет-проекты в тематике недвижимости. На сегодня проекты компании работают в 37 странах.
В ЛУН он пришел еще на третьем курсе университета и за 4 года прошел путь от позиции продуктового аналитика до создания собственного подразделения по разработке алгоритмов.
О себе
Я вырос в семье физиков. Дедушка был одним из первопроходцев в изучении природы ударов абсолютно твердых тел, написал ряд публикаций и книг о педагогическом аспекте физики, участвовал в разработке первых голограмм. Брат — PhD физики и математики, имеет десятки научных публикаций в передовых изданиях, на данный момент живет во Франции и работает в CNRS над применением новейших ML подходов в ускорителях элементарных частиц. Я всегда равнялся на них и с детства интересовался наукой и технологиями.
Еще в начале
После школы поступил на мехмат в КНУ им. Шевченко, на кафедру математической физики. Выбрал это направление по двум причинам: полностью физика «не отпускала», и именно на этой кафедре работал мой будущий научрук, с которым я хотел написать диплом.
На бакалавриате работал над распознаванием лиц методом Виолы—Джонса на каскадах Хаара. Магистерскую диссертацию писал уже по сверточным нейронным сетям, которые на момент моей защиты более двух лет успешно работали у нас в ЛУН. Так что защититься было не сложно :)
Я получил два приглашения в аспирантуру — в КНУ на кафедру и в Институт математики НАН Украины, но оба предложения пока на паузе. Решил направить все силы на работу.
От анализа к решениям
В ЛУН я пришел более 4 лет назад на позицию продуктового аналитика. Фактически это была моя первая работа — не считая небольшой подработки в «Яндекс» еще в 2013 году.
Первое время я занимался аналитикой продукта, изучал паттерны поведения, использования разных фич, находил проблемные места. И примерно через
Одним из первых моих проектов в этой области была разработка системы, которая анализирует текст и автоматически определяет, кем написано объявление квартиры — собственником или посредником. Большинство людей хотят иметь дело непосредственно с собственником, чтобы не платить комиссию. Также посредники часто размещают фейковые объявления, чтобы им позвонили. А мы, агрегируя все объявления, накапливали на себе весь пользовательский негатив, вызванный контактом с такими предложениями. Появлялись плохие отзывы, проседали продуктовые метрики.
Первая версия алгоритма основывалась полностью на эмпирических наблюдениях, обернутых в группу SQL запросов. Мы предположили, что если за владельцем одного номера телефона закрепляется более трех объявлений разных квартир, то, скорее всего, это посредник. Точность такого алгоритма составляла около 70%. Это был baseline, от которого можно двигаться дальше.
Затем я вычитывал статьи, изучал новые подходы и технологии, постепенно улучшал качество. Сейчас этот алгоритм принимает более сотни параметров на вход, имеет точность классификации ~96%, использует градиентный бустинг над деревьями принятия решений.
Продуктовые метрики выросли, количество жалоб на неправильное определение владельца упало на порядок. Так мы и начали применять ML в нашем продукте. Затем внедрили системы обработки и анализа текстов рекуррентными нейронными сетями, сделали классификаторы изображений на сверточных нейронных сетях и еще много всего.
Задачи Head of AI
В ЛУН я отвечаю за решение всех проблем, которые можно решить с помощью машинного обучения. И, соответственно, за создание, внедрение и поддержку всех алгоритмов — сейчас их около двух десятков.
Каждый алгоритм разрабатывается под конкретную бизнес-задачу. Например, мы заметили, что в некоторых объявлениях некорректно указана цена. Человек пишет, что квартира стоит $40, — подразумевает $40 тыс. Фильтры просто скроют такое объявление. Чтобы это исправить, мы создали алгоритм, который находит и исправляет некорректное значение. Он реализован на основе другого алгоритма — регрессора цены, который по площади, месторасположению, фотографиям и другим факторам рассчитывает примерную стоимость квартиры.
Особое внимание уделяем системе дедупликации объявлений — чтобы поисковая выдача не показывала объявления одной и той же квартиры, агрегированные с разных сайтов. Два опорных столба этой системы: классификатор картинок и их группировщик.
Мы ежедневно обрабатываем около 30 млн изображений и относим каждое фото к одной из 37 категорий. Это позволяет автоматически понять, что изображено на картинке: кухня, ванная, фасад дома, паркинг и т. д. Затем можно провести сравнение по фотографиям интерьеров.
Но недостаточно работать только с изображениями. Бывает, что недобросовестные риелторы используют фотографии чужих более привлекательных квартир — чтобы привлечь внимание. В таком случае картинки одинаковые, а квартиры на самом деле — разные. Чтобы это определить, мы сравниваем текстовые описания.
Для понимания степени схожести текстов между собой внедрили подсистему глубокого анализа. За основу взяли работу команды ребят из Google. Используя большой корпус текстов из объявлений, мы представляем слово в виде вектора в N-мерном пространстве. Чтобы оценить текстовою близость, попробовали усреднить векторы всех слов, которые встретились в тексте. Предварительно провели их нормировку так, чтобы норма каждого была равна 1. Чем ближе по косинусному сходству векторы слов будут находиться друг к другу, тем больше вероятность, что эти слова об одном и том же, их контекст одинаков.
Благодаря переходу от текста к векторам, мы смогли использовать более производительные подходы и можем сравнить более 50 000 текстов в секунду.
В конце 2015 года мы запустили ЛУН под брендом Flatfy — сперва в Польше и Венгрии, а сейчас в 37 странах мира. Это бросило новые вызовы, связанные как с локализацией, так и с кратным ростом объема данных.
Из забавного: в Индии встречается, что в объявлении не указывают адрес дома, а пишут, что он находится возле такого-то ларька, который все местные знают. Как из этого вытянуть локацию — координаты широты и долготы? :) В ближайшее время будем заниматься этим вопросом.
Еще один вид деятельности, который я тоже отношу к работе, — это выступления на различных конференциях, внутренних встречах. Раньше я считал для себя непозволительным тратить время на подготовку к докладам, когда есть текущие задачи и понимание, как их решить.
Но со временем пришел к осознанию, что для глобальных проектов нужна сильная команда. Сейчас у нас в подразделении работают четыре человека, но в течение года планируем расширить команду до десяти. Выступления на конференциях — хороший способ познакомиться с интересными людьми.
Типичный рабочий день
11:00. Прихожу на работу. Заливаюсь кофе. Рабочий день мало формализован — ежедневных митингов или созвонов, назначенных на конкретное время, у меня нет. Несколько раз в неделю бывают собеседования с новыми кандидатами и другие встречи. Все остальное время я погружаюсь в решение проблем, над которыми работаю лично я или ребята из команды.
Конкретные действия зависят от этапа работы над проблемой. К примеру, первым делом всегда пытаюсь понять ее истинную природу — а вдруг проблемы и нет :) Затем формирую ряд гипотетических подходов к решению. Получаю безумное удовольствие от больших вызовов и люблю делать первый шаг в решении самостоятельно.
Дальше делаю прототип, который реализует основную идею. Если концепция подошла, принимаюсь за ее улучшение и довожу уровень качества до требований продакшна. Если не подошла, беру следующую из ранее составленного списка подходов. Порой ни одна из них не срабатывает — тогда рождается что-то совершенно новое.
Раньше соотношение непосредственной работы и встреч было примерно 90% к 10%. Сейчас мы активно расширяем команду, поэтому на данный момент больше похоже на 60 к 40.
21:00. Стараюсь уходить с работы не позже 21:00, получается не всегда. Но я никогда не воспринимал свою работу как работу :) Потому, часто приходя домой, еще дописываю что-то, чтобы поскорее увидеть, сработала ли идея. И даже если бы мне в принципе не нужно было работать, чтобы обеспечивать жизнь, я бы все равно продолжил заниматься ровно тем тем, чем занимаюсь сейчас.
В первые несколько лет в ЛУН у меня был период, когда я работал по
Инструменты и продуктивность
Мне нравится решать не какие-то конкретные задачи, а комплексные проблемы. Разницу между этими понятиями хорошо объясняет история из SpaceX. Инженерам надо было снять информацию с множества датчиков на ракете, и из-за больших объемов данных у них не получалось это сделать в режиме реального времени. Когда к вопросу подключился лично Маск, он понял, что часть информации списывать не обязательно, так как ее можно рассчитать на основе других показателей. Это пример решения именно проблемы, а не задачи.
Задача была такой: успеть снять информацию с датчиков. А проблема — получить необходимые данные для принятия решения. И после того, как понимание задачи расширили до понимания проблемы, родилось эффективное решение.
В компании все стараются работать по принципу baby steps: сначала попробовать простое или известное решение, и только затем переходить к сложному. Простые и элегантные решения сложных проблем я считаю высшим пилотажем.
В любом случае, зафиксировать результаты простого решения очень полезно — чтобы потом сравнить их с результатами сложного и оценить, насколько оправдались усилия.
Например, первая версия классификатора, который определял, изображен ли на фотографии фасад здания, была сделана очень просто. Мы разбивали изображение на 9 частей и пытались найти небо вверху на фотке, сравнивая относительное количество синего цвета в верхнем секторе ко всему изображению. Получив baseline в ~70% по f1-score, мы уже могли двигаться дальше и сравнивать результаты более сложных решений с первым простым. Сейчас наш классификатор использует дообученую сверточную нейронную сеть. В прошлой версии он понимал 28 классов и обладал точностью 98.6%. Уже собрали новый датасет на 37 классов и 100 тыс. изображений, тестируем новую версию.
Для работы с почтой использую принцип Zero Inbox: стараюсь сразу реагировать на все вопросы, которые требуют какого-то решения от меня, и не удаляю цепочки писем, пока задача не будет закрыта.
Любимый инструмент для заметок, мыслей, расчетов и всего-всего — бумага и ручка. Записи всегда лежат передо мной: чтобы их посмотреть, не нужно открывать какой-то софт. Встречи веду в Google-календаре. Рабочие переписки — в Slack. Еще есть Telegram — «молодежь» не хочет общаться по почте и присылает решения тестовых заданий туда :)
Прототипирование в основном делаю в Jupyter, развернутом на серверах с необходимыми вычислительными мощностями — обычно это AWS. Продакшн крутится частично на наших собственных серверах, частично на Hetzner и RapidSwitch. У нас нет никаких ограничений по используемым фреймворкам, но мне больше других нравится PyTorch. Но есть подсистемы и на тензоре, и на caffe и на sklearn.
Когда исследовательская часть завершена и нужно оформить какой-то API или завернуть все в красивую коробку для внедрения, пишу код в PyCharm. Наш репозиторий с алгоритмами лежит на GitHub.
Книжки и самообразование
Я не могу выделить самообразование в отдельный процесс — у меня нет рутинных задач. По сути вся работа — это самообразование.
AI развивается колоссальными темпами, поэтому важно все время держать руку на пульсе. Те методы, которые считались передовыми пару лет назад, сегодня уже устарели. Мне нравится анализировать свои проекты несколько летней давности и думать, как бы их можно было реализовать более эффективно с сегодняшними знаниями и инструментами.
Регулярно читаю различные статьи по алгоритмам, машинному обучению, искусственному интеллекту. Еженедельно просматриваю рубрику Computer Science на arxiv.org, читаю white papers, пре-публикации. Подписан на страницы Yann LeCun, Andrew Ng и других в Facebook — там часто можно получить самую свежую информацию о новых достижениях в области ML.
Одной из фундаментальных книг по машинному обучению считаю «Pattern Recognition and Machine Learning» Кристофера Бишопа, познакомился с ней в начале своего пути. Сейчас читаю «Deep Learning» Яна Гудфеллоу. Еще начал читать Адизеса, хочу основательно подойти к вопросу формирования команды.
Стыдно признать, но на художественную литературу, к сожалению, сейчас банально не хватает времени.
Ретроспектива и планы на будущее
Я всецело согласен с утверждением: «Суть прогресса в переоценке возможностей». Потому всегда брался и берусь за новые вызовы. Себе в прошлом, настоящем и будущем я бы посоветовал меньше бояться ошибок. Основным инструментов эволюции была ошибка (и время). И к чему это все привело :)
Главное — делать выводы и не наступать на те же грабли. В остальном опыт фейлов — самый ценный.
Сейчас я формирую новую команду, которая будет заниматься вопросами разработки и интеграции алгоритмов, с дальнейшей поддержкой, в продукты ЛУН и Flatfy.
Проект называется FLAIR — Flatfy Artificial Intelligence Researchers. Но важнее его толкование: «Flair — a special or instinctive aptitude or ability for doing something well». Мне хочется, чтобы это всегда было о нас. В ЛУН очень плодородная почва для создания такого рода продукта: у меня есть все преимущества стартапа и при этом не надо думать о финансировании и административной возне.
Еще одна идея на перспективу — развивать академический бренд ЛУН. Я хочу, чтобы наши ребята больше делились своими интеллектуальными наработками, выступали, делали публикации. Так что будем работать над тем, чтобы стать заметными в академическим мире.