Posts Tagged ‘с изображениями’

Метрические пространства и ИНС

Среда, Февраль 10th, 2010

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


Варианты хранения информации о расстоянии между А и Б


Вариант 1. Есть кластер с тремя связями: от А, Б и от кластера с информацией о расстоянии. Для того, чтобы оперировать с информацией о расстоянии, могут применяться различные механизмы. Но для начала, кластер, обозначенный как «d=1.7», нужно активировать. В схеме 1 – активировать А и Б, далее служебный кластер частично активируется (нечеткое распознавание), на нем концентрируется внимание, он распознается полностью, и активирует кластер «d=1.7». Чтобы убрать нечеткое распознавание, можно пойти другим путем – снизить порог срабатывания.
Вариант 2. Чтобы убрать стадию нечеткого распознавания, добавлен отдельный кластер. Связь «вперед» должна также полностью активировать следующий кластер. Как видно, во всех этих вариантах соблюдается условие симметрии А и Б – так как они должны активироваться одновременно.
Вариант 3. В многозадачной ИНС кластеры, объединяющие А и Б, могут хранить не только информацию о расстоянии. Чтобы не путать такие кластеры, в данном случае добавлен кластер вопроса «d?». Для того, чтобы узнать расстояние, нужно активировать кластеры обоих объектов и кластер вопроса о расстоянии. Нечеткое распознавание не нужно.
Вариант 4. То же, что и в пункте 3, но расстояние хранится не в одном кластере, а в цепочке – в данном случае, цепочке знаков, которые можно преобразовать в число.

В вариантах 1-2-3 кластер «d=1.7» мог соответствовать последнему кластеру цепочки, похожей на вариант 4, которая кодировала расстояние побуквенно. Для обработки такой цепоки нужно умение счета, умение сравнивать числа на величину и т. д. А можно добавить такую возможность в ИНС на базовом уровне, где за операции с числами будет отвечать интерфейс к калькулятору. Тогда нужно меньше нейронов (один кластер вместо цепочки), и вариант 4 не нужен.

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

История навигации

Пятница, Январь 22nd, 2010

Чтобы не сохранять (в другой программе типа текстового редактора) идентификаторы нейронов и кластеров, к которым нужно будет еще раз вернуться при отладке, в Нейролабораторию добавлено ведение истории навигации. Идея – та же, что и в Visual Studio, когда ведется история перехода курсором по файлам и строкам внутри файла.
Следующие события сохраняются:
* Выделение и снятие выделения с нейронов
* Выделение текущей связи
* Подсветка циклов
* Копирование текста
Для всех из списка возможна отмена и повтор действия. Для того, чтобы отмена приводила к как можно более похожему состоянию, введены такие дополнения. Информация о выделении нейронов содержит два списка – с выделенными и погашенными нейронами. При отмене, списки меняются местами – исходно выделенные нейроны гасятся, погашенные – выделяются.
Некоторое действие (например, выделение цикла) может привести к множеству действий (например – к выделению нейронов, созданных в том цикле). Спровоцированное действие также попадет в историю навигации. Но отменять и повторять их по одиночке неправильно, нужно обрабатывать их вместе. Для автоматизации группировки используется создание объекта NLUndoLock. При создании, этот объект регистрируется. (Соответственно, и при уничтожении этого объекта, он также оповещает свое хранилище). Если других аналогичных живых объектов нету, то начинается новый блок действий, иначе используется старый. В таблице истории навигации, группировка в блоки показывается стандартными скобками. Красным маркером показывается текущая позиция курсора отмены/повторения, а по совместительству – и курсора занесения истории новых команд.


Окно навигационных действий

Понимание структуры ИНС-2

Четверг, Январь 21st, 2010

Продолжение.
С ростом сложности ИНС, рассмотренных способов ориентирования в структуре ИНС становится недостаточно. Желательно визуально отображать структуру. Визуальное отображение на двухмерной карте ИНС мало помогает. Решение:
1) Применять дополнительную карту для отображения структуры
2) На этой дополнительной карте отображать не все нейроны, а только выбранного кластера и всех его признаков – рекурсивно. (Если не повезет, то из-за рекурсии на карту может попасть слишком много нейронов).
3) Вместо отображения каждого нейрона кластера, отображать кластеры высокоуровнево – одним квазинейроном на кластер. Для ИНС Б2 экономия в площади – девятикратная.
4) Вместо отображения кластеров в порядке создания, использовать двухмерную сортировку – по уровню иерархии и очередности срабатывания


Сравнение нового и старого способа просмотра цепочек


Чтобы было понятнее, зачем все это городить, можно взглянуть на фрагмент ИНС чуть посложнее:


Пример двухмерной сортировки – синие линии отделяют уровни иерархии


Детали устройства со стороны разработчика ИНС:
1) Если ИНС сообщает, что в ней есть кластеры, то при загрузке окон окружения ИНС создается и окно для отображения структуры нейронных цепочек
2) Каждый нейрон может переопределить функцию INeuroCluster* cluster()
3) В своей реализации INeuroCluster, зависящем от ИНС, можно возвращать список кластеров-признаков и кластера, предыдущего в цепочке памяти. Для ИНС Б2 используются кластеры нейронов всех связей с nEn и nIn.

Детали устройства со стороны разработчика интерфейса Нейролаборатории:
1) Для двухмерной сортировки и отображения структуры используется служебная ИНС. ИНС этого типа нельзя создать через интерфейс в качестве самостоятельной ИНС для исследований в НЛ.
2) Каждый нейрон этой ИНС соответствует кластеру главной ИНС.
3) Команду отображения цепочки можно вызвать несколькими способами: выбором кластера в таблице кластеров, двойным щелчком по идентификатору кластера в таблице нейронов, связей или нейронных цепочек, путем ввода идентификатора кластера в окне для отображения цепочек
4) После получения команды отображения цепочки по кластеру, у заданного кластера рекурсивно получаются все признаки и все кластеры, предшествующие в цепочках. Для них создаются соответствующие нейроны и связи между ними. Связи строятся двух типов – «признак обобщения» и «следствие».
5) Производится двухмерная сортировка. Все квазинейроны вначале имеют один и тот же уровень иерархии и время срабатывания. Начиная с кластера-инициатора, рекурсивно распространяется информация о том, что кластер-признак – ниже по иерархии. У заданного кластера, кластеры-признаки вместе с кластерами, предыдущими в цепочке, получают также информацию о том, что они должны сработать как минимум на цикл раньше, чем заданный кластер. В смысле реализации, вычисления производятся итеративно, а не рекурсивно – чтобы не переполнить стек. Если за всю итерацию ни один квазинейрон не получил инфорамцию о том, что его уровень иерархии надо еще более понизить, а максимальное время срабатывания – еще более отсрочить, то вычисления прекращаются. Если количество итераций превысило количество нейронов, это значит, что в данном фрагменте ИНС наблюдается зацикливание, и вычисления прекращаются.
6) Полученные относительные числа нормализуются: уровни иерархии и время срабатывания индексируются от нуля и выше, последовательно. По этим индексам строится отображение. В каждом столбце заносятся квазинейроны с одним и тем же интервалом максимального первого срабатывания. Уровни иерархии заносятся как отдельные строки и выделяются синими линиями. Выделение линий важно, так как в одном столбце могут быть несколько квазинейронов и несколько уровней, как на втором рисунке.

Понимание структуры ИНС в Нейролаборатории

Четверг, Январь 21st, 2010

В Нейролаборатории, перед вами нейрон цепочки памяти. Как понять, что именно он запоминал? Вариантов много.
Можно сделать двойной щелчок в строке этого нейрона по ячейке с циклом создания нейрона. Тогда по всем окнам пройдет сообщение «подсветить цикл №Х». В окне истории ввода/вывода будет подсвечена та строка с вводом/выводом, цикл создания которой наиболее близок к подсвечиваемому. Наиболее вероятно – что будет подсвечен тот ввод/вывод, который и был связан с данным нейроном и кластером. Можно будет сориентироваться, что за текст обрабатывался системой в момент создания кластера.


Двойной щелчок по циклу создания нейронов


Можно иначе. В кластере этого нейрона, выбрать нейрон контура nIn, и в окне с таблицей связей посмотреть на все его признаки и, таким образом, увидеть, что именно запоминал данный кластер (или что он распознает). Можно перейти на запомненные признаки по двойному щелчку их идентификатора в таблице связей – но если нужно только узнать, что за буквы были запомнены, то достаточно посмотреть комментарий нейрона, на который указывает связь, в той же таблице связей, в столбце правее.
Обычно достаточно выделить нейрон контура nIn в таблице связей. Если уже выбран нейрон другого контура, и нужно выбрать nIn, то, чтобы не переключать внимание на таблицу нейронов, не открывать ее, не искать визуально границ кластера и nIn в нем, можно в окне с таблицей связей выбрать из выпадающего списка нейрон нужного типа – там все нейроны кластера того нейрона, связи которого уже отображаются.
Вариант с подсветкой цикла проще. Однако, он не подходит, если нейрон был создан во время обобщения других нейронных цепочек – так как никакого ввода/вывода и обмена с внешней средой в тот момент не было, а если и был – то не относится к обобщению. Не проблема. В ИНС обычно есть окно с логированием. В информацию каждой строки лога входит и цикл логирования. Хороший тон – заносить в лог информацию о том, что за цепочки выбраны для обобщения. В ответ на глобальное сообщение о подсветке цикла, таблица логов также подсвечивает строку с циклом, наиболее близком к циклу сообщения. Там будет текст типа «сон 2ВЦ обобщение: выбраны н-ы 901 и 869». Можно ввести идентификатор одного из нейронов в поле ввода идентификатора в таблице связей, и далее применять просмотр связей. Но вводить вручную долго. Вместо этого можно сделать щелчек средней кнопкой мыши в любой ячейке таблицы. Из текста в ячейке таблицы будут выделены числа, и показано окно с выбором, что сделать с любым из чисел – подсветить нейрон с таким идентификатором или цикл с таким номером. После нажатия на кнопку действия, окно само закроется.


Выделить цикл -> окно логов -> выделить нейрон


Но что, если запомнены высокоуровневые признаки, у которых нет комментария? Если бы вы отлаживали чужую ИНС подобно коду на ассемблере в чужой программе, то можно было бы самому задавать комментарии.
Для частичного решения проблемы применяется автоматическое назначение комментариев. Алгоритм следующий.
1) У сенсорных нейронов комментарии не меняются и соответствуют воспринимаемым буквам
2) У кластеров цепочек памяти, если была изменена – добавлена или удалена – хотя бы одна связь, выставляется флаг «пересчитать комментарий»
3) Один раз на каждую высокоуровневую итерацию происходит перерасчет комментариев.
4) Всем нейронам кластера дается одинаковый для всех комментарий. Поэтому можно говорить «комментарий кластера» вместо «комментарий нейрона».
5) Комментарий у кластера берется так: в скобках перечисляются комментарии всех признаков, которые входят в nIn, а разделяются они через вертикальную черту или иной разделитель. Например, сенсорный нейрон «а» запомнен кластером, кластер принимает комментарий «(а)».
6) Каждый признак, который запомнен кластером, рассматривается как цепочка. Вся такая цепочка заносится в комментарий. Например, некоторая цепочка запомнила слог «об», двумя кластерами – которые имеют комментарии «(о)» и «(б)». Если второй кластер это цепочки будет распознан и станет признаком некоторой другой цепочки, то он войдет в нее как «((о)|(б))»
7) После того, как комментарий кластера поменялся, информация о том, что нужно обновить комментарий, выставляется для всех зависимых от него кластеров – для кластера, следующего в цепочке, и для более высокоуровневых кластеров. Их комментарии будут обновлены в следующей итерации.

Показ границ линий расположения в 2d

Воскресенье, Январь 17th, 2010

В дополнение к «№93 NL UI: Выбор координат нейронов для карты нейронов» ( http://neurocod.net/blog/tag/2009/04/№93-nl-ui-выбор-координат-нейронов-для-карт ). Чтобы было легче определять границы кластеров и нейронных цепочек, при «переводе строки» (расположения новых нейронов) в память заносится верхняя граница строки, и затем всегда отображается.


Синие линии – границы строк

Смена режимов 1ВЦ и 2ВЦ

Суббота, Январь 16th, 2010

Сначала схема работы ИНС, которая просматривает все совпадения и работает без разрывов.
1ВЦ нашел позицию. Эта позиция могла быть получена только на текущем шаге (найден второй кластер, у которого более одного общего признака получено за последний шаг), или за текущий и предыдущий шаги (найдена цепочка, у которой минимум один общий признак с прошлого шага и один общий за текущий). Поэтому, после нахождения позиции в 1ВЦ, в обеих цепочках, алгоритм должен перейти на шаг назад (чтобы учесть все варианты), а затем активировать эти предыдущие кластеры и начать работу с 2ВЦ.
Теперь представьте, что возможен разрыв в 15 шагов. После нахождения кандидата в 1ВЦ, по обеим цепочкам сигнал должен вернутся на 15 шагов назад. Ждать последовательного перехода сигнала назад по цепочке в 15 итераций, а потом еще и снова 15 шагов идти вперед? Слишком расточительно.
Решение: для перехода ведущего сигнала назад по цепочкам на сравнительно большое количество шагов, использовать «перескок назад» сигнала по связям. Какую выбрать схему соединений?
Наиболее простая схема – каждой позиции на цепочке соответствует свой нейрон (контур) перехода на N шагов назад. (На рисунке – схема 1). Преимущества такого решения – высокая точность: сигнал переходит на одно и то же количество шагов назад (кроме первых N нейронов, для которых цепочка еще не достаточно длинная). Недостаток – большое количество нейронов, у которых всего одна связь. Это неэффективно и в ЕНС, и в ИНС. Для ЕНС более подходит решение с локальным «накоплением» связей и одной посылкой назад. На рисунке – схема 2. С некоторым небольшим разбросом интервалов перехода можно смириться.


Варианты возвратных схем


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

Группировка истории нейроконтуров по итерациям

Пятница, Январь 15th, 2010

Переход на высокоуровневые итерации сделал простой визуальную группировку строк операций нейроконтуров в таблице истории.


Группировка в стандартном стиле - красными линиями

Хочу XOR Надо

Воскресенье, Октябрь 25th, 2009

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


Создание точек останова на заданный шаг кода ИНС


У писателей есть правило: если ничего не пишется – писать хоть по странице в день. (далее…)

Представление классов в памяти

Четверг, Октябрь 22nd, 2009

В этой заметке используются понятия, введенные в «№29 Распознавание и прогнозирование, активация и торможение, необходимость и достаточность» ( http://neurocod.net/blog/tag/2008/08/№29-распознавание-и-прогнозирование-а ). Как раз будет рассматриваться добавление возможностей медленной памяти к тем механизмам быстрой памяти, которые рассматривались до сих пор. Слова «необходимость» и «достаточность» используются для обозначения понятий, введенных в «№30 (продолжение – прогнозирование)» ( http://neurocod.net/blog/tag/2008/08/№30-продолжение-прогнозирование ). В списке целей «План решения задачи создания ИИ ОН на основе ИНС» ( http://neurocod.net/blog/tag/2009/06/план-решения-задачи-создания-ии ) это – пятый пункт: «научиться производить кластеризацию образов. Например, автоматическое разделение слов на существительные, прилагательные и т. д. для неизвестного языка».

Пусть выделена обобщенная нейронная цепочка из нескольких слов. Нужно научиться создавать такую цепочку, чтобы вместо некоторого слова в цепочку входило множество слов, кластер, класс понятий. Так, вместо конкретного предмета – обозначение «тут может быть любое существительное». Для русского языка, отдаленное подобие могла бы носить нейронная цепочка с выделением стандартных окончаний – но это не совсем то. Нужно, чтобы создавался кластер, реагирующий или на слова независимо от окончаний (как в английском языке, где слова не имеют такой регулярной структуры, как в русском языке), или на слова как целое, независимо от окончаний, или, обобщенно, на некоторый набор образов. Подразумевается, что у образов нету общих нейронов-признаков, общность таких образов можно выделять только на основе повторения последовательностей. Например, последовательности ВЦ1=«а, б1, в» и ВЦ2=«а, б2, в» – неплохо бы создать образ, который одинаково реагирует на б1 и б2. Причем, вместо пропуска («разрыва») элемента на месте б1/б2, должны быть именно связи с б1/б2.


Варианты создания кластеров, обобщающих набор признаков в классификацию

(далее…)

Поиск и обобщение, 1ВЦ и 2ВЦ

Понедельник, Октябрь 19th, 2009

При описании алгоритмов работы ИНС, часто приходилось использовать их длинные названия. Для сокращения, введу новые: стадия алгоритма выделения обобщения, в которой только одна ведущая цепочка, и происходит поиск кандидатов для обобщения, будет называться «поиск, 1ВЦ» (одна ведущая цепочка). Стадия, на которой поиск произведен, вторая цепочка найдена, и происходит само обобщение, будет называться «обобщение, 2ВЦ». Теперь продолжим рассмотрение этих алгоритмов.
В прошлой записи на эту тему, «Торможение при распознавании и обобщении» ( http://neurocod.net/blog/tag/2009/10/торможение-при-распознавании-и-обобщ ), рассмотрение прошло первый из трех пунктов – обобщение «для гностических нейронов, активируемых одним шагом, без учета времени». Теперь пришла очередь второго пункта: «рассмотрение цепочек памяти (с длинной от одного элемента и выше), работающих без разрывов».
Известный шаблон алгоритма нужно усовершенствовать. Нужно добавить распознавание образов в обе стадии – 1ВЦ и 2ВЦ. Распознавание на примере одного кластера во время обобщения было рассмотрено в прошлой заметке. Для учета цепочек, нужно добавить шаг с пересылкой разрешающих сигналов по nEn. Но нужно предусмотреть и внесение распознанных образов в цепочку памяти – обновление цепочки.
На рисунке ниже, для простоты, каждый кластер изображен одним нейроном. Порог такого нейрона считается как сумма порога nIn+nEn. У nEn порог может быть 0, если кластер первый в цепочке, иначе 1. Обозначения: ВЦ1,1 и ВЦ1,2 – временная цепочка 1, кластеры 1 и 2. ГК1 – гностический кластер 1. Остальное – кластеры признаков.


1ВЦ, внесение изменений после распознавания


Связь от ГК1->ВЦ1,2 выделена цветом. Нужно рассмотреть четыре ситуации: [1ВЦ или 2ВЦ] и [выделенная связь существует или нет]. Если связь не существует, ее нужно создать.
После спуска сигнала с ВЦ1,1 к признакам и подъема вверх, в алгоритме, рассмотренном в прошлой записи, будет активирован ГК1. Раз уж он активирован, то можно воспользоваться ситуацией и заносить в ВЦ1,2. Но на момент распознавания, ведущим кластером еще будет являться ВЦ1,1. Чтобы соответствовать общепринятому подходу соединять только активные кластеры, нужно подождать до следующего такта, когда ведущим станет ВЦ1,2, и тогда уже добавлять ГК1 в список признаков. Нужно предусмотреть, чтобы посылка сигнала к признакам со стороны ВЦ1,2 не приводила к переактивации ГК1 – ведь он уже был активен недавно. Для этого, перед таким шагом, нужно не забыть обнулить активацию. Поэтому, проверка и добавление связи должно происходить до очередного спуска «вниз к признакам» и до обнуления активации.
Нужно рассмотреть специальный случай – когда образ, который будет распознан, «случайно» сам оказался ведущей цепочкой.


2ВЦ, исходное состояние


В таких случаях, если не внести изменений в алгоритм, будет выделен кластер с полной копией признаков, как у гностического кластера. Но такая копия не нужна. Можно заметить, что в режиме 2ВЦ способ определения такой ситуации – один из ведущих кластеров распознан. Если он распознан, то все работает нормально. Новый кластер следовало бы создавать, если бы кластер находился в режиме предпороговой активации. Хорошо, ситуация определена. Можно писать заплатку… Но есть вариант лучше – универсализировать алгоритм. Такое распознавание происходит в конце функции «вниз и вверх». В случае 1ВЦ, если прозвон начался с начала ВЦ, распознавание в этой цепочке будет происходить всегда – это нужно учитывать. Универсализация относится к шагу торможения. Можно заметить, что если распознанный ведущий кластер никак не выделять, то он точно также произведет торможение признаков. В случае 2ВЦ, просто ничего не будет выделяться. Но зато останется работать функциональность, при которой такой кластер будет занесен во вторую цепочку – как и показано на последнем рисунке. То есть, новая обобщенная цепочка не сформируется, но старая будет подправлена.


2ВЦ, после внесения изменений