3.4 Топология сети

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

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

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

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

(45)

Эта функция принимает значения от 0 до 1. Ее график приведен на рисунке Рис. 12.

sigmoid.png

Рис. 12. График функции сигмоиды

3.5 Начальное состояние нейронной сети

Метод начальной инициализации весов является одним из важнейших факторов, влияющих на скорость обучения многослойной сети [5]. При определении способа задания весов следует учитывать, что от величин весов зависит величина аргумента функции активации. Если веса будут слишком большими или слишком маленькими, то аргумент попадет в зоны затухания функции, производная в которых имеет крайне маленькое значение. Это приведет к сильному падению скорости обучения нейронной сети.

НЕ нашли? Не то? Что вы ищете?

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

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

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

4 Реализация классификатора

4.1 Структура программного обеспечения

Для реализации приложения был выбран язык программирования С++ в версии стандарта от 2011 года, а также следующие программные средства:

·  Библиотека классов Boost;

·  Среда программирования QtCreator;

·  Система автоматизированной сборки приложений из исходного кода CMake;

·  Распределенная систем управления версиями исходного кода программного обеспечения Mercurial.

Приложение способно функционировать в операционной системе GNU/Linux. Компиляция исходных кодов производилась компилятором Clang версии 3.6. При разработке был разработан ряд классов. Исходный код программного обеспечения приведен в приложение А.

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

Классы layer_t и net_t служат для реализации модели искусственной нейронной сети. Класс layer_t содержит в себе данные, необходимые для описания единичного слоя сети, а именно матрица весов между нейронами этого и предыдущего слоя, и входные и выходные вектора. Также этот класс содержит в себе информацию, которую необходимо сохранять для каждого слоя сети в ходе обучения. Эта информация включает в себя вектор аргументов функции активации, вектор значений величин ошибок. При использовании модификации алгоритма обратного распространения ошибок с адаптивным изменением скорости обучения, в объекте класса layer_t также сохраняется матрица значений скоростей обучений для весов и значений , полученных на предыдущем шаге обучения. Для упрощения реализации модели нейронной сети и алгоритма обучения, величина смещения задается с помощью виртуального нейрона, чей выход всегда равен 1. При этом, настоящее значение смещения сохраняется как вес синаптической связи между этим нейроном и некоторым нейроном слоя. Вследствие этого, матрица весов имеет дополнительную строку под индексом 0, которая относится к весам, приходящим от виртуального нейрона. Также, нулевые элементы входного и выходного векторов всегда равны 1.

Класс net_t содержит в себе массив нейронной сети и информацию о размерности векторов входа и выхода. Этот класс ответственен за создание необходимого количества объектов класса layer_t. При этом он настраивает их таким образом, чтобы вектор входа некоторого слоя был выходом предыдущего. Это позволяет убрать лишнее дублирование в памяти одних и тех же данных, а так же уменьшить количество производимых в ходе работы программы операций копирования данных. Этот класс ответственен за инициализацию весовых коэффициентов сети. Также он позволяет осуществлять загрузку сети из файла и запись ее в файл для дальнейшего использования.

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

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

Данные, которые будут использованы для обучения нейронной сети, должны быть записаны в файлах определенного формата, а путь к ним передан программе при запуске. Входные и целевые выходные вектора описываются в разных файлах, при этом i-й входной вектор будет сопоставлен с i-м выходным вектором. В каждом файле каждый вектор данных записывается на отдельной строке, элементы вектора разделяются символом ‘;’. Первая строка, при чтении пропускается, так как обычно в нее записываются наименования величин, лежащих во входных векторах. Пустые строки игнорируются. Чтение файлов реализовано в функции import_csv.

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

·  --data_file,-d – параметр, задающий файл, содержащий набор входных векторов

·  --target_file,-t ­­– параметр, задающий файл, содержащий набор выходных векторов

·  --train – произвести тренировку сети. Этот параметр может быть заменен параметром --test

·  --test – произвести тестирование сети, при этом также должен быть указан путь к файлу с уже обученной нейронной сетью.

Следующие параметры могут быть переданы программе при необходимости:

·  --help,-h – вывести справочную информацию о программе

·  --epoches,-e число – задать число эпох, в ходе которых будет производиться обучение. Число должно быть неотрицательным.

·  --validation число – этот параметр позволяет задать долю примеров, которая будет использована для проведения валидации в ходе обучения нейронной сети. Число должно находиться в диапазоне

·  --learn_rate,-r число – задать скорость обучения. Число должно быть неотрицательным.

·  --shuffle,-s – перемешать примеры случайным образом перед началом обучения.

·  --layers,-l набор чисел – этот параметр позволяет задать количество и размерности скрытых слоев сети. При использовании этого параметра необходимо указать набор чисел, записанных через пробел. Число скрытых слоев будет равно количеству указанных чисел, а сами числа задают число нейронов в соответствующем слое.

·  --save путь к файлу – этот параметр задает путь к файлу, в который будет сохранена искусственная нейронная сеть после завершения обучения.

·  --load путь к файлу – указывает файл, из которого должна быть загружена нейронная сеть при запуске приложения.

·  --adaptive_learn число1 число2 число3 – задает использование метода адаптивной скорости обучения. Три числа задают параметры соответственно.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10