Введение Numenta NuPIC — открытая реализация алгоритмов, моделирующих процессы запоминания человеком информации, происходящие в неокортексе.
Исходные коды NuPIC на GitHub Вкратце, цель NuPIC можно описать как «трюк, который идентифицирует, запоминает и прогнозирует пространственные и временные закономерности в данных».
Это то, что человеческий мозг делает большую часть времени: запоминает, обобщает и прогнозирует. Очень хорошее описание этих процессов можно найти в книге Джеффа Хокинса «Об интеллекте» (есть русский перевод книги «Об интеллекте»).
На сайте Нумента имеется подробный документ, подробно описывающий алгоритмы и принципы работы, а также несколько видеороликов.
Сборка и установка
Оно описано в файле readme в репозитории, поэтому не буду вдаваться в подробности.Для работы nupic понадобится python2.7 (или 2.6) с заголовочными файлами.
Параметры и структура модели
Ключевой концепцией нупика является модель неокортекса (или просто модель), представляющая собой набор клеток, обрабатывающих и хранящих входные данные.В процессе обработки входных данных ячейки прогнозируют вероятное развитие событий, что автоматически формирует прогноз на будущее.
Как это делается, я расскажу в следующей статье; пока это просто общее описание самого необходимого.
Модель состоит из нескольких процессов, поведение каждого из которых задается набором параметров.
Кодер
Входные данные проходят через кодировщик и преобразуются в форму, понятную модели.Каждая ячейка воспринимает только двоичные данные, и для работы схожие по значению данные должны иметь аналогичное двоичное представление.
Например, мы хотим ввести числа от 1 до 100 (скажем, текущую относительную влажность) в качестве входных данных модели.
Если просто взять двоичное представление чисел, то значения 7 и 8 расположены рядом, но их двоичное представление сильно отличается (0b0111 и 0b1000).
Чтобы этого избежать, кодер преобразует числовые значения в набор битов единиц, сдвинутых пропорционально значению.
Например, для диапазона значений от 1 до 10 и трех единиц мы получаем следующее представление:
- 1 -> 111000000000
- 2 -> 011100000000
- 3 -> 001110000000
- 7 -> 000000111000
- 10 -> 000000000111
Значения с плавающей запятой и дискретные значения (true/false и другие перечислимые типы) представляются аналогично.
Пространственный пулер
Основная задача SP — обеспечить активацию аналогичного набора ячеек на аналогичном наборе данных, добавив в эту активацию элемент случайности.Подробное обсуждение того, как это делается, выходит за рамки статьи; желающие могут дождаться продолжения или обратиться к первоисточнику (white paper).
Временной пулер
Помимо выявления схожих шаблонов во входных данных, NuPIC может различать контекст этих данных, анализируя их поток во времени.Это достигается за счет многослойного набора ячеек (так называемых столбцов ячеек), причем подробное описание также выходит за рамки предполагаемого объема.
Достаточно сказать, что без этого система не смогла бы отличить символ Б в последовательности ABCABC от такого же символа в CBACBA.
Практика: синус
Хватит теории, перейдем к практической стороне вопроса.Во-первых, давайте возьмем простую функцию синуса, подадим ее на вход модели и посмотрим, насколько хорошо она сможет ее понять и предсказать.
Полный пример кода , давайте рассмотрим ключевые моменты.
Чтобы создать модель на основе набора параметров, используйте класс ModelFactory:
MODEL_PARAMS — довольно свободный словарь с полным набором параметров модели.from nupic.frameworks.opf.modelfactory import ModelFactory model = ModelFactory.create(model_params.MODEL_PARAMS) model.enableInference({'predictedField': 'y'})
Нас сейчас интересуют не все параметры, но на некоторых стоит остановиться.
'sensorParams': {
'encoders': {
'y': {
'fieldname': u'y',
'n': 100,
'name': u'y',
'type': 'ScalarEncoder',
'minval': -1.0,
'maxval': 1.0,
'w': 21
},
},
Здесь вы задаете параметры энкодера, который преобразует значение синуса (в диапазоне от -1 до 1) в битовое представление.
Значения minval и maxval определяют диапазон, значение n указывает общее количество битов в результате, а w — количество единиц (по какой-то причине оно должно быть нечетным).
Таким образом, весь диапазон разбит на 79 интервалов с шагом 0,025. Для проверки этого достаточно.
Остальные параметры менять пока нет необходимости — их много, но значения по умолчанию работают вполне хорошо.
Даже после прочтения технической документации и работы с кодом в течение нескольких месяцев точное назначение некоторых опций остается для меня загадкой.
Вызов метода EnableInference в модели указывает, какой из входных параметров мы хотим предсказать (он может быть только один).
Подготовка завершена, можно накачивать модель данными.
Это делается так: res = model.run({'y': y})
Аргументы представляют собой словарь, в котором перечислены все входные значения.
На выходе модель возвращает объект, содержащий копию входных данных (как в исходном представлении, так и в закодированном виде), а также прогноз на следующий шаг.
Больше всего нас интересует прогноз в поле умозаключений: {'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 шагов:
Есть прогресс.
После 10 000 шагов:
После 10000 шагов последние 360 значений:
Видно, что модель определенно получила некоторые представления о том, чего от нее хотят.
Заключение
В этой статье я постарался дать максимально общее представление о том, как использовать NuPIC, не вдаваясь в дебри деталей реализации.За кадром осталось очень многое - структура сети, система визуализации церебро, роение и т.д. Если у вас есть время и интерес к теме, статьи можно продолжить.
Теги: #искусственный интеллект #иерархическая темпоральная память #numenta #nupic #python
-
Реальная Машина В Виртуальном Пространстве
19 Oct, 24 -
Блоги По Jquery На Русском Языке
19 Oct, 24 -
История Сотрудника Google №13
19 Oct, 24 -
Как Продать Идею Или Android-Приложение?
19 Oct, 24 -
Обновления Проекта Arduino
19 Oct, 24