Чуть больше недели я направляюсь на первый саммит пользователей Snowflake в Сан-Франциско, где я расскажу о совместном использовании данных в индустрии частного медицинского страхования Австралии.

Я не только взволнован для конференции, но, пока я там, я также очень рад посетить офис Numenta для встречи.

Snowflake построили хранилище данных следующего поколения, а Numenta создает то, что я считаю алгоритмом машинного обучения следующего поколения, так что это будет большая неделя!

Я давно интересовался машинным обучением с тех пор, как впервые изучил его в университете около 15 лет назад. Это было в середине последней зимы AI, так что я не ожидал многого от курса, потому что на самом деле никто об этом не говорил. Но это было увлекательно, с философской точки зрения, и произвело на меня неизгладимое впечатление.

В моей текущей работе я работаю над процессами анализа данных, которые включают машинное обучение текущего поколения. Но, зная о некоторых его ограничениях и мне всегда было любопытно, как работает человеческий интеллект, я внимательно следил за исследованиями Numenta и в течение ряда лет был частью их сообщества.

Итак, чтобы передать мое волнение перед предстоящей поездкой, этот пост представляет собой эксперимент, в котором я комбинирую две технологии; запуск текущего алгоритма интеллектуальных вычислений Numenta в базе данных на Snowflake и его использование для обнаружения аномалий в последовательностях данных.

Разве ИИ еще не интеллектуален?

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

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

Этот пост никоим образом не направлен на то, чтобы умалить эффективность этих подходов к машинному обучению. Их используют по всему миру крупнейшие компании и самые яркие умы для решения реальных проблем. Имея достаточное количество образцов данных, они могут классифицировать изображения, преобразовывать речь в текст или прогнозировать потребление энергии. А используя правила вместо данных, они могут научиться побеждать в таких играх, как Го, или преуспевать в игре Atari (без удовольствия).

Мало того, даже после того, как мы раскроем трудный орешек интеллекта млекопитающих, эти традиционные подходы по-прежнему останутся критически важными для определенных типов анализа, в которых мы на самом деле не нуждаемся в рассуждениях, подобных человеческим.

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

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

Чем отличается подход Numenta AI?

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

Миссия Numenta - понять, как интеллект работает в мозгу, чтобы они могли реализовать его в программном обеспечении и построить интеллектуальные системы. Они все еще находятся на периферии с точки зрения отрасли, но их исследования прогрессируют и всегда интересны, особенно для тех, кто имеет двойной интерес к информатике и нейробиологии. Например, в последнее время большое внимание уделяется структурам ячеек сетки, тому, как древний навигационный механизм был адаптирован для высшего образования. Я ожидаю, что результаты исследования на июньской встрече будут в большей степени посвящены роли таламуса и тому, как они включают роль внимания в свою теорию.

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

Вы можете начать изучать HTM, посмотрев HTM School на Youtube, которая познакомит вас с основами. Или, если вы больше читаете книги, вы не сможете пройти мимо Об интеллекте, книги соучредителя Numenta Джеффа Хокинса, в которой изначально были изложены основы HTM.

Что это может делать?

Помимо того, что само исследование остается открытым, у Numenta есть проект с открытым исходным кодом под названием nupic, который реализует алгоритмы обучения, описанные в теории HTM. Это прежде всего средство исследования, и оно пока не ведет себя как полноценно работающий мозг. Если бы это было так, я уверен, что эта технология уже использовалась бы практически в каждой системе!

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

Помимо проектов с открытым исходным кодом, появляются коммерческие приложения. Например, Cortical.IO применяют HTM специально для понимания естественного языка.

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

Реализация снежинки

Я собираюсь выполнить очень простое учебное упражнение в Snowflake, используя простые последовательности чисел.

Для этого нам нужно создать пару компонентов, но прежде чем вдаваться в подробности, я хочу начать с демонстрации снимка:

  1. что мы строим в Snowflake (правая сторона)
  2. где каждая часть соответствует теории HTM (в центре), и
  3. чему это соответствует в биологии (слева).

Давайте работать по порядку сверху вниз.

Энкодеры

Кодеры - это первое, через что проходят наши данные.

Они представляют собой сокращенную абстракцию исходных сигналов мозга, таких как зрительная кора или слуховая кора. Необработанный ввод преобразуется в разреженное представление с несколькими важными свойствами, более подробно описанными в этой статье. Забавный факт: ваш неокортекс не имеет представления о зрении, звуке или запахе, и его не волнует, от какого из ваших органов чувств пришел сигнал. Он просто учится и прогнозирует, используя единый общий механизм, а кодировщики являются воротами к нему.

Я собираюсь создать скалярный кодировщик для Snowflake, используя javascript UDF. На входе будет одно число, а на выходе - массив бит, некоторые из которых активны, а большинство - нет.

Я сэкономил время, позаимствовав часть javascript-кода Numenta и внося несколько изменений:

Одно из свойств кодировщиков (из приведенной выше статьи):

Один и тот же вход всегда должен давать такой же SDR, что и выходной.

Это означает, что мы можем установить атрибут «неизменяемый» в Snowflake UDF и получить большую выгоду от кэширования.

Чтобы продемонстрировать значения от 1 до 5:

select 1 as value, SCALAR_ENCODER(1,1024,0,250,14,false) as ENCODED_VALUE
union all
select 2 as value, SCALAR_ENCODER(2,1024,0,250,14,false) as ENCODED_VALUE
union all
select 3 as value, SCALAR_ENCODER(3,1024,0,250,14,false) as ENCODED_VALUE
union all
select 4 as value, SCALAR_ENCODER(4,1024,0,250,14,false) as ENCODED_VALUE
union all
select 5 as value, SCALAR_ENCODER(5,1024,0,250,14,false) as ENCODED_VALUE

Кодер выводит разреженный массив шириной 1024 бита с входным значением в диапазоне 0–250 и шириной 14.

Как видите, числа, которые расположены ближе друг к другу, имеют большее совпадение в битах. Мы делаем это, потому что считаем их «семантически похожими».

Мы эффективно создаем что-то вроде волосковых клеток в улитке, где каждый выходной бит может быть активен в нескольких аналогичных входах.

Пространственный пулер

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

Таким образом, роль Spatial Pooler заключается в проецировании закодированного ввода, как одного из этих SDR, в мини-столбцы. Мини-столбцы - это группы вертикально расположенных групп нейронов, которые получают общий ввод и связаны между собой.

Последовательная память

Мозг - это, по сути, система памяти, постоянно предсказывающая будущее состояние на основе последовательностей из прошлого и, соответственно, усиливающая / ослабляющая синапсы. Это обучение на ивбском языке, которое я помню как «вместе огонь, вместе соединяем». Мозг может потреблять всего ~ 20 Вт, потому что он непрерывен и эффективен, он не обрабатывает информацию так, как мы обычно делаем с компьютерами.

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

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

И для пространственного пула, и для памяти последовательностей я снова собираюсь позаимствовать чужой код. На этот раз это HTM.js, реализация HTM на JavaScript, созданная членом сообщества Numenta Полом Лэмбом. Опять же, все, что я делаю, это немного модифицирую его, чтобы он работал в контексте Снежинки.

В HTM.js все различные биологические конструкции (ячейки, столбцы, слои, синапсы и т. Д.) Моделируются как их собственные прототипы javascript в разных файлах. Я собираюсь объединить их все в другую Табличную функцию, определяемую пользователем javascript (UDTF) Snowflake, вместе со всей логикой обучения и прогнозирования контроллера.

Исходный код окончательного UDTF можно найти здесь (он слишком велик для отображения здесь).

Имея эту функцию, мы можем запускать запросы, которые проходят вниз по столбцу таблицы и однократно узнают последовательность найденных значений. Состояние сети HTM находится в памяти исполнителя UDTF, первоначально случайное, но изменяющееся с каждым новым значением по мере обучения. Это, конечно, означает, что мы намеренно не будем использовать параллелизм движка Snowflake, который вы обычно получаете с UDTF, потому что порядок обработки имеет значение.

Так что давай попробуем! И я буду использовать Tableau, где это возможно, чтобы сохранить визуализацию.

Начиная с таблицы с числами от 10 до 20, этот цикл возвращается к 10 и продолжается так до бесконечности.

Я назову эту таблицу LOOPING_NUMBERS, а столбец - THE_NUMBER.

Визуально последовательность такова:

Посмотрим, сможет ли наш HTM UDTF изучить эту последовательность.

Но сначала HTM.js фактически принимает плотно представленные разреженные массивы. Вместо длинного массива нулей и единиц разумно ожидать, что входной массив будет просто содержать позиции индекса единиц. Вот почему я добавил параметр DENSE_OUTPUT, который, если установлен в true, делает мою последовательность 1,2,3,4,5 следующим образом:

Итак, используя нашу входную таблицу LOOPING_NUMBERS, мы запускаем столбец THE_NUMBER сначала через скалярный кодировщик, а затем через сеть HTM.

select 
THE_NUMBER,
SCALAR_ENCODER(THE_NUMBER,1024,0,250,20,true) as ENCODED_INPUT,
ACTIVE,
PREDICTIVE
from LOOPING_NUMBERS,
table(HTM(SCALAR_ENCODER(THE_NUMBER,1024,0,250,20,true)))

Вот пример того, что мы получаем в ответ:

Я немного прокрутил набор результатов до того места, где начинаются прогнозы. Как вы могли подумать, это довольно сложно интерпретировать так. Столбец ACTIVE содержит индексы активных мини-столбцов, а PREDICTIVE - это активные столбцы, которые также находились в состоянии прогнозирования.

Чтобы лучше понять, что происходит, мы можем просто использовать показатель успешности прогнозов для расчета показателя аномалии:

select THE_NUMBER,
    SCALAR_ENCODER(THE_NUMBER),
    ACTIVE,
    PREDICTIVE, 
    ARRAY_SIZE(ACTIVE)-ARRAY_SIZE(PREDICTIVE) as NOT_PREDICTED_COUNT,
    NOT_PREDICTED_COUNT/ARRAY_SIZE(ACTIVE) as ANOMALY_SCORE
from LOOPING_NUMBERS,
table(HTM(SPARSE_TO_DENSE(SCALAR_ENCODER(THE_NUMBER))));

Теперь у нас есть оценка аномалий, с которой нужно работать, мы можем визуально взглянуть на то, что испытывает сеть HTM:

Это похоже на новорожденного ребенка: сначала все не имеет смысла, а затем закономерности становятся привычными.

Что за небольшой след случайных аномалий, оставшийся наверху? Это эффект, вызванный способом обучения повторяющихся входных данных, и есть способы смягчить его в основной базе кода nupic python, их просто нет в HTM.js. Так что просто поверьте мне и игнорируйте их :)

А теперь давайте подбросим несколько крутых шаров и посмотрим, что из этого получится. Вместо 10,11,12,13 мы дадим 10,11,13,13.

Сеть обнаруживает почти определенную аномалию. Причина, по которой это не совсем 100%, заключается в том, что в выходных данных кодировщика наблюдается довольно большое перекрытие между 12 и 13, поэтому прогнозировалось небольшое количество активных столбцов.

А теперь давайте по-настоящему удивим его большой последовательностью десятков, потому что это совсем другое.

Сеть снова выплевывает кофе и ненадолго сбивается с толку, прежде чем приспособиться к новой последовательности.

Давайте попробуем еще раз, повторяющуюся последовательность 10, 12, 14, 16, 18, 20, 19, 17, 15, 13, 11:

Аналогично предыдущему, но период корректировки длиннее, потому что повторение новой последовательности занимает больше времени.

Теперь давайте сделаем что-нибудь интересное, чтобы закончить, и вернемся к исходной последовательности 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20. Вы можете подумать, что это давно забыто со всеми этими изменения. На самом деле сеть имеет огромную емкость хранилища и едва успевает ее распознать:

Резюме

Надеюсь, вам было так же весело читать это, как я все это собирал. Если вы хоть немного похожи на меня, HTM сначала пугает, но невероятно полезно изучать, если вам интересно, как работает интеллект. Я пришел к выводу, что алгоритмы обучения, основанные на биологии, являются важной частью нашего пути к созданию более интеллектуальных систем.

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

И снова зайдите в сообщество Numenta, если вы хотите узнать больше, и не забудьте представиться!.