Общая идея обучения нейронной сети (НС) при помощи генетического алгоритма (ГА) включает следующие шаги:
1. Формирование начальной популяции.
2. Обучение.
3. Оценка популяции.
4. Ранжировка.
5. Селекция.
6. Скрещивание.
7. Мутация [1].
Информация о нейронной сети кодируется в геном для ГА. В начале алгоритма число популяции генерируется случайно. Необходимо нейронную сеть преобразовать в соответствие с информацией о геноме. Далее необходимо оценить результаты после обучения НС. Далее выполняются стандартные шаги ГА: оценка популяции, селекция, скрещивание, мутация. Главная проблема при комбинировании НС и ГА заключается в преобразовании или кодировании НС в геномы для ГА [2].
Для решения поставленной задачи рассмотрим структуру НС для логических операций OR, XOR и AND. Сеть является многослойной прямого распространения. На вход поступает два нейрона (1 и 0), есть два скрытых слоя и один выходной результат (1 или 0). На рисунке 1 приведена структура многослойной сети для интерпретации решаемой задачи.
Рисунок 1. Структура многослойной сети
Таким образом, НС имеет два входных нейрона, два скрытых слоя и один выходной нейрон.
Для генетического алгоритма было выбрано вещественное кодирование, так как это позволяет избавиться от операций кодирования/декодирования, используемых в целочисленном кодировании, а также увеличить точность найденного решения. В качестве метода скрещивания – двухточечный кроссинговер. В качестве функции активации выбрана сигмоидальная функция. Метод селекции – селекция с усечением.
На 2 рисунке предоставлена разработанная диаграмма классов, описывающая нейронную сеть.
Рисунок 2. Диаграмма классов нейронной сети
Описания назначения классов представлены в таблице 1.
Таблица 1. Назначение разработанных классов
Название класса |
Назначение |
ActivationFunction |
Класс реализует общий вид функции активации. |
ActivationSigmoid |
Класс реализует сигмоид, заданный формулой:
Эта функция необходима, так как нейронная сеть передает выходной сигнал через функцию активации. |
Chromosome |
Класс реализует хромосому и ее параметры. Каждая хромосома имеет набор генов, значение целевой функции, число генов, метод скрещивания (двухточечный кроссинговер). |
ErrorCalculation |
Вычисляется ошибка полученного значения выходного нейрона для того, чтобы определить насколько полученное значение отличается от эталонного или идеального значения. Для этого вычисляется среднеквадратичная ошибка. Каждый элемент обучаемого множества сравнивается с эталоном. Ошибка вычисляется по формуле:
|
FeedforwardLayer |
Описывает каждый слой нейронной сети. Содержит свойства, определяющие входной слой, скрытые слои и выходной слой. Также содержит метод ComputeOutput для расчета выходного нейрона. Выходное значение рассчитывается по формуле:
Для вычисления выходного сигнала используется скалярное произведение, реализованное в классе MatrixMath. Скалярное произведение рассчитывается между входной матрицей и матрицей весов. Полученный результат скалярного произведения поступает в функцию активации в качестве параметра для окончательного получения выходного сигнала нейрона. |
FeedforwardNetwork |
Описывает нейронную сеть, состоящую из нескольких слоев, описанных в классе FeedforwardLayer. |
GeneticAlgorithm |
Реализует все этапы генетического алгоритма: селекция, скрещивание, мутация, оценивание. |
MateWorker |
Реализует сам процесс скрещивания особей для создания нового поколения (двухточечный кроссинговер). |
Matrix |
Класс для создания матрицы и их преобразование в вектора. Входные данные подаются в виде матриц. Поэтому весь процесс работы происходит в основном с матрицами. Содержит методы заполнения матрицы случайными числами, добавления новых строк и столбцов, а также отчистки матрицы. |
MatrixCODEC |
Реализует матрицу кодирования и декодирования. Матрица CODEC может кодировать и декодировать матрицу в/из массива типа doubles. Матрица кодирования и декодирования нужна, когда нейронная сеть должна быть преобразована в массив типа doubles для использования генетического алгоритма. |
MatrixMath |
Класс, содержащий методы математических операций. В нем реализованы методы нахождения скалярного произведения матрицы. Скалярное произведение двух матриц необходимо для вычисления выходного нейрона. Используется в классе FeedforwardLayer в методе ComputeOutputs. |
NeuralChromosome |
Преобразованная хромосома, связанная с НС. |
NeuralGeneticAlgorithm |
Адаптация генетического алгоритма для нейронной сети. |
Train |
Класс, описывающий основные этапы обучения. В нем вызывается метод Iteration, которые реализован в классе Genetic Algorithm. То есть обучение ведется при помощи ГА. |
TrainingSetNeuralChromosome |
Преобразование нейрона в хромосому для использования ГА. Обучение нейронной сети ГА. Содержит метод вычисления значения целевой функции нейрона. |
TrainingSetNeuralGeneticAlgorithm |
Обучение нейронной сети ГА. Содержит метод вычисления среднеквадратичной ошибки при определение лучше приспособленной особи. В методе реализуется процесс обучение нейронной сети ГА и вызывается метод TrainingSetNeuralChromosome. |
Были проведены различные эксперименты для трех логических операторов XOR, AND и OR с различными параметрами генетического алгоритма.
Пример эксперимента для оператора “ИЛИ” приведен на рисунке 3.
Рисунок 3. Пример обучения нейронной сети
Для обучения нейронной сети с помощью генетического алгоритма задаются следующие параметры: число поколений, размер популяции, вероятность мутации, процент скрещивания.
Для наглядности результаты работы сведены в таблицы 2-4.
Таблица 2. Результаты работы нейронной сети для логического оператора “ИЛИ”
№ |
Число поколений |
Размер популяции |
Вероятность мутации |
Процент скрещивания |
Значение № 1 (0 or 0 = 0) |
Значение № 2 (1 or 0 = 1) |
Значение № 3 (0 or 1 = 1) |
Значение № 4 (1 or 1 = 1) |
Средняя ошибка |
1 |
100 |
200 |
0.1 |
0.1 |
0.691 |
0.695 |
0.7276 |
0.7527 |
0.45 |
2 |
500 |
500 |
0.2 |
0.3 |
2.21E-07 |
1 |
0.99 |
1 |
0.37 |
3 |
1500 |
800 |
0.4 |
0.5 |
1Е-20 |
1 |
1 |
1 |
5Е-21 |
4 |
100000 |
5000 |
0.4 |
0.5 |
1Е-20 |
1 |
1 |
1 |
5Е-21 |
5 |
500000000 |
400 |
0.1 |
0.25 |
5.421Е-13 |
1 |
1 |
1 |
0.048 |
6 |
100000000 |
50000 |
0.2 |
0.5 |
0.000723 |
0.99 |
0.99 |
0.99 |
0.00036 |
Таблица 3. Результаты работы нейронной сети для логического оператора “И”
№ |
Число поколений |
Размер популяции |
Вероятность мутации |
Процент скрещивания |
Значение № 1 (0 or 0 = 0) |
Значение № 2 (1 or 0 = 0) |
Значение № 3 (0 or 1 = 0) |
Значение № 4 (1 or 1 = 1) |
Средняя ошибка |
1 |
100 |
100 |
0.1 |
0.25 |
0.021 |
0.156 |
0.1552 |
0.863 |
0.23 |
2 |
500 |
300 |
0.2 |
0.25 |
1Е-20 |
1Е-20 |
1Е-20 |
1 |
0.006 |
3 |
2000 |
900 |
0.4 |
0.5 |
1Е-20 |
1Е-20 |
1Е-20 |
1 |
0.108 |
4 |
5000 |
2000 |
0.2 |
0.5 |
1Е-20 |
1Е-20 |
1Е-20 |
1 |
8.66Е-21 |
5 |
500000 |
20000 |
0.3 |
0.2 |
1Е-20 |
1.45Е-15 |
1Е-20 |
1 |
7.28Е-16 |
6 |
90000 |
2000 |
0.05 |
0.35 |
0.00022 |
0.00122 |
0.00021 |
1 |
0.00063 |
Таблица 4. Результаты работы нейронной сети для логического оператора “Исключающее ИЛИ”
№ |
Число поколений |
Размер популяции |
Вероятность мутации |
Процент скрещивания |
Значение № 1 (0 or 0 = 0) |
Значение № 2 (1 or 0 = 1) |
Значение № 3 (0 or 1 = 1) |
Значение № 4 (1 or 1 = 0) |
Средняя ошибка |
1 |
150 |
100 |
0.1 |
0.2 |
8.66Е-08 |
0.5 |
0.5 |
0.5 |
0.433 |
2 |
500 |
300 |
0.3 |
0.35 |
1Е-20 |
1 |
1 |
1Е-20 |
7.07Е-21 |
3 |
1200 |
500 |
0.009 |
0.6 |
1Е-20 |
1 |
1 |
1Е-20 |
7.07Е-21 |
4 |
100000 |
10000 |
0.122 |
0.37 |
2.677Е-06 |
0.99 |
0.99 |
2.24Е-06 |
1.748Е-06 |
5 |
500000 |
40000 |
0.1 |
0.9 |
1.746Е-09 |
0.99 |
0.99 |
1.481Е-16 |
7.1316Е-06 |
6 |
48909 |
400 |
0.39 |
0.7 |
1Е-20 |
0.99 |
1 |
1Е-20 |
1.53Е-11 |
Из таблиц видно, что результаты нейронной сети, обученной при помощи генетического алгоритма, зависят от выбранных параметров. Чем больше поколений, и чем меньше вероятность мутации, тем точнее результаты, то есть ближе к идеальным значениям. Соответственно, ошибка вычислений меньше. Процент скрещиваемых особей популяции также влияет на результаты. Чем он больше, тем выше точность. Однако, в некоторых случаях необязательно задавать большую длительность эволюции для получения наиболее точных результатов. Как показали эксперименты, увеличив процент скрещивания и вероятность мутации, можно получить близкие к идеальным результатам.
Благодаря вещественному кодированию упростился процесс кодирования, так не нужно было реализовывать операции кодирования/декодирования, используемые в целочисленном кодировании, а также увеличилась точность найденного решения, что видно из проведенных экспериментов. На точность также повлиял выбор типа функции активации. Благодаря сигмоиду были усилены слабые сигналы и ослаблены сильные сигналы.
Библиографический список
- Хайкин С. Нейронные сети. М.: Издательский дом “Вильямс”, 2006.
- Бодянский Е.В. Искусственные нейронные сети: архитектура, обучение и применение. Харьков: Телтех, 2004.