EN / RU

Техническое описание нейросетевых исходников


Сами исходники (Delphi) находятся в платном доступе, лежат здесь.


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

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

Тоесть всё это находится внутри нейрона, и дендриты и степени их влияния - это всё части одного нейрона. Однако, при программировании модели нейронной сити вполне допустимо хранение весовых коэффициентов сети в отдельном массиве, а матрицы связей сети - в другом массиве, причем в этом случае сами объекты нейронов вообще могут быть не нужны. Такие способы генерации сетей реализуются в матлабе и подобных ему симуляторах. В более ранних программных реализациях, которые лежат в каталогах "9dek2005" и "15aug2005" я использовал похожий способ. Матрицу связей и веса хранил в отдельных динамических массивах. Процедура инициализации сети как раз и нужна для генерации этих динамических массивов. Вначале мы задаем конфигурацию сети, тоесть, точно расписываем, сколько должно быть входных нейронов, сколько выходных, сколько слоев и сколько нейронов на слой. Затем генерируем динамические массивы, потом выбираем функцию принадлежности и затем приступаем к обучению сети. На мой взгляд, сети на динамических массивах конечно имеют неоспоримые преимущества в плане реализации многослойных нейронных сетей, но они начинают явно пробуксовывать при реализации нейронных сетей звездчатого типа или шаровых, в которых нет четкой послойной организации и где каждый нейрон связан с каждым, или по крайней мере разрешены связи между нейронами удаленных слоев. Очевидно, что каждый разработчик на своё усмотрение может выбирать свой способ реализации нейронной сети.

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

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

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

Редактор нечетких правил.


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

После этого необходимо отредактировать каждое правило, тоесть задаться конкретными функциями принадлежности, которые будут на входе и на выходе каждого правила. У меня там реализовано таким образом, что после выбора каждой функции принадлежности на каждом входе правила, вы нажимеете "add", а перед вводом функции принадлежности для выходного множества, надпись на кнопке "add" меняется на "Then". Короче, я думаю, методом "научного тыка" кому надо - разберетесь. :-))



Визуализатор графика обучения нейронной сети.

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

но также и в графическом виде. Для этого нужно найти в меню "графики обучения" и вытащить окно графиков. Затем нажимаете на кнопку "filllistbox" и заполняете массив значений для графика. Потом его нужно отмасштабировать для удобства отображения кнопкой "Масштабировать", и отобразить кнопкой "показать".

График обучения рисуется одновременно на канве формы и в отдельном компоненте для построения графиков. Я так и не определился в своё время, что лучше оставить - канву или компонент.
При желании всё это можно даже распечатать.

kennobi 13.07.2010г.

Обсудить эту статью на форуме





Комментарии пользователей:

Adedeji2012-04-10 13:35:27
Wow! Great to find a post koncikng my socks off!

Dina2013-09-08 16:27:26
It's always a pleasure to hear from someone with exseetipr.

Dweezil2016-10-22 03:28:23
That's a we-outhought-llt answer to a challenging question



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

Имя:   
Текст:




Внимание! При перепечатке эта ссылка обязательна!