Нейронные сети на C#

ОГЛАВЛЕНИЕ

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

•    Скачать исходники - 251 Кб
•    Скачать демонстрационный проект - 181 Кб

Введение

История нейронных сетей начинается в 1950-х гг., когда была представлена архитектура простейших нейронных сетей. После начальной работы в области идея нейронных сетей стала весьма популярной. Но затем область угасла, когда обнаружилось, что нейронные сети тех времен годились для крайне ограниченного числа задач. В 1970-х гг. область снова расцвела, когда была представлена идея многослойных нейронных сетей с алгоритмом обучения с обратным распространением. С тех пор много разных исследователей изучало область нейронных сетей, что привело к появлению широкого диапазона разных нейронных архитектур, применявшихся к множеству разных задач. Теперь нейронные сети применяются к таким задачам, как классификация, распознавание, приближение, предсказание, кластеризация, моделирование памяти и множество других разных задач, число которых растет.

В данной статье описана библиотека C# для расчетов нейронной сети. Библиотека реализует несколько известных архитектур нейронной сети и их алгоритмы обучения, такие как обратное распространение, самоорганизующаяся карта Кохонена, эластичная сеть, обучение по дельта-правилу и обучение перцептрона. Применение библиотеки показано на нескольких примерах:

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

Приложенные архивы содержат исходные коды для всей библиотеки, всех вышеперечисленных примеров, и несколько дополнительных примеров, не перечисленных и не рассмотренных в статье.

Статья не дает полную теорию нейронных сетей, которую легко найти на множестве разных ресурсов по всему интернету и на CodeProject. Вместо этого статья предполагает, что у читателя есть общие знания о нейронных сетях, и поэтому цель статьи – обсудить библиотеку C# для вычислений нейронной сети и ее применение к разным задачам.

Применение библиотеки

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

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

Библиотека содержит шесть основных сущностей:
•    Neuron – базовый абстрактный класс для всех нейронов, инкапсулирующих такие общие сущности, как вес нейрона, выходное значение и входное значение. Другие классы нейрона наследуются от базового класса, чтобы расширить его дополнительными свойствами и специализировать его.
•    Layer – представляет коллекцию нейронов. Это базовый абстрактный класс, инкапсулирующий общий функционал всех слоев нейронов.
•    Network – представляет нейронную сеть, является коллекцией слоев нейронов. Это базовый абстрактный класс, предоставляющий общий функционал типовой нейронной сети. Для реализации конкретной архитектуры нейронной сети требуется унаследовать класс, расширив его специфичным функционалом любой архитектуры нейронной сети.
•    IActivationFunction – интерфейс функции активации. Функции активации используются в нейронах активации – типе нейрона, где вычисляется взвешенная сумма его входов, и затем значение передается на вход функции активации, и выходное значение становится выходным значением нейрона.
•    IUnsupervisedLearning – интерфейс для алгоритмов неуправляемого обучения – типа алгоритмов обучения, где системе даются образцы входов только на этапе обучения, но без желаемых выходов. Задача системы – организоваться так, чтобы найти взаимосвязь и сходства между выборками данных.
•    ISupervisedLearning - интерфейс для алгоритмов управляемого обучения – типа алгоритмов обучения, где системе на этапе обучения даются образцы входов вместе с желаемыми выходными значениями. Задача системы – обобщить учебные данные и научиться предоставлять правильное выходное значение, когда ей предъявляется только входное значение.

Библиотека предоставляет следующие архитектуры нейронной сети:

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

Разные алгоритмы обучения применяются для обучения разных нейронных сетей и для решения разных задач:
•    Обучение перцептрона  – алгоритм считается первым алгоритмом обучения нейронной сети, история которого начинается с 1957 г. Алгоритм применяется к однослойной сети активации, где каждый нейрон имеет пороговую функцию активации. Диапазон его применений мал и ограничен классификацией линейно разделимых данных.
•    Обучение по дельта-правилу – алгоритм является следующим шагом после алгоритма обучения перцептрона. Он использует производную функции активации и применим только к однослойным сетям активации, где каждый нейрон имеет непрерывную функцию активации вместо пороговой функции активации. Самая известная непрерывная функция активации – однополярная и двухполярная сигма-функция. Поскольку алгоритм применим только к однослойным сетям, он ограничен некоторыми задачами классификации и распознавания.
•    Обучение с обратным распространением  – один из самых известных алгоритмов для обучения многослойной нейронной сети. Изначально он был описан в 1974г., и с тех пор он активно изучался и применялся к широкому спектру разных задач. Поскольку алгоритм способен обучать многослойные нейронные сети, диапазон его применения очень большой и включает в себя такие задачи, как приближение, предсказание, распознавание объекта и т.д.
•    Обучение SOM  – этот алгоритм был разработан Кохоненом и считается одним из самых известных алгоритмов неуправляемого обучения для задач кластеризации. Он рассматривает нейронную сеть как двумерную карту узлов, где каждый узел представляет отдельный класс. Алгоритм организует сеть так, что ей удается находить взаимосвязь и сходства между выборками данных.
•    Обучение эластичной сети  – алгоритм походит на идею алгоритма обучения SOM, но рассматривает нейроны сети не как двумерную карту узлов, а как кольцо. В ходе обучения кольцо приобретает некоторую форму, представляющую решение. Одна из самых распространенных демонстраций этого алгоритма обучения – задача коммивояжера (TSP).

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