Это третья статья из цикла о мыслящей программе [1], [2]. Не смотря на то, что ряды читателей редеют, я стараюсь не отступать от своей идеи, которой к слову уже исполнился год. За этот год мы (я и идея) прошли долгий путь, который в большей степени пришлось преодолевать практически вслепую, положившись на собственную интуицию. За это время идея трансформировалась из программы в Искусственный Интеллект, из Искусственного Интеллекта в искусственный интеллект, далее снова в программу, затем в мыслящую программу и, наконец, в свой окончательный вариант – искусственный организм. Именно к нему ведет мое повествование.
Не будем забывать, что все эти размышления об узлах, работе органов чувств, все это подчинено одной общей цели – созданию работающего прототипа программы, имитирующей преобразования информации в голове человека.
Для этого нужно понять две основные вещи – как информация записывается и как она воспроизводится. Сходу на этот вопрос не ответишь, так как нет ничего, за что бы можно было зацепиться и начать строить рассуждения. Поэтому первой ступенькой на пути к разгадке тайн этих процессов было описание работы органов чувств [2]. Именно с них информация начинает свой путь по нервной системе человека. По логике вещей следующим этапом идет запись информации, т. е. запоминание или обучение.
Вот он – Святой Грааль искусственного интеллекта. Обучение считается одной из важнейших его характеристик. Как уже многие догадались, главным героем в этой пьесе выступает образование связей.
Начнем поиск ответа с официальных источников – обратимся к информации о физиологии человека. Вот что написано в главе, посвященной памяти:
Или, говоря русским языком, память – это совокупность условных рефлексов. Не знаю как вас, а меня это определение насторожило. Как можно такую сложную систему представлять в виде совокупности одних только причинно-следственных связей, которыми, по сути, и являются рефлексы? Поиски других физиологических процессов, кандидатов на «основу памяти» были безрезультатны. Похоже на то, что ученые сами не до конца разобрались в этом вопросе. И, чтобы не оставлять явных пробелов в своей теории, списали все на условные рефлексы, как на самые очевидные кандидаты. Хотя в той же самой книге, в главе, посвященной этим рефлексам, написано, что они отвечают за мышечно-химическую активность. И ни слова о памяти.
Ну что ж, раз официальные источники находится в тупике и ничего нового не могут предложить уже почти вторую сотню лет, то ничего не остается, кроме как продолжить поиск среди неофициальных.
Мне сразу же попалась на глаза мнемотехника с ее интересной моделью памяти. Там, помимо уже известных нам рефлекторных связей, описаны некие электрические или, как их еще называют, резонансные связи. Именно на них, в основном, и построена наша память, если верить этой модели.
В целом все звучит логично и правдоподобно, не смотря на то, что физиология электрических связей до конца не определена. Есть лишь предположение, что возбужденные нейроны каким-то образом способны синхронизировать свои колебания. В итоге, если будет возбужден только один нейрон, возбуждение передастся остальным членам группы благодаря эффекту резонанса (отсюда и второе название этих связей). Но это лишь предположение.
Так или иначе, эта теория в состоянии описать некоторые моменты процесса запоминания, хоть и на более высоком уровне абстракции. А так как модель нашей программы также разрабатывается на более высоком уровне абстракции, чем нейроны, то теория нам подходит.
Как это обычно бывает, теория расходится с практикой. В нашем случае этого также не удалось избежать. Дело в том, что условные рефлексы образуются на этапе работы краткосрочной памяти. А в нашей модели несколько иное деление на этапы, и во время работы краткосрочной памяти никакие связи не образуются [2]. Единственное, что происходит на этом этапе – это поиск соответствий между информацией из краткосрочной памяти и постоянной. Но это не означает, что условных рефлексов у нас не будет. Хотя нет, означает.
Попробуем справиться с этим недоразумением, задействовав разные типы связей или разные способы образования. Какие типы можно выделить? Рефлекторные и резонансные. Чем они отличаются? Рефлекторные связи устанавливаются от условного раздражителя к безусловному, при этом безусловный появляется спустя какой-то промежуток времени. Кроме того для образования рефлекторных связей существуют ограничения вроде того, что безусловный раздражитель должен быть сильнее с точки зрения биологической значимости.
Попробуем посмотреть на это с другой стороны. Что если связь будет образовываться даже тогда, когда безусловный раздражитель слабее условного? Безусловный просто-напросто не будет вызываться, так как он будет не важен и не интересен в данной ситуации. Получается, что вместо того, чтобы вводить критерии на установку связей, можно ввести их на переход по ней во время этапа поиска. Для этого во время образования связи нужно установить некоторые ее свойства, чтобы было, что анализировать. Например, дату образования. Тогда совокупный процесс связывания можно упростить, создавая связи направо и налево, при этом регистрируя различные их свойства.
Далее некоторые из этих связей почистятся специальным алгоритмом очистки, а оставшиеся могут быть использованы при поиске. Остальную логику мы вынесем в процессы поиска, когда программа будет думать – перейти или нет по данной связи, анализируя ее свойства и другие параметры. В результате у нас получится сохранить реальные модели мышления и поведения, в том числе и рефлексы. Ура, проблема решена!
Ну вот, с проблемой вроде как справились (отложив ее на потом), осталось только выяснить, как, где и когда образуются новые связи. А еще – что это за свойства такие загадочные. И алгоритм очистки.
Обо всем по порядку. Для начала попробуем сформулировать общий принцип образования связей в терминах нашей системы:
Новая, только что поступившая от органов чувств информация должна связаться с информацией, уже существующей в оперативной памяти.
Другими словами новая информация свяжется с текущей ситуацией, с текущими мыслями и ощущениями – со всем, о чем думает человек в данный момент.
С точки зрения узлов [1], [2] никаких логически сложных процессов не происходит. Группа узлов, пришедшая от органов чувств, образует такие связи между собой. Потом она связывается с узлами из оперативной памяти. Сама по себе связь представляет собой банальную ссылку. Пока я склонен считать, что связывать следует по принципу каждый с каждым.
Если подобная система активно поработает некоторое время, то наступит такой момент, когда все узлы в памяти образуют связи со всеми. Хорошего в этом мало, так как информация в итоге не будет никак структурирована, и процессы вспоминания просто не смогут эффективно работать, так как они основаны на переходе от одного узла к другому по ссылке.
Чтобы справиться с этой проблемой, нужно вспомнить, что человек очень легко забывает информацию, если она некоторое время не будет воспроизводиться. А еще можно заметить, что некоторые ситуации мы вспоминаем легче, а некоторые с трудом. Это говорит о том, что связи не равноценны, и в приложении к нашей системе должны иметь свой вес. Чем больше вес, тем сильнее связь. Чем меньше – тем больше шансов, что она разорвется.
Вот для этого нам и понадобятся свойства связей. Первые кандидаты на эту роль – это «дата последнего доступа» и вес. С датой понятно, а вес будет выражаться целым числом, равным количеству переходов по этой связи, эдакий рейтинг популярности. Также можно добавить общий вес узла, равный количеству переходов на него.
Кроме того, что эти два свойства будут использоваться при поиске, можно будет организовать внешний алгоритм по очистке и оптимизации памяти. Для очистки можно установить порог из совокупности даты последнего доступа, веса узла и его состояния [2] (величины возбуждения или усталости, которая определяет силу раздражителя, соответственно положительного и отрицательного). А для оптимизации поиска, в случае, если память хранится в текстовых файлах, можно узлы с наибольшим весом переносить повыше.
Как и было задумано, при запоминании не происходит никаких сложных преобразований, одни только примитивные операции добавления ссылок и срабатывания счетчиков обращений. Более интересные эффекты проявляются, когда эти простые операции выполняются в большом количестве (как это и должно быть). Постепенно в памяти будут формироваться определенные группы узлов, которые будут являться аналогом образов предметов или явлений. Выделяться эти группы будут тем, что вес связей с внутренними членами группы будет заметно больше веса связей с другими узлами. Подобное формирование образов является предпосылкой к началу обучения речи и как следствие – более сложной интеллектуальной деятельности.
Самое замечательное в том, что нам не нужно жестко программировать поведение и образ мышления программы. Если общие операции вроде образования связей и снятия показаний с органов чувств определены жестко, то критерии поиска и детали работы алгоритма очистки можно и нужно настраивать и калибровать, основываясь на известных экспериментальных данных. Так что задача не такая уже и сложная, какой могла показаться вначале. Точнее мы разбили ее на два этапа – создание чего-то отдаленно похожего на фреймворк и, собственно, настройка и калибровка этого фреймворка.
К этому моменту мы рассмотрели, как программа получает информацию и как она ее запоминает. В следующий раз мы рассмотрим механизмы поиска. Но до сих пор за кадром оставалось то, откуда берется вся эта информация. Пришло время поговорить о виртуальном окружении.
Чисто теоретически этим окружением может являться все, что угодно. Даже одна переменная, содержащая число 42. Но на практике, если мы хотим, чтобы программа развивалась, совершенствовала свою модель мира, научилась говорить, в конце концов, нужно предоставить ей нечто большее, чем число 42. Это должен быть динамичный мир со своими объектами, у которых будут свои свойства, и со своими законами, которые будут действовать на объекты и на саму программу. И программу теперь уже уместнее называть искусственным организмом.
Если мы хотим, чтобы он развивался как человек и думала как человек, то нужно создать для него мир, максимально соответствующий реальному. Иначе мы получим интеллект уровня пришельца с Альфы Центавра.
Да, легко сказать «максимально соответствующий реальному». Это недостижимый идеал. Но нужно понимать одну вещь – чем более детализированный мы сделаем мир, тем больший потенциал получит программа. Если человек воспитывается в примитивном мире животными, то он и будет животным, с точки зрения уровня развития. Так что если мы создадим для программы относительно простой мир, то мы не сможем развить ее в человека.
Как же быть? Начинать с простого, вот как. Чтобы получить работающий прототип как можно скорее. Ведь дело в том, что нормально тестировать и калибровать его можно только тогда, когда разработаны все компоненты. Раз с примитивным окружением мы получим уровень развития животного, то и нацелимся вначале на животного. Возможно, многих это разочарует, но я не вижу другого выхода, если кто-нибудь видит – просветите. А вообще получить «честную» имитацию животного само по себе достижение.
Чтобы не делать сферического коня, выберем конкретный прототип и чем проще – тем лучше. Для начального этапа я выбрал планарию. Окружающий мир будет представлять собой ванночку, по которой эта планария ползает. Будет возможность поместить еду на определенный участок ванночки. А обучать планарию я буду условному рефлексу – держаться подальше от «освещенных» областей ванночки. Для этого во время обучения, когда она будет заползать на освещенные области, ее будет «бить током» – это ей очень не понравится.
Из этого следует, что у искусственного организма помимо органов чувств и памяти будет тело, способное передвигаться, есть и чувствовать боль. А еще у него будут потребности – в еде, движении, и прочее.
Когда это будет реализовано, можно будет постепенно усовершенствовать анализаторные системы организма, добавлять потребности и усложнять сам мир. При этом можно также придерживаться сходства с реальными организмами и их условиями обитания. Постепенно будем продвигаться к млекопитающим, а там и до человека рукой подать. Вот такая вот эволюция.
P. S. Потенциал программы определяется не совсем так, как у настоящих организмов. Если у последних сразу после рождения есть мозг с определенным количеством нейронов, которое расти не будет, и между этими нейронами уже есть связи, то у нашей программы присутствует только необходимый минимум узлов, отвечающих за потребности. По мере работы программы число узлов, составляющих постоянную память, будет расти. Исходя из этой особенности, нам нет нужды на этапе разработки уделять время архитектуре сети узлов, как это делается при разработке нейросетевых решений. Вместо этого основная масса работ будет заключаться в разработке органов чувств, тела и окружающего мира. А также настройке всего этого добра, только это уже будет не совсем программирование. Такой подход позволяет уже на ранних этапах получить работающую систему, которую затем можно постепенно усложнять, настраивая и внедряя новые функции, без необходимости обнулять накопившуюся память и начинать развитие с чистого листа.
Не будем забывать, что все эти размышления об узлах, работе органов чувств, все это подчинено одной общей цели – созданию работающего прототипа программы, имитирующей преобразования информации в голове человека.
Для этого нужно понять две основные вещи – как информация записывается и как она воспроизводится. Сходу на этот вопрос не ответишь, так как нет ничего, за что бы можно было зацепиться и начать строить рассуждения. Поэтому первой ступенькой на пути к разгадке тайн этих процессов было описание работы органов чувств [2]. Именно с них информация начинает свой путь по нервной системе человека. По логике вещей следующим этапом идет запись информации, т. е. запоминание или обучение.
Обучение
Вот он – Святой Грааль искусственного интеллекта. Обучение считается одной из важнейших его характеристик. Как уже многие догадались, главным героем в этой пьесе выступает образование связей.
Что говорит наука?
Начнем поиск ответа с официальных источников – обратимся к информации о физиологии человека. Вот что написано в главе, посвященной памяти:
Принято считать, что физиологическая основа памяти лежит в так называемых последовательных временных связях, которые возникают в коре полушарий головного мозга на условно-рефлекторных принципах.
Или, говоря русским языком, память – это совокупность условных рефлексов. Не знаю как вас, а меня это определение насторожило. Как можно такую сложную систему представлять в виде совокупности одних только причинно-следственных связей, которыми, по сути, и являются рефлексы? Поиски других физиологических процессов, кандидатов на «основу памяти» были безрезультатны. Похоже на то, что ученые сами не до конца разобрались в этом вопросе. И, чтобы не оставлять явных пробелов в своей теории, списали все на условные рефлексы, как на самые очевидные кандидаты. Хотя в той же самой книге, в главе, посвященной этим рефлексам, написано, что они отвечают за мышечно-химическую активность. И ни слова о памяти.
Ну что ж, раз официальные источники находится в тупике и ничего нового не могут предложить уже почти вторую сотню лет, то ничего не остается, кроме как продолжить поиск среди неофициальных.
Мне сразу же попалась на глаза мнемотехника с ее интересной моделью памяти. Там, помимо уже известных нам рефлекторных связей, описаны некие электрические или, как их еще называют, резонансные связи. Именно на них, в основном, и построена наша память, если верить этой модели.
Главное отличие электрических связей от рефлекторных заключается в том, что электрические связи не являются однонаправленными. Если вы создали в воображении связку из нескольких образов (посмотрели на кошку, состоящую из морды, глаз, ушей, хвоста, лапок и пр.), то стимулом может быть любой образ этой связки. Реакцией всегда будет появление в воображении целостного образа, всех ранее связанных образов. Достаточно увидеть хвост, воображение дорисует его до целостного образа кошки.
В целом все звучит логично и правдоподобно, не смотря на то, что физиология электрических связей до конца не определена. Есть лишь предположение, что возбужденные нейроны каким-то образом способны синхронизировать свои колебания. В итоге, если будет возбужден только один нейрон, возбуждение передастся остальным членам группы благодаря эффекту резонанса (отсюда и второе название этих связей). Но это лишь предположение.
Так или иначе, эта теория в состоянии описать некоторые моменты процесса запоминания, хоть и на более высоком уровне абстракции. А так как модель нашей программы также разрабатывается на более высоком уровне абстракции, чем нейроны, то теория нам подходит.
От теории к практике
Как это обычно бывает, теория расходится с практикой. В нашем случае этого также не удалось избежать. Дело в том, что условные рефлексы образуются на этапе работы краткосрочной памяти. А в нашей модели несколько иное деление на этапы, и во время работы краткосрочной памяти никакие связи не образуются [2]. Единственное, что происходит на этом этапе – это поиск соответствий между информацией из краткосрочной памяти и постоянной. Но это не означает, что условных рефлексов у нас не будет. Хотя нет, означает.
Попробуем справиться с этим недоразумением, задействовав разные типы связей или разные способы образования. Какие типы можно выделить? Рефлекторные и резонансные. Чем они отличаются? Рефлекторные связи устанавливаются от условного раздражителя к безусловному, при этом безусловный появляется спустя какой-то промежуток времени. Кроме того для образования рефлекторных связей существуют ограничения вроде того, что безусловный раздражитель должен быть сильнее с точки зрения биологической значимости.
Попробуем посмотреть на это с другой стороны. Что если связь будет образовываться даже тогда, когда безусловный раздражитель слабее условного? Безусловный просто-напросто не будет вызываться, так как он будет не важен и не интересен в данной ситуации. Получается, что вместо того, чтобы вводить критерии на установку связей, можно ввести их на переход по ней во время этапа поиска. Для этого во время образования связи нужно установить некоторые ее свойства, чтобы было, что анализировать. Например, дату образования. Тогда совокупный процесс связывания можно упростить, создавая связи направо и налево, при этом регистрируя различные их свойства.
Далее некоторые из этих связей почистятся специальным алгоритмом очистки, а оставшиеся могут быть использованы при поиске. Остальную логику мы вынесем в процессы поиска, когда программа будет думать – перейти или нет по данной связи, анализируя ее свойства и другие параметры. В результате у нас получится сохранить реальные модели мышления и поведения, в том числе и рефлексы. Ура, проблема решена!
От практики к новой теории
Ну вот, с проблемой вроде как справились (отложив ее на потом), осталось только выяснить, как, где и когда образуются новые связи. А еще – что это за свойства такие загадочные. И алгоритм очистки.
Обо всем по порядку. Для начала попробуем сформулировать общий принцип образования связей в терминах нашей системы:
Новая, только что поступившая от органов чувств информация должна связаться с информацией, уже существующей в оперативной памяти.
Другими словами новая информация свяжется с текущей ситуацией, с текущими мыслями и ощущениями – со всем, о чем думает человек в данный момент.
С точки зрения узлов [1], [2] никаких логически сложных процессов не происходит. Группа узлов, пришедшая от органов чувств, образует такие связи между собой. Потом она связывается с узлами из оперативной памяти. Сама по себе связь представляет собой банальную ссылку. Пока я склонен считать, что связывать следует по принципу каждый с каждым.
Если подобная система активно поработает некоторое время, то наступит такой момент, когда все узлы в памяти образуют связи со всеми. Хорошего в этом мало, так как информация в итоге не будет никак структурирована, и процессы вспоминания просто не смогут эффективно работать, так как они основаны на переходе от одного узла к другому по ссылке.
Чтобы справиться с этой проблемой, нужно вспомнить, что человек очень легко забывает информацию, если она некоторое время не будет воспроизводиться. А еще можно заметить, что некоторые ситуации мы вспоминаем легче, а некоторые с трудом. Это говорит о том, что связи не равноценны, и в приложении к нашей системе должны иметь свой вес. Чем больше вес, тем сильнее связь. Чем меньше – тем больше шансов, что она разорвется.
Вот для этого нам и понадобятся свойства связей. Первые кандидаты на эту роль – это «дата последнего доступа» и вес. С датой понятно, а вес будет выражаться целым числом, равным количеству переходов по этой связи, эдакий рейтинг популярности. Также можно добавить общий вес узла, равный количеству переходов на него.
Кроме того, что эти два свойства будут использоваться при поиске, можно будет организовать внешний алгоритм по очистке и оптимизации памяти. Для очистки можно установить порог из совокупности даты последнего доступа, веса узла и его состояния [2] (величины возбуждения или усталости, которая определяет силу раздражителя, соответственно положительного и отрицательного). А для оптимизации поиска, в случае, если память хранится в текстовых файлах, можно узлы с наибольшим весом переносить повыше.
Что у нас получается?
Как и было задумано, при запоминании не происходит никаких сложных преобразований, одни только примитивные операции добавления ссылок и срабатывания счетчиков обращений. Более интересные эффекты проявляются, когда эти простые операции выполняются в большом количестве (как это и должно быть). Постепенно в памяти будут формироваться определенные группы узлов, которые будут являться аналогом образов предметов или явлений. Выделяться эти группы будут тем, что вес связей с внутренними членами группы будет заметно больше веса связей с другими узлами. Подобное формирование образов является предпосылкой к началу обучения речи и как следствие – более сложной интеллектуальной деятельности.
Самое замечательное в том, что нам не нужно жестко программировать поведение и образ мышления программы. Если общие операции вроде образования связей и снятия показаний с органов чувств определены жестко, то критерии поиска и детали работы алгоритма очистки можно и нужно настраивать и калибровать, основываясь на известных экспериментальных данных. Так что задача не такая уже и сложная, какой могла показаться вначале. Точнее мы разбили ее на два этапа – создание чего-то отдаленно похожего на фреймворк и, собственно, настройка и калибровка этого фреймворка.
Искусственный организм
К этому моменту мы рассмотрели, как программа получает информацию и как она ее запоминает. В следующий раз мы рассмотрим механизмы поиска. Но до сих пор за кадром оставалось то, откуда берется вся эта информация. Пришло время поговорить о виртуальном окружении.
Чисто теоретически этим окружением может являться все, что угодно. Даже одна переменная, содержащая число 42. Но на практике, если мы хотим, чтобы программа развивалась, совершенствовала свою модель мира, научилась говорить, в конце концов, нужно предоставить ей нечто большее, чем число 42. Это должен быть динамичный мир со своими объектами, у которых будут свои свойства, и со своими законами, которые будут действовать на объекты и на саму программу. И программу теперь уже уместнее называть искусственным организмом.
Если мы хотим, чтобы он развивался как человек и думала как человек, то нужно создать для него мир, максимально соответствующий реальному. Иначе мы получим интеллект уровня пришельца с Альфы Центавра.
Да, легко сказать «максимально соответствующий реальному». Это недостижимый идеал. Но нужно понимать одну вещь – чем более детализированный мы сделаем мир, тем больший потенциал получит программа. Если человек воспитывается в примитивном мире животными, то он и будет животным, с точки зрения уровня развития. Так что если мы создадим для программы относительно простой мир, то мы не сможем развить ее в человека.
Как же быть? Начинать с простого, вот как. Чтобы получить работающий прототип как можно скорее. Ведь дело в том, что нормально тестировать и калибровать его можно только тогда, когда разработаны все компоненты. Раз с примитивным окружением мы получим уровень развития животного, то и нацелимся вначале на животного. Возможно, многих это разочарует, но я не вижу другого выхода, если кто-нибудь видит – просветите. А вообще получить «честную» имитацию животного само по себе достижение.
Чтобы не делать сферического коня, выберем конкретный прототип и чем проще – тем лучше. Для начального этапа я выбрал планарию. Окружающий мир будет представлять собой ванночку, по которой эта планария ползает. Будет возможность поместить еду на определенный участок ванночки. А обучать планарию я буду условному рефлексу – держаться подальше от «освещенных» областей ванночки. Для этого во время обучения, когда она будет заползать на освещенные области, ее будет «бить током» – это ей очень не понравится.
Из этого следует, что у искусственного организма помимо органов чувств и памяти будет тело, способное передвигаться, есть и чувствовать боль. А еще у него будут потребности – в еде, движении, и прочее.
Когда это будет реализовано, можно будет постепенно усовершенствовать анализаторные системы организма, добавлять потребности и усложнять сам мир. При этом можно также придерживаться сходства с реальными организмами и их условиями обитания. Постепенно будем продвигаться к млекопитающим, а там и до человека рукой подать. Вот такая вот эволюция.
P. S. Потенциал программы определяется не совсем так, как у настоящих организмов. Если у последних сразу после рождения есть мозг с определенным количеством нейронов, которое расти не будет, и между этими нейронами уже есть связи, то у нашей программы присутствует только необходимый минимум узлов, отвечающих за потребности. По мере работы программы число узлов, составляющих постоянную память, будет расти. Исходя из этой особенности, нам нет нужды на этапе разработки уделять время архитектуре сети узлов, как это делается при разработке нейросетевых решений. Вместо этого основная масса работ будет заключаться в разработке органов чувств, тела и окружающего мира. А также настройке всего этого добра, только это уже будет не совсем программирование. Такой подход позволяет уже на ранних этапах получить работающую систему, которую затем можно постепенно усложнять, настраивая и внедряя новые функции, без необходимости обнулять накопившуюся память и начинать развитие с чистого листа.