Пишем нейросеть на Python. Часть 2

На прошлом уроке мы начали писать нейросеть на Python. Напомню что уже разработали:

·        Класс нейрона.

·        Три передаточных функции («как есть», «сигмоида» и «пороговая функция»)

·        Простой тестовый пример.

А сейчас напишем целую нейросеть, которая будет обучаться через генетический алгоритм. Но сначала немного теории. Как можно обучить нейронную сеть? В случае одного нейрона используем коррекцию весов на величину Δw[1]:

Где η —  коэффициент обучения, выбираемый эмпирическим путем, t – желаемая реакция нейрона, y  — фактическая реакция нейрона, x – вход нейрона.

У реальной нейронной сети не один нейрон. Они могут быть организованы разными способами, мы же рассмотрим один из них – многослойный персептрон.  Один из способов его обучения – метод обратного распространения ошибки [2,3].

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

где — выходное значение нейросети при предъявлении k-ого образа, — 

желаемое выходное значение, соответствующее k-ому образу.

Далее, вычисляем весовые коэффициенты выходного (второго) слоя (коррекцию проводим от выхода ко входам):

где — новое значение весового коэффициента входа i (на  итерации k+1), — старое значение весового коэффициента, η — эмпирический коэффициент, представляющий скорость обучения, — 

выход первого (входного слоя).

Однако, данный метод имеет существенный недостаток: не гарантируется глобального экстремума[2,3]. Поэтому мы реализуем методом обучения нейронной сети через генетический алгоритм, описанный в [3]:

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

Теперь приступим к разработке нейросети. Те классы, что мы уже разработали на прошлом уроке целесообразно выделить в отдельный файл. Обзовем этот файл neuro_library.py. Вот его содержимое вместе с последними изменениями (Добавлен класс слоя, класс нейронной сети, класс генетического алгоритма)

А вот тестовый пример:

Результат работы данной программы будет примерно следующее.

Вот такой текстовый вывод:

И график изменения целевой функции по итерациям:

 

Как видим, данная нейросеть, благодаря многословности, справилась с функцией XOR (однослойная нейросеть с такой задачей не справляется).

 

Литература

  1. Статья в Интернет. «Теория нейронных сетей. Урок 4. Обучение нейросети. Линейный персептрон». URL: http://easyprog.ru/index.php?option=com_content&task=view&id=1491&Itemid=75/
  2. Коробейников А. В. Программирование нейронных сетей. Учебно-методическое пособие по дисциплинам «Методы оптимизации. Нейронные сети», «Нейрокомпьютерные системы» и «Нечеткая логика и генетические алгоритмы». – Ижевск: Изд-во ИжГТУ — 2013 – 44 с.
  3. Шуравин А. П. Исследование обучаемости нейронной сети на примере предсказания числовых рядов // Научные достижения и открытия 2017: сборник статей III Международного научно-практического конкурса. Пенза:Наука и Просвещение, 2017. С. 31-36.

 

Comments

So empty here ... leave a comment!

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

Sidebar