РЕАЛИЗАЦИЯ ПРОСТЕЙШИХ НЕЙРОННЫХ СЕТЕЙ В СРЕДЕ. NET НА ЯЗЫКЕ С# - Студенческий научный форум

X Международная студенческая научная конференция Студенческий научный форум - 2018

РЕАЛИЗАЦИЯ ПРОСТЕЙШИХ НЕЙРОННЫХ СЕТЕЙ В СРЕДЕ. NET НА ЯЗЫКЕ С#

Бибичева Т.С. 1
1Саратовский национальный исследовательский государственный университет
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
Введение

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

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

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

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

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

Цель работы: исследовать возможность реализации простейших нейронных сетей в среде .Net на языке С#.

Поставленная цель определила следующие задачи:

  1. Рассмотреть библиотеки ALGLIB, FANN C#, Neural Networks on C# для реализации нейронных сетей в среде .Net на языке С#

  2. Создать и обучить простейшую нейронную сеть (на примере логических функций импликация и исключающее ИЛИ) средствами каждой библиотеки.

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

  1. Библиотеки для реализации нейронных сетей в среде .Net на языке С#

Программное обеспечение, имитирующее работу нейронной сети, называют нейросимулятором либо нейропакетом.

Большинство нейропакетов включают следующую последовательность действий:

  1. Создание сети (выбор пользователем параметров либо одобрение установленных по умолчанию).

  2. Обучение сети.

  3. Выдача пользователю решения.

Выбор нейропакета определяется квалификацией и требованиями пользователя [1].

Рассмотрим реализацию нейронных сетей в среде .Net на языке С#. Для этого изучим библиотеки ALGLIB, FANN C# , Neural Networks on C#.

ALGLIB

В основу реализации нейронных сетей в ALGLIB положены два принципа:

  1. отношение к нейронным сетям, как к всего лишь одному из алгоритмов классификации/регрессии;

  2. разумная простота средств для работы с нейронными сетями.

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

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

Нейронная сеть в ALGLIB представлена структурой MultiLayerPerceptron. Хотя эта структура имеет открытые поля, для работы с ней следует использовать исключительно подпрограммы ALGLIB, не обращаясь к полям напрямую. Работа с нейронными сетями осуществляется в такой последовательности:

  1. Выбор архитектуры и инициализация структуры при помощи соответствующей функции.

  2. Обучение нейронной сети при помощи одного из алгоритмов.

  3. Использование обученной сети (применение к входным данным, сериализация и т.д.).

Пакет ALGLIB позволяет создавать нейронные сети без скрытых слоев, с одним скрытым слоем и с двумя скрытыми слоями. Соединения идут от входного слоя к первому из скрытых (если он есть), затем ко второму, затем - к выходному. "Короткие" соединения от входного слоя к выходному отсутствуют. Скрытые слои имеют одну из стандартных сжимающих функций активации. Выходной слой может быть линейным (такие сети используются в задачах аппроксимации), может иметь сжимающую функцию активации (в случае, если выходы сети ограничены определенным диапазоном) [2].

FANN C#

Fast Artificial Neural Network (FANN) – библиотека с открытым исходным кодом, которая позволяет создавать искусственные нейронные сети в том числе полносвязанные многослойные сети. Библиотека включает в себя структуру для простой обработки наборов данных обучения. Поддерживает более 20 языков программирования [3].

Достоинства библиотеки:

  1. Поддерживает метод обратного распространения ошибки;

  2. Проста в использовании;

  3. Имеет высокую скорость работы;

  4. Хорошо документирована;

  5. Включает несколько реализованных активационных функций;

  6. Широко используется.

Neural Networks on C#

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

Библиотека содержит шесть основных сущностей:

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

2. Layer – представляет коллекцию нейронов. Это базовый абстрактный класс, инкапсулирующий общий функционал всех слоев нейронов.

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

4. IActivationFunction – интерфейс функции активации. Функции активации используются в нейронах активации – типе нейрона, где вычисляется взвешенная сумма его входов, и затем значение передается на вход функции активации, и выходное значение становится выходным значением нейрона.

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

6. ISupervisedLearning - интерфейс для алгоритмов управляемого обучения – типа алгоритмов обучения, где системе на этапе обучения даются образцы входов вместе с желаемыми выходными значениями. Задача системы – обобщить учебные данные и научиться предоставлять правильное выходное значение, когда ей предъявляется только входное значение [4].

  1. Создание и обучение простейшей нейронной сети

Для создания и обучения нейронной сети были выбраны 2 логические функции: для демонстрации работы сети с однослойным персептроном - импликация, для демонстрации работы сети с многослойным персептроном - исключающее ИЛИ (XOR).

Импликация

Дана логическая функция импликация. Это функция от двух аргументов, каждый из которых может быть нулем или единицей. Она принимает значение 0, когда первый аргумент равен единице, а второй – 0, иначе 1.

Обозначим один входной аргумент через x1, а другой через x2, тогда все их возможные комбинации будут состоять из четырех точек на плоскости. Таблица 1 показывает требуемую связь между входами и выходом.

Таблица 1 – Таблица истинности для функции импликации

Значение x1

Значение x2

Требуемый выход

0

0

1

0

1

1

1

0

0

1

1

1

Предположим, что задачу можно проиллюстрировать с помощью однослойной нейронной сети с двумя входами, показанной на рисунке 8. В сети на этом рисунке активационная функция f является пороговой, так что OUT принимает значение ноль, когда Y больше 0,5, и единица в случае, когда Y меньше или равно 0,5. Нейрон выполняет следующее вычисление:

Фиксируя Y на величине порога 0,5, сеть можно описать уравнением

Это уравнение линейно по и , т. е. все значения по и , удовлетворяющие этому уравнению, будут лежать на некоторой прямой в плоскости -.

Любые входные значения для и на этой линии будут давать пороговое значение 0,5 для Y. Входные значения с одной стороны прямой обеспечат значения Y меньше порога, следовательно, OUT=1. Входные значения по другую сторону прямой обеспечат значения Y больше порогового значения, делая OUT равным 0 [5].

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

Рисунок 1 - Однослойная сеть

Будем считать, что сеть уже обучена, то есть значения синаптических весов сети на рисунке 1 определены: В качестве функции активации применим функцию единичного скачка с порогом 0,5.

Тогда результат работы такой нейронной сети можно представить в виде таблицы 2.

Таблица 2 – Результаты работы сети для функции импликации

Значение x1

Значение x2

Требуемый выход

OUT

0

0

1

1

0

1

1

1

1

0

0

0

1

1

1

1

Решение задачи импликации с использованием библиотеки FANN C# приведено в приложении 1, с использованием ALGLIB – в приложении 2, Neural Networks on C# – в приложении 3.

Сравним время обучения и время получения результатов для сети, реализующей операцию импликации, для библиотек FANN C#, ALGLIB, Neural Networks on C#. Результаты сравнения приведены в таблице 3.

Таблица 3 – Сравнение времени работы для функции импликации

 

ALGLIB

FANN C#

Neural Networks on C#

Время обучения нейронной сети (ElapsedMilliseconds)

303

14

17

Время получения результата (ElapsedMilliseconds)

7

7

3

По полученным данным можно сделать вывод, что время получения результата для всех библиотек примерно одинаково, но скорость обучения сети, реализованной с библиотеками FANN C# и Neural Networks on C#, выше, чем для библиотеки ALGLIB.

Исключающее ИЛИ

Дана логическая функция XOR. Это функция от двух аргументов, каждый из которых может быть нулем или единицей. Она принимает значение 1, когда один из аргументов равен единице, но не оба, иначе 0.

Обозначим один входной аргумент через x1, а другой через x2, тогда все их возможные комбинации будут состоять из четырех точек на плоскости. Таблица 4 показывает требуемую связь между входами и выходом.

Таблица 4 – Таблица истинности для функции исключающего ИЛИ

Значение x1

Значение x2

Требуемый выход

0

0

0

0

1

1

1

0

1

1

1

0

Предположим, что задачу можно проиллюстрировать с помощью однослойной нейронной сети с двумя входами, показанной на рисунке 8.

В сети на этом рисунке активационная функция f является пороговой, так что OUT принимает значение ноль, когда Y меньше 0,5, и единица в случае, когда Y больше или равно 0,5. Нейрон выполняет следующее вычисление:

Никакая комбинация значений двух весов не может дать соотношения между входом и выходом, задаваемого табл. 2.1. Фиксируя Y на величине порога 0,5, сеть можно описать уравнением

Это уравнение линейно по и , т. е. все значения по и , удовлетворяющие этому уравнению, будут лежать на некоторой прямой в плоскости -.

Любые входные значения для и на этой линии будут давать пороговое значение 0,5 для Y. Входные значения с одной стороны прямой обеспечат значения Y больше порога, следовательно, OUT=1. Входные значения по другую сторону прямой обеспечат значения Y меньше порогового значения, делая OUT равным 0 [5].

Изменения значений , и порога будут менять наклон и положение прямой. Для того чтобы сеть реализовала функцию исключающее ИЛИ нужно расположить прямую так, чтобы точки (0, 0) и (1, 1) были с одной стороны прямой, а точки (0, 1), (1, 0) – с другой. Нарисовать такую прямую невозможно. Это означает, что какие бы значения ни приписывались весам и порогу, сеть неспособна воспроизвести соотношение между входом и выходом, требуемое для представления функции исключающее ИЛИ. Однако эта функция легко формируется уже двухслойной сетью, причем многими способами. Один из таких способов представлен на рисунке 2 [6].

Рисунок 2 - Двухслойный персептрон с пороговой функцией активации

Будем считать, что сеть уже обучена, то есть значения синаптических весов сети на рисунке 8 определены цифрами над стрелками В качестве функции активации применим функцию единичного скачка с порогом 0,5 [6].

Тогда результат работы такой нейронной сети можно представить в виде таблицы 5.

Таблица 5 – Результаты работы сети для функции исключающего ИЛИ

Значение x1

Значение x2

Требуемый выход

OUT1

OUT2

OUT3

0

0

0

0

0

0

1

0

1

1

0

1

0

1

1

0

1

1

1

1

0

0

0

0

Решение задачи исключающего ИЛИ с использованием библиотеки FANN C# приведено в приложении 4, с использованием ALGLIB – в приложении 5, Neural Networks on C# – в приложении 6.

Сравним время обучения и время получения результатов для сети, реализующей операцию исключающего ИЛИ, для библиотек FANN C#, ALGLIB, Neural Networks on C#. Результаты сравнения приведены в таблице 6.

Таблица 6 – Сравнение времени работы для функции исключающего ИЛИ

 

ALGLIB

FANN C#

Neural Networks on C#

Время обучения нейронной сети (ElapsedMilliseconds)

392

24

29

Время получения результата (ElapsedMilliseconds)

8

10

4

По полученным данным можно сделать вывод, что, как и для операции импликации, время получения результата для всех библиотек примерно одинаково, но скорость обучения сети, реализованной с библиотеками FANN C# и Neural Networks on C#, выше, чем для библиотеки ALGLIB.

  1. Сравнительный анализ библиотек

Критерии сравнения нейропакетов [7]:

  1. наглядность представляемой информации;

  2. возможность использовать различные структуры;

  3. скорость работы;

  4. наличие документации.

Результат сравнения библиотек приведен в таблице 7.

Таблица 7 – Сравнение библиотек

Библиотеки

Критерии

ALGLIB

FANN C#

Neural Networks on C#

Наглядность представляемой информации

Для понимания кода необходимо ознакомиться с документацией

Код программы интуитивно понятен

Код программы интуитивно понятен

Возможность использовать различные структуры

Для обучения могут использоваться 3 алгоритма

Большое количество алгоритмов обучения

Большое количество алгоритмов обучения

Наличие документации

Библиотека хорошо документирована

Библиотека хорошо документирована

Библиотека плохо документирована

Вывод: Согласно данным критерием наиболее оптимальной является библиотека FANN C#, т.к. библиотека «Neural Networks on C#» плохо документирована и не имеет широкого распространения, а в библиотеке ALGLIB нейронные сети рассматриваются как один из алгоритмов классификации/регрессии, поэтому эта библиотека имеет широкий неиспользуемый функционал.

Заключение

В данной работе были рассмотрены программные средства для реализации нейронных сетей в среде .Net на языке С#, такие как библиотеки ALGLIB, FANN C#, Neural Networks on C#. Для этого были приведены 2 задачи с логическими функциями. На основе решения примеров сделан сравнительный анализ библиотек, который показал, что наиболее оптимальной является библиотека FANN C#, т.к. библиотека «Neural Networks on C#» плохо документирована и не имеет широкого распространения, а в библиотеке ALGLIB нейронные сети рассматриваются как один из алгоритмов классификации/регрессии, поэтому эта библиотека имеет широкий неиспользуемый функционал.

В будущем планируется рассмотреть использование нейронных сетей для решения адаптивного тестирования.

Список использованных источников
  1. Программное обеспечение для работы с нейронными сетями [Электронный ресурс]. URL: http://www.intuit.ru/studies/courses/6/6/lecture/178?page=6 (дата обращения: 04.03.2017).

  2. ALGLIB [Электронный ресурс]. URL: http://alglib.sources.ru/dataanalysis/neuralnetworks.php (дата обращения: 17.02.2017).

  3. FANN [Электронный ресурс]. URL: http://leenissen.dk/fann/wp/ (дата обращения: 17.02.2017).

  4. Neural Networks on C# [Электронный ресурс]. URL: http://www.codeproject.com/Articles/16447/Neural-Networks-on-C (дата обращения: 17.02.2017).

  5. Уоссермен, Ф. Нейрокомпьютерная техника: теория и практика / Ф. Уоссермен. М.: Мир, 1992. 184 с.

  6. Пример решения задачи XOR [Электронный ресурс]. URL: http://www.aiportal.ru/articles/neural-networks/decision-xor.html (дата обращения: 02.05.2017).

  7. Программное обеспечение для работы с нейронными сетями [Электронный ресурс]. URL: http://www.intuit.ru/studies/courses/6/6/lecture/178?page=6 (дата обращения: 04.03.2017).

ПРИЛОЖЕНИЕ 1 Реализация импликации с использованием FANN C#

class ImplicationNetwork

{

private NeuralNet _network;

public ImplicationNetwork()

{

List layers = new List();

layers.Add(2); // число нейронов входного слоя

layers.Add(1); // число нейронов внутреннего слоя

layers.Add(1); // число нейронов выходного слоя

_network = new NeuralNet(NetworkType.LAYER, layers);

_network.LearningRate = (float)0.1; // уровень обучения

_network.ActivationSteepnessHidden = 1;

_network.ActivationSteepnessOutput = 1;

// функция активации для внутреннего и выходного слоя

_network.ActivationFunctionHidden = ActivationFunction.SIGMOID_SYMMETRIC;

_network.ActivationFunctionOutput = ActivationFunction.SIGMOID_SYMMETRIC;

// функция остановки

_network.TrainStopFunction = StopFunction.STOPFUNC_BIT;

_network.BitFailLimit = 0.01;

}

public void TrainNetwork()

{

TrainingData data = new TrainingData();

// входные и выходные значения

var input = new double[4][]

{ new double[] {0, 0},

new double[] {0, 1},

new double[] {1, 0},

new double[] {1, 1}};

var output = new double[4][]

{ new double[] {1},

new double[] {1},

new double[] {0},

new double[] {1}};

data.SetTrainData(input, output);

// инициализация весов

_network.InitWeights(data);

_network.TrainOnData(data, 1000, 10, 0);

}

public double Test(double a, double b)

{ double r = _network.Run(new double[] {a, b})[0];

return Math.Round(r); }

}

Результат работы программы:

ПРИЛОЖЕНИЕ 2 Реализация импликации с использованием ALGLIB

class ImplicationNetwork

{

private static alglib.mlptrainer _teacher;

private static alglib.multilayerperceptron _network;

private static alglib.mlpreport _report;

public ImplicationNetwork()

{

// создание объекта-тренера, первый аргумент – число

// нейронов входного слоя, второй - выходного

alglib.mlpcreatetrainer(2, 1, out _teacher);

// функция для создания сети,

// первый аргумент – число нейронов входного слоя,

// второй – внутреннего слоя, третий - выходного

alglib.mlpcreate1(2, 1, 1, out _network);

}

public void TrainNetwork()

{

// представление данных для обучения в виде матрицы

double[,] xy = new double[,] {{0, 0, 1}, {0, 1, 1}, {1, 0, 0},

{1, 1, 1}};

// привязка данных к объекту-тренеру

alglib.mlpsetdataset(_teacher, xy, 4);

// обучение сети

// первый аргумент – объект-тренер, второй – сеть,

// третий – количество запусков

alglib.mlptrainnetwork(_teacher, _network, 100, out _report);

}

public double Test(double a, double b)

{

double[] x = new double[] { a, b };

double[] y = new double[] { 0 };

alglib.mlpprocess(_network, x, ref y);

return Math.Round(y[0]);

}

}

Результат работы программы:

ПРИЛОЖЕНИЕ 3 Реализация импликации с использованием Neural Networks on C#

class ImplicationNetwork

{

private double _learningRate = 0.1;

private double _momentum = 0.0;

private double _sigmoidAlphaValue = 2.0;

private double _learningErrorLimit = 0.1;

private int _maxCountOfIterations = 1000000;

private ActivationNetwork _network;

private BackPropagationLearning _teacher;

public ImplicationNetwork()

{

// создание персептрона с 2 нейронами входного слоя,

// 1 нейроном внутреннего слоя, 1 - выходного

_network = new ActivationNetwork((IActivationFunction)new SigmoidFunction

(_sigmoidAlphaValue), 2, 1, 1);

_teacher = new BackPropagationLearning(_network); // создание учителя

_teacher.LearningRate = _learningRate;

_teacher.Momentum = _momentum;

}

public void TrainNetwork()

{

// данные обучения

double[][] input = null;

double[][] output = null;

input = new double[4][] {

new double[] {0, 0},

new double[] {0, 1},

new double[] {1, 0},

new double[] {1, 1}};

output = new double[4][] {

new double[] {1},

new double[] {1},

new double[] {0},

new double[] {1}};

int iteration = 0;

while (iteration

Просмотров работы: 1780