Текст
                    Министерство образования Российской Федерации
Ивановский государственный энергетический университет
Лаборатория быстрых алгоритмов Российской академии наук
Московский государственный университет коммерции
Ивановский филиал
Ивановская государственная текстильная академия
С.Г. Сидоров, Л.П. Чернышева,
Б.Л. Ершов, Ф.Н. Ясинский
НЕЙРОКОМПЬЮТЕРЫ
Устройство,
Работа,
Моделирование на ПК
Методические указания
Иваново 2002

Министерство образования Российской Федерации Ивановский государственный энергетический университет Лаборатория быстрых алгоритмов Российской академии наук Московский государственный университет коммерции Ивановский филиал Ивановская государственная текстильная академия С.Г. Сидоров, Л.П. Чернышева, Б.Л. Ершов, Ф.Н. Ясинский НЕЙРОКОМПЬЮТЕРЫ Устройство, Работа, Моделирование на ПК Методические указания Иваново 2002
Составители: С.Г.Сидоров, Л.П. Чернышева, Б.Л.Ершов, Ф.Н.Ясинский Редактор Н.А. Коробов Издание будет полезно студентам и аспирантам, обучающимся по специальностям, связанным с разработкой и применением вычислительных и информационных систем. Утверждено цикловой методической комиссией Рецензент кандидат технических наук, доцент К.А. Харахнин
Оглавление Введение.........................................................4 Строение головного мозга человека................................5 Строение нейрокомпьютера.........................................7 Работа нейрокомпьютера...........................................8 Моделирование нейрокомпьютеров на персональном компьютере.......10 Обучение нейрокомпьютера распознаванию образов................10 Обучение нейрокомпьютера прогнозированию......................13 Заключение......................................................17 Библиографический список........................................17 Приложения......................................................18 Приложение!. Программа обучения нейрокомпьютера распознаванию образов.........................................18 Приложение 2. Программа обучения нейрокомпьютера прогнозированию состояния струны..............................21 3
Введение В настоящее время резко возрастает интерес к нейрокомпьютерам и нейрокомпьютерным системам. Более того, упомянутые системы выходят за пределы исследовательских лабораторий и начинают внедряться в промышленных масштабах. Например, в 2000 г. в периодической печати появилось сообщение о начале выпуска одной из японских фирм комплекта микросхем, ориентированных на построение нейрокомпьютерных систем обработки информации для автомобильной промышленности. Интерес к нейрокомпьютерным системам обусловлен тем, что в основе алгоритма их работы лежит модель деятельности человеческого мозга. Таким образом, нейрокомпьютеры являются системами искусственного интеллекта. В отличие от обычных вычислительных систем (в шутку называемых "числогрызами"), нейрокомпьютерные системы приспособлены к самообучению и решению задач в условиях неопределенности. Благодаря этому упомянутые системы могут решать такие сложные задачи, как распознавание образов, прогнозирование наступления различных вероятных событий, подбор эмпирических зависимостей, описывающих функциональную связь числовых рядов в условиях невозможности построения математической модели объекта или процесса. Конечно, элементы систем искусственного интеллекта моделировались и на обычных вычислительных системах. Например, не представляет принципиальной сложности введение в программу алгоритма адаптации работы программы к конкретным условиям. Известны такие системы искусственного интеллекта, как экспертные системы, которые построены на языках логического программирования LISP и PROLOG. Они способны не только обрабатывать информацию самых разных типов и по самым разнообразным алгоритмам, но и давать истолкование полученных результатов. Нейрокомпьютерные системы, являясь принципиально системами искусственного интеллекта и моделируя прохождение информации в головном мозге человека, идеально приспособлены к решению указанных выше задач. Развитие средств вычислительной техники, особенно параллельных вычислительных систем, к концу 90-х гг. сделало возможным не только подробное исследование нейрокомпьютерных систем, но и их широкое применение на рабочих местах. К сожалению, доступной литературы по этой тематике явно недостаточно. Это издание является попыткой частично восполнить существующий пробел. 4
Нейрокомпьютеры моделируют работу нервной системы. Поэтому для понимания принципов их устройства и работы необходимо иметь некоторое представление о строении головного мозга человека. После рассмотрения строения мозга будет показана реализация описанной модели техническими средствами. Строение головного мозга человека Мозг является важнейшим элементом тела человека. Он обрабатывает информацию и управляет работой всех остальных органов. Потребляя мощность около 20 Вт, мозг с энергетической точки зрения невероятно эффективен. В мозговой ткани можно выделить две основные группы клеток - нервные (нейроны) и глиальные. Нейроны осуществляют передачу и обработку информации, глиальные клетки обеспечивают нейронам опору и питание. Нейроны очень мелки и редко достигают в поперечнике одной тысячной доли миллиметра. Одни из них шарообразны, другие яйцевидны, третьи пирамидальны. В коре головного мозга их насчитывается около 1011. Фрагмент схемы строения нервной системы показан на рис.1. Видны две нервные клетки (нейроны), от них отходят короткие (дендриты) и длинные (аксоны) отростки, которые сильно ветвятся. Аксон у нервной клетки бывает только один, и у него ветвится только кончик. Длина дендрита обычно менее тысячной доли миллиметра. Аксоны по сравнению с ними являются гигантами длиной от 0,1 мм до 1 м. На рисунке показана точка соединения аксона и дендрита, называемая синапсом. Дендрит Аксон Синапс Тело I клетки -J Аксон Рис. 1. Фрагмент схемы строения нервной системы Внешняя мембрана клетки нейрона имеет уникальную способность генерировать нервные импульсы (потенциалы действия). Эти импульсы 5
являются продуктом деятельности нервной системы и основой ее вычислительных способностей. Отростки предназначены обеспечивать связь между нейронами. Нервная клетка посылает сообщение с помощью аксона, используя его как проводник. Аксоны вступают в синаптический контакт (через синапс) с телами нервных клеток и с их дендритами. Всего один нейрон может генерировать импульс, который высвобождает или затормаживает сотни или тысячи других нейронов, каждый из которых, в свою очередь, может воздействовать на сотни или тысячи других нейронов. Таким образом, эта высокая степень связанности (в мозге человека приблизительно 1014-1015 связей), а не функциональная сложность самого нейрона, обеспечивает нейрону его вычислительную мощность. Мозг человека получает информацию от внешних и внутренних рецепторов. Информация рецепторных клеток адресуется периферическим нейронам. Отростки рецепторных клеток направляются к этим нейронам и по пути ветвятся. В свою очередь каждый из них посылает свой аксон в мозг к нейронам следующего звена. Так от звена к звену передается в мозгу информация рецепторных клеток, пока не достигнет исполнительных нейронов и не превратится с их помощью в команды мышцам и железам. На рис.2 показано направление потока информации, поступающей от рецепторных клеток (А), вплоть до формирования команд мотонейронам (М) и направления их мышцам (Н). Б, В, ..., Л - нейроны промежуточных звеньев. В настоящее время известно лишь кое-что о первых этапах обработки информации (Б, В) и о ее конечных этапах (Л), предшествующих формированию команд мотонейронами. О том, что происходит на остальных промежуточных этапах обработки информации, почти ничего неизвестно. 6
Строение нейрокомпьютера Нейронные вычислительные системы моделируют процесс передачи информации, характерный для нервной системы человека. Важнейшим элементом нейронной вычислительной системы является устройство распознавания образов - перцептрон (рис.З). Перцептрон состоит из трех слоев нейроклеток: R - слой рецепторов, А - слой ассоциативных клеток, Е - слой эффекторных клеток. Клетки слоя R имеют связи с клетками слоя А. Эти связи носят самый разнообразный характер. Из одной клетки слоя R может выходить несколько связей к слою А, в одну клетку слоя А может приходить несколько связей от клеток слоя R. Сигналы, пришедшие в одну ассоциативную клетку, суммируются. Клетки слоя А связаны с клетками эффекторного слоя. Сигналы от ассоциативных клеток приходят на клетки эффекторного слоя. Регулируя "проводимость" Gjj каналов связи от ассоциативных клеток к эффекторным, можно изменять весовые коэффициенты, с которыми эффекторные клетки суммируют сигналы, пришедшие от нескольких ассоциативных. Таким образом, регулируя весовые коэффициенты, можно усиливать или ослаблять те или иные информационные связи. На слое R формируется образ, предлагаемый перцептрону для распознавания. Слой эффекторных клеток Е служит для получения ответа от перцептрона о распознаваемом образе. Сравнивая рисунки 2 и 3, можно увидеть некоторое сходство в организации нейросетей головного мозга и устройства для распознавания 7
образов - перцептрона. В обоих случаях имеются рецепторные клетки (слой А на рис.2 и R на рис.З), ассоциативные клетки соответствуют периферическим нейронам и нейронам последующих звеньев (слои Б ... Л на рис.2), эффекторные клетки слоя Е (рис.З) соответствуют мотонейронам слоя М (рис.2), изображенных ромбами. Это сходство и дало название рассматриваемым вычислительным системам. Работа нейрокомпьютера Работу нейрокомпьютера рассмотрим на примере работы устройства для распознавания образов - перцептрона (рис.З). Образ, предназначенный для распознавания, формируется на клетках рецепторного слоя R. Те клетки, на которые падает образ, переходят в возбужденное состояние. При программировании на компьютере слои нейронных клеток можно описать массивами, состояние покоя клеток - нулевыми значениями элементов массивов, состояние возбуждения - какими- либо ненулевыми значениями (например 1). Клетки рецепторного слоя, перешедшие в возбужденное состояние, возбуждают те клетки ассоциативного слоя, с которыми у них установлены связи. Так как в одну клетку ассоциативного слоя могут приходить несколько сигналов от разных клеток рецепторного слоя, то одна и та же клетка может возбуждаться при различных условиях. По этой же причине в клетках ассоциативного слоя возбуждение носит накопительный характер, т.е. оно возрастает при увеличении числа сигналов, приходящих от рецепторного слоя. Для отбрасывания слабых сигналов вводят порог возбуждения ассоциативных клеток. Таким образом, клетки возбуждаются только при превышении некоторого порога, для чего необходимо возбуждение нескольких входных связей. Учитывая все вышесказанное, алгоритм работы ассоциативной клетки может быть описан следующими уравнениями: i=i (1 если Ur > 0 Uacc , вых [0 если ис < 0 (1) (2) где и, - входные сигналы от рецепторов, Uc - суммарный сигнал на входе ассоциативной клетки, 0 - пороговое значение, при превышении которого ассоциативная клетка возбудится. 8
Возбужденные клетки ассоциативного слоя возбуждают клетки эффекторного слоя, с которыми у них установлены связи. Сигналы нескольких ассоциативных клеток, связанных с одной клеткой эффекторного слоя, суммируются с разными весовыми коэффициентами, отражающими важность связи. Некоторые очень важные связи могут иметь достаточно большие весовые коэффициенты, коэффициенты ненужных связей стремятся к нулю. Стоит отметить, что связи могут быть как положительными (возбуждающими), так и отрицательными (тормозящими). Результат распознавания определяется значением всех просуммированных с учетом весовых коэффициентов сигналов от возбужденных нейронов: иа=£с,иг, i=l ггэфф = f1 если ив >0 ВЬ1Х (0 если UB < 0 (3) (4) где U?1'1’ - входные сигналы от ассоциативных клеток, G, - веса связей ассоциативных и эффекторных клеток, UB - суммарный сигнал на входе эффекторной клетки, Результат равный единице говорит о том, что эффекторная клетка возбуждена. Комбинация возбужденных эффекторных клеток позволяет классифицировать распознаваемый объект. Возможны и другие алгоритмы работы, в частности, при 0=0. В этом случае выражения (1), (2), (3) и (4) сведутся к (3) и (4), что в конечном итоге на клетке эффекторного слоя приведет к обычному суммированию сигналов рецепторов с учетом весовых коэффициентов. В этом случае нет смысла вводить рецепторные и ассоциативные клетки и модель такой системы примет вид, показанный на рис.4. Такие системы называются нейро динамическими. Рис.4. Схема нейродинамической системы 9
Моделирование нейрокомпьютеров на персональном компьютере Нейрокомпьютер является достаточно сложной вычислительной системой и, как всякое устройство подобного рода, нуждается в предварительной отладке алгоритмов обработки информации и программного обеспечения. Поэтому важным этапом разработки нейрокомпьютера является его моделирование с помощью уже отлаженных вычислительных систем, в том числе и обычных компьютеров. Моделирование нейрокомпьютеров на персональном компьютере рассмотрим на примере решения двух задач: распознавания образов и прогнозирования. Обучение нейрокомпьютера распознаванию образов Для простоты рассматривается процесс обучения распознаванию всего двух образов: крестика и нолика. Размеры образов и их местоположение на поле рецепторных клеток определяется случайным образом. Любой из образов на рецепторном слое занимает поле размером не менее 3x3 клеток. Задача моделирования - обучить нейронный компьютер распознавать случайно сформированный образ с достаточной степенью верности. Нейронная вычислительная система (рис.5) состоит из слоя рецепторных клеток R, слоя А, в котором моделируется уравнение (1), слоя А1, для моделирования уравнения (2) и одной эффекторной клетки Е для моделирования уравнений (3) и (4). Рис.5. Прохождение сигналов в распознающей нейросистеме Предполагается, что все слои имеют размерность NxN клеток, а каждая клетка рецепторного слоя имеет N связей с клетками ассоциативного слоя (на рис.5 для простоты принято N=2 и показаны все возможные связи только одной рецепторной клетки). Слоям клеток соответствуют двумерные массивы R, А, А1. Сведения о весовых коэффициентах помещены в двумерном массиве G, а сведения о связях - в трехмерном массиве S, содержащем двухкомпонентные записи. Компоненты L и С записи содержат соответственно 10
номера строки и столбца клетки ассоциативного слоя, на которую воздействует по связи с номером К рецепторная клетка, находящаяся в столбце С и строке L. Первый индекс этого массива определяет строку, второй - столбец, третий - номер связи. Например, если мы хотим узнать с какой клеткой ассоциативного слоя связана клетка рецепторного слоя с координатами 5,6 по третьей связи, то мы должны прочитать соответствующие значения S[5,6,3].L для строки и S[5,6,3].C для столбца. Кроме массивов в программе используются следующие переменные и константы: • (Print - это флаг, разрешающий вывод на экран содержимого матрицы рецепторов. В программе он включается (true) за 20 шагов до конца обучения, все остальное время он выключен (false), • Imax - максимальное число шагов обучения нейрокомпьютера, • nOk - счетчик правильных ответов, • die - тип образа в массиве рецепторов (1 - крестик, 0 - нолик), • dicl - то же, но результат распознавания образа, • Teta - порог возбуждения нейрона, • DeltaG - шаг изменения весовых коэффициентов в процессе обучения. Программа обучения нейрокомпьютера распознаванию образов приведена в прил. 1. Рассмотрим ее текст более подробно. Программа включает в себя ряд процедур и функций, выполняющих законченные в логическом отношении операции: • InitVar - инициализация значений переменных, • GenSv - инициализация связей рецепторных клеток (массив R) с ассоциативными клетками (массив А), • Obraz - генерация типа и параметров образа, запись образа в массив R, а также вывод сообщения о сформированном образе, • Otobr - отображение образа в массивах А и А1, соответствующих ассоциативным клеткам, • Reak - распознавание образа и вывод сообщения о результате на экран, • Teach - обучение нейронной сети. Работа программы начинается с вызова процедуры инициализации переменных и массивов - InitVar. Эта операция сводится к обнулению счетчика удачных попыток nOk, сбросу флага печати (Print, заданию максимального числа шагов 1тах=2000 и обнулению элементов массива весовых коэффициентов G. Инициализация связей процедурой GenSv включает в себя заполнение элементов массива S случайными значениями из диапазона размерности массивов рецепторных и ассоциативных клеток. Далее в программе организуется цикл с известным числом шагов Imax по параметру Step. В этом цикле выполняются следующие действия: И
• случайный выбор типа (die) и параметров образа - размера и места размещения на слое рецепторных клеток, т.е. происходит коррекция содержимого массива R, • отображение образа на слое ассоциативных клеток, т.е. заполнение массивов А и А1, • распознавание образа и определение значения переменной dicl, • коррекция массива G при несовпадении заданного образа с результатом его опознания (обучение), • увеличение значения переменной nOk в случае совпадения сформированного образа с результатом распознавания, • вывод текущей информации о ходе процесса - какой образ формируется, результат опознания, доля удачных ответов в общем числе попыток. Определение типа образа происходит в зависимости от шага по формуле die := Step mod 2. Крестику соответствует единица, нолику - ноль. Далее обнуляется массив R, случайным образом определяются индексы элемента массива R, соответствующего центру образа, а затем в соответствующие элементы массива R записываются единицы. Отображение образа на слой ассоциативных клеток начинается с очистки массивов А и А1. Далее выбираются элементы массива R, заполненные единицами, и увеличивается на единицу содержимое элементов массива А, имеющих связь с выбранными элементами массива R. В конце процесса отображения записываются единицы в элементы массива А1, связанные с элементами массива А, содержащими число, превышающее значение порога Teta. Процесс обучения нейронной вычислительной системы сводится к коррекции массива весовых коэффициентов по правилу: fG; = G: + AG если А, =1 и die = О ( > (5) [ G. = G, - AG если А( = 1 и die = 1 где G, - вес i-й связи, Д G - вес обучения, А, - значение на выходе ассоциативной клетки, входе i-й связи, die - тип распознаваемого образа (1-крестик, 0-нолик). Весовые коэффициенты изменяются только для связей, "виноватых" в ошибке (А;=1). Нейрокомпьютер постоянно пытается уменьшить возможность повторной ошибки, подбирая тем самым оптимальные веса для заданных случайным образом связей. В основе процедуры обучения (Teach) лежит циклический алгоритм, включающий два цикла с известным числом повторений. Внешний цикл организован по параметру L (строка), вложенный - по параметру С (столбец). 1
Параметры L и С определяют элемент массива Al [L,C], для которого следует произвести коррекцию весового коэффициента G[L,C]. Если в указанный элемент массива записана единица и рисовался нолик, то весовой коэффициент уменьшается на величину DeltaG. Если в элементе массива A1[L,C] записана единица и рисовался крестик, то весовой коэффициент увеличивается на эту же величину. В цикле по параметру Step основной программы за 20 шагов до конца обучения включается разрешение вывода на экран содержимого матрицы рецепторов (fPrint:=4rue). При этом появляется возможность визуально проконтролировать вид образов, предлагаемых нейрокомпьютеру для распознавания. Запрет вывода на экран матрицы рецепторов в период обучения связан с замедлением процесса обучения при выполнении экранных операций. При выводе на экран содержимого матрицы рецепторов (последние 20 шагов обучения), выводится также справочная информация об изображаемом и распознанном образах. При этом можно проверить качество обучения нейрокомпьютера, которое в сильной степени зависит от количества шагов обучения. Работу программы можно исследовать, изменяя значения констант: N - размерность массивов, Teta - порог обучения, DeltaG - вес обучения; и изменяя значение переменной Imax - максимальное число шагов обучения. Распознавание большего количества образов (например цифр 0-9 или букв A-Я) в простейшем случае сводится к увеличению числа эффекторных клеток. При этом распознаваемый образ оказывается закодированным в двоичном коде (например: ООО - 0, 001 - 1,010 - 2, 011 - 3 и т.д.). Обучение нейрокомпьютера прогнозированию Применение нейронных сетей для прогнозирования рассмотрим на примере колебания струны. Струна натянута между двумя неподвижными стенками и в начальный момент времени получает импульс, который начинает распространяться вдоль струны, вызывая ее колебание. Процесс колебания струны описывается уравнением а прогнозирование состояния струны в следующий момент времени реализуется разностной схемой u*+1 =2U*-1 + ^-^ .(и^-г-и* + и^), (7) где 13
i = 2,N-l- номер точки, К - номер момента времени, U - смещение струны, С - скорость волны, U^+l- отклонение струны в будущий момент времени в рассматриваемой точке, Ц*'1- отклонение струны в прошлый момент времени в рассматриваемой точке, Цк - отклонение в настоящий момент времени в рассматриваемой точке, L'JS, - отклонение в настоящий момент слева от рассматриваемой точки, - отклонение в настоящий момент справа от рассматриваемой точки, h - некоторая постоянная, т - смещение во времени. Нейрокомпьютер, оценивая текущее положение струны, прогнозирует ее положение в следующий момент времени. Цель обучения - достичь приемлемой вероятности совпадения прогноза положения струны на основе нейросетевой технологии с ее эталонным положением, получаемым по выражению (6). Другими словами, нейрокомпьютер должен найти решение уравнения колебания струны в виде U^1 =G,-U^, +G,-U^+ G3 -LJ^+G4-U^1. (8) В данном случае за модель нейронной вычислительной системы примем нейродинамическую систему, структура которой приведена на рис.6. Рис.6. Структура нейросети, прогнозирующей колебание струны Обучение нейрокомпьютера будем производить в одной точке струны по четырем значениям: • текущему отклонению этой точки, • отклонению слева от этой точки, 14
• отклонению справа от этой точки, • отклонению в этой точке в предыдущий момент времени. За истинное состояние точки принимается ее отклонение, рассчитанное по выражению (6). Так как формула колебания струны одинакова для всех точек струны, то по формуле, полученной для одной точки, можно спрогнозировать состояние всей струны целиком. Программа обучения нейрокомпьютера прогнозированию колебаний струны приведена в прил.2. Интерфейс программы предусматривает вывод на экран параметров процесса обучения и графических изображений струны, полученных расчетом процесса по выражениям (6) - (7) и прогнозированием по выражению (8). Рассмотрим ее текст более подробно. В тексте программы к рассматриваемому в настоящем издании вопросу отношение имеют следующие данные: • №31 . Nt • tau = 0.1 • h= 1 • с = 2 • dH = 0.01 • dG = 0.01 • Ct • u . Un . Us • G • Step • Err - число точек в струне, - номер обучаемой точки, - шаг по времени, - постоянная, - скорость волны, - допустимое отклонение прогноза от истинного значения, - шаг изменения весовых коэффициентов, - прогноз отклонения точек (массив), - текущие отклонения точек (массив), - отклонения точек на следующем шаге (массив), - отклонения точек на предыдущем шаге (массив), - массив весовых коэффициентов, - текущий шаг, - число ошибок, - переменная цикла. Программа включает в себя следующие процедуры: • Varlnit - инициализацию значений переменных, • Graphlnit - инициализацию графики, • Teach - обучение нейросети, • OutPar - вывод на экран одного параметра, • WriteData - вывод данных на экран, • New Step нейросети, - расчет и прогноз состояния струны, i • Screen - вывод изображения струны на экран. Работа программы начинается с вызова процедуры вызов обучения инициализации переменных и массивов - Varlnit. В этой процедуре устанавливаются начальные значения переменных г, Nt, Step, Err и массивов G[i], Ut[i], U[i], Un[i], Us[i]. Изначально всем точкам струны задается нулевое отклонение. 15
Одной из точек струны (а именно, точке номер 5) в начале работы программы задается некий импульс, который вызовет колебание струны. После инициализации переменных вызывается процедура инициализации графики - Graphlnit. Эта процедура устанавливает графический режим работы экрана, определяет предельные координаты окна для вывода информации и выводит изображение осей координат. Затем начинается собственно сам цикл обучения нейрокомпьютера, повторяющийся до тех пор пока не будет нажата какая-нибудь клавиша. В ходе выполнения этого цикла производится один шаг обучения нейрокомпьютера (процедура NewStep), обновление массивов Us[i] и U[i], вывод на экран текущего истинного и спрогнозированного состояний струны, а также вывод численной информации о текущем шаге и подбираемых коэффициентах. После нажатия любой клавиши цикл обучения нейрокомпьютера прерывается и программа завершает свою работу стандартной процедурой закрытия графического режима. Процедура NewStep производит последовательно расчет истинного положения струны, расчет спрогнозированного положения струны, расчет получившегося отклонения (dU) в обучаемой точке (Nt), и в случае если отклонение превышает допустимый диапазон (-dH...+dH), вызывает процедуру самообучения нейрокомпьютера (Teach). В этой же процедуре происходит увеличение текущего шага (Step). Обучение нейрокомпьютера (в процедуре Teach) заключается в расчете необходимых поправок и добавление их к обучаемым коэффициентам. Поправки вычисляются с учетом знака, в зависимости от взаимного расположения точек истинной и спрогнозированной струн. Так как вызов этой процедуры происходит в случаях ошибочного прогнозирования, то здесь же происходит увеличение переменной Err, отвечающей за количество ошибок, допущенных в процессе обучения. Процедура Screen выводит на экран истинную струну цветом ColorStruna и спрогнозированную струну цветом ColorData. Отображение струн производится в режиме XORPut (см. процедуру Graphlnit), поэтому эта процедура вызывается дважды, с небольшой задержкой между вызовами. Первый вызов прорисовывает обе струны, второй вызов удаляет их с экрана. Процедура WriteData производит вывод на экран числовых значений переменных Step, dH, dG, G[1 -4]. Для вывода каждого из значений вызывается процедура OutPar. В качестве первого параметра этой процедуры указывается текст, выводимый перед числовым значением, вторым параметром указывается переменная, значение которой необходимо вывести на экран. Вы можете без труда добавить в процедуру WriteData вывод на экран интересующих вас значений переменных. Расчетные значения подбираемых весов выводятся на экран слева от найденных значений, что позволяет визуально проконтролировать процесс обучения. При значениях заданных в программе на полное обучение нейрокомпьютера требуется немногим более 6000 шагов. 16
Работу программы можно исследовать, изменяя значения констант: N - количество точек, из которых состоит струна, mtt - коэффициент масштабирующий струну, выводимую на экран, tau - шаг по времени (требуется для расчета истинного положения струны), h - постоянная (требуется для расчета истинного положения струны), с - скорость волны (требуется для расчета истинного положения струны), dH - граница, задающая допустимый уровень погрешности при прогнозировании, dG - вес обучения. Заключение В настоящем издании рассмотрены основные простейшие структуры нейронных вычислительных систем. Следует иметь в виду, что возможны и другие структуры, описанные в специальной литературе. Применение нейрокомпьютеров продемонстрировано на двух несложных задачах. Для более сложных задач потребуются нейронные вычислительные системы с большим числом клеток, связей и слоев. Рассматривая простые структуры и примеры применения, авторы издания стремились продемонстрировать читателю суть вопроса, не загромождая математическими и другими проблемами. Опыт моделирования нейронных компьютеров показывает, что они не очень "критичны" к набору связей рецепторных и ассоциативных клеток. Основной проблемой будет решение вопроса обучения нейронной сети - необходимо определить алгоритм поиска неправильно работающих связей и алгоритм изменения весовых коэффициентов. Один из авторов настоящего издания (С.Г.Сидоров) успешно опробовал программу распознавания человека по фотографиям и программу диагностики состояния металлических конструкций, находящихся в агрессивной среде, по микрофотографиям шлифов сгибов труб. Нейронные сети являются достаточно перспективным направлением в области вычислительной техники и могут найти применение в самых неожиданных областях науки и техники. Библиографический список 1. Круглов В.В., Борисов В.В. Искусственные нейронные сети. - М.: Горячая линия - Телеком, 2001. 2. Уоссермен Ф., Нейрокомпьютерная техника: теория и практика. Пер. с англ. -М.: Мир, 1992. 3. Горбань А.Н. Обучение нейронных сетей. - М.: СП Параграф, 1990. 4. Вапннк В.Н., Червоиенкис А.Я. Теория распознавания образов. - М.: Наука, 1974. 17
Приложения Приложение 1 Программа обучения нейрокомпьютера распознаванию образов (*»*********************»*.**.****.******♦*♦**************»***»,) (* Обучение распознаванию крестика и нолика *) (****************★************#*********************************) Program NeuroXO; uses Crt; const N = 20; Teta = 3; DeltaG = 0.03; (*размерность клеток*) (*порог*) (*вес обучения*) type LC = record L :byte; 0 :byte; end;(*of XY*) (*тип координат*) (*строка *) (* колонка*) ar R :array[0. .N, 0. ,N] of byte; (*слой рецепторов*) A :array [0. . N, 0. .NJ of byte; (*ассоциативный слой*) Al :array[0. . N, 0 . N] of byte; (*бинарный ассоц. слой S :array[0. .N, 0. .N, 0..N] of LC; (*массив связей*) G :array[0. .N, 0. •N] of real; (*веса связей*) var die, (*тип фигуры: 1-крестик, 0-нолик*) dicl :byte; ^опознанный тип*) fPrint :boolean; (*разрешение вывода на экран*) Imax :word; (*максимальное число шагов обучения*) Step : word; (*текущий шаг*) nOk : word; (*число удачных ответов*) L, С, К :byte; (*индексы: строка, колонка, номер связи* procedure GenSv; (*генерация связей*) begin for L:=0 to N do for C:=0 to N do for K:=0 to N do begin S[L,C,K].L:-Random(M); S[L,C,K].C:=Random(N); end;(*of for*) end;(*of GenSv*) 18
procedure InitVar; (‘инициализация переменных*) begin fPrint:=false; (‘запрет вывода на экран*) lmax:=2000; (‘число шагов обучения*) nOk:=0; (‘число удачных ответов*) for L:=0 to N do for C:=0 to N do G[L,C]:=0; (‘очистка весов*) GenSv; (‘генерация связей*) end;(*of InitVar*) procedure Otobr; (‘отображение образа*) var Lv,Cv :byte; begin for L:=0 to N do (‘очистка слоев А и Al*) for C;=0 to N do begin A[L,C];=0; A1[L,C]:=O; end;(‘of for C*) for L:=0 to N do (‘отображение в слое A*) for C:=0 to N do if R[L,C]=1 then for K:=0 to N do begin Lv:=S[L,C,K] -L; Cv:=S[L,C,K] .C; inc(A[Lv,Cv] ) ; end;(‘of for K*) for L:=0 to N do (‘отображение в слое Al*) for C:=0 to N do if A[L,C]>Teta then A1[L,C]:=1; end;(‘of Otobr*) function Obrazrbyte; (‘создание образа*) var i :integer; (‘переменная цикла*) Lc,Cc :byte; (‘строка и столбец центра*) rr :byte; (‘радиус образов*) begin for L:=0 to N do for C:=0 to N do R[L,C]:=0; (‘чистка рецепторов*) dic:=Step mod 2; (‘выбор образа*) Obraz:=dic; rr:=Trunc(Random(Trunc(N/2))); (‘подбор размеров образа*) if rr<3 then rr:=3; (*выбор места расположения образа*) Lc:=Trunc(rr+Random(Round(rr/1.6))); Cc:=Trunc(rr+Random(Round(rr/1.6))); (‘рисование выбранного образа*) Case die of 0:begin (‘рисование нолика*) for i:=l to 150 do begin L:=Trunc(Lc+rr*cos(i)); C:=Trunc(Cc+rr*sin(i)); R[L,C] :=1; end;(‘of for i‘) end;(‘of Case 0*) 1:begin (‘рисование крестика*) for i:=-rr to rr do begin 19
L:=Lc+i; C:=Cc; R[L,C]:=1; L:=Lc; C:=Cc+i; R[L,C]:=1; end;(’of for i*) end;(+of Case 1*) end;(*of Case*) (*вывод образа на экран если это не запрещено*) if not fPrint then Exit; (‘проверка запрета*) if dic=0 then Writeln(' Рисую нолик ') else Writein(' Рисую крестик for L:=0 to N do begin (*вывод на экран образа*) for С:=0 to N do if R[L,C]=0 then Write(’_’) else Write('*'); Writein; end;(*of for L*) end;(*of Obraz*) procedure Teach; (‘обучение нейросети*) begin for L:=0 to N do for C:=0 to N do if A1[L,C]=1 then (‘обучение виноватых*) if dic=0 then G[L,C]:=G[L,C]-DeltaG else G[L,C]:=G[L,C]+DeltaG; end;(*of Teach*) function Reak:byte; (‘распознавание образа*) var E :real; begin E: =0; for L:=0 to N do for C:=0 to N do E:= E+A1[L,C]*G[L,C]; if E>0 then Reak:=l else Reak:=0; if not fPrint then Exit; Writein; if E>0 then Writein ( ’ Я думаю, что это крестик ’) else Writein(’ Я думаю, что это нолик '); ReadKey; end;(*of Reak*) begin InitVar; for Step:=l to Imax do begin dic:=Obraz; (*новый образ*) Otobr; (‘отображение*) dicl:=Reak; (‘опознавание*) if dicOdicl then Teach else inc(nOk); ^обучение*) (*вывод текущей информации на экран*) Write('Шаг ',Step,' : Доля удачных ответов '); Writeln(nOk/Step*100:4:2,' % 1); (*разрешение вывода на экран за 20 шагов до конца’) if Step>(lmax-20) then fPrint:=true; end;(‘of for Istep*) Writein(’Конец '); end. 20
Приложение 2 Программа обучения нейрокомпьютера прогнозированию состояния струны (* Программа прогнозирования состояния струны *) (* подбор по 4 коэффициентам *) program Struna; uses Graph,Crt; const ColorGrid = Green; ColorStruna = Yellow; ColorData = LightRed; N = 31; mtt =3; tan = 0.1; h =1; c =2; dH =0.01; dG =0.01; (*цвет осей*) (*цвет струны*) (*цвет числовых данных*) (*число точек в струне*) (*кратность амплитуды*) (*шаг по времени*) (*постоянная*) (*скорость волны*) (*граница точности обучения*) (*вес обучения*) var Ut, u, Un, Us, f :array[1..N] of real; var G :array(1..4] of real; Nt :integer; r :real; var Wxl, Wyl, Wxr, Wyr, Wyc, dX, LX :integer; var Step, Err :longint; :integer; Y :integer; (*отклонения предсказанные*) (Отклонения точек*) (♦отклонения точек новые*) (*отклонения точек старые*) (*часть формулы отклонения*) (*массив весов*) (*номер обучаемой точки*) (Постоянная часть отклонения*) (*Х левый окна*) (*Y левый окна*) (*Х правый окна*) (*Y правый окна*) (*Y оси*) (*смещение по оси X*) (*длина по оси X*) (♦текущий шаг*) (*число ошибок*) (Переменная цикла*) (*координата Y данных*) procedure Varlnit; (Инициализация переменных*) begin г:=Sqr(c*tau/h); for i:=l to 4 do G[i]:=0; for i:=l to N do begin Ut[i]:=0; U[i]:=0; Un[i]:=0; Us[i]:=0; end; Us[5];=U[5]-tau*100; (*100<-импульс !!!*) Nt:=Trunc(N/2); Step:=l; Err:=0; end;(*of Varlnit*) 21
procedure Graphlnit; (‘инициализация графики») var Gd,Gm : integer; begin Gd:=detect; InitGraph(Gd,Gm,' '); Wxl:=0; Wyl:=0; Wxr:=GetMaxX; Wyr:=GetMAxY; Wyc:=Trunc((Wyr+Wyl+1)/2); dX:=Trunc((Wxr-Wxl)/N); LX:=N*dX; (♦изображение осей*) SetColor(ColorGrid); line(dX,Wyl,dX,Wyr); line(dX,Wyc,LX,Wyc); line(LX,Wyl,LX,Wyr); line(dX,Wyl,LX,Wyl); line(dX,Wyr,LX,Wyr); for i:=l to N do line(i»dX,Wyc-3,i*dX,Wyc+3); line(Nt*dX,Wyl,Nt»dX,Wyr); SetWriteMode(XORPut); end;(*of Graphlnit*) procedure Teach(e:real); (‘обучение весов*) var DeltaG :array[1..4] of real; (‘добавки весов*) sn :integer; (*знак*) begin for i:=-l to 1 do begin if U[Nt+i]<0 then sn:=-l else sn:=l; DeltaG[2 + i]:=dG‘sn*e; end; if Us[Nt]<0 then sn:=-l else sn:=l; DeltaG[4]:=dG*sn*e; for i:=l to 4 do G[i]:=Gfi]+DeltaG[i]; Err:=Err+l; end;(‘of Teach*) procedure Out Par(S:string;P:real); (‘вывод параметра на экран») var х :integer; si: string; begin Str (P:7:2,si); While sl[l] = ' ' do Delete(si,1,1); x:=Wxl+400; MoveTo(x,y); SetViewPort(x,у,x+170,y+10,ClipOn); С1earViewPort; sl:=S+’ = '+sl; OutText(si); SetViewPort(Wxl,Wyl,Wxr,Wyr,ClipOn); Y:=Y+10; end;(‘of OutPar*) procedure WriteData; (‘вывод данных на экран*) begin Y:=20; OutPar(' Step' ,Step) OutPar(' dH ' , dH) ; OutPar(' dG ' , dG) ; OutPar('0.04 G [ 1 ] ’ ,G[1] ) OutPar('1.92 G[2] ' ,G[2] ) OutPar('0.04 G [ 3] ' ,G[3] ) OutPar('-1 G[4] ' ,G[4] ) end;(*of WriteData*) 22
procedure NewStep; (*расчет новых значений*) var dU treal; (*отклонение*) j :integer; (*текущая точка струны*) begin (*новое положение струны*) for i:=2 to N-l do f[i]:=U[i+1]-2*U[i]+U[i-1]; for i:=2 to N-l do un[i]:=2*U[i]-Us[i]+r*f[i] ; (’прогнозирование положения струны*) for i:=l to N do Ut[i]:=0; for j:=2 to N-2 do begin for i:=-l to 1 do Ut [ j ] : ==Ut [ j ]+G [2+i ] *U [ j+i ] ; Ut[j]:=Ut[j]+G[4]*Us [ j]; end; (‘of for j *) (‘вычисление отклонения в обучаемой точке*) dU:=Ut[Nt]-Un[Nt] ; (‘обучение нейросети*) if dU<-dH then Teach(l); if dU>dH then Teach (-1); (‘новый шаг*) Step:=Step+l; end;(*of NewStep*) procedure Screen; (‘вывод струны на экран*) var xl,yl,xp,yp :integer; (‘координаты левой и правой точек*) begin SetColor(ColorStruna); (‘вывод струны*) for i:=l to N-l do begin xl:=i*dX; yl:“Round(Wyc-mtt*U[i]); xp:=xl+dX; yp:“Round(Wyc-mtt*U[i+1]); Line(xl,yl,xp,yp); end;(’of for*) SetColor(ColorData); (‘вывод прогноза*) for i:=3 to N-3 do begin xl:=i*dX; yl:“Round(Wyc-mtt*Ut[i]) ; xp:=(i+1)*dX; yp:“Round(Wyc-mtt*Ut[i+1]); Line(xl,yl,xp,yp); end;(*of for*) end;(*of Screen*) begin Varlnit; Graphlnit; (‘инициализация*) Repeat NewStep; (‘шаг обучения*) for i:=l to N do begin (‘обновление массивов*) Us [i] :=U[i]; U[i]:=Un[i]; end; Screen; Delay(100); Screen; (‘вывод струны на экран*) WriteData; (‘вывод данных на экран*) Until KeyPressed; CloseGraph; (‘закрытие графики*) end. 23
НЕЙРОКОМПЬЮТЕРЫ. УСТРОЙСТВО, РАБОТА, МОДЕЛИРОВАНИЕ НА ПК Методические указания Составители: С.Г. СИДОРОВ ЛИ. ЧЕРНЫШЕВА Б.Л. ЕРШОВ Ф.Н. ЯСИНСКИЙ Редактор В.Н. Махова Лицензия ИД № 05285 от 4 июля 2001 г. Подписано в печать . ,2002 г. Формат 60x84 1/16. Печать офсетная. Усл. печ. л. 1,39. Тираж 200 экз. Заказ Ивановский государственный энергетический университет. 153003, г. Иваново, ул. Рабфаковская, 34. Отпечатано в ОМТ МИБИФ 24