Интеллект Déjà vu

Дмитрий Усов (AllwaySync.com)

 

None of this is real. You pull the plug. I disappear. And nothing I ever say nothing I ever do will ever matter.

The Thirteen Floor (movie)

 

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

 

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

 

Здесь будет предложена другая предпосылка: естественный интеллект не работает на логических правилах и не строит модель мира. Все что он делает это запоминает, что было раньше (накапливает опыт), а на новые входные воздействия ищет нечто похожее в прошлом опыте и выдает на выход решение которое привело к хорошим результатам в прошлом. Вот и все что делает интеллект. Нет никакой логики, нет никаких правил четких или нечетких. Только опыт. Можно это назвать вариацией здравого смысла. Например, потому что если 5 раз за углом человека били, он наверняка туда больше не пойдет, даже не понимая, почему бьют именно за углом. Но больше подходит Déjà vu – как только мы видим ситуацию, которая уже была, мы уже знаем, как нужно действовать и каков будет результат.

 

Исключительно для наглядности примеры будут не из очень интеллектуальной, зато хорошо понятной все области. Допустим, наша интеллектуальная система учится управлять автомобилем, ничего не зная об устройстве автомобиля и правилах дорожного движения. Для гуманистов, автомобиль небьющийся и едет по дороге, где нет людей и животных, только такие же не небьющиеся машины. Задача технического зрения здесь не рассматривается, наша машина имеет все трехмерные координаты и описания всех объектов в поле зрения. Конечная цель – научиться ехать по дороге в нужную сторону, быстро, ни в кого не врезаясь и соблюдая правила дорожного движения. Алгоритм Déjà vu должен работать так. Видим ситуацию, справа к нам приближается машина. Такое наверняка уже было, роемся в памяти, находим 10 случаев когда машина приближалась справа. В 6 из них мы поехали прямо и допустили столкновение 3 раза. В 4 случаях мы остановились и все было хорошо. Значит, выбираем наиболее вероятное решение остановиться.

 

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

 

Если вы поняли о чем идет речь выше, то в этом месте у вас должны возникнуть возражения. Такая система не станет интеллектуальной по множеству причин. Назовем основные из них. Не понятно, что значит “похожие задачи” и по каким признакам можно сказать что решение одной задачи подходит для другой. Например, текущая задача: “зеленый легковой автомобиль справа”. На что это больше похоже: “красный мотоцикл справа” или “зеленый легковой автомобиль слева”. Если мы ничего не знаем об области применения, то второй вариант гораздо ближе. Другая проблема, что разных случаев слишком много чтобы собрать опыт решения каждого из них. Если рассмотреть перекресток и 20 машин на нем, то уже число вариантов как они могут быть расположены, не помещается в памяти современных компьютеров. Здесь мы подходим к следующей проблеме. В материальном мире все-таки есть некоторые законы, о которых интеллектуальная система должна иметь представление. Пока не понятно как можно записать некоторое правило дорожного движение через набор примеров его правильного или неправильного использования. Видимо это не полный список проблем, которые мешают приведенному выше алгоритму стать действительно интеллектуальным.

 

Теперь основная идея данной работы: когда простой метод поиска подобных задач в прошлом опыте себя исчерпывает, мы поднимается на второй уровень, задаем задачу о задаче (мета-задачу). Соответственно, если удовлетворительное решение метазадачи не найдено то поднимаемся на следующий уровень (мета-мета-задача). И т. д. пока не будет найдено приемлемое решение или не иссякнут вычислительные ресурсы.

 

Например, наша интеллектуальная система управляет автомобилем и текущая задача выглядет так: подъезжаю к пересечению с запада, скорость 60 км/час, ускорение 0, дорога сухая, понедельник, сзади черная грузовая машина, скорость 30 км/час, ускорение 5м/с2, слева желтый мотоцикл с коляской, в правом ряду, 3 пассажира, стоит знак что одностороннее движение, справа синяя легковая машина, скорость … и т.д. и т.п. Полное описание ситуации будет громоздким. Трудно рассчитывать на то что мы уже были в достаточно похожей ситуации и накопили достаточно опыта чтобы правильно действовать. Поэтому решение прямой задачи находит дорожную ситуацию, где цвет машин был тот же самый, но когда мы действуем так же как записано в нашем прошлом опыте, вероятность правильного поведения получается маленькой, потому что правила дорожного движения никак не учтены. Строим мета-задачу. Мета-задача будет выглядеть так: какие критерии “похожести” позволяют нам определить подходит ли решение одной задачи для похожей в этом смысле задачи (что-то вроде факторного анализа, если хотите). Решая мета-задачу находим, что для правильного управления автомобилем важно где находятся другие машины и дорожные знаки, а стороны горизонта и цвет машины не важен. И теперь, вооружившись таким знанием, мы ищем предыдущие дорожные ситуации, когда расположение машин и знаки были как в текущей дорожной ситуации (решаем исходную задачу). Это уже гораздо меньше вариантов и больше шансов что решение, которое работало в предыдущем случае, будет работать и сейчас.

 

Другими словами можно описать метазадачу как думание о процессе думания. Были люди, которые думали, как сделать дирижабли более эффективными. Другие люди подумали о том правильно ли думать о дирижаблях, и есть ли альтернативы (решали мета-задачу). Оказалось, что последние добились гораздо лучших результатов.

 

Перейдем к более формальному описанию. Интеллектуальная задача ставится в общем виде как реализовать алгоритм который по некоторому описанию вектора входных воздействий выдает за заданное время выходной сигнал (находит решение) и получить как можно более высокую оценку этого решения от внешней системы. Если алгоритм не завершает работу за заданное время он прерывается и на выход выдается некоторое решение по умолчанию. Вместо максимального времени выполнения алгоритма можно также использовать количество машинных операций. В виде языка программирования интеллектуальная задача может быть условно записана так:

 

OutputObject ExecuteAI(InputVector, MaximumTimespan);

 

После того как решение применено программа получает обратную связь в виде оценки для данного решения.

 

void SetRate(integer Rate);

 

Реализация этих подпрограмм разбивается на следующие 4 части (функции).

 

1)      Найти в базе данных предыдущего опыта задачи, которые похожи на текущую задачу.

2)      Применить к текущей задаче решение, которое в предыдущих задачах получило самую высокую оценку.

3)      Запомнить текущую задачу, примененное решение и оценку этого решения в базе данных.

4)      Удалить наименее нужные записи из базы данных чтобы она не переполнилась.

 

Представим это графически так:

1) НАЙТИ

2) ПРИМЕНИТЬ

3) ЗАПИСАТЬ

4) УДАЛИТЬ

 

Мы имеем некоторую простейшую реализацию этих четырех функций:

1)      НАЙТИ. Ищем задачи, которые наиболее близки к текущей задаче в смысле расстояния в n-мерном пространстве вектора входных воздействий (используя индексацию для многомерного поиска). Выбираем то решение, которое получило самую высокую оценку.

2)      ПРИМЕНИТЬ. Копируем решение на выходные сигналы. Если решение есть алгоритм, выполняем его.

3)      ЗАПИСАТЬ. Записываем в базу все характеристики текущей задачи, решение и оценку

4)      УДАЛИТЬ. Удаляем из базы ту запись, которая дольше всего не использовалась в качестве решения.

 

Так мы решаем исходную задачу. Когда решение исходной задачи не может быть найдено напрямую, переходим к метазадаче. Для этого каждую из четырех функции выше рассматриваем как самостоятельную задачу и решаем ее как исходную, с той лишь разницей что мы имеем меньше времени на ее решение. Если для мета-задачи нет подходящего решения, ищем решение мета-задачи для нее (мета-мета-задачи) и т. д. Когда на некотором уровне достаточно хорошее (в некотором смысле) решение найдено, спускаемся вниз до исходной задачи применяя соответвующее решение последовательно для всех уровней. Когда получаем оценку для решения исходной задачи, устанавливаем эту оценку для всех мета уровней задействованных в процессе.

 

Исходная задача

Мета-задача

Мета-мета-задача

1) НАЙТИ

1) НАЙТИ

2) ПРИМЕНИТЬ

3) ЗАПИСАТЬ

4) УДАЛИТЬ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2) ПРИМЕНИТЬ

1) НАЙТИ

2) ПРИМЕНИТЬ

3) ЗАПИСАТЬ

4) УДАЛИТЬ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3) ЗАПИСАТЬ

1) НАЙТИ

2) ПРИМЕНИТЬ

3) ЗАПИСАТЬ

4) УДАЛИТЬ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4) УДАЛИТЬ

1) НАЙТИ

2) ПРИМЕНИТЬ

3) ЗАПИСАТЬ

4) УДАЛИТЬ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

1)      НАЙТИ. Переходим к метазадаче, если после решения исходной задачи осталось машинное время

2)      ПРИМЕНИТЬ. Переходим к метазадаче, если время применения найденной похожей задачи превышает время, которое дано на решение этой задачи.

3)      ЗАПИСАТЬ. У автора есть общие идеи о критерии перехода к метазадаче, описание которых громоздко и выходит за рамки данной статьи.

4)      УДАЛИТЬ, то же что 3)

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

 

Важный момент – решения интеллектуальной задачи могут быть любого типа. В общем виде это некоторый алгоритм (или объект в терминах объектно-ориентрованного программирования), который зависит от самой задачи. Например, для задачи управления автомобилем решение будет выходные сигналы на руль и педали. Решением метазадачи для нее (функция 1)НАЙТИ) будет алгоритм, который позволяет быстро найти в базе данных опыта похожие дорожные ситуации в смысле правил дорожного движения. Представляется необходимым иметь решения, для применения которых нужно решать другие интеллектуальные задачи рекурсивно. То есть решение не детерминировано, а образует дерево решений (solution tree). Например, решение задачи о том уступать ли дорогу автомобилю может быть найдено как алгоритм, решающий другие интеллектуальные задачи, а именно “движется ли мы по главной дороге” и “с какой стороны помеха”. Однако дерево решений не должно расти слишком глубоко, иначе мы получим известные проблемы с поиском решения в огромном дереве.

 

В конце опишем преимущества, которые дает описанный подход к решению интеллектуальных задач.

 

 

Связаться с автором можно по контактной информации, указанной на сайтах AllwaySync.com или ScamFilter.com