Numenta NuPIC: первые шаги

  • Tutorial

Введение


Numenta NuPIC — открытая реализация алгоритмов, моделирующих процессы запоминания информации человеком, происходящие в неокортексе. Исходные коды NuPIC на github

В двух словах, назначение NuPIC можно описать как «фиговина, выявляющая, запоминающая и прогнозирующая пространственные и временные закономерности в данных». Именно этим большую часть времени занимается человеческий мозг — запоминает, обобщает и прогнозирует. Очень хорошее описание этих процессов можно найти в книге Джеффа Хокинса «On Intelligence» (есть русский перевод книги под названием «Об интеллекте»).

На сайте Numenta есть подробный документ, детально описывающий алгоритмы и принципы работы, а также несколько видео.


Сборка и установка


Описана в readme файле в репозитории, поэтому детализировать не буду. Для работы, nupic потребуется python2.7 (или 2.6) с заголовочными файлами.

Параметры и структура модели


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

Модель состоит из нескольких процессов, поведение каждого из которых задается набором параметров.

Encoder

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

Например, на вход модели мы хотим подавать числа из интервала от 1 до 100 (скажем, текущую относительную влажность). Если просто взять бинарное представление чисел, что значения 7 и 8, расположены рядом, но бинарное их представление отличается очень сильно (0b0111 и 0b1000). Чтобы этого избежать, encoder преобразует числовые значения в набор единичных бит, сдвинутых пропорционально значению. Например, для диапазона значений от 1 до 10 и трех единичных бит, получаем следующее представление:
  • 1 -> 111000000000
  • 2 -> 011100000000
  • 3 -> 001110000000
  • 7 -> 000000111000
  • 10 -> 000000000111

Если на входе несколько значений, то их бинарные представления просто объединяются вместе.
Аналогично представляются значения с плавающей точкой и дискретный набор значений (true/false, и другие перечислимые типы).

Spatial Pooler

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

Temporal Pooler

Помимо определения похожих образов входных данных, NuPIC умеет различать контекст этих данных, анализируя их поток во времени. Достигается это за счет многослойности набора клеток (так называемые клеточные колонки), и подробное описание также выходит за намеченные рамки. Тут достаточно сказать, что без этого, система не отличала бы символ B в последовательности ABCABC от того же символа в CBACBA.

Практика: синус


Довольно теории, перейдем к практической стороне вопроса. Для начала возьмем простую функцию синуса, подадим на вход модели и посмотрим насколько хорошо она сможет ее понять и предсказать.

Полный код примера, разберем ключевые моменты.

Для создания модели по набору параметров, используется класс ModelFactory:
from nupic.frameworks.opf.modelfactory import ModelFactory

model = ModelFactory.create(model_params.MODEL_PARAMS)
model.enableInference({'predictedField': 'y'})


MODEL_PARAMS — это довольно развесистый dict с полным набором параметров модели. Все параметры нас сейчас не интересуют, но на некоторых стоит остановится.
        'sensorParams': {
            'encoders': {
                'y': {
                    'fieldname': u'y',
                    'n': 100,
                    'name': u'y',
                    'type': 'ScalarEncoder',
                    'minval': -1.0,
                    'maxval': 1.0,
                    'w': 21
                },
            },


Здесь задаются параметры encodera, преобразующего значение синуса (в диапазоне от -1 до 1) в битовое представление. Значения minval и maxval определяют диапазон, значение n задает общее количество бит в результате, а w — количество единичных бит (оно почему-то должно быть нечетным). Таким образом, весь диапазон разделяется на 79 интервалов с шагом 0.025. Для проверки вполне достаточно.

Остальные параметры менять пока не нужно — их много, но значения по умолчанию вполне работают. Даже после прочтения witepaper и нескольких месяцев копания с кодом, точное назначение некоторых опций остается для меня загадкой.

Вызов метода enableInference у модели, указывает какой из входных параметров мы хотим прогнозировать (он может быть только один).

Подготовка закончена, можно накачивать модель данными. Делается это так:
res = model.run({'y': y})


В аргументы подается dict, в котором перечислены все входные значения. На выходе модель возвращает объект, содержащий в себе копию входных данных (как в оригинальном представлении, так и в закодированном), а также прогноз на следующий шаг. Больше всего нас интересует именно прогноз в поле inferences:
{'encodings': [array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  1.,  1.,
        1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.], dtype=float32)],
 'multiStepBestPredictions': {1: 0.2638645383168643},
 'multiStepPredictions': {1: {0.17879642297981466: 0.0083312500347378464,
                              0.20791169081775931: 0.0083320832430621525,
                              0.224951054343865: 0.020831041503470333,
                              0.24192189559966773: 0.054163124704840825,
                              0.2638645383168643: 0.90834250051388887}},


Прогнозировать мы можем на несколько шагов сразу, поэтому в словаре multiStepPredictions ключом является количество шагов прогноза, а значением — другой словарь с прогнозом в ключе и вероятностью в значении. Для примера выше, модель предсказывает значение 0.26386 с вероятностью 90.83%, значение 0.2419 с вероятностью 5.4% и т.д.

Наиболее вероятный прогноз находится в поле multiStepBestPredictions.

Вооружившись всем этим знанием, пытаемся прогнозировать простой синус. Ниже показаны графики прогонов программы, с указанием параметров запуска. На верхнем графике синяя линия — оригинальный синус, зеленая — прогноз модели, сдвинутый на один шаг влево. На нижнем графике среднеквадратичная ошибка за 360 значений назад (полный период).

Вначале ошибка довольно велика, и прогнозируемое значение заметно отличается от оригинального значения (sin-predictor.py -s 100):


Через 1000 шагов:


Прогресс налицо. Через 10000 шагов:


Через 10000 шагов, последние 360 значений:


Видно, что модель определенно получила некоторые представления о том что от нее хотят.

Заключение


В этой статье я попытался дать самое общее представление о том как пользоваться NuPIC, не уходя в дебри деталей реализации. За кадром осталось много всего — структура сети, система визуализации cerebro, swarming, и т.п. Если будет время и интерес к теме, статьи можно продолжить.
Share post

Similar posts

Comments 21

    +2
    Ух ты! Не ожидал, что они исходники выложат! Они, вроде, только теорию публиковали и разрешали самостоятельную имплементацию в целях изучения или коммерческое использование только по договоренности, а так же некоторые инструменты по распознаванию образов в виде закрытого софта для ознакомления… А тут сразу в Open Source! Вот это да! Круто! :)
      +1
      Да, они открылись этим летом, сейчас понемногу набирают сообщество. До этого, где-то в 2011-2012, что ли, Numenta предоставляла закрытый доступ к предыдущей версии платформы, но с тех пор все переписали.
      +3
      Если будет время и интерес к теме, статьи можно продолжить.
      Интерес безусловно есть, конечно продолжайте! :)
        0
        Для кодирования чисел с минимальными битовыми различиями между последующими можно использовать коды Грея
          0
          Сети будет трудновато понять, что это.
            0
            При использовании кодов грея потеряется избыточность входных данных. Связь между выходом энкодера и входами клеток вероятностная (как и в реальном мозге), поэтому избыточность важна.
            +5
            В Numenta/NuPIC смущает то, что там все как будто «в своем мире» живет. Я в нейросетях ни разу не эксперт, но смущает, что у них на сайте/в доках/инструкциях нигде нет сравнения с «традиционными» нейросетевыми моделями и другими статистическими методами. В whitepaper вместо того, чтоб сравнивать с другими методами машинного обучения, все сравнивается с нейронами человеческого мозга — ну куда это годится. И терминология вся какая-то непонятная. Ну, например «Swarming» вместо «cross-validation + hyperparameter optimization». Как будто все писали биологи, которые понятия не имеют о статистике и машинном обучении. Или как будто старались впечатлить не-экспертов. И ссылки все только на работы основателя фирмы. Это очень все подозрительно. Короче говоря, выглядят они научными фриками. Вполне возможно, что я не прав, и в этом всем на самом деле что-то есть (тем более что в нейросетях я мало что понимаю), но подача все-же странная какая-то.
              0
              На мой взгляд, странностей тут нет, хотя я тоже не ахти какой специалист в нейробиологии и нейронных сетях. Алгоритмы и структура HTM создавалась исходя из строения неокортекса и его работы. Это в каждом выступлении Хокинса чуть ли не центральный пункт — построить искусственный интеллект, схожий с человеческим можно только следуя от биологии и никак иначе. Само собой, без компромиссов все равно не обойтись — в том же NuPIC отказались от иерархичности сети из-за проблем с производительностью. Но тем не менее, HTM гораздо ближе к биологии чем те же NN, отсюда и терминологический перекос.

              Сравнение с традиционными моделями, я думаю, вопрос времени — информации по HTM и NuPIC просто катастрофически мало; из документации, по сути, только исходный код; сообщество тоже очень небольшое. Сами нументовцы, похоже, свято верят в непогрешимость Джеффа, и, насколько мне известно, сравнений не было. Буквально позавчера в рассылке было сообщениечто кто-то тестировал HTM на данных энергетиков и вышло вроде неплохо. Но, это, конечно, все не то.

              Как обычно, время покажет. Но из забавного — совсем недавно в DARPA началась какая-то движуха по созданию нейропроцессоров, в требованиях к архитектуре которых лежит близость к биологическим процессам: numenta.org/blog/2013/08/13/brains-and-machine-intelligence-a-long-time-coming.html, www.networkworld.com/community/blog/darpa-wants-computers-fuse-higher-human-brain-function, lists.numenta.org/pipermail/nupic_lists.numenta.org/2013-September/001150.html
                0
                Вот, я тоже как-то задумывался, что будет, если DARPA узнает о существовании Numenta и их исследованиях, как-то даже не по себе) По-моему, они имеют наиболее близкое представление об интеллекте…
                  +2
                  Известно что:
                  image
                    0
                    Когда читал их whitepaper и задумался, как можно было бы аппаратно реализовать их идеи, вспомнилось именно это
                  0
                  У них на канале есть очень хорошее видео (в концептуальном плане, конечно, т.к. технических деталей там мало), которое описывает, как работает их Grok и как можно использовать их платформу для обработки совместно с другими системами: www.youtube.com/watch?v=E7h_k72wT-o (если вы не видели ещё).
                  А информации не то что мало, скорее, она в очень слабо структурированном виде, что очень огорчает. Потому что само по себе то, что они делают невероятно интересно.
                    0
                    Спасибо! Канал grok как-то мимо меня прошел :)
                  0
                  Очень сложно объяснить в двух словах)
                  Рекомендую вам и не только вам, а вообще всем, даже людям далеким от темы, даже гуманитариям (и даже верующим/религиозным людям))), ознакомиться с книгой Джеффа Хокинса «Об интеллекте», даже просто ради того, чтобы лучше понимать самого себя, почему вы (ваш мозг) на то или иное событие реагируете именно так, а не иначе, почему мы удивляемся, как мы воспринимаем пространство и время и т.д., тогда множество вопросов отпадут сами собой, это очень интересное и нескучное чтиво, написано простым и доступным языком, практически все объясняется на пальцах и без трехэтажных формул. Оттуда же вы узнаете, что Джефф занимается исследованиями мозга и интеллекта более 30 лет, уже, наверное, около сорока, и рассказывает о зарождении эры исследований и построения ИИ, о двух ее основных направлениях: о главном, мэйнстриме, основанном на создании методов и алгоритмов, повторяющих и имитирующих поведение натурального интеллекта, движимое такими людьми, как Джон Маккарти, и побочном, андеграунде, которое всячески высмеивалось и не воспринималось всерьез, основанном на изучении и понимании принципов работы мозга, натурального интеллекта, памяти с последующими математическими построениями и алгоритмическими реализациями… В ней рассказывается почему он ушел из института (MIT, кажется), где насаждалась мэйнстримовая модель, зачем он создал и зачем продал компанию Palm Computing (производившую наладонники с распознаванием рукописного ввода), о том, что основал свой институт по исследованиям мозга и интеллекта, куда привлек множество специалистов из самых различных сфер — математиков, нейрофизиологов, нейробиологов и т.д. Так же он рассказывает и объясняет какие невероятные возможности принесет ИИ человечеству, что это будет незаменимый инструмент… Эта книга, практически, содержит основы основ для понимания всех остальных работ проводимых в Numetna :)
                  После этой книги почитайте их whitepapers, которые станут понятней раз в сто)
                    0
                    Да, Джефф слегка прошёлся в своей книге по традиционному подходу в ИИ, хотя и довольно скромно. Забавно то, что я встречал на некоторых сайтах с его публикациями очень неприязненные комментарии как раз этих адептов :) Буквально таки в смысле, что цель Нументы — нанести максимальный ущерб тем, кто занимается исследованиями/разработками в этой области. Вот оно стало быть для чего. :) А мужики-то и не знают (с).
                  0
                  Вау. У этого чуда есть Питоновские биндинги!
                  Идея-то сама выглядит классно. Осталось понять, как оно работает.
                    0
                    Оно изначально на питоне написано, C++ ядро еще в процессе разработки.
                  • UFO just landed and posted this here
                      0
                      Так и делают! Прогнозирование котировок акций, прогнозирование погоды, траффика и т.д. И даже авторы приводят это как один из примеров областей применения. Конечно, с полпинка не получится, нужно подходить основательно, со знанием дела, но эта модель вполне подходит для работы с подобного рода данными и задачами…
                      0
                      Наверное, в статью стоит добавить прямую ссылку на русский перевод описания этого алгоритма numenta.org/resources/HTM_CorticalLearningAlgorithms_ru.pdf (61 страница, между прочим, довольно подробно все описано)
                        0
                        Уважаемый автор! В свете недавнего выхода NuPIC 0.1 можно ли ожидать от вас публикации обещанного продолжения серии статей?
                        twitter.com/Numenta/status/558336485171019776

                        Only users with full accounts can post comments. Log in, please.