Почему роботу не нужно знать правду, чтобы работать

Введение

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

«Сколько программистов нужно, чтобы вкрутить лампочку? Ни одного — это аппаратная проблема».

Только у нас получилось наоборот — аппаратная проблема превратилась в программную.

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

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

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

И тут начинается хаос. Легкий сквозняк (не говоря уже о настоящем ветре) сносит дрон вбок. Он пытается компенсировать отклонение, но не понимает, что происходит. В его математической модели мира ветра просто не существует.

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

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

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

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

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

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

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

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

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

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

Наш герой — маленький дрон, который умеет летать только влево-вправо. Его миссия — висеть в точке ноль. Обозначим его позицию как xx, скорость — vv, а ускорение — aa. Управлять мы будем, как завещал классик теории управления Понтрягин, — задавая ему боковое ускорение uu.

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

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

a=ua=u

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

u=kpxkdvu = -k_p x - k_d v

Тут xx — это позиция дрона, а vv — его скорость. kpk_p и kdk_d — это просто ручки «силы толчка», которые мы настраиваем.

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

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

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

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

a=u+wa=u+w

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

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

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

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

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

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

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

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

wновая=wстарая+γsw^{\text{новая}} = w^{\text{старая}} + \gamma \cdot s

Или, если расписать ss:

wновая=wстарая+γ(v+x)w^{\text{новая}} = w^{\text{старая}} + \gamma \cdot (v + x)

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

Что это значит на человеческом?

Если «детектор неудачи» s кричит, что дрона уносит вправо (и позиция xx, и скорость vv положительны), формула говорит: «Эй, твоя догадка о ветре, дующем вправо, была слишком оптимистичной! Думай сильнее!». Дрон тут же увеличивает свою оценку w^\hat{w}. В следующий миг его упреждающий толчок w^\hat{w} становится мощнее, и он эффективнее борется с ветром.

Этот процесс самокопания и обучения продолжается, пока гипотеза w^\hat{w} не станет почти точной копией реального ветра ww. В этот момент «детектор неудачи» замолкает, оценка перестает меняться. Дрон гордо висит в точке ноль, а ветер обдувает его, не в состоянии сдвинуть. Более того, после короткого периода обучения дрон имеет достаточно точное представление о силе ветра и компенсирует его с самурайской точностью и скоростью. Занавес.

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

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

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

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

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

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

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

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

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

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

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

x˙=Ax+Bu\dot{x} = A x + B u

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

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

y=Cxy = C x

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

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

y=Cx=(0001)(sv)=(0v)y = Cx = \begin{pmatrix} 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} s \\ v \end{pmatrix} = \begin{pmatrix} 0 \\ v \end{pmatrix}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

P.S. Коллега в итоге купил обычный масляный обогреватель. Работает отлично, никакой математики не требует.