Объектно-ориентированная декомпозиция программной логики искусственных нейронных сетей
Автор: Гирин Р.В., Орлов С.П.
Журнал: Онтология проектирования @ontology-of-designing
Рубрика: Прикладные онтологии проектирования
Статья в выпуске: 1 (27) т.8, 2018 года.
Бесплатный доступ
В статье описана декомпозиция логики программной реализации искусственных нейронных сетей с целью её последующей реализации в виде набора слабосвязанных доменных классов. Рассмотрены структурная и функциональная декомпозиция логики. Методика декомпозиции программной логики иллюстрируется UML-диаграммами. Приведено краткое описание практической реализации программной логики искусственной нейронной сети на языке C#, выполненной на основе объектно-ориентированного подхода. Подобная реализация использована при проектировании нейронных сетей различной конфигурации с целью их последующего обучения, эксплуатации, а также проведения экспериментов. Предлагаемое разделение программной логики между классами и обеспечение слабой связанности между ними упрощает процесс поиска ошибок в программном коде, делает код более управляемым, повышает продуктивность разработчика. Приведённые в статье примеры демонстрируют, как рациональная декомпозиция программной логики нейронной сети на семантически независимые между собой блоки в сочетании с применением концепции «Внедрение зависимостей», способствует большей структурированности кода. Новым результатом является применение объектно-ориентированной декомпозиции к программной логике нейронной сети, что позволило значительно упростить процесс проектирования программного кода. Приведён пример тестирования декомпозированной логики нейронной сети. Предлагаемый подход к декомпозиции программной логики искусственных нейронных сетей можно применить к широкому спектру различных нейронных сетей, таких, как конволюционные и деконволюционные сети, сети, содержащие одновременно конволюционные и полносвязаннные слои нейронов. При этом единообразие реализации сетей различных видов обуславливает упрощение их понимания, снижает трудовые затраты на сопровождение и развитие реализующего их кода.
Искусственная нейронная сеть, системный анализ, декомпозиция, объектно-ориентированный анализ
Короткий адрес: https://sciup.org/170178771
IDR: 170178771 | DOI: 10.18287/2223-9537-2018-8-1-110-123
Текст научной статьи Объектно-ориентированная декомпозиция программной логики искусственных нейронных сетей
Использование искусственных нейронных сетей (ИНС) стало прорывом во многих областях машинного обучения и искусственного интеллекта [1-3]. В этой связи актуальна разработка различных подходов к проектированию ИНС. Во многих проектах необходимо наличие программной библиотеки, предоставляющей ИНС таким образом, чтобы можно былогибко варьировать и расширять её функциональность. Это, в свою очередь, достижимо только в случае рационального проектирования программной логики ИНС. В этом плане задачи реализации ИНС не отличаются от какого-либо другого проекта, связанного с разработкой программного обеспечения [4].
Известно, что при выполнении проектирования программного обеспечения значительное упрощение достигается путем декомпозиции всей совокупности реализуемой функциональности на её составляющие. В некоторых источниках подобную выделенную функциональность, подлежащую реализации в виде отдельного слабо связанного компонента, условно называют логикой [4], например, логика доступа к данным (англ. data access logic) и т.п. В данной статье под программной логикой ИНС понимается вся совокупность функциональ-ностей, выполняющих обработку данных на слоях нейронной сети. Следует отметить, что программная логика – это не логическое программирование, парадигма которого основана на автоматическом доказательстве теорем.
В настоящее время разработано большое число программных реализаций нейронных сетей. При этом во многих реализациях получены эффективные решения, которые целесообразно использовать в дальнейших разработках. В тоже время отсутствует методологический подход, который бы опирался на эффективные приёмы объектно-ориентированного проектирования и использовал накопленные знания в области ИНС.
В предлагаемой статье развивается объектно-ориентированный подход к анализу программной логики ИНС [5-7]. Совокупность реализаций ИНС, доступных в исходных кодах (open sours) на различных языках, можно условно разделить на две большие группы. К одной группе относятся реализации специализированной платформы для алгоритмов машинного обучения, в их числе и ИНС. В другую группу входят библиотеки, которые не используют какие-либо сторонние платформы, и именно они рассматриваются в данной публикации. Выполненная авторами имплементация (практическая реализация) ИНС также не использует сторонние платформы для алгоритмов машинного обучения, и выполнение кода осуществляется непосредственно на CLR ( Common Language Runtime — общеязыковая исполняющая среда) [8].
В силу актуальности тем, связанных с использованием ИНС, в настоящее время существует большое число примеров их исходных кодов. Многие из программных библиотек, доступных в исходных кодах, например [4, 9], выделяют класс нейронной сети, на который возложено хранение перечня слоев. Этот класс инкапсулирует логику взаимодействия данных слоев для обеспечения прямого и обратного прохождения сигнала. Некоторые варианты реализации добавляют в логику нейронной сети функциональность, обеспечивающую сбор и обработку основной статистики, накапливаемой при обучении нейронной сети. Интересно отметить, что с определённой точки зрения подобное совмещение может противоречить принципу единственности ответственности.
Реализация ИНС в программной библиотеке Caffe ( Convolution Architecture For Feature Extraction - свёрточная архитектура для распознавания признаков) [10], доступная в исходном коде на языке С++, содержит богатую палитру различных имплементаций слоёв нейронов ИНС. Эти слои удобно взаимно заменять, получая новую функциональность ИНС, обеспеченную набором слоёв с заданными характеристиками, такими как: функция активации, принцип, по которому сигнал корректируется весом синоптической связи, и др.
Известно, что нейронные сети широко варьируются по своей структуре, принципу передачи сигнала между слоями, применяемым функциям активации и другим характеристикам [11]. Программная библиотека, описанная в [12], обеспечивает реализации ИНС на языке Java при едином технологическом подходе к сетям разной структуры.
1 Структурная и функциональная декомпозиция программной логики ИНС
Рассматривая всю совокупность логики ИНС, можно выделить следующие основные структурные компоненты.
-
• Функция активации. Она может быть представлена в виде сущности, инкапсулирующей логику, связанную с функцией активации. Эта сущность содержит данные о параметрах функции активации и логику вычисления значений функции и её производной.
-
• Функция ошибки. Эта сущность применяется при обучении ИНС. Для тренировки ИНС применяет подход, который в области машинного обучения именуется «Обучение с учителем». В ходе этого процесса вместе с входным сигналом доступны сведения об ожидаемом выходном сигнале, который можно сравнить с фактически полученным сигналом. Оценку величины расхождения эталонного и фактического результата оценивают с использованием функции ошибки для определения величины, на которую необходимо скорректировать веса синаптических связей.
-
• Слой нейронов ИНС. Он может быть представлен в виде сущности, инкапсулирующей логику работы совокупности искусственных нейронов, находящихся на одном слое ИНС. Он обеспечивает хранение значений весов синаптических связей и содержит логику вычисления поля индуцирования (передаваемого функции активации) на основании входного сигнала. Поскольку данная логика использует функцию активации, каждый слой содержит хотя бы один объект функции активации.
-
• Нейронная сеть. Сеть может быть представлена в виде совокупности одного или нескольких слоев искусственных нейронов вместе с логикой их взаимодействия (передача сигнала в процессе его прямого и обратного прохождения, хранение значений предыдущих сигналов при необходимости и т.п.). Нейронная сеть для своего функционирования должна содержать хотя бы один слой нейронов.
В то же время, рассматривая функциональную организацию логики ИНС, можно выделить следующие уровни.
-
• Логика прямого прохождения сигнала. Она представляет собой основной режим работы нейронной сети, когда сигнал, поданный на вход ИНС, передаётся на вход функции активации по синаптическим связям с корректировкой на их веса. При этом функция активации, в свою очередь, формирует выходной сигнал отдельно взятого слоя нейронов или ИНС в целом. В конволюционных сетях [13] все нейроны, расположенные на одном слое, используют одинаковые синаптические связи. Это необходимо учитывать и в логике прямого прохождения сигнала, и в логике корректировки весов при обучении.
-
• Логика обратного прохождения сигнала ошибки. Эта функциональность применяется для обучения ИНС [13]. При обратном прохождении сигнала выходные значения ИНС сравниваются с эталонным сигналом (который доступен при обучении с учителем) и их расхождение оценивается с использованием функции ошибки. Полученная ошибка на выходном слое передаётся на предшествующий слой и далее до входного слоя.
-
• Логика корректировки весов и сдвигов нейронной сети. Подобная корректировка необходима для обучения нейронной сети. Удобно, когда эта логика гибкая и взаимозаменяемая. При этом частная производная функции ошибки используется для определения непосредственно величины, на которую корректируется вес связи или сдвиг. При необходимости имплементация логики ИНС должна выполнять замену используемой функции ошибки.
-
• Вспомогательная логика . К данной функциональной части можно отнести логику, выполняющую матричные операции, к которым сводится большинство численных преобразований, выполняемых внутри нейронной сети. Например, при использовании концепции глубокого обучения [14] необходимо осуществить «предобучение» каждого отдельного слоя заданной нейронной сети на базе «Обучение без учителя», с последующим обучением всей ИНС на основе «Обучение с учителем». На стадии предобучения требуется логика, выполняющая анализ структуры заданной нейронной сети, генерацию автоэнкодеров
для п р едобучения каждого слоя и са м о предоб у чение со с бором ста т истики. С целью соблюдения принципа единс т венности ответстве н ности эта логика и н капсулир о вана в отдельн о м классе.
Допо л няя описанную выше функци о нальную д екомпози ц ию прогр а ммной логики работы ИНС, р ассмотрим UML - д и аграммы п оследова т ельности, п риведённ ы е на рисунках 1 и 2.

Р исунок 1 - UML-диагра м ма последо в ательности, иллюстриру ю щая перех о д управления п р и прямом п р охождении сигнала в И Н С

Р исунок 2 - UML-диагра м ма последо в ательности, иллюстриру ю щая перех о д управлен и я при обратном п рохождени и сигнала в ИНС
На п р иведённых диаграм м ах легко видеть в з аимосвяз ь между в ыделенны м и в ходе функцио н альной декомпозиц и и совокуп н остями ф ункциона л ьностей. П ри прямом прохождении си г нала (см. рисунок 1 ) ИНС по с ледовател ь но делег и рует зада ч у прямой обработки сигнала к а ждому из входящих в неё сло ё в нейроно в . Каждый из слоёв н ейронов, в свою очередь, дел е гирует объекту клас с а функци и активаци и задачу в ы числения её значен и я. При обратном п р охождении сигнала (см. рису н ок 2) ИН С последо в ательно д е легирует задачу обратной о б работки сигнала ка ж дому из в х одящих в неё слоёв нейронов. Переход у правления от слоя к с лою в этом случае в ы полняетс я , начиная с последн е го и закан ч ивая пер в ым.
В нек о торых технических решения х требован и я таковы, что необ х одимо ис п ользовать уже обуч е нную нейронную сеть, без п о следующ е й её кор р ектировк и и дообу ч ения. Для обеспече н ия эксплуатации не й ронной се т и в таки х условиях важно вы п олнить группировку функцио н ала, составляющего ИНС, в д в ух вариа н тах: функ ц ионал, н е обходим ы й для эксплуатаци и и функционал, необходимый д ля обучен и я.
Рассматривая выполненную выше структурную декомпозицию, легко заметить, что для проектирования и эксплуатации ИНС достаточно иметь в распоряжении функцию активации, один или несколько слоёв нейронной сети и сущность, соответствующую самой нейронной сети. Сущность, соответствующая функции ошибки, требуется только в процессе обучения ИНС.
Функциональная декомпозиция показывает, что для работы ИНС достаточно иметь логику, обеспечивающую прямое прохождение сигнала, в совокупности с некоторой долей вспомогательной логики (например, логики, выполняющей матричные операции). Логика обратного прохождения сигнала и логика корректировки весов синаптических связей требуются только в процессе обучения ИНС.
Используя описанный подход при объектно-ориентированном проектировании, будем разделять логику ИНС на две группы классов:
-
■ классы, инкапсулирующие логику обучаемых ИНС и их компонентов;
-
■ классы, инкапсулирующие логику необучаемых ИНС и их компонентов.
Важно заметить, что обучаемые ИНС в себе содержат логику необучаемых, поэтому эти классы связаны наследованием.
В приводимой декомпозиции выделяется логика нейронов, находящихся на отдельно взятом слое ИНС. Дальнейшая декомпозиция на уровни логики отдельно взятых нейронов не выполняется в силу следующих соображений. На практике в структуре нейронных сетей на отдельно взятом слое используются нейроны схожей конфигурации. Учитывая это, арифметические операции, выполняемые на отдельно взятом слое ИНС, можно выразить и реализовать в коде в виде матричных операций. Некоторые матричные операции, такие как умножение, достаточно ресурсоёмки и обладают большой асимптотической сложностью [15], однако при этом они обладают алгоритмическим параллелизмом. Кроме того, такие вычисления можно выполнять на графических процессорах GPU ( Graphics Processing Unit ) в рамках концепции GPGPU ( General-purpose computing for GPU - неспециализированные вычисления на графических процессорах) [12, 16].
2 Технология проектирования программного кода логики ИНС
При проектировании описываемой реализации ИНС использовались следующие основные принципы:
-
• функциональность отдельно взятой выделенной сущности должна представлять собой логическую целостность для удобства чтения и понимания кода;
-
• совокупность выделенных сущностей должна обладать достаточной степенью слабой связанности для обеспечения возможности независимо развивать, тестировать и использовать различные сущности;
-
• каждый отдельно взятый класс, инкапсулирующий какую-либо логику, должен соответствовать принципу единственной ответственности , то есть быть ответственным за решение какой-либо отдельно взятой задачи и только её.
Следование этим принципам нацелено на проектирование кода так, чтобы заложенные концепции позволяли удобно компоновать различные ИНС и расширять их функционал (добавление новых функций активации, функций оценки ошибки, поддержка различных конфигураций ИНС и т.п.) [5].
На основании проведённых выше анализа и декомпозиции программной логики ИНС была выполнена её имплементация с использованием языка C#. На рисунке 3 приведена UML-диаграмма, которая даёт хорошее представление о перечне и связях, используемых в какой-либо программной библиотеке классов.

Рисунок 3 - UML-ди а грамма классов, иллюст р ирующая объектно-ориен т ированную декомпозицию программной логики И НС
На диаграмме легко выделить два пакета. В пакете, расположенн ом в верхней части изображения, содержатся интерфейсы и классы, обеспечивающие прям ое прохождение сигнала в ИНС. В нем расположены интерфейсы, объявляющие специфичные члены для многосвёрточных и односвёрточных функций активации, IMultiFoldA ctivationFunction и IOneFoldActivationFunction, соответственно. Для наглядности представлена одна реализация каждого из этих интерфейсов (классы LogSigActivationFunction и Soft maxFunction). В действительности их может быть больше в зависимости от числа поддерживаемых функций активации. Интерфейс ILayer объявляет перечень членов, специфичных для отдельно взятого слоя нейронов. Его непосредственной реализацией является абстрактный класс Layer, который задаёт базовую реализацию, общую как для слоёв содержащий многосвёрточную функцию активации, так и односвёврточную . Наследники класса Layer, классы MultiFoldActivationLayer и OneFoldActivationLayer, содержат реализацию логики многосвёрточных и односвёрточных слоев. Интерфейс INeuralNet объявляет члены, присущие непосредственно ИНС. Его реализацией является класс FeedForwardNeuralNetwork, название которого говорит само за себя – он реализует функциональность сети, выполняющей прямое прохождение сигнала. Разумеется, можно добавить реализацию и других нейронных сетей пос редством реализации интерфейса INeuralNet. Каждый класс ИНС, и в частности, FeedForwardNeuralNetwork, образует композицию с одним или более слоями нейронов.
В пакете, расположенном в нижней части диа г раммы, н а ходятся и н терфейс ы и классы, обеспечи в ающие обучение И НС. Инт е рфейс ILossFunctio n объявля е т члены, присущие функция м потерь. Приведена о дна из ре а лизаций данного ин т ерфейса – класс Cross-Entropy . Интерфейсы ILearnableLayer и ILearnab l eNeuralNet объявля ю т перече н ь членов, необходимых для о бучения отдельно в зятого сл о я и сети в целом, с о ответстве н но. Клас с ы Learna-bleMultiF o ldActivationLayer и Learnable O neFoldAc t ivationLayer – пото м ки Multi F oldActivationLayer и OneFoldActivation L ayer , соот в етственно. Они доб а вляют св о им предк а м реализацию ILea r nableLayer , а класс L earnable F eedForwardNeuralNe t work доб а вляет сво е му предку FeedForw a rdNeuralNetwork ре а лизацию IL earnable N euralNet .
Прив е дённая диаграмма б о лее детал ь но отраж а ет описан н ую выше структур н ую декомпозицию л огики ИНС. Испол ь зованы д в а интерфейса, описывающих классы, с о держащие логику в ычисления значе н ий фун к ции активации, IOneFold A ctivationF u nction и IMultiFoldActivationFunction (с м . рисуно к 4).
Совокупность одного или нескольки х слоёв нейронов об р азует соб о й ИНС. И нтерфейс, соответствующей ей, представ л ен на рис у нке 5.
public interface lOneFoldActivationFunction
{ double Activation(double parameter);
double Derivative(double parameter);
} . . . . .
public interface IMultiFoldActivationFunction
{ doubled Activation(double[] parameters);
double[.] Derivative(double[] parameters);
}
Рисунок 4 – Интерфейсы IOneFoldActivationFunction и IMultiFoldActivationFunction public interface INeuralNet { doublef] Processlnput(double[] input);
Enumerable
}
Рисунок 5 - Интерфейс INeuralNet
Поск о льку слой нейронов ИНС обла д ает значительной ч а стью лог и ки, котор а я является общей дл я многих разновидн о стей слоё в нейронных сетей, о на вынес е на в базо в ый интерфейс ILayer. Такая практика в ы деления б азовых сущностей на основан и и анализа признаков общности и различности необ х одима, ч т обы не дублировать код [6, 18 ] . Наследн и ками данного базового интерфейса яв л яются классы OneFol dA ctivation L ayer и MultiFold A ctivationLayer.
Как в и дно из названий эти х классов, они декла р ируют то л ько те чл е ны, котор ы е необходимы для реализации логики с лоя нейр о нной сет и в той ча с ти, где о ни различн ы в случае применен и я односвёрточной и многосв ё рточной функции а ктивации. Интерфе й сы ILayer, IOneFoldActivationLayer и IMu l tiFoldActi v ationLaye r приведен ы на рисун к е 6.
public interface ILaver
{ double [] Biases { get; } double [,] Weights { get: } int NumberOflnputs { get; } int NumberOfNeurons { get; } double[] FeedForward(double[] inputVector);
//некоторые члены интерфейса опущены для краткости
} public interface lOneFoldActivationLayer : ILayer
{ lOneFoldActivationFunction OneFoldActivationFunction { get; }
} public interface IMultiFoldActivationLayer : ILayer
{
IMultiFoldActivationFunction MultiFoldActivationFunction { set; } }
Рисунок 6 – Интерфейсы ILayer, IO n eFoldActivationLayer и I M ultiFoldAct i vationLayer
Следование принципу ра з деления о бъявлени я и реализ а ции про гр аммных сущностей позволяе т в дальнейшем гибк о изменять функцион а льность путём испо л ьзования р азных реализаций заданных интерфейс о в. Импле м ентация сформиров а нного на б ора интер ф ейсов выполнена следующим образом.
Одна из реализаций интерфе й са IOn e FoldActivationFuncti o n – э т о класс LogSigActivationFunction , кото р ый предс т авлен на рисунке 7.
public class LogSigActivationFunction:
lOneFoldActivationFunction
{ public double Activation(double parameter)
return e * (1.0 - e);
}
Р и сунок 7 - Кл а сс LogSigA c tivationFunc t ion
Логи к а этого класса дос т аточно п р оста, поэтому патт е рн «Вне др ение зав и симостей» ( Dependency injection ) [19, 20] в данном случае не применяе т ся. Одна к о этот кл а сс служит примером, образно говоря, н а чального э лемента цепочки за в исимосте й между д оменными классами р ассматриваемой пр о граммной библиотеки.
В классах, имплементирующих интерфейсы IOneFoldActivationFunction и IMultiFoldActivationFunction, применённая декомпозиция позволяет сосредоточиться только на логике вычисления значений функции активации в зависимости от переданных парамет- ров и вычислении значений производной данной функции. Это полн остью соответствует принципу единственной ответственности для отдельного взятого класса.
След у ющим логическим б л оком в ра с сматрива е мой логике является слой нейр о нов ИНС.
Класс OneFoldActivationLa y er показа н на рисун к е 8.
public class OneFoldActivationLayer : Layer, lOneF oldActivationLayer
{ public OneFoldActivationLayer(double[,] weights, double[] biases, lOneFoldActivationFunction af)
I : base(weights, biases)
{
//имплементация конструкторов не приведена для краткости public lOneFoldActivationFunction
OneFoldActivationFunction
{ get return oneFoldActivationFunction:
}
}
//другие члены класса не приведены для краткости
}
Р и сунок 8 - К л асс OneFol dA ctivationLa y er
Видн о , что один из па р аметров к онструкт о ров данн о го класс а – это р еализация IOneFold A ctivationFunction. Реализация э того клас с а выполн я ет делеги р ование с о ответствующих вы ч ислений переданно й реализа ц ии. Для к р аткости и мплемент а ция класса Layer не приводит с я, но в ней содерж и тся обща я базовая ф ункциона л ьность, с п ецифичная для слоя нейронов ИНС.
Анал о гичным образом зав и симость в недряетс я и для связки нейро н ной сети в целом, и составля ю щих её слоёв нейро н ов. Конст р уктор кла с са прини м ает в кач е стве пара м етра перечень слоё в , входящих в соста в нейронно й сети, а впоследств и и делеги р ует выпол н ение прямой пере д ачи сигнала от слоя к слою, о б еспечива я прямую п ередачу с игнала по сети в целом.
Таки м образом, вся логика ИНС, дек о мпозиров а нная опи с анным сп о собом, об ъ единена в общую ф у нкциональность пос р едством к онцепции «Внедрен и е зависим о стей» (ри с унок 9).
Сово к упность функциональностей, с о ответств у ющая лог и ке обучен и я ИНС, р е ализована следующ и м образом. Выделен интерфей с ILossFunction. Различные им п лементац и и данного интерфей с а позволяют привнести в о п исываему ю библио т еку испо л ьзование различных функций п отерь. Посредство м объекта, и мплемен т ирующег о данный и нтерфейс, определяются значения, на которые кор р ектирую т ся значен и я весов и с двигов.
Незав и симо от того, какая имплемен т ация сло я нейронов использу е тся (одна из описанных выш е или добавленная в х оде дора б отки биб л иотеки), с л ой нейро н ов можн о использовать в об у чаемой ИНС при выполнени и всего о д ного усло в ия: класс , описыва ю щий этот слой, дол ж ен реализовывать интерфейс I Learnable L ayer. В л о гике этог о класса в ы полняется делегиро в ание задачи вычисл е ния велич и ны корре к тировки в есов и сд в игов объе к ту, реализующему I LossFunction .
public class FeedForwardNeuralNetwork : INeuralNet { protected List
List
public FeedForwardNeuralNetwork(params
ILaver[] lavers)
//имплементация конструктора не приводится для краткости
} public IEnumerable
{ get
{ return layers;
} public double[] Processlnput(double[] input)
input = layers[i].FeedForward(input);
return input:
}
}
Р и сунок 9 - Класс FeedFor w ardNeural Ne twork как о д на из реализаций интер ф ейса INeural N et
Инте р фейс ILearnableNeur a lNet рас ш иряет инт е рфейс INeuralNet пе р ечнем чл е нов, необходимых д ля выполнения обу ч ения ИНС .
Таки м образом, для полу ч ения фун к циональн о сти обуч а емой ИН С достато ч но выполнить реал и зацию интерфейсов ILossFun c tion , ILear n ableLayer и ILearna b leNeural N et. В качестве при м ера на рисунке 10 п оказана о дна из ре а лизаций о бучаемой ИНС в в и де класса Learnable F eedForwardNeuralN e twork .
Важн о отметить, что такая реализа ц ия явл я ется н а следнико м класса FeedForw a rdNeuralNetwork дл я предотв р ащения д у блирован и я кода, о п исывающ е го логику прямого прохождения с игнала. Как б ыло подробно описан о выше, FeedForw a rdNeuralNetwork ин к апсулиру е т логику и все необ х одимые с с ылки на о б ъекты для обеспече н ия работы логики пр я мого про х ождения с игнала.
3 Модульное тестирование
Пред л агаемая методика ре а лизации И НС обеспечивает п р иемлему ю производ и тельность и точност ь нейронных сетей, о бученных на массив а х данных [21], а так ж е даёт возможность выполнят ь эксперименты, свя з анные с а п робацией различны х конфигу р аций ИН С [22]. Повышение качества существую щ его кода достигает с я посредс т вом рефа к торинга [ 5 , 23], технология к оторого предполагает приме н ение мод у льного т е стирован и я с испо л ьзованием юнит-тес т ов ( unittesting ). Расс м отрим пр е длагаему ю декомпо з ицию лог и ки ИНС с точки зрения удобства реализации юнит-тестов.
Для п римера проведём т е стирован и е логики класса O n eFoldActi v ationLaye r . Один из юнит-тес т ов, выполняющий п роверку к орректности метода FeedFor w ard данн о го класса, приведён на рисунке 11.
public class LearnableFeedForwardNeuralNetwork :
FeedForwardNeuralNetwork, ILearnableNeuralNet
{ private List
public LearnableFeedForwardNeuralNetwork(params ILeamableLaver[] layers) : base(layers)
{ learnableL avers. AddRanse(lavers);
} public IEnumerable
} public void ProcessError(double[] target, double alpha, double momentum)
double [] error = learnableL ayers .L ast(). ErrorVectorF rom(target);
foreach (var laver in learnableLayers)
{ lay er. Update Weights();
laver.UpdateBiasesO;
}
/ некоторые другие члены не приведены для краткости
}
Рисунок 10 - Класс L e arnableFeed F orwardNeu r alNetwork
Легко видеть, что подменой логики в ычислени я функции активаци и (имплеме н тация интерфейса I OneFoldActivationF u nction ) в х оде тести р ования м о жно пров е рить лог и ку работы метода F e edForward класса O n eFoldActi v ationLayer независи м о от друг и х классов. Это очень удобно, т.к. позволяет легко л о кализоват ь ошибки в коде и вн о сить корректировки.
Таки м же образом можн о провери т ь коррек т ность использовани я храним ы х данным классом в есов, логику вычисл е ния поля индуциро в ания входных значе н ий для ф у нкции активации. П ри этом достаточн о использо в ать в кач е стве, как и х часто н а зывают н а практике, тестового дублёра достаточн о простую условную реализац и ю интерф е йса IOne F oldActiva-tionFuncti o n.
Анал о гичным образом уп р ощается п роверка р еализации интерфе й са INeura lN et класса FeedForw a rdNeuralNetwork. П у тём внед р ения зави с имости в виде тест о вых дубл ё ров, представленн ы х в виде значитель н о упрощё н ных имплементаций интерфей с а ILayer , легко проверяется л огика работы класс а FeedFor w ardNeural N etwork. П одобное р азделение позволило декомпоз и ровать достаточно с ложную л о гику раб о ты ИНС в нескольк о относит е льно независимых б локов. При этом ка ж дый из н и х имеет с в ою семан т ическую ц елостность в сочетании с уме р енной сложностью.
[TestMethod]
public void OneFoldActivationLaverFeedForwardQ
{
//Arrange double[,] weightMatrix = new double [.] { { 1, 1, 1, 1 MUM}};
doublet] bias Vector = new doublet] {L1}1
OneFoldActivationLayer layer = new OneFoldActivationLayer( weightMatrix, bias Vector, new DummyOneFoldActivationFunctionQ);
//Act doublet] output = layer.FeedForward(new doublet] { 1. 2, 3,4 });
//Assert
Assert.AreEqual(ll, output[0]);
Assert.AreEqual( 11, output [ 1 ]);
}
Рисуно к 11 - Юнит-тест, проверя ю щий корре к тность метода FeedForward класса On eFoldActivationLayer
Заключение
Выпо л ненная реализация д екомпози ц ии программной ло г ики ИНС о пирается на использование о б ъектно-ориентиров а нной пар а дигмы. П р едложенн о е разделе н ие прогр а ммной логики меж д у классами и обесп е чение сла б ой связанности ме ж ду ними у п рощает процесс поиска ошибок в коде, делает ко д более уп р авляемым, повышает продукт и вность ра з работчика при проведении рефакторинга. Приведё н ные примеры демон с трируют, к ак рацио н альная декомпозиц и я логики на семант и чески нез а висимые между собой блоки в сочетани и с применением концепции «Внедрен и е зависим о стей» сп о собствует большей с труктури р ованности кода.
Предлагаемый подход к декомпози ц ии прогр а ммной ло г ики ИНС можно п р именить к широком у спектру различных нейронны х сетей: к о нволюци о нные и де к онволюц и онные сети; сети, с одержащие одновре м енно кон в олюцион н ые и пол н освязанн н ые слои н е йронов; и т.п. При этом единообразие р е ализации р азличного рода сетей обуслав л ивает упрощение их пониман и я, снижает трудозатраты на со п ровожден и е и развитие реализ у ющего их кода.
Список литературы Объектно-ориентированная декомпозиция программной логики искусственных нейронных сетей
- Хайкин, С. Нейронные сети: полный курс, 2-е изд. - М.: Издательский дом «Вильямс», 2006. - 1104 с.
- Rassell, S. Artificial Intelligence: A Modern Approach, 3rd Edition / S. Rassell, P. Norvig. - Pearson Education, 2010. - 1095 p.
- Мак-Каллок, У.С. Логическое исчисление идей, относящихся к нервной активности / У.С. Мак-Каллок, У. Питтс // В сб. «Автоматы» подред. К.Э. Шеннона и Дж. Маккарти. - М.: Изд-во иностр. лит., 1956. - С. 363-384.
- Fowler, M. Patterns of Enterprise Application Architecture / M. Fowler. - Addison-Wesley, 2002. - 560 p.
- Jacobsen, I. Object Oriented Software Engineering: A Use Case Driven Approach / I. Jacobsen, M. Christerson, P. Jonsson, G. Overgaard. - Addison-Wesley / ACM Press, 1992. - 56 p.