Posts Tagged ‘нейронные сети’

NL UI: тестирование ИНС

Среда, Июнь 30th, 2010

DARPA + мозги

Среда, Июнь 30th, 2010

http://www.pcweek.ua/themes/detail.php?ID=127854
«Ученые военного агентства передовых исследований США DARPA всерьез взялись за прикладное моделирование работы различных областей мозга. После нескольких лет изучения темы запущен проект Reorganization and Plasticity to Accelerate Injury Recovery (REPAIR) с общим бюджетом 28,8 млн. долл. Он объединил четыре университета во главе со Стэнфордом. Официальная цель исследования — восстановление солдат после ранений в голову. Планируется создание компьютерной модели мозга и имплантантов, обеспечивающих качественное взаимодействие травмированного человека с окружающим миром. В проекте будут задействованы достижения Массачусетского технологического института в сфере оптогенетики — генной модификации нейронов и управления их работой воздействием лазера. На первых этапах проекта у подопытных животных будут временно отключаться отдельные области мозга, а вместо них задействуются искусственно созданные. Интересуют военных и уникальные способности мозга к самовосстановлению — возможно, по результатам REPAIR удастся создать чипы, функционирующие, даже когда их существенные части испорчены. В рамках этого проекта также будет проводиться проектирование биоинформационных параллельных систем, способных решать сложные и комплексные задачи»

Параллелизация нейросетей – 2

Пятница, Июнь 4th, 2010

Параллелизация нейросетей – 2
В прошлой заметке описывалась довольно сложный способ параллелизации вычислений. Нейроны (нейрокластеры) делились на блоки и распределялись между потоками, некоторые данные дублировались, данные о связях также распределялись по потокам.
Но вот вычислительных ядер становится все больше и больше. Может оказаться, что лучше написать более вычислительно сложный код, но написать его раньше. Идея из функционального программирования – никаких особых синхронизаций не нужно, главное, чтобы функция не давала никаких побочных эффектов. Идею вспомнил во время чтения http://graphics.cs.williams.edu/archive/SweeneyHPG2009/TimHPG2009.pdf, стр 44 (ссылка с хабра). Каждая итерация каждого потока модифицирует данные только одного нейрона.
Код превращается во что-то типа:
* Создать несколько потоков
В каждом потоке:
* выбрать очередной необработанный нейрон
* обработать
В целях ускорения, очередность выборки нейронов потоками можно ставить в зависимости от потока.
Дальнейшая оптимизация: после завершения обработки «своих» нейронов, поток может перейти на обработку «чужих». Чтобы синхронизация проводилась не на каждом нейроне, распределять нейроны можно небольшими группами. Величину групп можно варьировать в зависимости от количества связей в нейронах. Пересчет границ групп можно проводить редко.
Недостаток подхода – лишний доступ к памяти при проверке «не нужно ли добавить активацию с этого нейрона», если нейрон отправки не активен. В некоторых ИНС это может увеличивать количество необходимой работы в 10-100 раз. Конечно, если потоков 100-1000, то и такой поворот событий сулит выигрыш :) Если в ИНС много пересылок «подпороговых» сигналов (подпороговых к высокочастотной активации), то такой способ более эффективен. Другой способ:
В каждом потоке выделяется интервал идентификаторов нейронов, который он имеет право менять. Для каждого потока выполняется функция:
Если данный нейрон должен модифицировать другие нейроны, то начать проход по связям
Если связь ведет к нейрону, идентификатор которого содержится в интервале, выделенном данному потоку– то его можно модифицировать.
Выигрыш такого подхода: в сравнении с предыдущим способом, обработка только активных связей (в некоторых случаях в 10-100 меньше работы), но лишняя проверка интервала на каждой связи, и количество проходов по памяти прямо пропорционально количеству потоков. В случае отсортированного списка связей, проверку вхождения нейрона в интервал можно делать только одну – вначале на одну границу интервала (например, «меньше»), а затем, после начала блока подходящих идентификаторов – только другую границу. После выхода за границу можно сразу переходить к следующему нейрону. Это может в 2 раза сократить обработку лишних связей. Еще в 2 раза – если начинать движение с начала или с конца списка связей в зависимости от интервала нейронов.
Вывод – вначале выгоднее попробовать схему с тупой синхронизацией нейронов назначения :)

Оптимизация проверки активации по bool

Среда, Апрель 7th, 2010

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

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

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

Направления самосовершенствования ИИ

Воскресенье, Апрель 4th, 2010

Самосовершенствование ИИ, или совершенствование при помощи человеческого разработчика, рационально применять в нескольких случаях:
* когда ИИ работает в данной области совершенствования лучше человека – быстрее, качественнее, дешевле, меньший занимаемый объем, меньшая вероятность уничтожения и т. д.
* когда ИИ работает хуже человека, но желательно сократить количество людей, работающих над ИИ – например, в целях секретности и лучшей управляемости. Вариация – когда ИИ работает хуже человека, но возможностей привлечь новых людей нету. Например, не хватает денег, нет единомышленников или надежных людей.
Направления самосовершенствования ИИ:
Улучшение реализации заданных нейроалгоритмов:
* лучший выбор структур данных и алгоритмов в целях повышения быстродействия, лучшего использования памяти
* то же самое, но при распарралеливании – так как задача на порядок сложнее предыдущей в однопоточном варианте
* то же самое, но при портировании на другие платформы – например, на видеокарты, или сервера с другими соотношениями производительности процессора и шины памяти, их цены и доступных объемов
* то же самое, но при спуске на уровень глубже, чем обычно – на уровень ассемблера, чтобы задействовать способы оптимизации, недоступные обычному компилятору из-за ограниченных знаниях об свойствах алгоритмов
Повышение качества существующих и разработка новых нейроалгоритмов:
* повышение скорости обучения по заданным данным
* минимизация количества необходимых обучающих примеров
* повышение устойчивости к неоптимальным начальным входным данным и ускорение переобучения
* перенос некоторых высокоуровневых способов мышления в раздел базовых системных алгоритмов
Адаптация под новые среды и новые типы данных:
* написание программных интерфейсов к нейроинтерфейсу – например, для анализа звуков, изображений, температурных датчиков
* выбор способа отображения сигналов на нейроны, анализ базовых преобразований (например, представление звуков аналогично человеческому уху)
* создание первичных сенсорных зон, работающих в особых условиях – например, несколько слоев сетчатки с преобразованием сигналов, на которые не распространяются традиционные способы обучения, связи жестко заданы, а частота работы этой подсети увеличена в сравнении с остальной ИНС
Адаптация существующих программ (см. «Нейроинтерфейс к GUI» ( http://neurocod.net/blog/tag/2010/04/нейроинтерфейс-к-gui )):
* перехват или замена классов отображения (view) на свои
* смена сигналов, подаваемых в нейросеть, на более оптимальные, смена частоты и полноты отображаемой информации
Совершенствование взаимодействия многих ИИ:
* создание и оптимизация интерфейсов общения между ИИ
* создание форматов знаний, извлечения и быстрого обмена новыми знаниями
* создание универсальных баз знаний, аналог справочников, более высокоэффективных, чем та же википедия
* выбор эволюционных схем и вычислительных экспериментов: при каких параметрах тот или иной ИИ лучше всего работает (скорость забывания, переобучения, степень доверия к данным, предпочтение поиска в глубину или в ширину и т. д.)
* выбор распределения различных параметров среди ИИ для повышения надежности работы всего коллектива ИИ, всеохватности знаний коллектива, и т. д.
Усовершенствования аппаратного обеспечения:
* разработка схем для производства под заказ на существующих предприятиях
* создание новых аппаратных сред (например, на основе нанотехнологий)

Нейроинтерфейс к GUI

Четверг, Апрель 1st, 2010

Введение

В случае развития человеческих нейроимплантантов, нейроинтерфейс к GUI может пригодиться и человеку, а на более ближнюю перспективу – ИИ.

Обоснование

Пусть ИНС требуется определить количество строк в окне с таблицей. Визуально определить границы полосы прокрутки, сравнить с размером окна и средним вертикальным размером одной строки – затратно. Эти ресурсы лучше отдать ИНС для более интеллектуальной работы. Получить одно число «количество строк» напрямую от объекта таблицы минимум в тысячу раз эффективнее (особенно, если анализ пикселей будет производить сама ИНС). А если такое повышение эффективности умножается на количество тысяч просматриваемых ячеек (а иначе – распознавание различных шрифтов и текста в каждой ячейке)… Ясно, что прямой нейроинтерфейс к существующему и будущему ПО крайне желателен.

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

Win32 API

В операционной системе Windows, можно перебирать все окна в системе, вместе с дочерними окнами, используя функции наподобие FindWindowEx/FindNextWindow. Они возвращают HWND – «держатель окна». Используя HWND, можно получать заголовки окон, текст внутри кнопок, надписей, списков и выпадающих списков и т. д. Для исследования иерархической структуры окон с этой позиции можно использовать программу Microsoft Spy++, которая поставляется вместе с различными версиями Microsoft Visual Studio. Эта программа также позволяет отлавливать все оконные сообщения, с возможностью фильтровать их по типу, что может пригодиться для анализа того, как окна работают и как на них можно влиять. Используя функции Win32 API, окнам можно слать любые сообщения и получать имена оконных классов. Например, в случае, если внутреннее окно – внедренное окно Internet Explorer (что определяется по классу с именем «Internet Explorer_Server»), то можно задействовать специальный код, чтобы получить объект браузера и начать работать с ним через COM – в том числе, иметь прямой доступ ко всему html-содержимому в виде DOM, произвольно его изучать и менять (примеры подобного кода можно найти в Интернете). Внедрение окон Internet Explorer встречается довольно часто, в чем можно убедиться, используя все тот же Spy++. Например, его можно встретить внутри таких приложений:
* официальный клиент ICQ отображает сообщения в окне Internet Explorer, в том числе – в окне истории сообщений
* справка Windows
* окно с карточкой форм слова (но не перевода) в Abbyy Lingvo
* просмотрщик chm-файлов
* некоторые диалоговые окна в Microsoft Visual Studio, например, мастер создания нового класса
* Нейролаборатория когда-то использовала этот браузер очень широко – от таблиц нейронов до диалоговых окон редактирования точек останова (в VC++ есть специальный класс CDhtmlDialog для создания подобных окон)
* весь интерфейс старых версий Windows Media Player
* окно отображения фотографий в Google Earth
* встроенные браузеры, типа того, что находится в окне winamp

Внедрение в чужой процесс

Перебирать окна одного процесса можно и другого процесса (внешнего). Но если работать через COM-интерфейс с объектами во внешнем процессе, то придется использовать так называемый marshalling, для передачи интерфейса во внешнее приложение. Это утомительно по многим причинам – например, внешнему приложению нельзя передавать обычные двухбайтовые строки, их обязательно нужно передавать по всем правилам, через SysAllocString/SysFreeString. Кроме того, межпроцессное взаимодействие осуществляется медленнее, чем внутрипроцессное. Поэтому во многих случаях желательно, чтобы код нейроинтерфейса работал внутри исследуюемого приложения (хотя обработанные данные потом могут передаваться во внешний процесс с нейросетью). Особенно, внутрипроцессное взаимодействие пригодится для первичного анализа и сжатия изображений перед отправкой внешнему приложению – так как во многих случаях от анализа непосредственно изображений окон отказаться полностью не выйдет. Для внедрения своего кода в чужие приложения используется техника, известная как dll injecting. Обычно она используется всякими вирусами, но, если вы контролируете свой антивирус, то можете разрешить своему приложению выполнять такие подозрительные действия. Способов dll injecting довольно много, я применял загрузку по вызову CreateRemoteThread.

Сторонние библиотеки

Все чаще современное ПО строится на основе сторонних библиотек, которые эмулируют внутренние окна самостоятельно. В таких приложениях создается только одно окно верхнего уровня на основе HWND (иначе операционная система не позволяет), а все внутренние дочерние окна прорисовываются самой библиотекой. Например, программы, написанные на Java или Qt, используют именно такой подход, в то время как программы, написанные на Delphi, используют традиционный подход окон Windows (классы Delphi в приложениях легко определять по имени, которое начинается с префикса из большой буквы T).
Кстати, мысль перевести Нейролабораторию на Qt появилась после очередного запуска Spy++, когда стало видно, что Google Earth написана на Qt (я часто запускаю Spy++ для незнакомых программ чтобы увидеть, на чем они написаны).

Если научиться работать с фреймворками типа Java/Qt, то дополнительно возникнет возможность работать и с окнами в операционных системах, отличных от Windows. К счастью, и Java, и Qt содержат довольно много метаинформации о внутренних объектах. При условии получения доступа к главному оконному объекту внутри приложения, можно перебирать все окна и многие другие объекты, подписываться на любые события и т. п. Как получить доступ к такому объекту? Наверное, можно такой доступ получить и «силой», вмешиваясь извне, наподобие dll injecting. Я такие способы в контексте qt/java пока не исследовал. В случае Qt, может потребоваться учитывать бинарную несовместимость различных компиляторов и изменение реализации системы метаинформации Qt в разных версиях Qt. В то время как байт-код java стандартизирован.

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

Java и не только

Чтобы обходить защиту модулей java, на подконтрольной системе можно поставить свою, измененную реализацию виртуальной машины – благо, их исходники доступны. Тогда появляется возможность вмешиваться в работу любых java-приложений без их персональной модификации. Это тем более перспективно, что в последнее время наметилась тенденция к переводу многих виртуальных машин других языков программирования на использование байт-кода java (http://ko.com.ua/node/47487 «Планетная система Java»).
Но на java и qt написано очень много ПО с открытым исходным кодом. Для начала, в большинстве случаев, будет достаточно умения работать только с открытым ПО.

Qt

Для Qt есть библиотека с графическим интерфейсом «Conan for Qt» ( http://sourceforge.net/projects/conanforqt/ ). Она позволяет получить представление о широчайших возможностях системы метаинформации Qt (хотя и меньших, чем в java). Сценарий работы для Qt следующий. Берутся исходники некоторой программы, к ним подключается своя библиотека с нейроинтерфейсом, и как правило модифицируется только одна строка – добавляется регистрация главного окна у нейроинтерфейса. Нейроинтерфейс перебирает окна, просматривает иерархию наследования. Например, некоторый класс наследуется от класса окна таблицы, а нейроинтерфейс умеет работать с такими окнами. Тогда он производит приведение типа указателя к известному типу, и получает широчайшие возможности. Например, получить объект «модель данных таблицы», и работать с ней напрямую – без перерисовки экрана. К любой такой таблице можно сразу присоединять систему поиска, аналогичную поиску текста в браузере, даже если исходная программа поиск не поддерживает – нейроинтерфейс будет перебирать по очереди все клетки с поиском нужного текста.

Про работу с файловой системой

Имея нейроинтерфейс к файловой системе на основе Qt или Java, автоматически обеспечивается кроссплатформенная работа с ФС.

Про работу с Html

Если требуется работа с реальными сайтами, то желательно применять насотящие браузеры, а не анализаторы html типа библиотеки libxml2, так как браузеры позволяют исполнять javascript и т. п. Для ускорения работы можно поступить, как поступили в google при автоматическом тестировании google chrome на правильность отображения веб-страниц: браузер отображал страницы не на экран, а в память.

Автоматизация проектирования серий

Воскресенье, Март 28th, 2010

АНТК им. Антонова построили Ан-225 «Мрию», самый большой и самый грузоподъемный эксплуатируемый самолет в мире, за рекордно короткие сроки – около двух-трех лет. Это стало возможным благодаря тому, что его разработка велась на основе Ан-125 «Руслан». У них общая электроника, двигатели (хоть и в разном количестве), ширина фюзеляжа и многое другое. После такого успеха, в АНТК начали развивать идею – производить разработку и других самолетов сразу же сериями. При стандартизированной разработке, упрощается отладка, сертификация подсистем и всего самолета, удешевляется и упрощается разработка и эксплуатационное обслуживание. Например, делается высокогорный самолет, с повышенной мощностью двигателей для работы в разреженном воздухе на высокогорных аэродромах, для взлета и посадки с коротких аэродромов. И этот самолет сразу в нескольких вариантах – пассажирский, грузовой, военный. И дополнительно – в нескольких «весовых категориях». (Такие самолеты нужны не только в Индии). Другая серия – самолет для дальних рейсов без особых экстремальных условий. Другие серии – для перелетов на среднюю дальности; на ближние расстояния. Возможно, и другие, типа военно-транспортных с коротким взлетом и посадкой.
Дальше развить идею помешала перестройка. Затем мешали западные спецслужбы. После смерти Балабуева, новое беспринципное руководство манагеров не собирается и не может внедрять такую прорывную технологию.
Но идею можно позаимствовать в новом виде.
Нейронные сети выделяют совпадающие последовательности. Это – основа для автоматизированной разработки серий устройств. Не только самолетов. Таким же образом можно производить, например, военную технику. Такой подход позволяет гибко решать ранее описанную задачу – всегда иметь «минимально достаточный калибр», для наиболее эффективного ведения войны. Мощности прежних танков стало не хватать? Сразу же производство переключается на чуть большую модель, чтобы как раз вместить пушку большего калибра с большим боезапасом и двигателем. Дальности применения истребителей стало не хватать? Выпустим истребитель побольше. И наоборот. Ради экономичности бомбардировок, нужно использовать бомбардировщики побольше. У противника появились средства противодействия, и бомбардировщики слишком часто сбивают? Переходим к более дешевой версии, с меньшей грузоподъемностью, меньшими размерами (заодно снижая ЭПР и увеличивая дальность обнаружения). Или – производим ракеты большей дальности.
Серия крылатых ракет. Чтобы при пуске ракеты не залетать/не заплывать/не заезжать в зону обстрела противника, ракету нужно пускать с более дальних дистанций. Ракету нужно делать с большим запасом топлива и более мощными двигателями. А заодно, ради сохранения эффективности, повысить боевую нагрузку.
Ракеты класса воздух-воздух, ракеты ПВО и ракеты систем залпового огня – все аналогично. Противник начал применять свое оружие с больших дистанций – нужно увеличить дальность применения. Противник улучшил броню – увеличить бронебойность. Аналогично с кораблями, подводными лодками, пулями и снарядами, минами и электромагнитными бомбами, вертолетами и грузовиками.
В некоторой степени аналогично поступают производители современных процессоров, выпуская модельные ряды, но они чаще отличаются количеством одинаковых ядер, и не используют автоматизированное выделение обобщений при проектировании.

Простейший алгоритм перебора действий

Суббота, Март 27th, 2010

Простейший алгоритм перебора действий решается на примере задачи по выводу всех двоичных последовательностей заданной длины, описанной в «Реализация мыслительного стека в семантической нейронной сети» ( http://neurocod.net/blog/2010/03/моделирование-мыслительного-стека-в ).
Выбрать любое из возможных действий, любой из известного списка кластеров, легко. Но нужно выбрать только те, что еще не были испробованы. Причем, не были испробованы только на данном шаге алгоритма, а не вообще когда угодно. Под состоянием вывода тут будет пониматься «выведена некоторая часть последовательности, нужно перебрать все возможные окончания». Решение:
1) активировать все возможные действия (их в данном случае немного), и активировать кластер состояния
2) провести распознавание активированных кластеров так, чтобы распознались все запоминания о действиях, уже совершенных в данном состоянии
3) провести торможение, останутся только неиспробованные действия. Неиспробованных может и не оказаться.
4) выбрать одно из оставшихся действий, и выполнить его.
5) Выполненное действие добавить в цепочку памяти о выполненных действиях.
6) Сделать последний добавленный кластер новым кластером текущего состояния вывода
Это минимальная схема. В ней не запоминается дополнительная информация о переключении режимов с планирования на само действие, и т. п. Цепочка памяти применяется все той же архитектуры. Так как архитектура известна, можно проводить детализацию дальше. Например, можно рассмотреть условия распознавания на шаге 2.
Связь от кластера конкретного действия (0 или 1) будет входить в кластер, создаваемый на шаге 5, как обычный признак, и будет подсоединяться к nIn. С кластером предыдущего состояния сложнее. Если в текущем состоянии еще не было произведено ни одного действия, то данный кластер – последний в цепочке. Любое следующее действие будет занесено в следующий кластер – кластер следующего состояния. Значит, распознавание предыдущего состояния в кластер нового состояния при очередном выполнении шага 2 будет происходить по связи nOut->nEn. Но если действия уже были, то кластер нового состояния будет добавлен в конец цепочки, а в конце цепочки уже находятся другие кластеры состояний, а не кластер предыдущего состояния, которое и будет активно. Кластер предыдущего состояния останется подсоединять только к nIn, как обычный признак. При распознавании, у кластеров этих двух вариантов будут получены разные активации: либо {nIn.act=1, nEn.act=1}, либо {nIn.act=2, nEn.act=0}. Так как связей других типов и от других признаков нету, то пороги также известны. Пороги у соответствующих нейронов будут составлять {nIn.thr=1, nEn.thr=1} и {nIn.thr=2, nEn.thr=1}. Видно, что во втором случае, кластер не будет распознан. Вариантов решения несколько:
1) Всегда добавлять пустой кластер после нового состояния. Такой «пустой кластер» мог бы содержать информацию с смене режимов, которая не запоминается сейчас, но может присутствовать в более сложных моделях. Тогда кластеры предыдущего состояния всегда присоединяются по nIn. Условия распознавания становятся везде одинаковыми – nIn активирован, nEn – нет. То есть, будет происходить нечеткое распознавание кластера, по одному только активному nIn. Но в такой простой модели делать цепочку памяти в 2 раза длиннее, чем нужно – не эстетично.
2) Сделать правило нечеткого распознавания, задав прямую проверку одной из перечисленных выше ситуаций – {nIn.act=1, nEn.act=1}, либо {nIn.act=2, nEn.act=0}.
3) То же, что и 2, но проверка более простая: сумма активаций nIn и nEn должна быть не меньше 2.
4) Использовать правила формирования нейронной цепочки, отличные от описанных. Например, делать так, чтобы nEn можно было не учитывать для случаев {nIn.act=2, nEn.act=0}, из-за изменения свойства кластера – уменьшения порога нейрона nBuf, на котором происходит промежуточное суммирование nEn и nIn для определения того, нужно ли производить распознавание всего кластера и активацию nOut. Если его порог равен 2, то для полноценного распознавания кластера должны быть активны оба nEn/nIn, а если порог равен только единице, то достаточно активации только одного из nIn/nEn.

Реализация мыслительного стека в семантической нейронной сети

Вторник, Март 16th, 2010

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

Как и принято в рассматриваемых моделях, все действия, мысли, планы заносятся в цепочку памяти. Тогда для создания «стека» нужно уметь:
0) запомнить состояние системы, к которому нужно вернуться
1) создавать указатели на произвольное место в «большой» цепочке памяти (см. пункт 0)
2) по этим указателям активировать данную позицию длинной цепочки памяти (которая см. 0)
3) учитывая активировавшуюся позицию (см. 0), уметь выбрать другой вариант, который еще не перебирался
4) уметь получить указатель на еще более ранний шаг
В качестве указателя можно использовать даже одну связь. Но это неудобное решение. Намного более широкий класс указателей – указатели в виде нейронных цепочек. Активация некоторой позиции в «длинной» цепочке происходит по нечеткому распознаванию – распознаванию всех признаков, входящих в короткую цепочку–указатель. Например, указатель может содержать признаки: «состояние моделируемой системы Х», «выбор действия для планирования». В исходной длинной нейронной цепочке, на которую нужно сослаться, в позиции запоминания тех признаков могут быть примеси признаков – скажем, некоторые малозначимые текущие мысли, параметры моделируемой системы. Чтобы распознавание цепочки сработало без всех признаков, которые входят в длинную цепочку на тех позициях, а только по признакам в указателе, и должно использоваться нечеткое распознавание.

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

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

Сначала я разрабатывал данную теорию на задаче игры в крестики-нолики путем мысленного перебора всех вариантов действий перед очередным ходом. Но оказалось, что это слишком сложная задача :) Более простая задача выглядит так:
* есть только два возможных действия на каждом шаге – их можно обозначить 0 и 1.
* количество перебираемых действий, количество необходимых шагов задано заранее
* достижение цели сообщается нейросети напрямую, а не требует сложного анализа (как при планировании игры в крестики-нолики самой нейросетью)
Тогда задача сводится к следующему. Действия 0 и 1 будут означать вывод букв 0 и 1 в текстовый вывод (активацию кластеров 0 и 1 и активацию кластера «действие разрешено», чтобы отличить от активации 0 и 1 при планировании). Нейросеть должна перебрать все возможные последовательности нулей и единиц заданной длины. Повторений при переборе быть не должно. После того, как выводимая цепочка достигает требуемой длины, нейросети шлется сигнал «можно приступать к следующему варианту».

Копия с aicommunity.org

Среда, Март 10th, 2010

Форум на aicommunity.org умер уже более полугода назад. Нашел кусок текста, который писал на тот форум в процессе обсуждения (кажется, http://forum.aicommunity.org/viewtopic.php?p=50498):
Выработана достаточно необычная модель ИНС. Краткое описание:
1) Квазинейроны.
Нейроны в модели соответствуют группам биологических нейронов.
2) Сложная структура нейронного кластера
Нейроны в модели объединяются в кластеры. В отличии от других моделей, разные части кластера имеют специализацию. Например, пусть есть нейронный кластер, распознающий набор признаков {П}. Одна часть кластера (отдельный квазинейрон) содержит связи с нейронов {П}. Такой (квази)нейрон можно назвать «входом кластера». Другой нейрон – «спуск к низкоуровневым признакам» – шлет сигналы к нейронам из {П} (а не принимает их). Отдельный нейрон служит «выходом» кластера – шлет сигналы вверх по иерархии признаков (иерархия условная). Другие части кластера занимаются проведением сигнала с учетом временной последовательности срабатывания, управлением режимами работы кластера, и т. д.
Такое разделение делает нейросеть более понятной для разработчика, по аналогии с фреймовыми моделями, но в то же время сохраняет гибкость и решает проблему внутренней активности.
3) Соединение кластеров в универсальные цепочки памяти.
Так как у кластеров сложная структура, то цепочка из кластеров может работать в различных режимах – и распознавания, и прогнозирования, и воспоминания. При запоминании, создается цепочка из кластеров, каждый кластер содержит входящие связи от (нейронов) признаков, которые были активны в тот некоторый момент. При поступлении похожей последовательности признаков, такая цепочка активируется (распознавание). В другом режиме работы, та же цепочка последовательно активирует входящие в нее кластера и запомненные ими признаки.
4) Управление условиями срабатывания отдельных подсистем ИНС
Это что нужно для управления режимами работы универсальных нейронных цепочек. Среди всех нейронных кластеров, нейроны одного функционального назначения группируются. Например, группируются все нейроны распознавания признаков (всех кластеров), или все нейроны посылки сигналов к признакам, входы/выходы/нейроны управления режимами работы. Каждую такую группу для краткости я называю «нейронный контур (работы)». В результате такого условного разделения, управлять нейросетью становится значительно легче. Обработку нейронов одного типа можно производить без учета других групп. Например, пусть в отдельном цикле происходит проход по всем нейронам из группы «выход кластера». Все активные нейроны признаков (например, активные кластеры зрительной коры) пошлют сигналы на своих выходы. Пока ничего нового в сравнении с другими моделями нет, но будет позже. Далее – проход по всем нейронам типа «вход кластера», обработка изменений, произошедших на предыдущих шагах. На этих нейронах как раз появилась активация, посланная на предыдущем шаге с нейронов «выход признака». Имеем ситуацию – распознаны более высокоуровневые признаки. Теперь можно в отдельном цикле обработать нейроны «посылка сигналов прогнозирования развития ситуации». Такое разделение позволяет работать с нейросетью, не беспокоясь о синхронизации отдельных подсетей. Например, так как нейроны признаков никто не трогает, активация на них не меняется, и не важно, что нейросеть будет делать – слать прогнозирование, или задействовать какие-то другие нейронные контуры, и сколько подобных шагов и в какой последовательности были произведены.
* не важна последовательность срабатывания других нейронных контуров
* можно варьировать скорости угасания сигналов в разных нейронных контурах
* можно игнорировать накопившийся потенциал на нейронах некоторого контура до того времени, пока они не понадобятся – сигналы будут слаться вовремя
* можно управлять семантикой операций – раздельно слать сигналы вверх/вниз по иерархии, и т. д.
5) Пример высокоуровневых нейронных операций, которые можно производить при помощи таких особенностей ИНС
Пересечение признаков. Активны два нейронных кластера. Нужно найти общие признаки. Достаточно пройтись по контуру «посылка сигналов вниз к признакам». Неактивные кластеры сигналы не пошлют. Признаки, входящие в оба активных кластера (имеющие связи от активных кластеров к себе), получат двойное превышение активации над порогом. Для объединения достаточно выделить кластеры с любой активацией, превышающей порог.
Найти разницу: один активный кластер шлет тормозящие сигналы, другой – активирующие. Полученные активные нейроны входят только во второй кластер.
6) Пример еще более высокоуровневого режима работы
Активны по одному кластеру у двух цепочек памяти.
Активные кластеры шлют сигналы к своим признакам.
Признаки, входящие в оба кластера, выделяются.
Выделенные признаки заносятся в отдельный, новый кластер – пусть Н0.
Исходные кластеры активируют нейронный контур «перейти вперед по цепочке памяти».
Активируются два следующих нейрокластера тех же нейронных цепочек, соответствующие развитию исходной ситуации во времени. Два предыдущих активных нейрокластера тормозятся. Повторение шагов, выделение общих признаков, занесение их в новый отдельный нейрокластер Н1 – и присоединение этого Н1 к Н0 в качестве роста новой нейронной цепочки.
Такой алгоритм выделяет устойчивую последовательность активации признаков, производит обобщение памяти.
Теперь должно быть понятно, что при разнообразии высокоуровневых нейтронных алгоритмов важно, чтобы было легко управлять скоростью угасания сигнала на отдельных нейронных контурах, следить за тем, чтобы сигналы с различным назначением и разных циклов не накладывались друг на друга.
7) Виртуализация внутрикластерных межнейронных связей. Упрощение управления режимами работы ИНС.
Изначально, взаимодействие между различными нейронными контурами внутри одного нейронного кластера происходило по обычным межнейронным связям. Например, нейрон признаков некоторого кластера распознал свои признаки, активировался, и шлет сигнал на нейрон выхода того же кластера, и на нейрон прогнозирования. А если нужно, чтобы сработал только один из них – прогнозирования или выхода, а не оба? При раздельной обработке нейронных контуров, можно было просто не обрабатывать нейроны некоторого типа несмотря на то, что на них есть сигнал. Но есть лучшее решение: один из нейронов – прогнозирования или выхода – затормозить. Или вовсе не слать на него сигналы. Но программирование таких эффектов утомительно. Решение – виртуализация внутрикластерных связей. Примерный код: «для всех нейронных кластеров, если активен нейрон признаков, активировать нейрон прогнозирования соответствующего кластера». Не нужно создавать тормозящие связи внутри кластера; активация появляется только на тех нейронах, где она нужна. Соответственно, алгоритм из пункта 6 будет теперь содержать пункты: «активный кластер активируют нейроны посылки сигналов к признакам», «активные кластеры активируют нейроны посылки сигналов к кластерам, следующим в цепочке памяти», «нейроны контура Х обнуляют активацию»
8) Гиппокамп, быстрая память – концепция
Принята следующая концептуальная модель. При активации некоторого нейронного кластера, гиппокамп быстро запоминает данный факт через, наверное, сложные нейросети коммутации. Ночью, гиппокамп может активировать признаки в той же последовательности. Повторная активация признаков в той же последовательности, но позже, повышает вероятность образования связей механизмами, рассмотренными Емельяновым-Ярославским (или Бощенко), так как проходит время на образования дополнительных комбинаций межнейронных связей (нейронная пластичность), а уже обнаруженные связи дополнительно закрепляются. Дополнительная активация некоторых других нейронов может способствовать нахождению дополнительных вставных нейронов, благодаря которым образуется связь (1000 связей на нейрон – 1000 потенциальных целей, один промежуточный нейрон – миллион потенциально достижимых целей, еще один – миллиард).
9) Благодаря концепции в п. 8, в искусственной нейросети можно принять: так как известно, что гиппокамп поможет созданию цепочки нейронов, при поступлении признаков (активации нейрокластеров) можно сразу же создавать нейронные цепочки, соответствующие идеальному случаю: абсолютно точное восстановление исходных признаков. Можно не ждать кучу времени, пока образуются такие цепочки.
10) Медленный сон.
Пункт 8 объясняет возможное назначение медленного сна. Дополнительная работа, которую производят мои модели ИНС во время медленного сна – выделение обобщающих нейронных цепочек по типу пункта 6. Тут же происходит очищение гиппокампа и удаление малоприоритетных нейронных цепочек
11) Производительность
В целях повышения просотты разработки, не только группы нейронов и связей объединяются в «квазинейроны» и «квазисвязи», но также и спайки моделируются одним квазиспайком. Вместо посылки множества спайков, берутся абстрактные «послать сигнал до полной активации». Все это значительно экономит ресурсы.
12) «Двойная активация» из пункта 5 и 6 (цитирую сообщение из своего блога на http://neurocod.net/ )
Но у этого подхода есть концептуальные недостатки. Как известно, потенциал действия биологических нейронов при разрядке всегда один и тот же. Накопление на мембране «двойного заряда» не подходит. Повышение порога гуморальными механизмами – слишком медленно (а люди просыпаются достаточно быстро). Можно рассмотреть изменение потенциала на мембранах вспомогательной нейросетью. Можно в режиме выделения тормозить ею нейроны, так что активироваться смогут только нейроны с двойной порцией активации. Или можно во время обычной работы дополнительно активировать нейроны, а в режиме выделения – прекращать поставлять помощь. Можно комбинировать активацию и торможение. Но мне более вероятным кажется использование времени активации в качестве варьируемого параметра. Так как посылка активации в природных нейросетях в режиме высокочастотного возбуждения происходит не единовременно, а множеством спайков, то нейрон, получающий двойную порцию активации (от двух цепочек), будет активирован примерно вдвое быстрее, чем в нормальных условиях. Вариантов реализации механизма выделения нейронов с двойной активацией тогда остается два. В одном варианте, нейроны цепочек шлют вдвое меньше спайков, чем обычно, и активируются только нейроны, входящие в обе цепочки. Мне более вероятным представляется случай, при котором отдельная нейросеть детектирует нейроны, активировавшиеся вдвое быстрее, чем обычно. Вдвое быстрее, конечно, после предыдущего такта нейросети «посылка к признакам». Тот же Бужаки говорил, что есть нейроны, очень точно реагирующие на время активации.
13) Ритмы мозга, электроэнцефалограммы
Различные высокоуровневые алгоритмы работы ИНС содержат различные последовательности активации нейронных контуров. Эти потворяющиеся последовательности в разных режимах – разной длинны. Во время активации некоторого нейронного контура, количество активных нейронов отличается от предыдущего шага. Все это вместе напоминает картину, возникающую при анализе электроэнцефалограмм, различные ритмы мозга. Наличие одновременно нескольких ритмов в мозге человека наводит на мысли о том, что мозг обычно одновременно решает несколько задач – например, прогнозирование и обобщение, поиск аналогий и запоминание.