Построение нейронной сети

Сфера искусственного интеллекта (ИИ), это уже непросто находящаяся в тени область исследования, а совокупность науки и различных технологий. Исследования в области создания ИИ идут уже не с один десяток лет. И конечно уже есть значительные продвижения. Хотя насколько они значительные, этого утверждать никто не берется. Хотя бы по той простой причине, что если говорить прямо, то граница исследования в области искусственного интеллекта закончится тогда, когда ЭВМ будет наделена разумом, отождествленным с разумом человека.

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

Выбор нейронной сети

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

Одним из лидирующих некоммерческих продуктов, является Fast Artificial Neural Network (FANN). Основные его преимущества:

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

После проведенного анализа программных продуктов было принято решение в пользу использования FANN.

Проектирование

Сейчас мы спроектируем нейронную сеть для классификации (распознавания) графических образов. Чем оптимальнее подобрано количество образов для обучения, тем будет выше результат. Дело в том, что определения “оптимальное количество образцов для обучения” не существует, здесь необходимо проводить как можно более детальный анализ поставленной задачи. Желательно иметь как можно больше разных разновидностей тех образцов, которые в дальнейшем потребуется классифицировать. Но и переусердствовать тоже не стоит, потому что нейронная сеть имеет свойство – переобучения.

Для примера обучения, был выбран следующий набор из пяти символов. Каждый символ присутствует в двух вариантах.

Набор символов для проектирования нейронной сети

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

Рассмотрим формат файла с исходными данными. В первой строке указаны размеры всех слоев. Далее идут пары значений: вектор образа и вектор множества допустимых значений, который может содержать только одну единицу. Номер разряда вектора множества, содержащий единицу, указывает на то, какой номер символа из множества допустимых значений (алфавита), классифицирует вектор образа. То есть, порядок символов, в рассматриваемом множестве следующий: “+-x/=”. Соответственно вектор “10000”, указывает на то, что вектор образа находящийся над вектором множества допустимых значений классифицирует символ “+”. Вектора разделены между собой символом перевода строки.

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

  1. количество векторов, здесь набор состоит из десяти образцов;
  2. размер векторов – в данном случае это произведение ширины и высоты изображения;
  3. размер множества допустимых значений (в данном случае это размерность алфавита и она равняется пяти).

В итоге должен получиться примерно такой (все зависит от того, как вы разлаживаете образы в вектор) набор данных:

Исходные данные для обучения нейронной сети Fast Artificial Neural Network

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

Обучение сети для использования в Windows

Для обучения, отлично себя зарекомендовала программа FannTool-1.2. Поэтому дальнейшие демонстрационные примеры будут проходить на ее основе. Скачиваем и распаковываем архив. После распаковки архива, она будет находиться в каталоге bin.

После запуска программы, необходимо открыть файл с исходными данными. Он должен иметь расширение *.dat.

Программа FannTool

Для обучения мы воспользуемся каскадным методом. Поэтому нужно перейти на вкладку Cascade Tuning, в которой производится настройка обучения сети для данного метода. Кстати практика показала, что в некоторых случаях обучение каскадным методом происходит намного быстрее.

Настройки каскадного метода обучения

Здесь в настройках требуется внести коррективы. Для этого в полях Maximum Out Epochs и Maximum Candidate Epochs установите значения равным 500. Данные значения были получены чисто экспериментальным путем и подходят для обучения многих сетей.

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

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

Сохранение обученной нейронной сети

Обучение сети для использования в Linux

Обученная сеть для работы под Windows, здесь не подойдет. Придется обучать новую. Ну ладно, раз надо так надо. Но здесь есть одно небольшое отличие – поскольку планируется использовать нейронную сеть на PHP, то никаких программ для обучения нам искать не придется. Все необходимое есть в архиве с исходниками интересующей нас библиотеки. Конкретно нас будет интересовать файл: simple_train.php.

Для обучения нам понадобятся следующие шесть функций:

  • resource fann_create_standard (int num_layers, int num_neurons1, int num_neurons2 [, int … ])

    Для создания нейронной сети требуется воспользоваться выше приведенной функцией. В качестве значения параметра num_layers требуется указывать общее количество слоев, включая входной и выходной. Значением параметра num_neurons1 является количество нейронов в первом слое. В параметре num_neurons2 указывается соответственно количество нейронов содержащихся во втором слое. Другие параметры указываются при необходимости и должны также содержать количество нейронов в соответствующих им слоях. Функция возвращает ресурс (resource) нейронной сети в случае успеха, или false в случае ошибки.

  • bool fann_train_on_file (resource ann, string filename, int max_epochs, int epochs_between_reports, float desired_error)

    Данная функция предназначена для обучения нейронной сети на предоставленном наборе данных. В первом параметре ann указывается ресурс созданной нейронной сети. В параметре filename указывается имя файла с набором данных. В качестве параметра max_epochs указывается максимальное количество эпох для тренировки. Значением параметра epochs_between_reports является интервал вывода результатов тренировки, при нулевом значении результаты тренировки выводиться не будут. И в качестве последнего параметра desired_error указывается значение максимально допустимой ошибки. Рассматриваемая функция возвращает true в случае успеха, или false при неблагоприятном исходе.

  • bool fann_save (resource ann, string configuration_file)

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

  • bool fann_destroy (resource ann)

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

  • bool fann_set_activation_function_hidden (resource ann, int activation_function)

    Данная функция устанавливает функцию активации для всех скрытых слоев. В первом параметре ann требуется передать ресурс созданной нейронной сети, а в параметре activation_function необходимо указать предопределенную константу функции активации табл. 1. Возвращаемым значением функции в случае успеха будет true, или false в случае ошибки.

  • bool fann_set_activation_function_output (resource ann, int activation_function)

    Использование рассматриваемой функции позволяет произвести установку функции активации для выходного слоя. В параметре ann указывается ресурс созданной нейронной сети, а в качестве значения второго параметра activation_function необходимо указать предопределенную константу функции активации табл. 1. При успешном выполнении данная функция вернет true, в ином случае false.

В исходном коде файла нам потребуется изменить следующие переменные:

  • $num_input = 49 – количество нейронов во входном слое;
  • $num_output = 5 – количество нейронов в выходном слое;
  • $num_layers = 3 – общее количество слоев, иными словами это количество переменных переданных в функцию;
  • $num_neurons_hidden = 10 – количество нейронов в скрытом слое.

Следует заметить, что количество нейронов в скрытом слое устанавливается обычно чисто экспериментальным путем (обычно в диапазоне num_input/5 — num_input/3). Также потребуется указать имена для файлов с набором данным для обучения и конфигурационного.

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

Таблица 1. Функции активации

FANN_LINEAR Линейная функция активации
FANN_THRESHOLD Пороговая функция активации
FANN_THRESHOLD_SYMMETRIC Симметрично пороговая функция активации
FANN_SIGMOID Сигмоидальная функция активации
FANN_SIGMOID_STEPWISE Пошаговое линейное приближение к сигмоидальному
FANN_SIGMOID_SYMMETRIC Симметрично сигмовидная функция активации
FANN_SIGMOID_SYMMETRIC_STEPWISE Пошаговое линейное приближение к симметрично сигмоидальному
FANN_GAUSSIAN Гауссова функция активации
FANN_GAUSSIAN_SYMMETRIC Симметричная Гауссова функция активации
FANN_GAUSSIAN_STEPWISE Пошаговая Гауссова функция активации
FANN_ELLIOT Быстрая (подобна сигмоидальной) функция активации определенная Дэвидом Эллиоттом
FANN_ELLIOT_SYMMETRIC Быстрая (подобна симметрично сигмоидальной) функция активации определенная Дэвидом Эллиоттом
FANN_LINEAR_PIECE Ограниченная линейная функция активации
FANN_LINEAR_PIECE_SYMMETRIC Ограниченная симметрично линейная функция активации
FANN_SIN_SYMMETRIC Периодическая симметрично синусоидальная функция активации
FANN_COS_SYMMETRIC Периодическая симметрично косинусоидальная функция активации
FANN_SIN Периодическая синусоидальная функция активации
FANN_COS Периодическая косинусоидальная функция активации

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