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

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

ИССЛЕДОВАНИЕ ПРОГРАММНЫХ СРЕДСТВ РЕАЛИЗАЦИИ НЕЙРОННЫХ СЕТЕЙ

Макарова К.И. 1
1Саратовский национальный исследовательский государственный университет имени Н.Г. Чернышевского
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
Цель работы: изучение и сравнительный анализ программных средств, реализующих механизм работы с нейронными сетями на языке программирования С#.

В соответствии с целью основными задачами являются:

  1. Определить набор задач, на основе которого будет производиться исследование программных средств;

  2. Описать основные возможности программных средств для работы с нейронными сетями;

  3. Реализовать решение каждой из задач с использованием выбранных программных средств

  4. Провести сравнительный анализ программных средств.

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

Определение набора задач для сравнения программных средств

При выборе задач внимание отдавалось классическим задачам для изучения возможностей нейросетей: “XOR” – простая задача для демонстрации работы нейросетей с многослойным персептроном, “Распознавание языка текста” – задача для сравнения скорости работы библиотек (требуется анализ большого объёма данных).

Задача XOR [2]

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

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

Таблица ниже показывает требуемую связь между входами и выходом.

   

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

0

0

0

1

0

1

0

1

1

1

1

0

Таблица 1. Функция XOR

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

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

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

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

   

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

     

0

0

0

0

0

0

1

0

1

1

0

1

0

1

1

0

1

1

1

1

0

0

0

0

Таблица 2. Результат работы сети

Задача распознавания языка текста

Допустим, есть 1000 документов на 3-х разных языках: французский, английский и немецкий. Задача – научить нейронную сеть распознавать язык документа. Для этого будет использоваться частотный механизм, суть которого заключается в том, что у каждого языка с разной частотой в тексте встречаются одни и те же символы. На начальном этапе подготавливаем 3 объемных текста для каждого из языков (английский, французский, немецкий) и подсчитываем частоты для всех уникальных символов. Эти данные передаем в нейронную сеть, с указанием соответствия “набор частот – язык” для обучения.

Обзор программных средств для работы с нейронными сетями

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

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

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

  • Обучение сети;

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

Критерии сравнения нейропакетов: скорость работы, простота применения, наглядность представляемой информации, возможность использовать различные структуры, наличие документации. Выбор определяется квалификацией и требованиями пользователя [3].

Для разработки нами был выбран язык программирования С#. В качестве библиотек для изучения было выбрано 3 библиотеки: FANN C#, ALGLIB и Neural Networks on C#.

FANN C#

Fast Artificial Neural Network (FANN) – бесплатная библиотека с открытым исходным кодом, которая позволяет создавать слоистые и полносвязные многослойные нейронные сети. Поддержка более чем 20 языков программирования (напр., C#, Java, C++, Javascript, Go) [4].

Далее будут рассмотрены основные параметры, которые используются при создании и обучении нейронной сети [5].

  1. Тип нейронной сети. Существует 2 типа:

  • NetworkType.LAYER – каждый слой имеет связи только со следующим слоем;

  • NetworkType.SHORTCUT – каждый слой имеет связи со всеми последующими слоями;

  1. LearningRate – коэффициент скорости обучения. Значение по умолчанию = 0.7. Выбирается, как правило, в диапазоне от 0 до 1. Ноль указывать бессмысленно, поскольку в этом случае корректировка весов вообще производиться не будет. Большие значения (0,7 – 1) будут соответствовать большому значению шага коррекции. При этом алгоритм будет работать быстрее, однако может снизиться точность настройки, что потенциально увеличит ошибку обучения. Малые значения коэффициента (0,1 – 0,3) соответствуют меньшему шагу коррекции весов. При этом число шагов (или эпох), требуемое для поиска оптимума, увеличивается, но возрастает и точность настройки, что потенциально уменьшает ошибку обучения. На практике коэффициент скорости обучения обычно подбирают экспериментально;

  2. ActivationFunctionHidden / ActivationFunctionOutput – функция активации для всех скрытых слоев сети / выходного слоя нейронов;

Возможные значения:

public enum ActivationFunction

{

LINEAR = 0,

THRESHOLD = 1,

THRESHOLD_SYMMETRIC = 2,

SIGMOID = 3,

SIGMOID_STEPWISE = 4,

SIGMOID_SYMMETRIC = 5,

SIGMOID_SYMMETRIC_STEPWISE = 6,

GAUSSIAN = 7,

GAUSSIAN_SYMMETRIC = 8,

GAUSSIAN_STEPWISE = 9,

ELLIOT = 10,

ELLIOT_SYMMETRIC = 11,

LINEAR_PIECE = 12,

LINEAR_PIECE_SYMMETRIC = 13,

SIN_SYMMETRIC = 14,

COS_SYMMETRIC = 15

}

Рассмотрим некоторые из функций более подробно. Пусть:

– входной параметр,

– выходной параметр,

– крутизна функции.

Тогда:

LINEAR – линейная функция активации

  • Интервал значений:

THRESHOLD – пороговая функция активации

SIGMOID – сигмоидальная функция активации

  • Одна из самых часто используемых функций активации

  • Интервал значений:

SIGMOID_SYMMETRIC – симметричная сигмоидальная функция активации, или tanh

  • Одна из самых часто используемых функций активации

  • Интервал значений: -1 < y < 1

GAUSSIAN – функция активации Гаусса

  • 0 в случае , 1 в случае и 0 в случае

  • Интервал значений:

  1. ActivationSteepnessHidden / ActivationSteepnessOutput – параметр крутизны функции активации для всех скрытых слоев сети / выходного слоя нейронов;

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

  1. TrainStopFunction – функция остановки обучения нейронной сети. Предлагается 2 варианта:

  • StopFunction.STOPFUNC_BIT – критерием остановки является количество “бит”, которые дали сбой – количество нейронов выходного слоя со значением больше, чем BitFailLimit (настраиваемый параметр);

  • StopFunction.STOPFUNC_MSE – критерием остановки является значение Mean Square Error (MSE).

По умолчанию используется StopFunction.STOPFUNC_MSE.

Набор методов для обучения нейронной сети:

  1. public void InitWeights(TrainingData data); – инициализация весов с использованием алгоритма Нгуена и Уидроу [6];

  1. public void TrainOnData(TrainingData data, uint maxEpochs,

uint epochsBetweenReports, float desiredError); – обучение на наборе входных и выходных данных в течение определенного периода времени.

Параметры:

data

Набор данных для обучения.

maxEpochs

Максимальное число эпох обучения.

epochsBetweenReports

Количество эпох между выводом текущего статуса обучения на консоль. Значение 0 означает отсутствие отчета о статусе.

desiredError

Желаемое значение MSE или BitFail, в зависимости от стоп-функции (TrainStopFunction).

Метод запуска нейронной сети:

public double[] Run(double[] input); − прогоняет набор входных данных через нейронную сеть, возвращая массив выходных данных, количество элементов в котором соответствует количеству нейронов в выходном слое сети.

Решение задачи “XOR” с использованием библиотеки FANN C# приведено в приложении 1, решение задачи “распознавание языка текста” приведено в приложении 5.

ALGLIB [7, 8]

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

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

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

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

Нейронная сеть в ALGLIB представлена структурой MultiLayerPerceptron. Пакет ALGLIB позволяет создавать нейронные сети без скрытых слоев, с одним скрытым слоем и с двумя скрытыми слоями. Соединения идут от входного слоя к первому из скрытых (если он есть), затем ко второму, затем − к выходному. «Короткие» соединения от входного слоя к выходному отсутствуют. Скрытые слои имеют одну из стандартных сжимающих функций активации, однако для выходного слоя нейронной сети возможно большее разнообразие. Выходной слой может быть линейным (такие сети используются в задачах аппроксимации), может иметь сжимающую функцию активации (в случае, если выходы сети ограничены определенным диапазоном).

Работа с нейронными сетями в данной библиотеке начинается с создания объекта-тренера – специального объекта, который хранит в себе данные и настройки для обучения и временные данные, которые используются при обучении сети. Объект-тренер можно создать, используя функцию mlpcreatetrainer или mlpcreatetrainercls. Первую следует применять при решении задач регрессионного анализа, вторую – при решении задач классификации.

Следующий шаг – загрузка данных для обучения. Данные необходимо представить в числовом формате в виде двоичной матрицы: каждая строка – входные данные + результат (напр. для операции xor следует создать матрицу вида: ), после чего привязать данные к объекту-тренеру с помощью вызова функции mlpsetdataset. Для сохранения памяти есть возможность использовать разреженные матрицы для представления данных. В этом случае следует использовать функцию mlpsetsparsedataset.

После создания объекта-тренера и подготовки данных для обучения следует приступить к созданию самой нейронной сети. Объект нейронной сети хранит в себе 2 важные характеристики: архитектуру сети и веса. Понятие «архитектура нейронной сети» состоит из следующих компонент: размерность входного слоя, количество и размерность скрытых слоев, размерность и тип выходного слоя (линейный – для задач регрессионного анализа, softmax –

для задач классификации). Определившись с архитектурой необходимо совершить вызов одной из следующих функций для создания сети:

  • mlpcreate0, mlpcreate1 или mlpcreate2 – для решения задач регрессионного анализа (линейный тип выходного слоя) с 0, 1 или 2 скрытыми слоями;

  • mlpcreatec0, mlpcreatec1 или mlpcreatec2 – для решения задач классификации (выходной слой с функцией активации softmax) с 0, 1 или 2 скрытыми слоями;

  • mlpcreater0, mlpcreater1 или mlpcreater2 – для решения задач регрессионного анализа с 0, 1 или 2 скрытыми слоями и выходным слоем с функцией активации, ограниченной интервалом ;

  • mlpcreateb0, mlpcreateb1 или mlpcreateb2 – для решения задач регрессионного анализа с 0, 1 или 2 скрытыми слоями и выходным слоем с функцией активации, ограниченной полуинтервалом.

Обучение осуществляется с использованием алгоритма batch L-BFGS [9]. Сеть может быть обучена с помощью вызова функции mlptrainnetwork, которая принимает в качестве параметров объект-тренер S, нейронную сеть net и количество запусков NRestarts. mlptrainnetwork позволяет производить обучение сети при помощи всего лишь одного вызова функции, но при этом все детали обучения скрыты внутри данного вызова. Иногда возникают случаи, когда необходимо контролировать процесс обучения. Для этого можно использовать пару функций – mlpstarttraining и mlpcontinuetraining. Такой подход позволяет производить обучение сети шаг за шагом.

Решение задачи “XOR” с использованием библиотеки ALGLIB приведено в приложении 2, решение задачи “распознавание языка текста” приведено в приложении 6.

Neural Networks on C# [10]

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

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

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

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

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

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

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

Разные алгоритмы обучения применяются для обучения разных нейронных сетей и для решения разных задач:

  • Обучение перцептрона;

  • Обучение по дельта-правилу;

  • Обучение с обратным распространением;

  • Обучение SOM;

  • Обучение эластичной сети.

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

Решение задачи “XOR” с использованием библиотеки Neural Networks on C# приведено в приложении 3, решение задачи “распознавание языка текста” приведено в приложении 7.

Сравнительный анализ программных средств

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

  • скорость работы;

  • простота применения;

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

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

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

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

Для сравнения скорости работы в задаче распознавания языка текста добавим следующий функционал:

Stopwatch timer = new Stopwatch();

timer.Start();

//train network or test network

timer.Stop();

Console.WriteLine();

Console.WriteLine(String.Format("ElapsedTicks: {0}", timer.ElapsedTicks));

Console.WriteLine();

Результат:

FANN C#

ALGLIB

Neural Networks on C#

Скорость обучения (ElapsedTicks)

4430

517151081

1112629

Скорость получения результата (ElapsedTicks)

15966

212

995

Простота применения

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

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

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

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

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

Для понимания написанной программы достаточно ознакомиться с кодом.

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

Для понимания написанной программы достаточно ознакомиться с кодом.

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

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

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

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

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

Библиотека хорошо документирована, большое сообщество.

Библиотека хорошо документирована, большое сообщество.

Библиотека плохо документирована, маленькое сообщество.

Заключение

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

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

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

Список использованных источников
  1. Саратовский национальный исследовательский государственный университет имени Н.Г. Чернышевского [Электронный ресурс]. URL: http://www.sgu.ru/ (дата обращения: 13.10.2016).

  2. XOR Problem [Электронный ресурс]. URL: http://www.aiportal.ru/articles/neural-networks/decision-xor.html (дата обращения: 13.10.16).

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

  4. Fast Artificial Neural Network Library [Электронный ресурс]. URL: http://leenissen.dk/fann/wp/ (дата обращения: 15.10.16).

  5. FANN C# NeuralNet Double [Электронный ресурс]. URL: http://joelself.github.io/FannCSharp/files/NeuralNetDouble-cs.html (дата обращения: 15.10.16).

  6. Осовский С. Нейронные сети для обработки информации / Пер. с польского И.Д. Рудинского. - М.: Финансы и статистика, 2002. С. 78-80.

  7. Neural networks [Электронный ресурс]. URL: http://www.alglib.net/dataanalysis/neuralnetworks.php (дата обращения: 20.10.16).

  8. ALGLIB Manual C# [Электронный ресурс]. URL: http://www.alglib.net/translator/man/manual.csharp.html (дата обращения: 20.10.16).

  9. A Multi-Batch L-BFGS Method for Machine Learning [Электронный ресурс]. URL: https://papers.nips.cc/paper/6145-a-multi-batch-l-bfgs-method-for-machine-learning.pdf (дата обращения: 20.10.16).

  10. Neural Networks on C# [Электронный ресурс]. URL: https://www.codeproject.com/articles/16447/neural-networks-on-c (дата обращения: 25.10.16)

ПРИЛОЖЕНИЕ 1

Реализация XOR с использованием FANN C#

class XORNetwork

{

private NeuralNet _network;

public XORNetwork()

{

List layers = new List(); // the number of input layer neurons

layers.Add(2);

// the number of hidden layer neurons

layers.Add(2);

// the number of output layer neurons

layers.Add(1);

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

// for better accuracy the value is 0.1

_network.LearningRate = (float)0.1;

// standard values for these settings

_network.ActivationSteepnessHidden = 1;

_network.ActivationSteepnessOutput = 1;

// one of the most popular activation functions

_network.ActivationFunctionHidden = ActivationFunction.SIGMOID_SYMMETRIC;

_network.ActivationFunctionOutput = ActivationFunction.SIGMOID_SYMMETRIC;

// setting stop-function settings

_network.TrainStopFunction = StopFunction.STOPFUNC_BIT;

_network.BitFailLimit = 0.01;

}

public void TrainNetwork()

{

TrainingData data = new TrainingData();

// initialize input and output values

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[] {0},

new double[] {1},

new double[] {1},

new double[] {0}

};

data.SetTrainData(input, output);

// initialize weights

_network.InitWeights(data);

// train

_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

Реализация XOR с использованием ALGLIB

class XORNetwork

{

private static alglib.mlptrainer _teacher;

private static alglib.multilayerperceptron _network;

private static alglib.mlpreport _report;

public alglib.mlpreport ErrorsReport { get { return _report; } }

public XORNetwork()

{

// the first parameter is number of input layer neurons,

// the second parameter is number of output layer neurons

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

// the first parameter is number of input layer neurons,

// the second parameter is number of hidden layer neurons,

// the third parameter is number of output layer neurons

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

}

public void TrainNetwork()

{

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

{ 1, 1, 0 } };

// INPUT PARAMETERS:

// S - trainer object

// XY - training set, see below for information on the

// training set format. This function checks correctness

// of the dataset (no NANs/INFs, class numbers are

// correct) and throws exception when incorrect dataset

// is passed.

// NPoints - points count, >=0.

alglib.mlpsetdataset(_teacher, xy, 4);

// INPUT PARAMETERS:

// S - trainer object

// Network - neural network. It must have same number of inputs and

// output/classes as was specified during creation of the

// trainer object.

// NRestarts - number of restarts, >=0:

// * NRestarts>0 means that specified number of random

// restarts are performed, best network is chosen after

// training

// * NRestarts=0 means that current state of the network

// is used for training.

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

Реализация XOR с использованием Neural Networks on C#

class XORNetwork

{

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 XORNetwork()

{

// create perceptron

_network = new ActivationNetwork(

(IActivationFunction)new SigmoidFunction(_sigmoidAlphaValue), 2, 2, 1);

// create teacher

_teacher = new BackPropagationLearning(_network);

// set learning rate and momentum

_teacher.LearningRate = _learningRate;

_teacher.Momentum = _momentum;

}

public void TrainNetwork()

{

// initialize input and output values

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[] {0},

new double[] {1},

new double[] {1},

new double[] {0}

};

int iteration = 0;

// loop

while (iteration

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