Или как пытаться обогреть виртуальный гараж и случайно наткнуться на философию робототехники
Всё началось с того, что наш коллега купил гараж. «Как бы его эффективно отапливать?» — спросил меня за кофе. И мы, как типичный инженер, вместо того чтобы посоветовать купить обогреватель помощнее, решили построить математическую модель. Знаете, как в том анекдоте: «Сколько программистов нужно, чтобы вкрутить лампочку? Ни одного — это аппаратная проблема». Только у нас получилось наоборот — аппаратная проблема превратилась в программную.
Когда дрон встречает ветер
Но прежде чем рассказать про эпический провал-квест с виртуальным гаражом, давайте поговорим о дронах и ветре.
Представьте: группа инженеров месяцами настраивает новенький квадрокоптер. В лаборатории он летает идеально — «зависни в этой точке», «пролети по квадратному маршруту» — выполняет всё с точностью до миллиметра, как швейцарские часы. Инженеры довольны, начальство в восторге, премии уже почти в кармане. А потом кто-то открывает окно.
И тут начинается цирк. Легкий сквозняк (не говоря уже о настоящем ветре) сносит дрон вбок. Он пытается компенсировать отклонение, но не понимает, что происходит. В его математической модели мира ветра просто не существует. Это как если бы вы всю жизнь жили в теплице, а потом вышли на улицу в бурю — «Что это за невидимая сила толкает меня?!»
Адаптивное управление: когда незнание — сила
Тут на сцену выходит адаптивное управление — одна из самых крутых концепций в робототехнике. Идея простая: если робот не знает всех параметров окружающего мира, пусть учится на ходу.
Работает это примерно так:
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-го уровня (года)
Что делать? Прокачать нашему дрону мозги! Научим его не слепо бороться с последствиями, а понимать и предсказывать действия врага.
-
Заводим «дневник наблюдений»: дрон создаёт у себя в памяти переменную w^. Это его личная догадка, его гипотеза о том, какой силы этот наглый Ветер. Изначально полагаем w^=0.
-
Новый план действий. Теперь его логика хитрее: «Я буду делать всё, как раньше, НО заранее дам упреждающего пинка в сторону, противоположную той, откуда, как я думаю, дует ветер».
u=−kpx−kdv−w^
Этот w^ в конце — и есть наш контрудар.
- Закон адаптации (самое-самое интересное): как дрону понять, что его гипотеза о ветре — чушь? Он постоянно сверяется со своим «детектором неудачи» — специальной величиной
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 внутри. И знаете что? Он справился! Температура держалась как приклеенная. Но потом стоило заглянуть в оценки параметров…
Пройдемся по графикам:
-
График показывает, что температура едва колеблется вокруг целевого значения в 20 градусов;
-
Обогреватель в точности попадает в пики уличной температуры;
-
Оцениваемые параметры абсолютно мимо!
-
Параметры ПИД-регулятора как-то перестраиваются, не очень важно как, самое важное — третий график!
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))
Посмотрим на графики:
-
Мы очень быстро меняем целевую температуру, обогреватель не сразу, но подстраивается.
-
Обогреватель иногда психует и выдает максимум мощности, но в целом следит за погодой.
-
Параметры довольно быстро подстроились под правильные значения.
-
Параметры ПИД-регулятора как-то перестраивались.
Это как учить нейросеть — на простых примерах она может выучить неправильные паттерны, которые случайно работают. Но на разнообразных данных приходится учить настоящие закономерности.
В робототехнике это называется «персистентное возбуждение» — когда входные сигналы достаточно разнообразны, чтобы «прощупать» все аспекты системы. Без него робот может застрять в локальном минимуме понимания мира.
Увы, мы, люди, тоже не лишены этого. Мы тоже можем застрять в локальном минимуме идеологии.
Когда правда не нужна: уроки для роботов и людей
Главный вывод из всей этой истории: для достижения цели не всегда нужна абсолютная истина. Виртуальный гараж отапливался отлично даже с неверными параметрами. Робот-пылесос прекрасно убирает, не зная законов термодинамики. Автопилот Tesla довозит до места, имея весьма приблизительное представление о намерениях других водителей.
В робототехнике мы постоянно идём на компромиссы между точностью модели и вычислительной эффективностью. Можно построить супер-пупер-мега-убер-точную модель мира, но пока робот её просчитает, мир уже изменится. Поэтому часто лучше иметь простую, немного неточную, но быструю модель.
Работая с роботами, мы поняли несколько вещей
-
«Я не знаю» — это нормальный ответ. Роботы постоянно работают с неполной информацией и неопределенностью. Байесовские фильтры буквально оперируют вероятностями: «Я на 70% уверен, что стена там».
-
Некоторые вещи
unknowable. Есть параметры, которые просто невозможно точно определить из доступных наблюдений. И это нормально — приближения достаточно. -
Цель важнее правды. Если робот выполняет задачу, какая разница, правильно ли он понимает мир? Главное — результат.
Может, стоит и нам иногда быть немного больше похожими на роботов? Меньше спорить о вещах, которые невозможно проверить, и больше фокусироваться на достижении целей. В конце концов, если мой виртуальный контроллер может отапливать гараж с неверным пониманием теплопроводности, то и мы можем достигать своих целей, не зная ответов на все вопросы вселенной.
P.S. Коллега в итоге купил обычный масляный обогреватель. Работает отлично, никакой математики не требует. Но где в этом веселье? Уже обсуждаем, как будем собирать ему умный дом с анализом данных!