Як я працюю: Володимир Кубіцький, Head of AI в ЛУН

[В рубриці «Як я працюю» ми запрошуємо гостя розповісти про свою роботу, організації воркспейса, корисних інструментах і лайфхаках]

Володимир Кубіцький очолює команду штучного інтелекту в ЛУН , української продуктової компанії, яка розробляє інтернет-проекти в тематиці нерухомості. На сьогодні проекти компанії працюють в 37 країнах.

У ЛУН він прийшов ще на третьому курсі університету і за 4 роки пройшов шлях від позиції продуктового аналітика до створення власного підрозділу по розробці алгоритмів.

Про себе

Я виріс у родині фізиків. Дідусь був одним з першопрохідців у вивченні природи ударів абсолютно твердих тіл, написав ряд публікацій і книг про педагогічному аспекті фізики, брав участь у розробці перших голограм. Брат — PhD фізики і математики, має десятки наукових публікацій у провідних виданнях, на даний момент живе у Франції і працює в CNRS над застосуванням новітніх ML підходів у прискорювачах елементарних частинок. Я завжди дорівнював на них і з дитинства цікавився наукою і технологіями.

Ще на початку 2000-х, коли у нас в провінції (я родом з Глухова, Сумська область) про існування ПК мріяти ніхто не міг, у діда була можливість взяти його на деякий час додому, поки брат був на канікулах. Так з ранніх років я почав освоювати бейсік. Незабаром написав свій перший калькулятор з візуальним інтерфейсом. У шкільний час регулярно ходив на олімпіади з математики, фізики, займав призові місця.

Після школи вступив на мехмат в КНУ ім. Шевченка, на кафедру математичної фізики. Обрав цей напрям з двох причин: повністю фізика «не відпускала», і саме на цій кафедрі працював мій майбутній научрук, з яким я хотів написати диплом.

На бакалавраті працював над розпізнаванням осіб методом Віоли—Джонса на каскадах Хаара. Магістерську дисертацію писав вже з згортковим нейронних мереж, які на момент мого захисту більше двох років успішно працювали у нас в ЛУН. Так що захиститися було не складно :)

Я отримав два запрошення в аспірантуру — в КНУ на кафедру і в Інститут математики НАН України, але обидві пропозиції поки на паузі. Вирішив направити всі сили на роботу.

Від аналізу до рішень

У ЛУН я прийшов більш 4 років тому на позицію продуктового аналітика. Фактично це була моя перша робота — не рахуючи невеликий підробіток в «Яндекс» ще в 2013 році.

Перший час я займався аналітикою продукту, вивчав патерни поведінки, використання різних фіч, знаходив проблемні місця. І приблизно через 4-5 місяців від розуміння проблем захотів перейти до спроб їх вирішення. Так і почався мій шлях у алгоритміки. ЛУН організований як стартап, і зона ответветственности співробітника визначається тільки тим, з чим він хоче і може впоратися. Тому ніяких формальностей в перемиканні на інші завдання не було, і я просто почав їх вирішувати.

Одним з перших моїх проектів в цій області була розробка системи, яка аналізує текст і автоматично визначає, ким написано оголошення квартири — власником або посередником. Більшість людей хочуть мати справу безпосередньо з власником, щоб не платити комісію. Також посередники часто розміщують фейкові оголошення, щоб їм подзвонили. А ми, агрегируя всі оголошення, накопичували на собі весь користувальницький негатив, викликаний контактом з такими пропозиціями. З'являлися погані відгуки, просідали продуктові метрики.

Перша версія алгоритму грунтувалася на емпіричних спостереженнях, обгорнутих в групу SQL запитів. Ми припустили, що якщо за власником одного номера телефону закріплюється більше трьох оголошень різних квартир, то, швидше за все, це посередник. Точність такого алгоритму становила близько 70%. Це був baseline, від якого можна рухатися далі.

Потім я вичитував статті, вивчав нові підходи і технології, поступово поліпшував якість. Зараз цей алгоритм приймає більше сотні параметрів на вхід, має точність класифікації ~96%, використовує градієнтний бустинг над деревами прийняття рішень.

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





Завдання Head of AI

У ЛУН я відповідаю за вирішення всіх проблем, які можна вирішити з допомогою машинного навчання. І, відповідно, за створення, впровадження і підтримку всіх алгоритмів — зараз їх близько двох десятків.

Кожен алгоритм розробляється під конкретну бізнес-завдання. Наприклад, ми помітили, що в деяких оголошеннях некоректно вказана ціна. Людина пише, що квартира коштує $40, — передбачає $40 тис. Фільтри просто приховають таке оголошення. Щоб це виправити, ми створили алгоритм, який знаходить і виправляє некоректне значення. Він реалізований на основі іншого алгоритму — регрессора ціни, який по площі, місця розташування, фотографій та інших факторів розраховує приблизну вартість квартири.

Особливу увагу приділяємо системі дедуплікаціі оголошень — щоб пошукова видача не показувала оголошення однієї і тієї ж квартири, агреговані з різних сайтів. Два опорних стовпи цієї системи: класифікатор картинок і їх группировщик.

Ми щодня обробляємо близько 30 млн зображень і відносимо кожне фото до однієї з 37 категорій. Це дозволяє автоматично зрозуміти, що зображено на картинці: кухня, ванна, фасад будинку, паркінг і т. д. Потім можна провести порівняння з фотографій інтер'єрів.

Але недостатньо працювати тільки з зображеннями. Буває, що недобросовісні ріелтори використовують фотографії чужих більш привабливих квартир — щоб привернути увагу. В такому випадку однакові картинки, а квартири насправді — різні. Щоб це визначити, ми порівнюємо текстові описи.

Для розуміння ступеня схожості текстів між собою впровадили підсистему глибокого аналізу. За основу взяли роботу команди хлопців з Google. Використовуючи великий корпус текстів з оголошень, ми представляємо слово у вигляді вектора в N-мірному просторі. Щоб оцінити текстовий близькість, спробували усереднити вектори всіх слів, які зустрілися в тексті. Попередньо провели їх нормування так, щоб норма кожного була дорівнює 1. Чим ближче за косинусному подібності вектори слів будуть знаходитися один до одного, тим більше ймовірність, що ці слова про одне й те ж, їх контекст однаковий.

Завдяки переходу від тексту до векторів, ми змогли використовувати більш продуктивні підходи і можемо порівняти більш 50 000 текстів в секунду.

В кінці 2015 року ми запустили ЛУН під брендом Flatfy — спершу в Польщі та Угорщині, а зараз у 37 країнах світу. Це кинуло нові виклики, пов'язані з локалізацією, так і з кратним зростанням обсягу даних.

З забавного: в Індії зустрічається, що в оголошенні не вказують адресу будинку, а пишуть, що він знаходиться біля такого-то ларька, що всі місцеві знають. Як з цього витягнути локацію — координати широти і довготи? :) Найближчим часом будемо займатися цим питанням.

Ще один вид діяльності, який я теж відношу до роботи, — це виступи на різних конференціях, внутрішніх зустрічах. Раніше я вважав для себе неприпустимим витрачати час на підготовку до доповідей, коли є поточні завдання і розуміння, як їх вирішити.

Але згодом прийшов до усвідомлення, що для глобальних проектів потрібна сильна команда. Зараз у нас у підрозділі працюють чотири людини, але протягом року плануємо розширити команду до десяти. Виступи на конференціях — хороший спосіб познайомитися з цікавими людьми.





Типовий робочий день

10:00-11:00. Встаю, перевіряю пошту і месенджери, збираюся на роботу. Живу дуже близько 6 хвилин пішки. Поки йду, розмірковую про поточних завданнях і найближчих зустрічах.

11:00. Приходжу на роботу. Заливаюсь кави. Робочий день мало формалізовано — щоденних мітингів або созвонов, призначених на конкретний час, у мене немає. Кілька разів на тиждень бувають співбесіди з новими кандидатами й інші зустрічі. Решту часу я поринаю в рішення проблем, над якими працюю особисто я або хлопці з команди.

Конкретні дії залежать від етапу роботи над проблемою. Приміром, першим ділом завжди намагаюся зрозуміти її справжню природу — а раптом проблеми і немає :) Потім формую ряд гіпотетичних підходів до вирішення. Отримую шалене задоволення від великих викликів і люблю робити перший крок у вирішенні самостійно.

Далі роблю прототип, який реалізує основну ідею. Якщо концепція підійшла, беруся за її поліпшення і доводжу рівень якості до вимог продакшну. Якщо не підійшла, беру наступну з раніше складеного списку підходів. Часом жодна з них не спрацьовує — тоді народжується щось абсолютно нове.

Раніше співвідношення безпосередньої роботи і зустрічей було приблизно 90% до 10%. Зараз ми активно розширюємо команду, тому на даний момент більше схоже на 60 до 40.

21:00. Намагаюся йти з роботи не пізніше 21:00, виходить не завжди. Але я ніколи не сприймав свою роботу як роботу :) Тому, часто приходячи додому, ще дописую те, щоб скоріше побачити, спрацювала ідея. І навіть якщо б мені в принципі не потрібно було працювати, щоб забезпечувати життя, я б все одно продовжив займатися тим, чим займаюся зараз.

У перші кілька років у ЛУН у мене був період, коли я працював по 12-14 годин в день. Хотілося ще, але на ніч офіс закривався і треба було йти додому. З допомогою такого інтенсиву мені вдалося досягти певних результатів за коротший проміжок часу. Але за такого графіка страждав сон і потім почалися проблеми з короткочасною пам'яттю. Я зрозумів, що це неприпустимо, тому зараз намагаюсь не працювати більше 10 годин на день.

Інструменти і продуктивність

Мені подобається вирішувати не якісь конкретні завдання, а комплексні проблеми. Різницю між цими поняттями добре пояснює історія з 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». Мені хочеться, щоб це завжди було про нас. У ЛУН дуже родючий грунт для створення такого роду продукту: у мене є всі переваги стартапу і при цьому не треба думати про фінансування та адміністративної метушні.

Ще одна ідея на перспективу — розвивати академічний бренд ЛУН. Я хочу, щоб наші хлопці більше ділилися своїми інтелектуальними напрацюваннями, виступали, робили публікації. Так що будемо працювати над тим, щоб стати помітними в академічним світі.

Опубліковано: 22/08/18 @ 07:00
Розділ Різне

Рекомендуємо:

DOU Labs: як в EPAM роблять хмарну платформу, яка відкриє розробникам доступ в автомобіль
Research Lead Микола Максименко — про квантових програмістів та роботу з Нобелівськими лауреатами
DevOps дайджест #21: куди девопсу піти восени
Податки в Deutschland – міфи та реальність
Поради сеньйорів: як прокачати знання junior Go