Динамическая Иерархическая Память. Программный код библиотеки классов и эксперименты.

Важно: этот код не является продуктом компании Numenta.

К сожалению, программный код компания Numenta больше не предоставляет в открытом виде и на данный момент даже использование через API доступно для узкого круга бета-тестеров. Однако я не поленился воспроизвести (с некоторым изменениями) код, описанный в статье «HIERARCHICAL TEMPORAL MEM ORY including HTM Cortical Learning Algorithms». По мере прогресса и своих возможностей буду публиковать здесь программный код и результаты моих экспериментов. Пока не могу себе позволить заниматься этим вопросом так плотно, как ребята из Нументы, так что не судите строго.

Описание библиотеки классов на C# и инструментов для конструирования и тестирования сети

Состав решения:

HTM – собственно библиотека классов HTM;

MyMath – библиотека классов, которую я использую во всех проектах. В данном случае используется в части визуализации работы HTM и построения графиков изображающих изменения показателей, характеризующих качество работы сети (частота верных предсказаний и частота не предсказанных  активаций колонок);

TestProject1 – модульные тесты;

…не окончено…

 

Эксперименты, посвященные проверке работоспособности технологии ДИП

Эксперимент 1. «Я знаю, что происходит!»

Это простой эксперимент с одноуровневой сетью состоящей из одного одномерного региона. Цель эксперимента – проверить способность региона запоминать последовательности.

Я рассудил так, что начинать нужно с простого. Да HTM рассчитана на обработку полей и векторов параметров, но я хотел посмотреть, как такая сеть сможет изучить изменение одного параметра. В эксперименте я создал одномерный регион, который получал на вход сигнал, кодирующий текущее значение параметра в виде массива из 32 бит. Параметр менялся по синусоиде и на каждом такте один из 32 бит становился активным, при этом, как правило, один и тот же бит оставался активным несколько тактов подряд. Оценивалась частота правильных предсказаний активности клеток в самом регионе.

В данном эксперименте точность работы сети (после некоторого самообучения) стабилизировалась и составляла в среднем около 75% правильных реакций. Где-то 1-5% предсказаний активации колонки не сбывались и примерно 10-15% активаций колонок не были предсказаны (см. рисунок ниже). Вероятно, это не предел, можно повысить точность за счет параметрической оптимизации сети.

  

Рисунок – оценки точности работы региона методом скользящего среднего за последние 100 тактов

В ходе этих экспериментов было сделано несколько небольших изобретений и появились интересные идеи. Об этом рассказывается в «Описании библиотеки…».

Исходники на C#: HTMsrc.rar

Эксперимент 2. «Я знаю, что будет дальше!»

Цель эксперимента - получить от сети прогноз того, какие паттерны она ожидает получить от сенсора в следующие несколько тактов.

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

Задачи:

  1. Получить прогноз активности на несколько тактов вперед.
  2. Преобразовать паттерн активности клеток региона в паттерн активности сенсора и далее в исходный синусоидальный сигнал, который подавался на вход при обучении.

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

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

Результаты:

  1. Клетки успешно обучались преобразовать паттерн активности клеток региона в паттерн активности сенсора. Процент верных активаций после некоторого обучения превышал 80%. 20% активаций были пропущены. При этом обучение происходило дольше, чем обучение обычных клеток из колонок региона (что логично).
  2. Удалось воспроизвести прогноз изменения параметра (меняющегося ступенчато по синусоиде), который в нормальном режиме подавался на вход региона. При этом прогноз удавалось получить на 5-10 шагов, после чего сигнал пропадал, да и среди этих 5-10 паттернов встречались пустые. Это объясняется тем, что 20% активаций моторный слой не отрабатывает, и поскольку на вход он получает свой собственный прогноз, то на каждом следующем шаге вероятность активации уменьшается.

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

  

Рисунок – измеренное и предсказанное значения сигнала (по оси абсцисс – номер такта)

Задача на будущее: развить концепцию «режима воображения» для многоуровневой сети (в данном примере сеть состояла из единственного региона).

 

Планы:

  1. Реализовать автоматическую настройку радиуса ингибирования в ПГ.
  2. Добавить 2D регион.
  3. Добавить обратную связь нижнего региона с регионом выше по иерархии.
  4. Добавить механизм параметрической оптимизации сети (выбрать критерии для начала).
  5. Добавить графический интерфейс для конструирования топологии сети.

 

 

Материалы стены перемещены в Гостевую книгу
Конструктор сайтов - uCoz