Все началось с увлечения глубоким обучением, нейронными сетями и далее по списку. Я посмотрел пару курсов, поучаствовал в соревновании на Kaggle… "чем бы еще заняться?". Тут мимо как раз по своим делам проползал робот-пылесос (Xiaomi Vacuum Cleaner V1) и подкинул интересную идею…
Длинное вступление
Данная статья — промежуточный итог определенному жизненному периоду. Надеюсь, она будет полезна людям, которые хотят заниматься машинным обучением, но еще не определились, в каком направлении развиваться. Почти год назад я в очередной раз сменил работу и местожительство. На новом месте много говорили про машинное обучение, но в основном менеджеры, желающие попиариться на хайповой теме. Остальные, встречали тему без особого энтузиазма (еще бы, работать-то им).
Мне стало интересно, что собой представляет машинное обучение. Спустя год, могу сказать — тема поразительно объемная. Давайте разберемся, какие конкретно аспекты доступны для применения в жизни и бизнесе.
- Классическое машинное обучение.
Коротко: все, что было до появленияхайпаглубокого обучения (Deep Learning). Если у вас табличные данные по продажам, клиентам, транзакциям и вы хотите увеличить продажи, привлечь клиентов, распознать фроды, вам сюда. Вот неплохие лекции, помогающие понять, как анализировать данные и использовать методы вроде случайного леса, K-means или XGBoost. Мне также понравились микрокурсы на Kaggle и сопутствующее соревнование по предсказанию цены дома. Пожалуй, любой бизнес, у которого есть реальные клиенты (а значит база данных) может применять эти методы. Там много интересного. - Deep Learning.
Беспилотные авто, беспилотные авто и замена головы Джека Николсона на голову Джима Керри. Но если погрузиться глубже, любая голова пойдет кругом. Здесь распознавание лиц, эмоций, положения тела, вытаскивание семантики из видео и всяческие преобразования видеопотока. Авто-транскрипция и авто-перевод, определение болезней и сорняков, ну вы поняли, практически что угодно. Кроме компьютерного зрения есть еще обработка естественного языка (NLP), обработка и симуляция аудио потока, игровые нейронные сети GAN. Какой бы аспект глубокого обучения вы не выбрали, можете потратить время на:
-
Углубление в детали архитектуры нейронных сетей.
Эта область, на мой взгляд, ближе всего к науке и требует соответствующего багажа знаний по математике и информатике. Если вам не терпится поэкспериментировать с новой убойной функцией активации, наворотить кастомных слоев, и чтобы learning rate не просто банально уменьшался, а закручивался в трубочку, то эта область глубокого обучения для вас. Открывайте свежие научные статьи и начинайте экспериментировать. С точки зрения бизнеса, такими вещами могут заниматься компании, готовые конкретно вкладываться в ресерч. Для шапочного знакомства на ютубе есть лекции стенфордского университета. -
Углубление в детали инфраструктуры.
Обучение заточенных на распознавание образов нейронных сетей требует машинных ресурсов. Выбор железа широкий и ограничен только размером кошелька. Думаю, GTX 1070 Ti можно считать хорошим стартом, но не забывайте, что одной лишь видеокартой не решить всех проблем, ибо данные еще нужно подготовить и скормить нейросети. Слабый CPU или медленный жесткий диск может стать бутылочным горлышком вашей системы. Поэтому прикупите дополнительно i5 процессор, 16 гигов оперативки и твердотельный жесткий диск. Клавиатура, так и быть, сойдет самая дешевая. Другой вариант, Google Cloud, Azure, AWS, Kaggle опять же. Облачные сервисы предлагают десятки, если не сотни вариантов, с начальной ценой где-то около 50 центов в час за K80 (примерно тоже, что и GTX 1070 Ti). Гугл дает 300$ депозит, на котором можно потренироваться. Azure дает 200$, с Амазоном не приходилось иметь дела. Мне приглянулся вариант Гугла, потому что можно быстро менять видеокарты ("А, гулять так гулять. Сегодня будет V100"). Конечно, по сравнению с зарплатами рок-стар дата сайнтестов из вашего ресерч отдела, эти траты будут сущими копейками. Небольшой лайфхак, при подключении к машине в облаке используйте проброс портов:you_user@your_host -L 8888:127.0.0.1:8888
. Это позволит запускать удаленный Jupyter на локальном компе. Отдельно хочется сказать про гугловские TPU. Их можно использовать совершенно бесплатно прямо из Google Colab, но сможете ли вы их использовать, вот в чем вопрос. Когда работаешь с более менее стандартными моделями, все выглядит красиво, но кастомные модели ведут себя непредсказумемо, если вобще запускаются. -
Углубление в реализацию в продакшене.
Эксперименты с архитектурой и участие в соревнованиях, весьма полезные штуки, но в реальности не так уж важно, дает ваша модель точность 85% или 87%. Для беспилотных авто или мобильных приложений в таком случае будет важнее скорость принятия решения, а для медицинских нужд скорее всего низкий уровень ошибок второго рода ("Здоров! Давай, до свидания!"). То есть на первый план выходит определение приоритетов. Плюс, куча технических вопросов: как выкатить и обеспечить непрерывную работу в продуктовой среде, как дообучать модель на новых данных, как мониторить и оценивать результаты работы, как вылавливать и фиксить баги, наконец. Все эти проблемы мы уже имеем с нормальным ПО, но теперь они выходят на другой уровень. Уже появляются инструменты для контроля версий (Git-LFS, Saturn Cloud), заточенные специально под машинное обучение, но общепринятых стандартов пока не существует, в чем безусловно есть своя романтика. Еще один лайфхак: если держать гиперпараметры в отдельных конфиг файлах, то можно легко восстановить успешные эксперименты. -
Использование готовых моделей и transfer learning.
Самая простая и привлекательная часть машинного обучения, для тех, кто хочет увидеть, как же это все работает в реальности. Готовых моделей достаточно, пара десятков строк кода и вуаля: разноцветные квадратики бегают по экрану. Не нужно тратить время и ресурсы на тренировку модели с нуля. Есть даже готовые решения в железе, если хочется распознавания on-site (вот кстати отличный обзор на них). Кажется, бери да пользуйся, но и тут есть свои ньюансы. Готовые модели тренированы на стандартных датасетах. Поэтому, чтобы узнать, кто ворует сметану у вашего бизнеса: кот Васька или кот Семен, придется таки тюнинговать модель (transfer learning). Возможно, баба Маша с метлой обойдется бизнесу гораздо дешевле.
Основная часть
Тут мы возвращаемся к началу поста. К тому времени, когда мимо проехал робот-пылесос, мне хотелось сделать простое функционирующее приложение или устройство с использованием машинного зрения. Так появилась идея, дать пылесосу еще один канал связи с внешним миром.
Если прикрутить к нему небольшую камеру, можно использовать готовые модели или натренировать свою. Возможностей применения полно. От точечной очистки загрязнений до преследования пса. Можно придумать какую-нибудь игру в физическом пространстве с использованием GAN или поиграться с NLP моделями и научить его разговаривать на манер голосового помощника. Короче, время обучить собственного домашнего робота.
Начинать конечно нужно с простых вещей. Например, поискать на Хабре, что уже сделано до нас. Оказывается "у ней внутре" Ubuntu 14.04, а значит, при наличии рута, можно, например,управлять с джойстка. Если дернуть данные лидара, то под рукой окажется не много ни мало, прототип беспилотного авто.
Выбор начинается уже на этом этапе. Взять готовую камеру с вайфаем и акуумулятором или плату для inference вроде Jetson Nano? А может собрать камеру, вайфай и аккум на Raspberry Pi? Каждый подход по своему интересен, но я старался держаться основной цели: сделать простое функционирующее устройство с использованием машинного обучения, поэтому выбрал первый вариант.
Пока камера была в пути, рутнул пылесос и покатался на нем. Работает отлично, еще осталось время пофантазировать. Допустим Гектор притащил с улицы палку и дербанит ее, лежа на своем любимом коврике. Камера, подвешенная достаточно высоко, фиксирует загрязнение (тут вспомнился челендж про грязные тарелки ) и отправляет координаты пылесосу. С охотой на пса все еще проще. Достаточно разместить камеру на самом пылесосе и запускать движение вперед при обнаружении пса, затем полный круг и возвращение на базу.
Но это планы на будущее. Сейчас сделаем кое-что совсем простое. Пусть пылесос издает разные звуки в зависимости от объекта, попавшего в поле зрения камеры. Для этого нам понадобятся два потока, связанные общей очередью.
- Модель (я использовал одну из готовых моделей TensorFlow model zoo) распознает объект и кладет его название в очередь.
- Другой поток забирает название объекта из очереди и формирует URL к звуковому файлу.
- Путь передается пылесосу, а тот стучится по полученному адресу за файлом по ftp или http.
- В папке каждого объекта несколько файлов для разнообразия. Файл выбирается случайным образом. Кроме того, есть параметр вероятности воспроизведения звука, чтобы пылесос, фиксируя Гектора на скорости 10 fps, не верещал как сумасшедший, а сообщал что-нибудь убедительно и с достоинством.
На схеме выглядит вот так:
Вот так работает:
Промежуточный итог
Цель достигнута: пылесос разговаривает. Я рад, что не стал городить слишком много сразу всего. Следующий шаг связать распознавание образов с потоком, регулирующим движение, а также попробовать transfer learning.
Искусственный интеллект, тема настолько объемная, что сложно определить, за что взяться в первую очередь. На мой взгляд не существует единой точки входа. Совсем не обязательно начинать с вычисления сложных производных или курсов программирования на Python (хотя и то и другое безусловно полезно). Выбирайте то, что интересно лично вам, и да пребудет с вами сила довести начатое до конца.
P.S. Детали реализации лежат в репозитории. Комментарии и пулл реквесты приветствуются.
Автор: Jajaka