Или как пытаться обогреть виртуальный гараж и случайно наткнуться на философию робототехники

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

Когда дрон встречает ветер

Но прежде чем рассказать про эпический провал-квест с виртуальным гаражом, давайте поговорим о дронах и ветре.

Представьте: группа инженеров месяцами настраивает новенький квадрокоптер. В лаборатории он летает идеально — «зависни в этой точке», «пролети по квадратному маршруту» — выполняет всё с точностью до миллиметра, как швейцарские часы. Инженеры довольны, начальство в восторге, премии уже почти в кармане. А потом кто-то открывает окно.

И тут начинается цирк. Легкий сквозняк (не говоря уже о настоящем ветре) сносит дрон вбок. Он пытается компенсировать отклонение, но не понимает, что происходит. В его математической модели мира ветра просто не существует. Это как если бы вы всю жизнь жили в теплице, а потом вышли на улицу в бурю — «Что это за невидимая сила толкает меня?!»

Адаптивное управление: когда незнание — сила

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

Работает это примерно так:

1. Робот предсказывает: «Если я поеду прямо, через секунду буду вот здесь».

2. Через секунду проверяет: «Хм, я оказался левее. Наверное, дует ветер справа».

3. Обновляет свою модель мира: «Окей, буду учитывать ветер силой X».

4. Повторяет, пока не научится ездить нормально.

Это можно реализовать, сравнивая предсказанное состояние с реальным и корректируя оценки неизвестных параметров. Например, робот может определить силу и направление ветра даже без анемометра (датчика ветра) — по разнице между ожидаемым и фактическим положением.

Магия в действии: дрон-неудачник против коварного Ветра

Давайте посмотрим, как эта магия работает на конкретном подопытном.

Герой нашего романа — маленький дрон, который умеет летать только влево-вправо. Его миссия — висеть в точке ноль. Обозначим его позицию как x, скорость — v, а ускорение — a. Управлять мы будем, как завещал классик теории управления Понтрягин, — задавая ему боковое ускорение u.

Сцена 1: Идеальный мир в лаборатории

В тишине и безветрии лаборатории всё просто. Физика для дрона описывается одной фразой: «куда сказали, туда и ускоряюсь». Для тех, кто любит погорячее, вот формула:

a=u

То есть реальное ускорение дрона a в точности равно нашему управляющему ускорению u. Чтобы заставить его висеть на месте, мы даём ему простейший «мозг» (ПД-регулятор), девиз которого: «Унесло вправо? Толкай влево!».

u=−kpx−kdv

Тут x — это позиция дрона, а v — его скорость. kp и kd — это просто ручки «силы пинка», которые мы настраиваем.

Чем сильнее дрона отнесло в сторону и чем больше его скорость, тем сильнее он тянется в противоположную сторону. То есть если дрона унесло на расстояние до соседнего магазина, возвращаться он будет с ускорением межгалактической ракеты. Ну а при малых отклонениях едва качнется в сторону цели.

После пары колебаний дрон находит равновесие и замирает в нуле. Успех!

Сцена 2: Внезапный выход на улицу

И тут на сцену выходит злодей — коварный боковой ветер. Он создает своё собственное ускорение w, о силе которого мы понятия не имеем. Уравнение мира становится сложнее:

a=u+w

То есть общее ускорение дрона теперь — результат нашего управления и пинка от ветра. Наш старый контроллер с его наивным «толкай-обратно» впадает в панику. Он честно пытается вернуть дрон в ноль, но ветер дует постоянно. В итоге дрон не висит в центре, а позорно застревает где-то сбоку, находя хрупкий баланс между командой «домой!» и настойчивым «уходи!» от ветра. Миссия провалена.

Сцена 3: Апгрейд мозга или адаптация 50-го уровня (года)

Что делать? Прокачать нашему дрону мозги! Научим его не слепо бороться с последствиями, а понимать и предсказывать действия врага.

  1. Заводим «дневник наблюдений»: дрон создаёт у себя в памяти переменную w^. Это его личная догадка, его гипотеза о том, какой силы этот наглый Ветер. Изначально полагаем w^=0.

  2. Новый план действий. Теперь его логика хитрее: «Я буду делать всё, как раньше, НО заранее дам упреждающего пинка в сторону, противоположную той, откуда, как я думаю, дует ветер».

u=−kpx−kdv−w^

Этот w^ в конце — и есть наш контрудар.

  1. Закон адаптации (самое-самое интересное): как дрону понять, что его гипотеза о ветре — чушь? Он постоянно сверяется со своим «детектором неудачи» — специальной величиной s=v+x. Если этот детектор не равен нулю, значит, что-то идёт не так, и пора пересматривать свои взгляды на жизнь (и на ветер). А если он равен нулю, значит, его позиция x и его скорость v равны нулю, а мы этого и добивались. Есть тут еще небольшая вероятность, что позиция и скорость противоположны друг другу и равны по силе, как гопота на стрелке, но это несильно нас беспокоит.

Правило обновления гениально в своей простоте. Вместо того чтобы менять свою догадку непрерывно, наш цифровой дрон делает это шажками, например, каждые 20 миллисекунд. На каждом шаге он смотрит на свой «детектор неудачи» и немного подкручивает свою гипотезу о ветре:

w^новая=w^старая+γ⋅s

или, если расписать s:

w^новая=w^старая+γ⋅(v+x)

Здесь γ (гамма) — это уже не скорость, а маленький коэффициент, который можно назвать «шагом обучения» или «уровнем доверчивости» дрона к показаниям своего детектора.

Что это значит на человеческом? Если «детектор неудачи» s кричит, что дрона уносит вправо (и позиция x, и скорость v положительны), формула говорит: «Эй, твоя догадка о ветре, дующем вправо, была слишком оптимистичной! Думай сильнее!». Дрон тут же увеличивает свою оценку w^. В следующий миг его упреждающий пинок −w^ становится мощнее, и он эффективнее борется с Ветром. Этот процесс самокопания и обучения продолжается, пока гипотеза w^ не станет почти точной копией реального ветра w. В этот момент «детектор неудачи» замолкает, оценка перестает меняться. Дрон гордо висит в точке ноль, а Ветер в бессильной ярости обдувает его, не в состоянии сдвинуть. Более того, после короткого периода обучения дрон имеет достаточно точное представление о силе ветра и компенсирует его с самурайской точностью и скоростью. Занавес.

keyboard_arrow_down

Виртуальный гараж и кризис истины

Вернёмся к гаражу. Коллега построил симуляцию системы отопления с неизвестными параметрами: теплопроводность стен (спойлер: старые гаражи — это термос наоборот) и постоянно меняющаяся внешняя температура.

Запустил адаптивный контроллер. Задача: поддерживать 20°C внутри. И знаете что? Он справился! Температура держалась как приклеенная. Но потом стоило заглянуть в оценки параметров…

Пройдемся по графикам:

  1. График показывает, что температура едва колеблется вокруг целевого значения в 20 градусов;

  2. Обогреватель в точности попадает в пики уличной температуры;

  3. Оцениваемые параметры абсолютно мимо!

  4. Параметры ПИД-регулятора как-то перестраиваются, не очень важно как, самое важное — третий график!

display(Image('/content/image.png', width=1000))

Контроллер в одном параметре ошибался на 80%, а в другом на 400%! В покер с такой предсказательной моделью я бы точно не стал играть...

Однако это был момент озарения. Робот может прекрасно выполнять свою задачу, имея совершенно неверное представление о мире. Он как тот студент на экзамене: решил задачу правильно, но по совершенно бредовой формуле, которую сам же и придумал.

Математика наблюдений (или почему GPS врёт, но довозит)

В теории управления есть красивая концепция. Любая система описывается уравнениями:

x˙=Ax+Bu

Где x — реальное состояние (позиция, скорость), u — управление (газ, тормоз), y — наши наблюдения (показания спидометра).

Состояние меняется в зависимости от того, где мы, и еще нашего управления.

y=Cx

А видим мы... Что-то мы видим.

Фишка в том, что мы почти никогда не видим полное состояние системы. Едете на машине? Спидометр показывает скорость, но не пройденный путь. Полное состояние системы — это пройденный путь и скорость x=(sv). Наблюдение — это «обрезанное» состояние.

y=Cx=(0001)(sv)=(0v)

То есть из полного вектора состояния (s — пройденный путь, v — скорость) в результате матричного умножения у нас остается только скорость. Машина не знает, где она. Зато знает, как быстро.

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

Поэтому используют фильтры Калмана, частичные наблюдатели и другую математическую магию. И часто эти методы дают неточную, но достаточную для работы картину мира.

Философия робота: миров нет, есть только сенсоры

Тут мы сделали ещё один шаг в кроличью нору. А что вообще такое «истинное состояние»? Робот никогда не видит мир — он видит только показания сенсоров. Для него нет «машины» или «стены» — есть паттерны в данных с лидара, числа с энкодеров, пиксели с камеры.

Мы, люди, делаем то же самое. Никто никогда не видел «силу» или «энергию» — мы видим, как вещи двигаются, и придумываем концепции для объяснения. Вся физика — это попытка найти паттерны в наших ощущениях и спрогнозировать будущие ощущения.

keyboard_arrow_down

Практический дзен: как заставить робота выучить правду

Помните контроллер с неверными параметрами? Мы всё-таки заставили его выучить правильные значения. Секрет оказался в хаосе — когда мы сделали внешние условия абсолютно случайными, контроллеру пришлось найти истинные параметры, чтобы адаптироваться максимально быстро.

display(Image('/content/image2.png', width=1000))

Посмотрим на графики:

  1. Мы очень быстро меняем целевую температуру, обогреватель не сразу, но подстраивается.

  2. Обогреватель иногда психует и выдает максимум мощности, но в целом следит за погодой.

  3. Параметры довольно быстро подстроились под правильные значения.

  4. Параметры ПИД-регулятора как-то перестраивались.

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

В робототехнике это называется «персистентное возбуждение» — когда входные сигналы достаточно разнообразны, чтобы «прощупать» все аспекты системы. Без него робот может застрять в локальном минимуме понимания мира.

Увы, мы, люди, тоже не лишены этого. Мы тоже можем застрять в локальном минимуме идеологии.

Когда правда не нужна: уроки для роботов и людей

Главный вывод из всей этой истории: для достижения цели не всегда нужна абсолютная истина. Виртуальный гараж отапливался отлично даже с неверными параметрами. Робот-пылесос прекрасно убирает, не зная законов термодинамики. Автопилот Tesla довозит до места, имея весьма приблизительное представление о намерениях других водителей.

В робототехнике мы постоянно идём на компромиссы между точностью модели и вычислительной эффективностью. Можно построить супер-пупер-мега-убер-точную модель мира, но пока робот её просчитает, мир уже изменится. Поэтому часто лучше иметь простую, немного неточную, но быструю модель.

Работая с роботами, мы поняли несколько вещей

  1. «Я не знаю» — это нормальный ответ. Роботы постоянно работают с неполной информацией и неопределенностью. Байесовские фильтры буквально оперируют вероятностями: «Я на 70% уверен, что стена там».

  2. Некоторые вещи unknowable. Есть параметры, которые просто невозможно точно определить из доступных наблюдений. И это нормально — приближения достаточно.

  3. Цель важнее правды. Если робот выполняет задачу, какая разница, правильно ли он понимает мир? Главное — результат.

Может, стоит и нам иногда быть немного больше похожими на роботов? Меньше спорить о вещах, которые невозможно проверить, и больше фокусироваться на достижении целей. В конце концов, если мой виртуальный контроллер может отапливать гараж с неверным пониманием теплопроводности, то и мы можем достигать своих целей, не зная ответов на все вопросы вселенной.

P.S. Коллега в итоге купил обычный масляный обогреватель. Работает отлично, никакой математики не требует. Но где в этом веселье? Уже обсуждаем, как будем собирать ему умный дом с анализом данных!