УДК 004.021
СОВМЕСТНОЕ ИСПОЛЬЗОВАНИЕ ERLANG И С ПРИ РЕАЛИЗАЦИИ АЛГОРИТМОВ ОБУЧЕНИЯ МНОГОСЛОЙНОГО ПЕРСЕПТРОНА
Н. П. Плотникова, В. В. Тесля
В статье описывается вариант программной реализации модели многослойного персеп-трона, использующий преимущества языков программирования, применяющих различные парадигмы (функциональную и императивную).
Моделирование искусственных нейронных сетей (ИНС) и применение полученных моделей для решения интеллектуальных задач различного уровня в настоящее время вновь становится актуальным. Но реальные задачи как правило требуют не только высокой скорости обработки данных, но и высокой надежности. Поэтому возникает необходимость сочетания указанных требований посредством применения новых инструментов разработки и новых подходов.
В данной работе рассматривается применение языков программирования Erlang и C для программного моделирования многослойного персептрона.
Erlang — функциональный язык программирования высокого уровня. Наиболее важные характеристики Erlang [1]:
— краткость и простота — программы на Erlang намного короче и проще, чем те же самые программы на императивных языках (например, С);
— отсутствие побочных эффектов — оператор присваивания отсутствует, объекты нельзя изменять и уничтожать, можно только создавать новые путем декомпозиции и синтеза существующих;
— отказоустойчивость — язык обладает множеством механизмов для обеспечения отказоустойчивости создаваемых программ, к примеру, в случае отказа одного из узлов виртуальной машины Erlang его процессы начнут исполняться на других и вернутся обратно при восстановлении работоспособности узла;
— «горячее» обновление кода — программы на Erlang позволяют обновлять свой код прямо во время исполнения, предусмотрена также возможность автоматического отката обновлений в том случае, если они приводят к нарушению работы системы;
— инкрементная загрузка кода —
пользователь может управлять загрузкой модулей в память при исполнении программы.
На Erlang был создан логически целостный, структурированный прототип программной системы, реализующий функции имитации и обучения многослойного персептрона.
Данный прототип состоит из двух основных модулей: nnet и training. Первый модуль содержит функцию simulate, которая с использованием информации о сети обрабатывает входные сигналы и возвращает результат работы сети. При этом в соответствии с логикой обработки данных в многослойном персептроне все вычисления производятся от слоя к слою.
Второй модуль содержит набор функций, реализующих обучение многослойного персептрона по алгоритму RPROP [2]. Основные вычислительные блоки, выполняемые на каждой эпохе обучения, изображены на рис. 1.
EpochCycle
SimulateOn TrainSet
CalculateFullGradient
г
Correct WeightsAndBia ses
Рис. 1. Основные вычислительные блоки функции обучения
SimulаteOnTrаinSet — блок, обеспечивающий обработку сетью всех элементов пар обучающей выборки, соответствующих вход© Плотникова Н. П., Тесля В. В., 2012
ным данным; в результате работы блока вычисляются значения промежуточных параметров и выходов нейронной сети для каждой пары обучающей выборки.
CalculateFullGradient — блок, вычисляющий на основе данных, полученных предыдущим блоком, суммарный градиент функции ошибки по всем парам обучающей выборки.
CorrectWeightsAndBiases — блок, отвечающий за корректировку весов и смещений многослойного персептрона на основе данных о вычисленном градиенте.
Указанные блоки производят расчеты посредством выполнения операций над организованными в матрицы данными, что с одной стороны позволяет более наглядно представлять алгоритмы математически, а с другой — делает вычислительные операции более массивными.
Одним из недостатков Erlang является медленное выполнение операций с плаваю-
щей точкой, что является критичным для рассматриваемого класса задач в силу необходимости осуществления большого количества матричных операций. Но этот недостаток компенсируется наличием возможности совместного использования более производительных с точки зрения вычислений языков программирования, к которым и относится С.
Поэтому для ускорения работы прототипа та его часть, которая реализует непосредственное выполнение матричных операций сложения, умножения, а также умножения матрицы на число, была переписана на С. Подключение кода С к модулю Erlang осуществляется с помощью механизма NIF (Native Implemented Functions) [3].
С целью оценки эффективности прототипа и его усовершенствованной модификации было произведено тестирование производительности. Условия тестирования приведены в таблице.
Архитектура многослойного персептрона 1 скрытый слой с количеством нейронов, равным количеству входов 1 выход активационная функция скрытого слоя — сигмоидальная активационная функция выходного нейрона — линейная
Характеристики обучающей выборки Объем — 10 пар Особенности — бинарные данные
Характеристика процессора Intel(R) Core(TM) i3-2310M CPU @2.10GHz
Были измерены различные характеристики для нейронных сетей с количеством нейронов от 201 до 1001, включая среднее время обучения (на эпоху), полное время обучения, время имитации. Наибольший интерес представляет среднее время обучения
нейронной сети как наиболее объективный показатель, характеризующий качество конкретной реализации алгоритма. Для каждой нейронной сети было проведено 30 прогонов программы. Результаты тестирования приведены на рис. 2.
Рис. 2. Зависимость среднего времени обучения ИНС от количества нейронов для реализации на Erlang и гибридной реализации (Erlang + C)
156 ВЕСТНИК Мордовского университета | 2012 | № 2
Как видно из графика, гибридная реализация позволяет сэкономить временные затраты на обучение нейронной сети в среднем в 1,75. Подобное ускорение, возможно, не критично для небольших сетей, время обучения которых составляет порядка нескольких десятков секунд, но существенно для сложных сетей, время обучения которых может достигать нескольких часов или дней. Следует также отметить, что попытка выделения более крупного вычислительного блока (вычисление градиента функции ошибки для одной пары обучающей выборки) для реализации на С не дала желаемого ускорения.
На основе проведенных исследований можно сделать следующие выводы: совмест-
ное применение таких языков программирования, как Erlang и C, позволяет получить возможность использования преимуществ функционального подхода к разработке программного обеспечения; преимуществ непосредственно Erlang как языка, созданного для реализации отказоустойчивых и надежных систем; преимуществ высокопроизводительного императивного языка программирования С. При этом затраты на преобразование данных для работы на стороне Erlang и на стороне С не оказывают большого негативного эффекта на скорость работы программы при условии, что правильно выделена та ее часть, которая содержит наибольшее количество вычислительных операций.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Оссовский С. Нейронные сети для обработки информации / С. Оссовский ; пер. с польск. И. Д. Рудинского. М. : Финансы и статистика, 2002. 344 с.
2. Armstrong J. Making reliable distributed systems in the presence of sodware errors / J. Armstrong. Thesis. November, 2003. 283 p.
3. Erlang programming language [Электронный ресурс]. Режим доступа: http:// www.erlang.org/. Загл. с экрана.
Поступила 06.02.2012.
УДК 004.422.612
МИНИМИЗАЦИЯ ЧАСТИЧНО ОПРЕДЕЛЕННЫХ БУЛЕВЫХ ФУНКЦИЙ
Р. Н. Песков, В. Н. Щенников
В данной работе рассматривается задача минимизации частично определенных булевых функций. Решается вопрос о доопределении функции таким образом, чтобы она удовлетворяла исходным требованиям.
В некоторых прикладных задачах заданная булева функция может быть не определена на некоторых наборах. Если эти наборы в исследуемой задаче не будут играть никакой роли, то можно доопределить функцию на этих наборах таким образом, чтобы получить наиболее минимальную нормальную форму, т. е. форму, имеющую наименьшее число букв [1].
Рассмотрим, например функцию, заданную следующей последовательностью
01x111x011x010x0, где «х» означает, что функция на данном наборе значений не определена.
Доопределим данную функцию нулями [2]. Найдем минимальную дизъюнктивную нормальную форму (ДНФ). Сначала необходимо определить импликанты заданной булевой функции. Функция А = А(х^, ..., хп) является импликантой функции / = / (Х1, ..., хп ), если А принимает значение единицы лишь в тех точках (не обязательно во всех), в кото© Песков Р. Н., Щенников В. Н., 2012