Ранее мы описали клеточный автомат, в котором могут возникать волны, имеющие хитрый внутренний узор. Мы показали, что такие волны способны распространять информацию по поверхности автомата. Оказалось, что любое место автомата может быть, как приемником, так и источником волн. Чтобы принять волну в каком-либо месте, достаточно посмотреть, какой узор получается в нем в момент прохождения волны. Если этот узор запомнить и впоследствии воспроизвести в том же месте, то от этого узора распространится волна, повторяющая на своем пути узор исходной волны.
Все это сильно напоминает радиосвязь. В любом месте земли можно принять сообщение и запомнить. Потом из любого места его можно снова запустить в эфир. При этом широковещательная трансляция подразумевает не конкретного получателя, а доступность сигнала для всех.
Автомат, который мы описываем обладает памятью. Точнее, памятью обладают все его элементы. Память элемента специфична. Единственное, что видит элемент автомата – это узор, составленный из активности своих соседей. Единственное, как элемент может отреагировать на тот или иной узор – это либо самому стать активным, либо, наоборот, выключиться. Память элемента – это набор запомненных им узоров с указанием, как на них реагировать: включаться или выключаться.
Интерференция узоров в клеточном автомате
Наличие у элементов автомата собственной памяти позволяет использовать сам клеточный автомат, как универсальное запоминающее устройство, реализующее ассоциативный массив. Ассоциативный массив – это хранилище пар вида «ключ-значение». Чтобы иметь возможность манипулировать с сохраненными данными ассоциативный массив должен поддерживать операции: добавления пары, поиска пары (по ключу или по данным) и удаления пары. Покажем, как это можно реализовать в нашем клеточном автомате.
Для больших аналогий с корой
Пространственный клеточный автомат и выделенный цилиндрический фрагмент
Предположим, что мы последовательно запустили в автомате две информационных волны. Пусть, первая волна несет значение, которое мы хотим сохранить, а вторая волна – уникальный ключ, который мы хотим сделать идентификатором сохраняемой информации. Каждая из волн распространит свой узор по всему пространству автомата, то есть в каждом его месте последовательно пройдут два узора, образованные первой и второй волной, соответственно. В наблюдаемом фрагменте первая волна оставит след, например такой, как показано на рисунке ниже.
След от информационной волны, несущей значение, которое необходимо запомнить
Позволим элементам помнить свое недавнее состояние. То есть, после прохождения волны активность элементов исчезает, но факт того, что они были активны хранится элементами до сигнала общего сброса. Иначе говоря, до общего сброса сохраняется оставленный волной след.
Вторая волна оставит свой след в том же объеме (рисунок ниже). Обозначим элементы каждой из волн своим цветом, при этом некоторые элементы могут получить сразу два цвета.
Следы от двух волн. Желтые – элементы, кодирующие значение. Черные – элементы, кодирующие ключ
Теперь, выполним запоминание. Для этого на всех элементах желтого цвета запомним узор, образованный элементами черного цвета. В свою очередь, на всех черных элементах запомним узор, образованный желтыми элементами. Первое фиксирует информационный узор с требуемым ключем. Второе, наоборот, фиксирует узор ключа, при этом «ключем» является сам информационный узор. В результате такой своеобразной «интерференции» в указанном объеме сохранится пара «ключ-значение».
Процесс обратного воспроизведения очень прост. Запустим в автомат ключ. То есть, запустим ту же самую черную волну. В объеме, за которым мы следим, активируются желтые элементы. Для них паттерн черных элементов будет сигналом, хранящимся в их памяти и вызывающим их активность. В результате, мы восстановим желтый узор, который является значением для соответствующего ключа. Этот желтый паттерн запустит волну, которая распространит извлеченную из памяти информацию по пространству автомата. Собственно, описанное – это и есть реализация записи информации и ее поиска по ключу.
Если все ключи будут уникальны, то воспроизведение информации по ключу будет вызывать единственную ответную информационную волну, соответствующую значению пары для этого ключа. Если коды значений так же будут уникальны, то будет возможен и обратный поиск ключа по значению.
Для сохранения одной информационного пары «ключ-значение» достаточно выполнить запоминания в одном элементарном объеме. Если каким-либо способом при запоминании указывать автомату место, где мы хотим хранить воспоминание, то можно получить пространственно-распределенную систему хранения. Однако ничто не мешает выполнить и «избыточное» распределенное запоминание. То есть запомнить одну и туже информацию не в одном месте, а во всем пространстве клеточного автомата. И то и другое — очень важные свойства, которые понадобятся нам в дальнейшем.
Каждый элементарный объем может хранить множество воспоминаний. Размеры его памяти пропорционален тому, сколько узоров может хранить отдельный элемент автомата. Если один запоминаемый узор составляет, например, два процента активности всех элементов, то общее количество возможных воспоминаний для элементарного объема будет приблизительно в 20-30 раз больше, чем память одного элемента.
Своеобразная интерференция двух информационных волн и распределенное запоминание делают описанный механизм крайне похожим на оптическую голографию. Принципы голографии открыл и описал Денеш Габор. Если иметь источник света со стабильной частотой, то разделив его посредством полупрозрачного зеркала на два, мы получим два когерентных световых потока. Один поток можно направить на объект, а второй на фотографическую пластину.
Создание голограммы
В результате, когда отраженный от объекта свет достигнет фотографической пластины, он создаст с освещающим пластину потоком интерференционную картину. Интерференционная картина, отпечатавшись на фотопластинке, сохранит информацию не только об амплитудных, но и о фазовых характеристиках светового поля, отраженного объектом. Теперь, если осветить ранее экспонированную пластину, то восстановится исходный световой поток, и мы увидим запомненный объект во всем его трехмерном объеме.
Воспроизведение голограммы
Голограмма имеет несколько удивительных свойств. Во-первых, световой поток сохраняет объем, то есть, разглядывая фантомный объект под разными углами, можно увидеть его с разных сторон. Во-вторых, каждый участок голограммы содержит в себе информацию обо всем световом поле. Так, если мы разрежем голограмму пополам, то сначала мы увидим только половину изображения. Но когда мы посмотрим на голограмму сбоку, то за краем оставшейся голограммы мы сможем разглядеть вторую «обрезанную» часть. Чем меньше фрагмент голограммы, тем ниже ее разрешающая способность, но даже через маленький участок можно, как через замочную скважину, рассмотреть все изображение.
Соответственно, описанная память по своей сути, вполне, может называться голографической, но с той оговоркой, что в ее основе лежит не классическая волновая интерференция, а несколько иная по своему алгоритму интерференция паттернов. Хотя, если копнуть глубже, то в представлении цифровой физики, рассматривающей пространство, как клеточный автомат, эти интерференции могут быть тождественны по своей природе.
Описание состояния автомата через битовый массив
Любому элементарному объему автомата может быть сопоставлен битовый массив. В начальном состоянии все его элементы равны нулю. Прохождение волны обращает часть элементов в единицы. В клеточном автомате после прохождения фронта волны элементы возвращаются в неактивное состояние. В сопоставленном битовом массиве введем несколько иные правила. Будем оставлять биты массива в единичном состоянии, накапливая активность после прохождения очередной волны. Будем осуществлять общий сброс состояния массива, когда посчитаем это необходимым.
Каждая волна кодирует только одно понятие. Сложение следов волн позволяет составить описание, состоящие из нескольких понятий одновременно. Сброс состояния битового массива сбрасывает описание. Последовательное прохождение волн создает описание. Законченное описание появляется, когда распространятся все необходимые волны.
Описанная структура соответствует фильтру Блума. Предположим, что у нас есть множество C, состоящее из понятий, которыми мы оперируем. Каждому элементу ci множества C сопоставим бинарный код bi разрядности m, содержащий k единиц. Выберем позиции единиц случайным образом. Составим множество I из нескольких понятий множества C.
Фильтр Блума содержит битовый массив B из m бит. В начальном состоянии он обнулен. Добавление элемента к фильтру Блума – это обращение в единицу тех элементов фильтра, которые соответствуют единицам бинарного кода добавляемого элемента. Отображение множества I на фильтр Блума эквивалентно логическому сложению бинарных кодов элементов, составляющих I, и перенос получившегося кода на бинарный массив фильтра.
Фильтр Блума позволяет проверить принадлежность любого элемента множества C, множеству I. Для проверки надо взять бинарный код элемента и убедиться, что всем единицам кода соответствуют единицы в фильтре Блума. Если хотя бы одна из позиций фильтра не соответствует, то элемент гарантированно не принадлежит множеству I. Если проверка пройдена, то с высокой вероятностью, которая зависит от параметров фильтра, элемент содержится в I. Пример проверки приведен на рисунке ниже.
Фильтр Блума. Элемент w не принадлежит заданному множеству {x, y, z}
Одно понятие в клеточном автомате в элементарном объеме кодируется паттерном, состоящем из небольшого числа элементов по отношению к общему числу элементов в этом объеме. Соответственно, о бинарном коде понятия можно говорить, как о длинном бинарном разряженном коде.
После формирования битового массива, соответствующего длинному описанию, плотность единиц возрастет, что будет соответствовать длинному бинарному средне-разряженному кодированию.
Для нашего автомата будем полагать, что общая разрядность, равная числу элементов в элементарном объеме, достаточно высока, общее число используемых понятий разумно ограничено и, что возможное число понятий в одном описании не особо велико. Тогда появляется возможность взять битовый массив, полученный после передачи описания, состоящего из нескольких понятий, и восстановить сами исходные понятия. Для этого надо примерить к битовому массиву, как к фильтру Блума, коды для всех возможных понятий и посмотреть, какие из них дадут положительный результат. В сделанных допущения можно добиться, чтобы при проверке вероятность ложноположительных срабатываний была низка.
Это значит, суммарные бинарные коды можно использовать, как аналоги исходного описания. То есть, в каждом месте автомата полученный после распространения сложного описания суммарный бинарный код будет содержать всю полноту исходного описания.
Создание хеша сложных описаний в клеточном автомате
Чтобы сохранить в клеточном автомате сложное описание во всей его полноте достаточно провести описанную ранее процедуру запоминания. Создать идентификатор воспоминания и осуществить интерференцию описания и идентификатора. При запоминании элементам, кодирующим узор идентификатора воспоминания, придется запомнить картину описания, содержащую достаточно много единиц. При компьютерном моделировании клеточного автомата это не представляет проблем, но, как будет показано позже, запоминание при большом количестве сигналов затруднительно для биологической системы. Соответственно, встает вопрос: нельзя ли уменьшить количество активных элементов, составляющих описание (или идентификатор), сведя их количество к количеству разряженного кодирования?
В результате мы приходим к задаче хеширования. Хеширование – это преобразование по определенному алгоритму входного массива данных произвольной длины в выходную битовую строку фиксированной длины. Такие преобразования также называются хэш-функциями или «функциями свертки», а их результаты называют хэш-кодом или «сводкой сообщения».
Чтобы привести наш клеточный автомат к условиям задачи хеширования введем для элементарного объема новый битовый хеш-массив относительно небольшой длины.
Требуемое нам хеш-преобразование должно понизить разрядность длинного бинарного кода до размеров хеша. Хорошая хеш-функция должна при этом минимизировать число возможных коллизий. То есть желательно, чтобы вероятность того, что два разных описания могу получить один и тот же хеш была минимальной.
Мы не будем сейчас останавливаться на том, какую хеш-функцию лучше использовать в нашем случае. Это вопрос достаточно интересный, но сложный. Просто, приведем, как пример, один из самых простых вариантов.
Можно разбить элементы исходного битового массива на группы и вычислить какую-либо однобитную логическую функцию от элементов группы (рисунок ниже). После чего сформировать хеш-код из полученных бит.
Пример вычисления одного бита хеша для группы элементов
Введем в клеточный автомат дополнительные элементы, которые будут соответствовать элементам хеш-массива. Не будем затрагивать регулярную решетку исходных ячеек. Создадим для новых элементов собственную решетку, находящуюся в том же геометрическом пространстве. Позволим старым элементам автомата видеть картину активности окружающих хеш элементов и дадим им возможность запоминать ее.
Кроме того, модифицируем исходные элементы таким образом, чтобы они могли накапливать информацию о своей активности за те несколько волн, пока передается сообщение.
Попробуем запомнить сложное описание, состоящее из нескольких понятий. Для этого, последовательно распространим волны, соответствующие понятиям из описания, по пространству автомата. Накопим информацию об активности. То есть, сформируем суммарную картину следа волн во всем объеме автомата. Затем, вычислим активность хеш-элементов.
На рисунке ниже показан результат сложения нескольких волновых узоров и результат их хеш-преобразования. Зеленые элементы образуют паттерн хеш-кода. Эти элементы существуют отдельно от исходных основных элементов, но находятся с ними в том же пространстве. То есть доступны им для наблюдения.
Сложение нескольких паттернов
Результат хеш-преобразования
Теперь распространим ключ и сохраним воспоминание. Только сейчас элементы, участвующие в узоре ключа, будут запоминать не информационную картину активности основных элементов, а узор полученного хеша.
После завершеия записи мы можем сбросить активность автомата и заново подать исходное описание. Картина активности основных элементов повторится, повторится и вычисленный от нее хеш. Появление знакомого хеш-кода вызовет появление узора, соответствующего ключу ранее сделанного воспоминания.
Если описанию соответствует единственное событие, то автомат может извлечь и распространить идентификатор этого события. Если же в памяти есть несколько воспоминаний с одинаковыми описаниями, то проявится суммарная картина, составленная из идентификаторов этих описаний. Такая ситуация требует более сложной обработки.
Подведем краткий итог:
- Две информационных волны могут “интерферировать” между собой. Одна волна отмечает элементы, которые должны что-то запомнить, а другая волна рисует узор того, что именно они должны запомнить;
- Слишком плотный узор при запоминании можно заменить его хешем;
- Запоминать можно локально в небольшой области автомата. Тогда можно хранить в каждом месте что-то свое;
- Запоминать можно глобально. Тогда в каждом месте автомата будет храниться своя копия одной и той же информации.
Я не случайно заостряю внимание на возможности локального и глобального запоминия. Далее я покажу, что именно эти два механизма являются ключевыми для понимании работы
Алексей Редозубов
Логика сознания. Вступление
Логика сознания. Часть 1. Волны в клеточном автомате
Логика сознания. Часть 2. Дендритные волны
Логика сознания. Часть 3. Голографическая память в клеточном автомате
Автор: AlexeyR