глава 1. автоматное программирование и нейронные сети

advertisement
Титульный лист1, 2
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
ГЛАВА 1. АВТОМАТНОЕ ПРОГРАММИРОВАНИЕ И НЕЙРОННЫЕ
СЕТИ
В
настоящей
главе
приводятся
общие
концепции
автоматного
программирования и нейронных сетей. Рассматривается понятие «система со
сложным поведением» и обосновывается применение автоматного подхода
для описания систем этого типа. Приводятся примеры задач, в которых
нейронные сети успешно применяются для управления автоматных систем.
Приводятся примеры задач, в которых применяются нейронные сети и могут
быть использованы в автоматах.
1.1. ОСНОВНЫЕ КОНЦЕПЦИИ АВТОМАТНОГО ПРОГРАММИРОВАНИЯ
В настоящем разделе описывается понятие «системы со сложным
поведением» и приводятся основные идеи автоматного программирования.
1.1.1. Системы со сложным поведением
В процессе создания программного обеспечения часто возникает
необходимость
реализации
систем
со
сложным
поведением.
Таким
поведением обладают многие устройства управления, сетевые протоколы и
т.д.
Будем считать, что система обладает сложным поведением, если в ответ
на возникновение некоторого события она, в зависимости от предыстории
может совершить одно из нескольких действий.
При традиционной программной реализации систем с таким поведением
программистами используются переменные, называемые флагами, которым
не соответствуют никакие элементы предметной области. Предназначение
флагов
–
участвовать
реализующих
логику
в
многочисленных
поведения.
Флаги
конструкциях
неявно
задают
ветвления,
отдельные
компоненты состояний. Использование флагов трудно для понимания,
подвержено ошибкам и практически не расширяемо.
Вместо этого в последнее время предлагается описывать системы со
сложным поведением, приписывая каждой из них некоторое множество
управляющих состояний. В этих состояниях поведение системы обычно
является простым и может быть описано явно (при необходимости
применяется декомпозиция автоматов). Связь управляющих состояний с
действиями и механизм переходов между состояниями удобно описывать с
помощью конечных автоматов с выходами[1]. При этом все поведение
системы
оказывается
сосредоточенным
в
автомате
или
системе
взаимодействующих автоматов. Такой подход к описанию поведения
называют автоматным[2].
Будем считать, что система обладает сложным поведением, если она
описывается автоматом, или системой взаимодействующих автоматов с
достаточно большим числом состояний и переходов.
Одна и центральных идей автоматного программирования[3] состоит в
отделении описания логики поведения (при каких условиях необходимо
выполнить те или иные действия) от описания его семантики (собственно
смысла каждого из действий). Кроме того, описание логики при автоматном
подходе жестко структурировано. Эти два свойства делают автоматного
описание сложного подведения ясным и удобным.
Одним из наиболее широких классов систем, обладающих сложным
поведением, являются реактивные системы. Системы этого класса могут
быть также названы событийными. В таких системах в качестве входных
воздействий используются события и входные переменные. События, в
отличие от входных переменных, не опрашиваются программой, а вызывают
соответствующие им обработчики. Входные переменные и выходные
воздействия реализуются произвольными подпрограммами (функциями).
Перечислим основные отличия реактивных систем от систем других классов.
Если в системах логического управления[4] в качестве входных
воздействий используются опрашиваемые программой двоичные входные
переменные и предикаты, соответствующие определенным состояниям
автоматов, взаимодействующих с рассматриваемым автоматом, то для
реактивных систем это понятие расширено. Во-первых, в качестве входных
переменных применяются любые подпрограммы (функции), возвращающие
двоичные
значения,
а,
во-вторых,
введены
события,
не
только
обеспечивающие возможность выполнения переходов в автоматах, но и
инициирующие запуск автоматов. События могут также инициировать
реализацию выходных воздействий в случае, когда состояние автомата не
изменяется.
Другое отличие «реактивных» систем от систем логического управления
состоит в том, что в них в качестве выходных воздействий применяются не
только двоичные переменные, а произвольные подпрограммы.
Также как и в системах логического управления, в «реактивных»
системах алгоритмы представляются в виде системы взаимосвязанных
автоматов. При этом если в системах первого типа взаимодействие
автоматов в основном осуществляется за счет обмена номерами состояний, а
вложенность присутствует в начальном состоянии, то в реактивных системах
число способов взаимодействия увеличилось.
В качестве примера системы, управляемой автоматами, приведем
реализацию протокола «SMTP» на основе SWITCH-технологии[5][6],
которая изображена на рис. 1.
Рис.1. Схема взаимодействия автоматов реализации протокола «SMTP»
1.1.2. Автоматное программирование
Парадигма автоматного программирования[3] состоит в представлении
систем со сложным поведением в виде автоматизированных объектов
управления. Автоматизированный объект управления представляет собой
объект управления, интегрированный с системой управления в одно
устройство. При этом система управления обладает сложным поведением и
представляется в виде системы взаимодействующих конечных автоматов, а
объект
управления
обладает
простым
поведением
и
реализуется
традиционными методами.
В случае, когда автоматы описывают системы со сложным поведением, и
когда логика поведения не полностью определена на момент проектирования
системы, появляется возможность использовать нейронные сети.
1.2. ИСКУССТВЕННЫЕ НЕЙРОННЫЕ СЕТИ
Искусственные нейронные сети (ИНС)[7] — математические модели, а
также их программные или аппаратные реализации, построенные по
принципу организации и функционирования биологических нейронных
сетей — сетей нервных клеток живого организма. Это понятие возникло при
изучении процессов, протекающих в мозге, и при попытке смоделировать эти
процессы.
1.2.1. ВОЗНИКНОВЕНИЕ искусственных нейронных сетей
Первой такой попыткой были нейронные сети Маккалока и Питтса[7].
Они предложили систему обработки информации в виде сети, состоящей из
простых вычислителей, созданных по принципу биологического нейрона.
Каждый такой элемент i =1,2...n имеет входы и выходы, принимающие
значения 0 или 1. Состояние отдельного нейрона определяется влиянием
остальных как взвешенная линейная комбинация ∑ 𝑤𝑖𝑗 𝑛𝑗 их выходов 𝑛𝑗 . К
сумме затем применяется пороговая функция вида 𝑔(∑ < 0) = 0; 𝑔(∑ ≥
0) = 1 [7]. Маккалок и Питтс показали, что такие сети могут производить
произвольные вычисления, подобно известной машине Тьюринга. При этом
единственной нерешенной проблемой оставался подбор весов 𝑤𝑖𝑗 –
настраиваемых параметров для задачи. В 1962 г. Ф. Розенблатт для решения
проблемы классификации символов приложил использовать особый тип
искусственной нейронной сети, названный им персептроном[7][8]. В этой же
работе им был предложен итеративный алгоритм получения весов 𝒘𝒊𝒋 ,
моделирующих силу синоптической связи. Значения весов получались по
известным входным значениями и соответствующим желаемым выходам
сети.
В 1969 г. Минский и Паперт в своей работе[7][9] показали, что
персептрон не может решать целый класс простых задач, таких как,
например, реализация логической операции XOR. Все исследования в этой
области были приостановлены до середины 80-х годов.
В 1986 г.Д. Румельхарт, Г. Хинтон и Р. Вильямс предложили
эффективный алгоритм для обучения более совершенного, так называемого
многослойного, персептрона[7][10].
С конца 80-х годов по настоящее время теория нейронных сетей активно
развивается. В современный период нейронные сети все чаще применяются
для решения разнообразных практических задач. Более того, они все чаще
применяются в диагностике, промышленности, финансовой схеме и в
повседневной жизни – там, где необходимо решать задачи, с которыми
раньше справлялся только человек.
1.2.2. ТОПОЛОГИИ ИСКУССТВЕННЫХ НЕЙРОННЫХ СЕТЕЙ
Существует несколько распространенных топологий нейронных сетей.
Каждая из них обладает своими достоинствами и подходит для решения
определенного типа задач.
Многослойный персептрон [10][7] - это искусственная нейронная сеть с
прямыми связями (feedforward), в которой имеется несколько слоев нейроэлементов с настраиваемыми весами связей. Архитектура трехслойного
персептрона, получившего наибольшее распространение, приведена на рис.
2.
Y1
YM
Выходной слой
...
X’’N2
X’’1
Скрытый слой
...
X’1
X’N1
Входной слой
...
X1
XN
Рис. 2. Архитектура многослойного персептрона
К элементам входного слоя применимо следующее правило: 𝑥𝑗′ =
′′ ′′
𝑓(∑𝑁
𝑖=1 𝑤𝑖𝑗 𝑥𝑖𝑗 ) 𝑗 = 1. . 𝑁1 . К элементам скрытого слоя применимо следующее
′′ ′′
правило: 𝑥𝑘′′ = 𝑓(∑𝑁1
𝑗=1 𝑤𝑗𝑘 𝑥𝑗𝑘 ) 𝑘 = 1. . 𝑁2 .
′′ ′′
Элементы выходного слоя рассчитываются как 𝑌𝑙 = 𝑓(∑𝑁2
𝑘=1 𝑤𝑘𝑙 𝑥𝑘𝑙 ) 𝑙 =
1. . 𝑀.
В
отличие
от
элементарного
персептрона,
формирующего
классифицирующую гиперплоскость, многослойный персептрон может
формировать в режиме обучения сложные нелинейные гиперповерхности
(кусочно-линейные, полиномиальные и т. п.). Благодаря этому многослойный
персептрон способен распознавать произвольное число классов, имеющих
сложную структуру в пространстве первичных признаков. При этом классы
могут представлять собой выпуклые, невыпуклые и многосвязные объекты.
Сети
Хопфилда
[10][7]
представляют
собой
широкий
класс
искусственных нейронных сетей, включающий в себя многие типы сетей в
качестве частных подклассов. Это обусловлено тем, что сеть Хопфилда
является абсолютно однородной структурой без какой-либо внутренней
специализации ее нейро-элементов (рис. 3).
1
2
N-1
N
1
2
N-1
N
1
2
N-1
N
Рис. 3. Архитектура сети Хопфилда
Существуют две основные разновидности ИНС Хопфилда:
 сеть с пороговыми элементами;
 сеть с сигмоидальными элементами
Сеть с пороговыми элементами функционируют в асинхронном режиме,
то есть каждый элемент в случайные моменты времени с некоторой средней
частотой определяет свое состояние. В качестве порогового уровня для всех
элементов
обычно
выбирается
ноль.
Благодаря этому оказалось возможным описать динамику сети Хопфилда в
рамках
энергетического
подхода.
При
этом
оказывается
полезной
механическая аналогия между поведением сети и движением шарика по
некоторому
Поведение
вязкому
сети
с
рельефу
сигмоидными
под
действием
элементами
силы
тяжести.
описывается
системой
нелинейных дифференциальных уравнений, учитывающих синхронность и
непрерывность
Основными
переключения
недостатками
искусственной
элементов.
нейронной
сети
Хопфилда
являются:
1. неэкономное использование памяти (количество случайных образов,
которое сеть может запомнить с вероятностью последующего
восстановления, равной 1, не превышает 15 % от общего количества
элементов);
2. чувствительность к искажениям распознаваемых образов (сеть имеет
весьма скромные возможности распознавания, так как допустимо лишь
искажение образов ограниченным аддитивным шумом);
3. неинвариантность
(например,
к
к
геометрическим
аффинным
или
преобразованиям
проективным
образов
преобразованиям
распознаваемых изображений).
Нейросети Хемминга[7][10] – искусственная нейронная сеть Хемминга
реализует
оптимальный
в
смысле
минимума
ошибки
алгоритм
классификации, используемый для решения задач в области связи
(восстановление искаженного случайным шумом эталонного сигнала).
Архитектура ИНС Хемминга показана на рис. 4.
1
2
N-1
1
N-H1
2
N-H1
1
N
N-HM-1
2
N
N-1
N-HM
N-1
N
Рис. 4. Архитектура сети Хемминга
Сеть представляет собой двухуровневую структуру, в каждом слое
которой расположены элементы с насыщением. Число элементов в верхнем и
нижнем слоях одинаково и равно числу классов образов. Веса связей и
пороги элементов задаются при обучении сети Хемминга.
После задания весов связей и порогов элементов на входы сети подается
двоичный N-мерный вектор (образ). Он должен сохраняться на входах в
течение времени, достаточного для параллельного срабатывания всех
элементов нижнего слоя и инициализации элементов верхнего слоя. Каждый
элемент нижнего слоя вычисляет следующую величину N - Hi, где Hi расстояние Хемминга между входным вектором и i-м эталоном.
После удаления входного вектора с входов сети состояние элементов
нижнего слоя не изменяется, а в верхнем слое происходит синхронное
срабатывание элементов.
Верхний слой осуществляет выбор элементов с наибольшим уровнем
возбуждения. Критерием окончания процесса классификации служит
отсутствие выходных сигналов на выходах всех элементов верхнего слоя, за
исключением одного. Номер этого элемента соответствует классу, к
которому принадлежит искаженный шумом входной образ. По сравнению с
сетью Хопфилда сеть Хемминга:
1. требует почти на порядок меньшего числа соединений между
элементами при одинаковой информационной емкости сети;
2. в процессе работы всегда "сходится" (эволюционирует) к некоторому
эталонному образу.
Порогово-полиномиальные
нейросети[7][10]
–
предназначены
для
распознавания сложных (линейно не разделимых) классов образов, заданных
в n-мерном пространстве двоичных признаков [10]. Схема пороговополиномиальной сети изображена на рис. 5.
Y1
x1
C
f1
П
...
...
...
xn
C
Р
Класс 1
fm
П
Yn
Р
Класс 2
Рис. 5. Схема архитектуры порогово-полиномиальной нейросети
На входе сети имеется сенсорный блок пороговых элементов (Сэлементов), фиксирующий признаки объектов х = (xj, ..., хn) в виде двоичных
кодов. Полученный входной образ (двоичный вектор х) поступает на блок
полиномиальных преобразователей (А-элементов), формирующий m-мерный
вектор вторичных (полиномиальных) признаков z = (f1(х), ..., fm(х)). Эти
вторичные признаки определяют m-мерное пространство полиномиальных
fj(х), j = 1...m, признаков, называемое спрямляющим пространством. Явный
вид функций fj(х) выбирается адекватно решаемой задаче непосредственно
по обучающей выборке. В выходном слое расположены решающие
пороговые элементы (Р-элементы), каждый из которых "отвечает" за
распознавание одного из классов объектов.
1.2.3. применение нейронных сетей
Настройка нейронных сетей производится при помощи трех парадигм
обучения[7]:
 обучение «с учителем». При данном подходе считается, что для
каждого примера xn из обучающей выборки {xn} заранее известен
желаемый результат t ∈ {tn} работы нейронной сети. Это позволяет
эффективно корректировать веса сети. Примером обучения «с
учителем»
может
служить
процедура
обучения
персептрона.
Очевидным недостатком подобного подхода является то, что не всегда
имеется достаточное количество примеров «с ответами», а порой их и
вовсе невозможно получить.
 обучение «без учителя». Этот тип обучения предполагает, что
желаемые выходы сети не определены, и алгоритм обучения
нейронной сети подстраивает веса по своему усмотрению. Фактически
при этом нейронная сеть ищет закономерности в обучающих данных и
выполняет группирование схожих входных векторов по неявным
признакам.
Чаще
всего
этот
метод
используется
для
задач
классификации.
 обучение методом критики. Данный подход является фактически
промежуточным между первыми двумя. Предполагается, что имеется
возможность только оценивать правильность работы сети и указывать
желаемое направление обучения. Подобная ситуация часто встречается
в системах, связанных с оптимальным управлением. Подобная
нейронная сеть состоит из так называемых эгоистичных нейронов.
Процедура обучения таких нейронов поощряет каждый отдельный
нейрон
к
увеличению
только
собственной
«награды»,
а
не
производительности всей сети.
Нейронные сети могут быть применены для решения следующих
задач[11]:
 Распознавание образов и классификация. В качестве образов могут
выступать различные объекты: символы, изображения, образцы звуков.
 Принятие решений и управление.
 Кластеризация
 Прогнозирование
 Аппроксимация
 Сжатие данных и ассоциативная память
В общем случае при применении нейронных сетей выделяют несколько
этапов решения задачи[11]:
1. Сбор данных для обучения;
2. Подготовка и нормализация данных;
3. Выбор топологии сети;
4. Экспериментальный подбор характеристик сети;
5. Экспериментальный подбор параметров обучения;
6. Собственно обучение;
7. Проверка адекватности обучения;
8. Корректировка параметров, окончательное обучение;
ВЫВОДЫ ПО ГЛАВЕ 1
1. Автоматное
программирование
–
парадигма
программирования,
предназначенная для проектирования систем со сложным поведением
в терминах состояний, переходов, входных и выходных воздействий.
Этот подход имеет ряд достоинств и подходит для создания
реактивных систем.
2. Вычислительные системы, основанные на нейронных сетях, обладают
рядом
качеств,
таких
как:
распределенность
представления
информации и вычислений, спобность к обучению и обобщению,
адаптивность.
2. ИСПОЛЬЗОВАНИЕ НЕЙРОННЫХ СЕТЕЙ В АВТОМАТАХ
Искусственный интеллект – одна из наиболее важных теоретических и
прикладных областей информатики. Существует широкий спектр приемов и
подходов для создания элементов искусственного интеллекта в прикладных
программах и управляющих системах реального времени.
Наиболее широкое развитие в этой области получили нейронные сети и
генетические алгоритмы. Особо отметим класс нейронных сетей с
возможностью самообучения. Однако их применение зависит от предметной
области,
и они
выступают в роли
специальных
объектов, задача
взаимодействия с которыми возлагается на дополнительные средства и
компоненты программы.
В то же время, существует парадигма автоматного программирования,
которая позволяет формализовать поведение программы за счет выделения
состояний и переходов между ними. В настоящей главе представляется
несколько известных способов совместного использования нейронных сетей
и автоматов.
2.1. Нейронная сеть – источник управляющего воздействия.
Этот метод совместного применения конечных автоматов и нейронных
сетей был предложен в работах [12]. При использовании этого метода для
управления системой со сложным поведением предлагается совместно
применять нейронную сеть и конечный автомат, которые совместно строятся
генетическим алгоритмом.
При этом нейронная сеть используется для классификации значений
вещественных входных переменных и выработки входных логических
переменных для автомата, а автомат – для выработки выходных воздействий
на систему со сложным поведением (рис. 6).
Числовые или
логические
входные
переменные
Внешняя
среда
Логические
переменные
Нейронная
сеть
Выходные
воздействия
Конечный
автомат
Система со
сложным
поведением
Рис. 6. Структурная схема системы управления
Стоит отметить что в данном случае нейронная сеть является
единственным источником воздействия для автомата. Указанный метод
применялся для построения конечно автомата управления моделью
беспилотного летательного аппарата[12].
2.2. Автомат как источник входных данных для нейронной сети.
Этот метод совместного применения конечных автоматов и нейронных
сетей был предложен в работе [13] для решения задачи распознавания
динамических образов.
Типичная нейронная сеть может использоваться для распознавания
изображений. Цвет каждой из точек изображения передается на входы
входного слоя сети. При этом с помощью весовых
коэффициентов и
функции активации вычисляется вектор входных сигналов. Круг задач,
решаемых такой нейронной сетью, ограничен распознаванием статических
изображений (без учета предыстории изменений). Нейронная сеть вычисляет
результат по конкретному набору исходных данных, не учитывая динамику и
изменение этих данных.
В тех задачах, где требуется учитывать динамику процесса, в работе [13]
предлагается применять другие структуры, например, комбинацию
нейронной сети и набора конечных автоматов (рис.7).
Внешняя
среда
Автоматы
Нейронная
сеть
Рис. 7. Схема использования автоматов и нейронных сетей для
распознавания динамических образов
При помощи автоматов выделяются параметры, которые невозможно
измерить для одного конкретного входного образа, но которые видны при
обзоре всей динамики происходящих процессов. Эти параметры могут
обрабатываться нейронной сетью, которая на их основе может принимать
решения.
С каждой из точек входного изображения связан конечный автомат, на
который подаются события, определяемые изменениями, происходящими в
этой точке. Каждый автомат, в свою очередь, связан с нейронной сетью, на
входы которой он отправляется сигналы. Нейронная сеть, распознавая
различные конфигурации состоянии конечных автоматов, распознает
динамические образы. Одной из задач, которые может решать такая
структура, является отслеживание движения объекта.
2.3. Клеточные автоматы и нейронные сети.
Клеточным автоматом[14] называют сеть из элементов, меняющих свое
состояние в дискретные моменты времени в зависимости от состояния
самого элемента и его ближайших соседей в предшествующий момент
времени.
Различные
клеточные
автоматы
могут
демонстрировать
весьма
разнообразное поведение, которое может быть адаптировано для целей
обработки информации за счет выбора (а) закона изменения состояния
элемента и (б) конкретного определения понятия “ближайшие соседи”.
Нейронная сеть Хопфилда вполне может рассматриваться, как клеточный
автомат, элементами которого являются формальные нейроны [15]. В
качестве
пороговое
закона
изменения
преобразование
состояния
взвешенной
нейро-автомата
суммы
входов
используется
нейронов,
а
ближайшими соседями каждого элемента являются все прочие элементы
автомата.
Выводы по главе 2
1. Совместное применение автоматов и нейросетей служит для решения
различных задач, где с одной стороны есть система со сложным
поведением, а с другой есть необходимость использовать достоинства
нейронных сетей.
2. Рассмотрены ситуации, когда нейронная сеть является источником
входных воздействий для автомата и автомат является источником
входных данных для нейронной сети.
3. Рассмотрен способ создания нейронной сети с помощью клеточных
автоматов.
4. Для задач, в которых требуется использовать нейронную сеть в
автомате без создания и усложнения архитектуры автомата требуется
реализовывать частное решение. Данный вопрос будет подробно
рассмотрен в следующей главе.
3.
МЕТОД
ПОСТРОЕНИЯ
АВТОМАТНЫХ
ПРОГРАММ
С
ИСПОЛЬЗОВАНИЕМ РАСШИРЕННОГО СОСТОЯНИЯ
3.1. Автоматы и М-автоматы
Автоматы используются для реализации поведения систем со сложным
поведением. Поведение автомата определяется состояниями и заданными
переходами. Реакция автомата на входное воздействие зависит только от
входного воздействия и текущего состояния. Понятие входное воздействие
является одним из базовых для автоматного программирования. Чаще всего
входное воздействие – это вектор. Его компоненты подразделяются на
управляющие воздействия (события) и входные переменные. Автомат,
получая входное воздействие, обрабатывает его и формирует выходные
воздействия. Правила формирования выходных воздействий называют
функцией выходов автомата. Правила, по которым происходит смена
состояний, называют функцией переходов автомата. Понятие автомата,
используемое в автоматном программировании, представлено на рис. 8.
Состояние
Функция
переходов
Выходное
воздействие
Функция
выходов
Входное
воздействие
Рис. 8. Автомат в автоматном программировании
В качестве примера использования автоматов на рис. 9 показан граф
переходов
автомата
пользователя в системе.
AdvancedUser[5],
реализующего
регистрацию
AdvancedUser
Activation
Delete
Suspended
Active
Pending enter
mac
Unsuspended
Deleted
Activate
Captcha
Blocked
Activate
Remove
Actived enter
DA
Deleted
Activate
Registered
Рис. 9. Автомат регистрации пользователей
Этот автомат состоит из нескольких состояний и групп состояний.
Каждому состоянию пользователя соответствует состояние автомата.
Начальное состояние пользователя – Suspended, оно означает, что
пользователь не начал регистрироваться. По событию Unsuspended автомат
переходит в состояние Pending enter mac в группе состояний Activation и
пользователь вводит личную информацию. По событию Activate автомат
переходит в состояние Captcha в группе состояний Active и пользователь
вводит
контрольное
значений
для
предотвращения
автоматической
регистрации. По событию Activate автомат переходит в состояние Actived
enter DA, которое означает, что пользователь должен подтвердить свои
данные.
По событию Activate автомат переходит в состояние Registered,
которое означает, что пользователь зарегистрирован.
После того, как автомат перешел в одно из состояний группы Activation,
администратор системы может заблокировать пользователя. По событию
Delete автомат перейдет в состояние Blocked в группе Deleted. По событию
Remove автомат переходит в состояние Deleted и все данные пользователя
будут удалены из системы.
Парадигма автоматного программирования включает в себя методику
разработки спецификации и описания разработанных автоматов, что делает
ее удобной для создания систем со сложным поведением.
Автоматная программа обычно реализует некоторое поведение, которое
заранее определено программистом и является решением поставленной
задачи.
В свою очередь – принятие решений – это процесс, который можно
описать. Принятие решений производится на основе не только условий и
внешних событий, но и оценки значений различных переменных. Часто
невозможно заранее просчитать все комбинации значений переменных и
четко определить зависимость принимаемого решения от них.
Для подобных задач в работе [16] было предложено использовать
автоматы мышления, они же М-автоматы. Идея их применения состоит в
том, что принятие решения происходит в ходе размышления – прохождения
определенного пути в автомате. Каждый участок этого пути выделяется в
отдельное интеллектуальное состояние, которое оценивает определенный
фактор и влияет на процесс размышления.
Каждое
состояние
в
М-автомате
обладает
соответствующими
свойствами, присущими определенному чувству или шагу в размышлении.
Из каждого состояния М-автомата существуют переходы в некоторые
другие состояния. Эти переходы задаются программистом на этапе
проектирования.
В работе [16] описываются возможные методы для управления процессом
принятия решений в М-автоматах: алгоритмы, управляемые задаваемыми
параметрами, логические выражения и т. д. Однако конкретная реализация
автоматов в этой работе не приведена.
3.2. Использование нейронных сетей в состояниях автомата
Идея
М-автоматов
может
быть
использована
в
автоматном
программировании для создания блока принятия решений. Блок принятия
решений – это состояния и переходы между ними, созданные для решения
какой-либо задачи. Авторами настоящей работы предлагается использовать
нейронные сети при реализации состояний в блоке принятия решений и, тем
самым, создания искусственного интеллекта в автомате. Блок принятия
решений в этом случае будет представлять собой совокупность переходов и
состояний, содержащих небольшие нейронные сети, каждая из которых
будет отвечать за оценку значений определенных переменных.
Для реализации описанного подхода предлагается дополнить набор
компонент
графов
переходов
автоматов
расширенным
состоянием,
содержащим нейронную сеть. Такие состояния в графах переходов будем
выделять пунктиром, с обозначением нейронной сети или без.
Для того чтобы показать как организовать работу с нейронной сетью в
автомате рассмотрим пример многослойного персептрона [7] (рис. 10).
Y1
YM
Выходной слой
...
X’’N2
X’’1
Скрытый слой
...
X’1
X’N1
Входной слой
...
X1
XN
Рис 10. Многослойный персептрон
Чтобы организовать работу с нейронной сетью необходимо подать
входные данные X1..XN, а также совершить воздействие не нейронную сеть,
чтобы получить выходные данные Y1..YM.
Как было указано выше, входное воздействие автомата часто состоит из
управляющего воздействия и входных данных. Эти входные данные можно
сохранить в контексте автомата и использовать их как входные данные
для нейронной сети. Контекст автомата – это переменные, используемые в
работе автомата для хранения различной информации. Также было отмечено,
что автомат совершает выходное воздействие на управляемый объект.
Очевидно, что для управления нейронной сетью автомат должен совершить
воздействие и на нее, но при этом воздействие не будет являться выходным
для автомата, поскольку нейронная сеть является частью его состояния (рис.
11).
Состояние
Функция
управления НС
Функция
переходов
Воздействие
на НС
Функция
выходов
Выходное
воздействие
НС
Входные данные
Управляющее
воздействие
Входное
воздействие
Рис. 11. Воздействие на нейронную сеть
Функция управления нейронными сетями – это правила совершения
воздействия на нейронную сеть.
Предлагается совершать такое воздействие при входе в расширенное
состояние (рис 12).
1
2
Управляющее
воздействие S
A
3
Входное
воздействие
Входные данные
X1 , X2 , X 3
4
B
Y1
X1
X2
S
НС
X3
Y2
Y3
Рис 12. Воздействие на нейронную сеть при входе в состояние
На рис. 12 цифрами обозначена последовательность обработки входного
воздействия автоматом.
1) Автомат находится в состоянии А.
2) Подается входное воздействие, состоящее из управляющего
воздействия S и входных данных X1, X2, X3.
3) По управляющему воздействию S срабатывает переход из состояния A
в расширенное состояние B.
4) При входе в расширенное состояние B входные данные X1, X2, X3
подаются на вход нейронной сети, и осуществляется воздействие на
сеть.
Таким образом, после воздействия на нейронную сеть мы получим
выходные значения (Y1, Y2, Y3), которые являются результатом работы сети.
В терминах М–автоматов это будет являться решением отдельного
интеллектуального состояния. Для того чтобы построить путь размышления
и заставить автомат переходить от одного расширенного состояния в другое
предлагается использовать результаты работы сети как источник нового
управляющего воздействия на автомат (рис. 13).
Состояние
Функция
управления НС
Воздействие
на НС
Результат
Функция
переходов
Выходное
воздействие
Функция
выходов
НС
Управляющее воздействие
Управляющее
воздействие
Входные данные
Входное
воздействие
Рис. 13. Использование результатов работы сети
Входные данные могут быть сохранены в контексте автомата – это
позволит автомату перейти в новое состояние, не потеряв входные данные.
Эти данные могут быть использованы повторно другими расширенными
состояниями (рис. 14).
2
Управляющее
воздействие S
Входное
воздействие
Контекст
1
Входные данные
X1 , X2 , X3 , X4 , X 5
A
3
S
5
Управляющее
воздействие Y1
4
B
Y1
X1
X2
X3
НС
7
6
Y1
Y1
X4
НС
Y2
Y3
C
X5
Y2
Рис. 14. Пример использования результатов работы нейронной сети
На рис. 14 цифрами обозначена последовательность обработки входного
воздействия:
1) Автомат находится в состоянии A.
2) На вход подается входное воздействие, состоящее из управляющего
воздействия S и входных данных X1, X2, X3, X4, X5. Входные данные
сохраняются в контексте автомата.
3) По управляющему воздействию S срабатывает переход из состояния A
в расширенное состояние B.
4) При входе в расширенное состояние B входные данные X1, X2, X3
подаются на вход нейронной сети, и осуществляется воздействие на
сеть. В результате работы выходное значение сети Y1 стало равно
единице.
5) Выходное значение нейронной сети в состоянии B используется для
генерации нового управляющего воздействия Y1.
6) По управляющему воздействию Y1 срабатывает переход из
расширенного состояния B в расширенное состояние C.
7) На вход нейронной сети в состоянии C подаются входные данные X4,
X5, которые хранятся в контексте автомата. Совершается воздействие
на нейронную сеть.
Может возникнуть ситуация, когда все значения выходов Y1, Y2, Y3 равны
нулю. Это означает, что сеть не смогла принять решения – что тоже является
результатом. В данном случае мы можем использовать такой результат как
источник нового управляющего воздействия, например сигнала Unknown.
Стоит отметить, что входные воздействия автомата, обозначенные как Y1,
Y2, Y3 могут усложнить структуру состояний и переходов автомата, сделав ее
нечитаемой. Для устранения этого недостатка предлагается использовать
осмысленные значения для названий выходных значений сети, например, для
нейронной
сети,
которая
определяет
направление
движения
можно
использовать слова «Юг», «Север», «Запад», «Восток». Тогда вместо Y1, Y2,
Y3, Y4 после работы сети будут генерироваться сигналы с названиями сторон
света.
При применении предложенного подхода появляется возможность
реализовать априори неопределенную логику переходов. На рис. 15
представлена схема автомата Robot, использующего расширенные состояния
для управления роботом, который может шагнуть или прыгнуть вперед.
Robot
Not enough
power
Waiting
Unknown
Detecting
power
Not ready
Enough
power
Think
Unknown
Unknown
Detecting state
Detecting pit
Ready
Jump
Jumping
Step
Walking
Рис. 15. Автомат с расширенными состояниями
Автомат содержит несколько простых состояний: Waiting – ожидание
команды, Jumping – прыгать, Walking – шагать.
Следующие его состояния являются расширенными. В них определяется:
готов ли робот к действиям (Detecting state), достаточно ли у него энергии
для выполнения срочных действий (Detecting power) и есть ли перед ним яма
(Detecting pit).
Блок принятия решений этого автомата является неотъемлемой частью
автомата и представлен на рис. 16.
Robot
Not enough
power
Unknown
Detecting
power
Not ready
Enough
power
Think
Unknown
Unknown
Detecting state
Detecting pit
Ready
Jump
Step
Рис. 16. Блок принятия решений автомата Robot
Переходы (см. рис. 16) соединяют расширенные состояния между собой и
с другими состояниями. Переходы из расширенных состояний срабатывают в
результате работы нейронной сети. Так, автомат в состоянии Waiting
получает событие Think и переходит в расширенное состояние Detecting
State. После работы нейросети состояния Detecting state автомат может
оказаться в других расширенных состояниях: Detecting pit (по событию
Ready) или Detecting power (по событию Not ready). После работы нейронной
сети в состоянии Detecting power автомат может оказаться в состоянии
Waiting (по событию Not enough power) и ожидать следующего события
Think, или перейти в другое расширенное состояние Detecting pit (по
событию Enough Power). Из состояния Detecting pit автомат может перейти в
простые состояния Jumping (по событию Jump) или Walking (по событию
Step).
3.3. Реализация
Для объектно-ориентированной реализации автоматного подхода в работе
[17] была разработана библиотека. Ее достоинством является простота
создания автоматов на языке Java. Библиотека предоставляет также средства
для представления разработанных автоматов в виде графов переходов по
тексту программы.
Для реализации расширенных состояний в эту библиотеку введен класс
NState, который, в свою очередь, использует библиотеку SNeuro [18].
Последняя предоставляет базовые интерфейсы и реализует несколько типов
нейронных сетей.
Для создания экземпляра расширенного состояния необходимо наряду с
его именем передать в конструктор дополнительные параметры: размерность
вектора входных данных, количество и названия выходов нейронной сети,
набор данных (входные и выходные значения) для ее обучения. Нейронная
сеть
будет
создана
и
обучена
при
создании
объекта
программы,
соответствующего этому состоянию.
Как отмечалось выше, воздействие на нейронную сеть осуществляется
при входе в состояние (см. рис. 11, 12). При входе в расширенное состояние,
экземпляр класса NState считывает входные данные из контекста и подает их
на вход в нейронную сеть (см. рис. 13, 14). После этого осуществляется
воздействие на нейронную сеть (расчет выходных значений), а полученные
выходные значения используются для генерации нового управляющего
воздействия на автомат.
Важным моментом предлагаемой реализации является то, что параметры
нейронных сетей в состояниях могут быть откорректированы в процессе
работы автомата.
Перед генерацией нового управляющего воздействия экземпляр класса
NState (расширенное состояние) сохраняет свое название, входные данные и
выходные значения нейронной сети в специальной области памяти,
реализованной в библиотеке и названной «памятью размышлений автомата».
Вызывая функцию correction, которая реализована в базовом классе DSL из
библиотеки, описанной в работе [17], можно провести коррекцию нейронных
сетей всех расширенных состояний, участвовавших в последнем принятии
решений. Это предоставляет дополнительные возможности для обеспечения
настройки автомата, так как логику срабатывания переходов можно изменить
в процессе работы.
3.4. Применение расширенных состояний
Использование расширенных состояний возможно в задачах, для решения
которых применимы нейронные сети, применяемые в этих состояниях. Это
может
быть
анализ
входных
данных,
распознавание
образов
или
предсказание значений. Также расширенные состояния можно использовать
в задачах, где в зависимости от входных значений необходимо принять одно
из нескольких решений или произвести кластеризацию данных [18].
Для того чтобы решить задачу с помощью нейронной сети, необходимо
собрать и подготовить данные для обучения, выбрать топологию сети и ее
характеристики, обучить сеть и сделать корректировку параметров обучения.
Можно
сформулировать
алгоритм,
основанный
на
применении
расширенных состояний.
1. Определение структуры блока принятия решений (как показано,
например, на рис. 15, 16).
2. Создание графа переходов автомата с использованием расширенных
состояний для блока принятия решений.
3. Выбор топологии нейронной сети, используемой в расширенном
состоянии.
4. Сбор и подготовка данных для обучения.
5. Обучение нейронных сетей расширенных состояний.
6. Определение правил корректировки характеристик сети в процессе
работы автомата.
7. Проверка адекватности обучения и правил корректировки во время
тестирования.
Выполняя эти действия последовательно, можно получить автомат,
решающий поставленную задачу.
3.5. Пример использования. Автомат управления ежом.
Для демонстрации применения расширенных состояний реализуется
автомат для решения следующей задачи. Автомат управляет поведением ежа,
который идет по прямой и на каждом шагу находит еду, тратя на шаг пять
единиц энергии. Еда может быть ядовита (энергия уменьшается на 40
единиц), а может быть полезна (энергия увеличивается на 10, 20 или 40
единиц). Еж не должен есть ядовитую еду. Когда он «наедается» и его
энергия становится больше 100 единиц, он не должен еду есть. Собственная
энергия ежа имеет начальное значение 30 и хранится в контексте автомата.
Еж делает шаг, ест или пропускает еду и делает следующий шаг.
Порядок работы с автоматом такой: сначала обновляется контекст
автомата и подаются входное значение (значение энергии еды), потом
подается сигнал Think и автомат принимает решение – съесть еду, или
пропустить и совершает выбранное действие. Далее поступает сигнал Step,
еж делает шаг и тратит энергию. Затем снова обновляется контекст автомата
и так далее.
Согласно описанному выше методу проектируется автомат:
1. Определение структуры блока принятия решений. Для того чтобы
принять решение, съесть еду или нет, требуется определить яд это или нет.
Для этого нужно расширенное состояние Detect Good_Bad, которое
определит впереди яд или полезная еда. Также нужно установить, наелся еж
или нет, в том случае, если он нашел не яд. Для этого будет использоваться
расширенное состояние Detect Need_Food. Блок принятия решений будет
состоять из двух расширенных состояний и нескольких переходов (рис. 17).
Hedgehog
Think
Unknown
Detect
Good_Bad
Bad
Good
Unknown
Detect
Need_Food
No
Yes
Рис. 17. Блок принятия решений
В состояние Detect Good_Bad автомат перейдет из другого состояния по
событию Think. Из этого расширенного состояния по событию Bad автомат
выйдет из блока принятия решений и перейдет в другое состояние. По
событию Good автомат перейдет в расширенное состояние Detect Need_Food.
Из него, по событиям No и Yes автомат перейдет в другие состояния.
2. Создание графа переходов автомата с использованием расширенных
состояний для блока принятия решений. В процессе работы еж должен не
только понимать, что делать с едой, но и совершать действия: ждать команду,
есть еду, пропустить еду. Зная структуру блока принятия решений (см. рис.
17) и действия, которые должен совершать еж, построим граф переходов
(рис. 18).
Hedgehog
Wait
Step
Think
Actions
Unknown
Detect
Good_Bad
Bad
Skip
Good
Unknown
Detect
Need_Food
No
Eat
Yes
Рис. 18. Граф переходов автомата управления ежа
Блок принятия решений дополнен состоянием Wait – еж ждет команду
сделать шаг. Для выполнения ежом действий была создана группа состояний
Actions, содержащая состояния Skip – пропустить и Eat – съесть еду. По
событию Step автомат перейдет из состояния в группе Actions в состояние
Wait, а по событию Think автомат перейдет в расширенное состояние Detect
Good_Bad.
3. Выбор топологии нейронной сети, используемой в расширенном
состоянии. Расширенные состояния используют однослойные нейронные
сети, являющиеся сетями Кохонена [7][19]. Эти нейронные сети позволят
принять решение в зависимости от нескольких входных данных и их можно
обучать.
Входные данные перемножаются с коэффициентами узлов сети.
Полученные выходные значения обрабатываются по правилу «победитель
забирает все»: наибольшее значение превращается в единичное, остальные
обращаются в ноль.
Входными значениями для нейронных сетей расширенных состояний
блока принятия решений (см рис. 17) являются значения собственной
энергии и значение энергии ежа. Выходные значения по описанному выше
правилу равны единице или нулю.
Выходные значения сети состояния Detect Good_Bad называются Good
(должно быть равно единице, когда еда не ядовитая) и Bad (должно быть
равно единице, когда еда ядовитая).
Выходные значения сети состояния Detect Need_Food называются Yes
(должно быть равно единице, когда еж может есть) и No (должно быть равно
единице, когда еж наелся и не должен есть).
Работа с нейронной сетью выполняется в классе NState. Экземпляр класса
NState создается следующим образом:
public NState GoodBad = new NState(
"Detect: Good_Bad",
2,
GoodBadEvents,
HungryTrainData.GoodBad());
4. Сбор и подготовка данных для обучения. Для того чтобы расширенные
состояния начали принимать правильные решения, необходимо обучить их
нейронные сети. Для этого требуется подготовить данные для обучения. Для
обучения нейронной сети состояния Detect Good_Bad, используются два
массива: для входных и выходных значений.
Каждый элемент массива входных значений – массив из двух элементов:
текущее значение энергии и энергия еды, которую встречает еж. Каждый
элемент массива выходных значений – это массив из двух элементов:
значения выходных значений сети, равные нулю или единице.
Входные данные:
double [][] inputs = {{10,-10}, {10,10}, {20,20}, {25,20},
{25,-12},{20,-4}, {25,-5}, {50,40}, {100,40}, {1,-100}, {12,40},{50,-40},{34,1}};
Выходные данные:
int [][] results =
{{0,1}, {1,0}, {1,0}, {1,0}, {0,1},
{0,1}, {0,1}, {1,0}, {1,0}, {0,1}, {0,1}, {0,1}, {1,0}};
В разделе «Реализация» было сказано, что в конструктор расширенного
состояния передается количество и названия выходных значений нейронной
сети. В данном случае используется следующий список:
String [] GoodBadEvents = {"Good", "Bad"};
Пара {0,1} означает, что второе выходное значение должно быть равно
единице и буден сгенерировано управляющее воздействие Bad. Используя
обученную сеть состояния Detect Good_Bad, еж сможет определять яд на
своем пути.
Для того чтобы обучить нейронную сеть состояния Detect Need_Food,
применяются массивы входных и выходных значений. Элементы массива
входных значений содержат текущее значение энергии и энергию еды.
Входные данные:
double [][] inputs = {{10,10}, {20,10}, {99,10}, {90,10},
{80,10}, {30,10}, {80,10}, {50,10}, {30,10}, {60,10}, {60,10},
{86,10}, {30,10}};
Выходные данные:
int [][] results = {{1,0}, {1,0}, {0,1}, {0,1}, {0,1}, {1,0},
{0,1}, {1,0}, {1,0}, {0,1}, {1,0}, {0,1}, {1,0}};
Список названий входных значений:
String [] enoughEvents = {"Yes", "No"};
Пара {0,1} означает, что второе выходное значение должно быть равно
единице и будет сгенерировано управляющее воздействие No. Используя эту
сеть, еж определит: может ли он есть еду.
5. Обучение нейронных сетей. В пункте «Реализация» указано, что
нейронная сеть обучится автоматически при создании экземпляра класса,
поскольку алгоритм обучения нейронной сети реализован в классах пакета
SNeuro.
Для проверки того, что нейронная сеть обучена, существуют специальные
переменные, которые позволяют узнать состояние сети.
6. Определение правил корректировки характеристик сети в процессе
работы автомата. При решении данной задачи не используются правила
корректировки сетей во время работы автомата, так как данные для обучения
позволяют предусмотреть различные комбинации значений переменных
автомата и набор входных данных ограничен. Правила корректировки
следует использовать при большом наборе входных значений.
Для использования корректировки можно было бы добавить функцию на
переходе по входному воздействию Step , которая анализировала бы значение
энергии ежа. В случае, если энергия ежа стала больше 100 – можно вызывать
функцию correction и будет произведена корректировка нейронных сетей
таким же методом, как и при первоначальном обучений, с условием, что
принятое решение – ошибочно и нужно соответствующим образом поменять
значения узлов сети.
7. Проверка адекватности обучения и правил корректировки во время
тестирования. Для проверки адекватности обучения нейронной сети после
создания
расширенных
состояний
вызываются
функции
проверки
адекватности обучения, которые прогоняют данные, использованные при
обучении, и считают количество допущенных ошибок в вычислении
выходных значений.
Sysytem.out.prinln(GoodBad.stateOfNN()); // печатает 0
Sysytem.out.prinln(enough.stateOfNN()); // печатает 0
Авторами было проведено тестирование разработанного автомата. До
обучения энергия ежа в конце пути была равна 30, а в результате обучения
она повысилась до 110. Это демонстрируется фрагментом протокола
поведения ежа с начальным значением энергии, равным 30. Протокол
состоит из трех столбцов, читаемых последовательно:
Food: (10.0)
Think
Good
Yes
Eating (10.0)
Step
Weight is 35.0
Bad
Skip
Step
Weight is 80.0
Food: (10.0)
Think
Good
Step
Weight is 125.0
Food: (-40.0)
Think
Bad
Skip
Step
Food: (20.0)
Think
Good
Yes
Eating (20.0)
Step
Weight is 50.0
Food: (40.0)
Think
Good
Yes
Eating (40.0)
Step
Weight is 85.0
Food: (-40.0)
Think
No
Skip
Step
Weight is 75.0
Food: (20.0)
Think
Good
Yes
Eating (20.0)
Step
Weight is 90.0
Food: (40.0)
Think
Good
Yes
Eating (40.0)
Weight is 120.0
Food: (10.0)
Think
Good
No
Skip
Step
Weight is 115.0
Food: (20.0)
Think
Good
No
Skip
Step
Weight is 110.0
Result is 110.0
Из протокола следует, что сначала обновляется контекст автомата –
добавляется еда, как и обозначено в постановке задачи. Далее подается
входное воздействие Think и автомат начинает «думать». В результате он
попадает в одно из простых состояний группы Actions (см. рис. 18).
Ниже представлен исходный код автомата, используемого в примере:
public class Hungry extends DSL{
public State wait = new State("Wait");
String [] GoodBadEvents = {"Good", "Bad"};
String [] enoughEvents = {"Yes", "No"};
public NState GoodBad = new NState(
"Detect: Good_Bad",
2,
GoodBadEvents,
HungryTrainData.GoodBad());
public NState enough = new NState(
"Detect: Need Food",
2,
enoughEvents,
HungryTrainData.enough());
// Переходы
public Transition think = new Transition(
"think", "THINK", wait, GoodBad);
public Transition Good = new Transition(
"Good", "GOOD", GoodBad, enough);
public Transition poison, bad, eat, step;
public StateGroup actions = new StateGroup("Actions");
public Hungry () {
GoodBad.brain.train(HungryTrainData.GoodBad());
enough.brain.train(HungryTrainData.enough());
Vector <Entity> sig = new Vector <Entity> ();
// Создание состояний skip, eating.
// …
// Создание переходов
poison = new Transition("Poison", "Bad", GoodBad, skip);
// Создание переходов bad, eat, step
// …
}
}
3.6. Пример использования. Автомат управления роботом-исследователем.
// Описание примера с автоматом Explorer
Выводы по главе 3.
Заключение.
ИСТОЧНИКИ
1. Хопкрофт Дж., Мотвани Р., Ульман Дж. Введение в теорию
автоматов, языков и вычислений. М.:Вильямс, 2002.
2. Непейвода Н.Н. Стили и методы программирования. М.: Интернетуниверситет информационных технологий, 2005.
3. Поликарпова Н.И., Шалыто А.А. Автоматное программирование.
СПб: Питер, 2009.
4. Царев Ф.Н. Разработка метода совместного применения генетического
программирования и конечных автоматов на примере игры «Летающие
тарелки». СПбГУ ИТМО. Бакалаврская работа. 2007.
5. Шалыто
А.А.
Switch-технология.
Алгоритмизация
и
программирование задач логического управления. СПб: Наука, 1998.
6. Агафонов К.А., Порох Д.С., Шалыто А.А. Реализация протокола
«SMTP» на основе SWITCH-технологии. Проектная документация.
http://is.ifmo.ru/projects/smtp/
7. Аксенов С.В., Новосельцев В.Б. Организация и использование
нейронных сетей (методы и технологии).Томск: Издательство НаучноТехничсеской литературы, 2006.
8. Розенблатт Ф. Принципы нейродинамики. Персептрон и теория
механизмов мозга. М.:Мир, 1965.
9. Минский М., Пайперт С. Персептроны. М.: Мир, 1971.
10.Дюк В., Самойленко А. "Data Mining: учебный курс", СПб: Питер,
2001. http://masters.donntu.edu.ua/2004/fvti/solomka/library/ist3.htm
11.Круглов В. В., Борисов В.В. Искусственные нейронные сети. Теория и
практика. М.: Горячая линия - Телеком, 2001.
12.Царев.
Ф.Н.
Совместное
применение
генетического
программирования, конечных автоматов и искусственных нейронных
сетей для построения системы управления беспилотным летательным
аппаратом. //Научно-Технический вестник СПбГУ ИТМО. Выпуск 53.
Автоматное программирование, с. 42-60.
13.Первушин Е.В. Применение конечных автоматов для улучшения
характеристик
нейроподобных
сетей.
СПбГУ
ИТМО.
2007.
http://is.ifmo.ru/projects/11-08-2007_pervushin_neural/
14.Тоффоли Т., Марголус Н. Машины клеточных автоматов. М.:Мир
1991
15.Терехов. С.А. Лекции по теории и приложениям искусственных
нейронных сетей. http://alife.narod.ru/lectures/neural/Neu_index.htm
16.Амосов Н. М., Касаткин А. М., Касаткина Л. М., Талаев С. А.
Автоматы и разумное поведение. Опыт моделирования. Киев: Наукова
думка, 1973.
17.Gubin Y., Timofeev K., Shalyto A. Creation of Automaton Classes from
Graphical Models and Automatic Solution for Inverse Problem /SYRCoSE.
M.: 2009.
18.Библиотека
для
создания
neuro.googlecode.com/svn/trunk
19.http://ru.wikipedia.org/wiki/Сеть_Кохонена
нейросетей.
https://java-
Download