Boss приехал первым, команда Стэнфорда заняла второе место спустя 20 минут. «Малыш Бен» финишировал не на призовом месте, команды Корнелла и МТИ финишировали, не уложившись в шестичасовой регламент гонки. Стало очевидно, что в разработке робототехнических транспортных средств лидируют Питтсбург и Пало-Альто.
Подход пенсильванской команды разительно отличался от тактики команды Стэнфорда или Университета Карнеги – Меллона. Он основывался на знаниях. Команда пыталась создать машину, которая бы смогла решать, что делать на дороге, опираясь на запрограммированный «опыт». И такой подход был одним из двух основных в разработке ИИ. Гоночная команда Университета им. Бена Франклина опиралась на подход общего ИИ. Он не сработал.
«Малыш Бен» старался «увидеть» препятствия глазами человека. За распознавание объектов отвечал LIDAR, лазерный радар, установленный на крыше. Затем «мозг» идентифицировал объект, основываясь на критериях: форма, цвет и размер. Следом, используя метод древа принятия решений, предстояло выбрать, что делать: замедлиться, если это живое существо вроде человека или собаки, или, если это живое существо – птица, то можно продолжить движение, поскольку она, скорее всего, улетит. «Малышу Бену» нужно было хранить огромное количество информации об объектах реального мира. Например, о дорожном конусе. В стоячем положении их легко различать по треугольной форме и квадратной основе. Обычно они не больше метра высотой. Мы можем написать примерное правило:
identify object:
IF object.color = orange AND object.shape = triangular_with_square_base
THEN object = traffic_cone;
IF object.identifier = traffic_cone
THEN intitiate_avoid_sequence
Но что если дорожный конус лежит на боку? Я живу на Манхэттене и вижу, как их постоянно задевают. Я видела, как улицы перекрывают конусами и как люди выходят из машины, переставляют конус и едут дальше. Значит, правило нужно немного поправить. Попробуем вот это:
identify object:
ЕСЛИ object.color = orange И object.shape is like triangular_with_square_base.rotated_in_3D
ТОГДА object = traffic_cone;
ЕСЛИ object.identifier = traffic_cone
ТОГДА intitiate_avoid_sequence
А вот здесь мы сталкиваемся с разницей между человеческим мышлением и алгоритмами. Наш мозг может представить, как в пространстве вращается конус. Вы можете представить в своей голове конус, когда я о нем говорю. И, если я попрошу вас представить «перевернутый конус», вы наверняка справитесь и даже сможете представить, как он вращается. Разработчики тоже владеют пространственным мышлением и успешно справляются с этой задачей. Есть один занятный математический тест: детям показывают нарисованную трехмерную фигуру, затем демонстрируют картинки других фигур и просят выбрать, на какой из них изображена та же фигура, только в другом ракурсе.
У компьютера нет воображения. Поэтому, чтобы просто «повернуть объект», ему требуется произвести рендеринг трехмерной модели или – в крайнем случае – построить векторную карту. И программисту приходится писать код с учетом трехмерного пространства. Но – не в пример человеческому мозгу – компьютер неплохо справляется с угадыванием. Объект либо находится в списке известных ему, либо нет.
Когда я сидела за рулем «Малыша Бена», он делал две вещи: ездил кругами и не справился с объездом препятствия. Когда прошел шок, я начала размышлять, почему он не смог объехать препятствие. Это был столб. «Малышу Бену» нужно было правило вроде «if obstacle.exists_in_path and obstacle.type=stationary, obstacle.avoid». Однако, видимо, правило не сработало, поскольку не все объекты остались статичными. Человек может появиться, постоять немного и двинуться дальше. Тогда правило выглядело бы так: «if obstacle.exists_in_path and obstacle.type = stationary, AND obstacle.is_not_person, avoid». Но и это бы тоже не сработало: теперь нужно пояснить, чем человек отличается от колонны, и, значит, мы вернулись к проблеме классификации объектов. Если колонну можно распознать как таковую, тогда нужно написать правило отдельно для людей, отдельно для колонн. Однако мы не знаем, действительно ли там колонна, пока не увидим ее или хотя бы не распознаем объект, – поэтому я чуть не умерла в машине, которая чуть не столкнулась с огромным столбом.
Разум – вот ключевая проблема. А поскольку не существует способа запрограммировать теорию мышления, машина никогда сможет реагировать на препятствия так же, как человек. Компьютер «знает» только то, что ему «сказали». Без разума, когнитивной возможности прогнозировать будущее, невозможно за долю секунды решить, что светофор представляет собой препятствие, и принять соответствующие меры.
В рамках разработки ИИ проблема разума была центральной с самого момента основания дисциплины. В конечном итоге Минский назвал ее сложнейшей задачей. Возможно, именно поэтому в Стэнфорде и Карнеги даже не пытаются пользоваться этим подходом. Они избрали радикально противоположный путь решения проблемы объезда препятствий. Подход слабого ИИ исключительно механистичен и опирается на набор неоправданно эффективных данных. И этот подход сработал лучше, чем ожидалось. Мне нравится думать об этом как о задаче робота Карела.
В 1981 г. профессор Стэнфорда Ричард Паттис представил учебный язык программирования под названием Karel the Robot
[103]. Карел – в честь Карела Чапека, изобретателя слова «робот». Карел не был настоящий роботом, а представлял собой стрелку в разлинованном на клетки квадрате, все это было нарисовано на листе бумаги. Студенты представляли, что стрелка и есть робот, – так они изучали основы программирования. В квадрате был один или несколько выходов. Карел мог двигаться по клеточкам подобно пешке в шахматах. Задача состояла в том, чтобы помочь Карелу выбраться из коробки. Это вводное упражнение, выполняемое при помощи бумаги и ручки, годами было первым заданием на курсах программирования в МТИ, Гарварде, Стэнфорде и других технологических центрах. Профессор рисовал квадратик. В нем было несколько препятствий. Наша задача состояла в том, чтобы написать команды для Карела и вытащить его из заточения, миновав все препятствия. Не то чтобы это было весело, но не так скучно, как математика и другие дисциплины, на которые я ходила на первом курсе. Вот как выглядит типовое упражнение (рис. 8.1). А вот и инструкция к этой загадке: «Каждое утро Карел просыпается в своей кровати, когда газета оказывается на крыльце его дома. Запрограммируйте Карела так, чтобы он забрал газету и вернулся в постель. Газету кидают каждое утро на одно и то же место, а окружающий мир, в том числе кровать, расположены так, как показано на рисунке». Стрелка – это Карел; предполагается, что он находится в постели, отправной точке задачи. Чтобы добраться до газеты, ему нужно повернуть на 90° на север, пройти две клеточки в этом направлении, затем две клеточки на запад и так далее, до тех пор, пока он не достигнет цели.