Логика мышления spin-off 2: некоторые алгоритмы выделения цепочек

от автора


Задача:

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

Одно из решений

Разделим задачу на две:
1) найти две похожие серии событий (надо понять, что примерно вот эти два слова содержат похожие последовательности)
2) выделить их в отдельную цепочку («пад»)
Начнем с части 2. Усложним нейрокластер с метками времени, который запоминает все события в цепочку памяти, так, как показано на первой картинке. Благодаря распознающей части (направления связей вверх от признаков к обобщающей метке времени) будет решатся подзадача 1 — найти позицию с общими признаками, а благодаря воспоминающей цепочке со связями вниз будет решатся подзадача 2. Решение подзадачи 2 такое: начнем одновременно вспоминать два слова с тех позиций, где у них есть общее. То есть, система будет слать активацию по нейронам, которые соответствовали тем буквам. Если буква встретилась в обеих словах, то её надо запомнить. Для этого, пусть воспоминание происходит с половинной силой. Если порог активации нейрона T, то цепочка воспоминания должна слать 0.5 T потенциала действия. Тогда порог активации будет превышен только тогда, когда признак встретился в обеих цепочках. После этого признак становится активирован. После чего можно использовать обычный алгоритм запоминания с кодом из прошлой статьи — гиппокамп создаст цепочку памяти, назначив в неё те признаки, которые были общими для обеих цепочек. Мы свели решение к предыдущему.
В ЕНС (естественных НС) «половинная активация» может достигаться варьированием времени посылки (количество спайков, которые пришли), количеством нейромедиаторов, или может быть, задействованием тормозящих связей (чтобы превратить 1T в 0.5T).
Подзадача 1 несколько сложнее, так как должна работать с нечетким распознаванием. То есть, даже если в цепочке только лишь несколько общих признаков, которые затеряны где-то в середине цепочки, надо все равно заметить такую ситуацию. Напомню, что нейроны условно говоря могут быть в трех режимах — покоя, посылки одиночного сигнала, и режим высокочастотной активации. Можно принять, что «полноценное распознавание» приводит к переходу нейрона в режим высокочастотной активации, а нечеткое распознавание — к однократной посылке сигнала. Или можно принять, что в нейрокластере будут специализированные нейроны, одни из которых сработают лишь при полном совпадении и уверенном распознавании, а другой нейрон сработает и при распознавании лишь части признаков. Решений много, главное — как-то заметить появление активации на искомых кластерах.

Когда это делать

вопрос — в какое время производить такой поиск. Подходов может быть несколько:
1) специализированный режим сна — точнее, «медленного сна». Система перебирает все события, которые она узнала за день, и ищет совпадения с другими своими воспоминаниями. В данном случае, система использует воспоминание — посылку по нисходящей цепочке, затем дает время на то, чтобы нейроны признаков послали сигналы уже «наверх», к другим воспоминаниям. После чего суммирует, и ищет такие воспоминания, у которых наибольшее количество общей активации. После чего выбирает одно из таких мест и запускает подзадачу 2 — «выделить цепочку».
2) без специализированного режима сна. Система может на ходу, во время восприятия, проводить поиск — а на что похожа текущая ситуация? Собственно, поиск происходит автоматически во время обычного мышления за счет посылки сигналов нейронами, системе остается лишь обращать внимание на такие воспоминания, у которых возникло много общего с текущей ситуацией, и по необходимости запускать анализ — выделять общую подцепочку.

Похожие алгоритмы

Эти алгоритмы кажутся простыми, но в них заключено много тонкостей, даже больше, чем в алгоритме быстрой сортировки, которую, как известно, долго не могли написать без ошибок.
Эта задача похожа на известные задачи, например, поиска общих подпоследовательностей ДНК. Только у ДНК на каждом шаге может быть лишь один нуклеотид, а в нейросети на каждую метку времени может приходится произвольное число признаков. Поэтому данная задача — более общий случай в сравнении с поиском по ДНК. Если пытаться перенести существующие алгоритмы и решать такую задачу «влоб», без нейросетей, через манипулирование списками признаков, то голова начинает идти кругом — все эти вложенные списки совпадений, списки последовательностей совпадений, другие вопросы. Решать эту задачу посылкой активаций на нейроны намного проще — нейроны уже существуют, все делают автоматически, память на них уже выделена, никаких вложенных списков не нужно, осталось только проанализировать некоторые нейроны и запустить нужные алгоритмы.
Подзадачи 1 и 2 я называю режимами с одной и двумя ведущими цепочками соответственно. То есть, «сколько активных нисходящих нейронов в цепочках воспоминания шлют сигналы в попытке выделить совпадения». Если такая вспоминаемая цепочка только одна, то она ищет себе второго кандидата для сверки. А если кандидат уже найден, то можно активировать и его, и начать выделять признаки. Такие названия — «1 или 2 ведущих цепочки» — позволят делать ссылки на эти алгоритмы по именам, а не «подзадача 1 или 2». Режим с одной ведущей цепочкой еще можно назвать «режимом поиска совпадений», а 2 ведущих цепочки — режимом выделения совпадений.

Поиск совпадений …

(1ВЦ, 1 ведущая цепочка) можно проводить такими способами:
1) линейно просматривать все воспоминания, которые встретились за день. Переход в этот режим для целей отладки можно делать так: в тестовые наборы входных данных для ИНС вставляется специальный символ юникода, или специальное слово, при прочтении которого ИНС перейдет в режим «медленного сна» и начнет искать совпадения. Смысл такой — наполнили ИНС реальными данными, запустили отладку алгоритмы поиска обобщений.
2) использовать не линейный поиск, а начинать анализ с самых интересных ситуаций — с тех, у которых был наибольший эмоциональный окрас. Это оптимизация нужна, так как эти алгоритмы очень прожорливые. У крыс, кажется, воспоминание того, что было днем, происходит всего порядка в 10 раз быстрее, чем это происходило днем. Сон занимает меньше времени, чем бодрствование. Так что при равномерном распределении времени по всем воспоминаниям, каждому воспоминанию можно успеть сопоставить лишь несколько похожих ситуаций, причем большинство из которых будет мусором и малозначимыми совпадениями. Поэтому выгодно сконцентрироваться на самом важном, и начинать работу с него. Можно сказать, у алгоритма добавляется еще один шаг — 0 ведущих цепочек, на этом шаге система должна выбрать очередное событие в памяти с максимальной важностью, и передать его в следующий шаг — сделать ведущей цепочкой для поиска совпадений.
3) можно делать засечки еще со времени бодрствования — заранее создавать связи на самые интересные места, которые надо будет сопоставить ночью.
Выделенные цепочки с совпадениями запоминаются, но в будущем могут быть забыты, если их важность со временем угаснет.

Забывание

Забывание приводит к тому, что нейрокластер удаляется — операция removeNC, обратная к операции newNC. В ЕНС нейроны никуда не денутся, не умрут, просто их связи ослабнут до такой степени, что они уже не будут реагирвоать на свои признаки, и будут готовы перестроится на запоминание другой комбинации. В нашей модели такие нейроны не нужно хранить, их можно сразу удалять — это ускорит работу ИНС, снизит потребление памяти, упростит отладку. Это позволяет быть может на порядок снизить требования к потреблению памяти.

Распараллеливание

Чтобы производить переход от режима 1ВЦ к 2ВЦ, вначале я пытался создавать управляющие нейроны, которые производили коммутацию сигналов, анализ, смену режимов. Но затем я счел эту работу слишком низкоуровневой и стал писать императивный код на С++ — код типа «пройтись по всем кластерам, проанализировать их, выбрать нужный, подумать, не сменить ли режим работы».
Вопрос производительности такой системы: если делать нейроны аппаратными, то их можно распараллеливать (да хотя бы на видеокартах). Тогда код с управляющими нейронами и связями внутри кластера легко и автоматически распараллеливается (это всего лишь посылка активаций, которая итак распараллелена по условиям задачи), а вот императивный код на С++ придется распараллеливать каждый раз самостоятельно. Поэтому для небольших однопоточных нейросетей проще писать код на С++, а для массово параллельных ИНС лучше переносить эту работу внутрь самой ИНС на плечи нейронов и связей между ними. Надо не забывать, что «цикл по всем нейронам» или «цикл по всем нейрокластерам» на С++ с точки зрения аппаратной ИНС — это O(1), единичный шаг посылки активации. Поэтому видно, что и 1ВЦ и 2ВЦ (ведущих цепочки) для идеально распараллеленой ИНС имеют одинаковую вычислительную сложность.

ссылка на оригинал статьи http://geektimes.ru/post/268660/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *