Как делать ИИ-устройства в домашних условиях

Как делать ИИ-устройства в домашних условиях
  • Юрий Зибрин — автор статьи и соавтор упомянутых проектов
    AI инженер (RL · CV · LLM Agents · Embodied AI), Ведущий системный аналитик, сооснователь solved-by.ml 
  • Антон Петров — соавтор упомянутых проектов
    AI-инженер (CV · LLM Agents) / Разработчик / Тимлид, сооснователь solved-by.ml

История одного игрового робота: правильные и неправильные подходы, грабли компьютерного зрения — и приглашение к разговору.

Хотите ли вы уметь в домашних условиях делать ИИ-устройства — от несложных бытовых штук до домашних роботов? Если да — читайте дальше! У нас со Слёрмом есть идея поделиться опытом и наработками в данной области, с тем чтобы множество людей смогли встать на путь создания своих устройств — как хобби или проектов на работе, а может быть, для своего стартапа, или чтобы начать делать такие штуки на заказ. А может быть, для того чтобы решить какие-то домашние задачи.

В качестве затравки сначала коротко расскажу про свой путь в эту сторону.

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

Как я в это ввязался

Как сказал выше, я всегда интересовался этой темой, но интересовался пассивно. Максимум читал какие-то статьи или смотрел видео, не вникая в технические детали. Работа и всё прочее отъедали все силы и время. Но в какой-то момент случилось событие, которое стало переломным. Мой приятель озвучил идею создания игрового робота, который мог бы стать компаньоном для игры в настольные игры. И тут во мне что-то включилось, и я стал искать пути быстро понять матчасть, чтобы осознать, как это делать.

К счастью, мне попались курсы Слёрма по введению в дата-сайенс (https://slurm.io/data-scientist), которые (и это не скрытая реклама, а чистая правда) были нацелены именно на практику и были построены так, что учили думать в нужную сторону. У них было уникальное свойство:
  • 60 процентов практики
  • Плюс отличный методический приём
    разбирать подробно теорию, решать на лекции задачу, а в качестве домашки давать похожую, но… другую! И это каждый раз создавало ситуацию: с одной стороны — понимание базы, с другой — необходимость думать. И для меня это стало решающим.
После этих курсов мне стало достаточно просто прочесть по диагонали статью или посмотреть четверть урока на Coursera ровно по теме, которая мне нужна, и после этого идти делать что-то своими руками. Мои активности в эту сторону мотивировали и моего приятеля — автора идеи, — и он тоже включился в это более активно, чем раньше. И мы шаг за шагом начали реализовывать задуманное.

Что уже получилось

На текущий момент у нас есть следующие результаты:
  • почти завершён игровой робот для игры в гомоку (5 в ряд)
  • реализован устойчивый пайплайн компьютерного зрения, который понимает позицию на доске;
  • реализован аналог гугловского алгоритма AlphaZero для принятия решения о следующем ходе;
  • путём очень лёгкого трюка реализована своя микро-LLM, которая может обсудить самые важные вещи о ходе игры (типа решения о том, кто делает первый ход, желания пользователя переходить или закончить игру и ещё нескольких простых кейсов) и при этом может работать, занимая всего 150 мегабайт (как расскажу ниже);
  • осталась одна интересная задача: перемещение игровой фигурки на доску манипулятором.
Игровой робот для гомоку: видит доску, думает над ходом и комментирует игру
Игровой робот — цель первая. Вторая, дальняя — домашний робот-помощник, который возьмёт на себя простые бытовые дела. Здесь мы тоже сделали первые шаги: экспериментируем с VLA-моделями (Vision-Language-Action — сети, которые по картинке и текстовой команде выдают действие) на задаче поиска объектов в учебной 3D-среде. Но это тема для отдельного рассказа.
Цель № 2 — домашний робот-помощник для простых бытовых дел (концепт)

Кейс со знаком минус: как робот учился видеть доску

Один кейс раскрою подробно, поскольку он коррелирует с целью данной статьи. А именно — пайплайн компьютерного зрения, который понимает позицию на доске. Почти сразу после курса я придумал, как это решать в целом (и эта идея всё ещё сохраняется в уже реально работающем механизме), но решал — в плане DS-подходов — неверно и потратил на это уйму времени!

Я решил, что:
  • определю координаты углов доски
  • после чего определю положения фигурок на доске и, зная количество клеток, сопоставлю фигурки с центрами клеток — и тем самым получу позицию
Но промучился я с этим несколько месяцев!

А виноват был… замечательный учёный Эндрю Ын… точнее, его курс на Coursera… а ещё точнее — то, что я его пример очень уж сильно обобщил и решил, что это универсальное решение.

Там был пример, как обычная CNN, модифицированная для определения координат («просто замените классификационную голову на регрессионную — и всё заработает»), находит координаты глаза человека.

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

Сначала сеть и вовсе выучила не доску, а шторы на фоне (на тесте-то всё было отлично — привет, ложные корреляции, про них ещё будет в конце статьи). Тогда мы построили идеально аугментированный датасет — отрендерили сцены в Blender: разные фоны, ракурсы, формы и цвета досок. Не помогло и это.

Выяснилось, что для нахождения формы и положения объектов в таких случаях сильно лучше подходят сегментационные сети (тоже, кстати, свёрточные — дело не в CNN как таковой, а в постановке задачи). Практика это подтвердила: после 3−4 месяцев мук с регрессией — я перебрал кучу архитектур — сегментационная сеть дала решение ЗА ЧАС!
Рабочий пайплайн зрения целиком: от фото до позиции — сегментация плюс немного геометрии
Итог работы пайплайна: распознанная позиция — матрица 12×12
Что же меня подвело? Ведь информации в интернете море: и статьи, и курсы, и прочее. А подвело то, что я не смог найти источник сведений, который хорошо и наглядно описывал бы зоны применимости разных методов и их узкие места!

Кейс со знаком плюс: понимание речи за один вечер

Для контраста — пример, где правильная постановка задачи сработала с первого раза. Роботу надо понимать несколько игровых фраз: кто ходит первым, «давай переходим», «надоело — заканчиваем». Полноценная LLM тут не нужна, да и не влезла бы: всё должно работать локально и весить мегабайты, а не гигабайты. Каркас — примитивный трансформер-классификатор, который нейронка написала мне за пять минут. Весь фокус в одном решении: вместо «пустых» эмбеддингов, обучаемых с нуля, я взял предобученные русские — они уже «знают», что «надоело играть» и «давай закончим» — об одном и том же. Дальше — по десятку вариаций каждой фразы, пять минут обучения, и модель начала верно понимать формулировки, не совпадающие с обучающими ни единым словом. Никакой магии: знание языка принесли эмбеддинги, моей модельке осталось лишь разложить готовые смыслы по нескольким намерениям. Итог: 150 мегабайт (причём сама модель — всего 50 МБ, остальное — эмбеддинги) и один вечер. С доской неверная постановка стоила мне месяцев — здесь верная сэкономила их.

Цель этой статьи

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

Также за это время мы реализовали много других проектов. На работе — сложные LLM-пайплайны для обработки документов, самообучающиеся эволюционирующие агенты, которые пишут документацию и ищут баги, а сам процесс разработки перестроен в формат AI-first. Для сторонних заказчиков — системы ИИ-наблюдения за критичными событиями и механики семантического поиска. Подробности можно посмотреть на solved-by.ml.

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

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

Почему именно сейчас

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

И вот что странно: 99 процентов из этого почему-то не сделано и даже не придумано. Оно ждёт всех нас — включая, возможно, читателей этой статьи!

Два примера, которые хорошо показывают, о чём речь.
Первый. Недавно в сети «Перекрёсток» появились ИИ-весы: они смотрят на товар и, поняв, что это, сокращают список для выбора покупателем — положили яблоки, в списке на экране только яблоки. Скорее всего, там работает довольно банальная предобученная CNN. Сети такого класса доступны уже более десяти лет — и совершенно непонятно, почему это не было реализовано раньше.
Второй. На окне висит занавеска, закрывая его процентов на двадцать. Когда прохожий идёт мимо, она сдвигается вместе с ним — так, чтобы он ничего не видел в квартире. Решение несложное, и вариантов на поверхности даже несколько: сегментационная сеть или обычный детектор определяет положение человека, дальше — мотор. С таким можно разобраться за неделю!
Есть задачи гораздо более сложные и интересные — например, домашние роботы или игровые, вариант которых упомянут выше. Их, конечно, не сделать за неделю и даже за месяц. Но концептуально это не предельно сложно, и при желании такое делается в домашних условиях!

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

Грабли, которых нет в туториалах

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

Вот ещё, помимо моего опыта, два самых простых примера на пальцах, которые будут понятны любому читателю:
Пример 1. Сеть уверенно отличает котов от собак. Стираем на фото глаза — коты пропадают: оказывается, решение держалось на маленькой области, и мы об этом не знали. А теперь наоборот: оставляем глаза, нос и уши, но раскидываем их по картинке в беспорядке — сеть по-прежнему уверенно говорит «кот». Тот, кто это видел, навсегда понимает: свёрточная сеть отвечает на вопрос «есть ли здесь нужные куски», а не «сложены ли они в правильную фигуру». Ну и если рассматривать мой неудачный опыт в начале статьи — CNN совершенно не умеет понимать взаимное расположение объектов на картинке!
Пример 2. Обучаем классификатор, например, тех же котиков и собачек, получаем 100% точности за пять минут — и радуемся. А потом выясняется, что все фотографии одного класса (котиков) были сняты в облачную погоду, а другого (собачек) — в солнечную, и сеть выучила погоду, а не объект. Такие случайные корреляции с таргетом — самая частая причина, по которой отличная модель не работает в реальности. Тот, кто это увидел, навсегда поймёт тему с ложными корреляциями в датасете.
И вот всем этим очень хочется поделиться! Есть мысль на большом количестве задач научить выбирать решения и подходы и заранее видеть их узкие места. Вопрос — в каком формате это сделать и найдётся ли заинтересованная аудитория.

С чего начать

Ну и напоследок — как проще всего встать на этот путь, раз уж я обещал в начале.

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

А дальше начинается интересное. Оно заработает на ваших кадрах и сломается на соседских. Начнёт врать в пасмурный день. Покажет 100% точности на тесте и промахнётся на всём живом. И вот тут выясняется главное: информации в интернете полно, любая нейронка объяснит вам любой метод — но никто не скажет заранее, какой из методов ваш и где именно он развалится. Это не гуглится, потому что вы ещё не знаете, что спрашивать.

Я выяснял это сам, и это стоило мне девяти неверных решений из десяти. Одно только распознавание доски стоило мне нескольких месяцев — просто потому, что я перебирал не те подходы.

Что дальше

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

Джеффри Хинтон — «What's wrong with convolutional neural nets?» · лекция в MIT, 2014
Про врождённые ограничения CNN: сеть находит «нужные куски», но не собирает из них фигуру. Тот самый кейс с частями лица, раскиданными по картинке.

Geirhos et al. — «Shortcut Learning in Deep Neural Networks» · Nature Machine Intelligence, 2020
Систематика ложных корреляций: как сети выучивают побочные признаки вместо целевых — наши «шторы» и «погода» как массовое явление.

Tobin et al. — «Domain Randomization» · OpenAI, 2017
«Не делай симулятор реалистичным — делай разнообразным»: принцип, по которому мы строили аугментированный датасет в Blender.

Ronneberger et al. — «U-Net» · 2015
Каноническая архитектура семантической сегментации — класс сетей, который решил нашу задачу с доской «за час».

Silver et al. — «Mastering Chess and Shogi by Self-Play» · DeepMind, 2017
Первоисточник AlphaZero — алгоритма, аналог которого думает за нашего робота.

Navec · проект Natasha
Лёгкие предобученные русские эмбеддинги — основа нашего «понимающего» модуля на 150 мегабайт.
Читайте также: