Вы находитесь на странице: 1из 140

Министерство образования и науки Российской Федерации

Пензенский государственный университет

А. В. Сивохин, А. А. Лушников, С. В. Шибанов

ИСКУССТВЕННЫЕ НЕЙРОННЫЕ СЕТИ

Лабораторный практикум

Наградной
логотип
вуза
Издательство
Пензенского государственного
университета
Пенза 2004
УДК 681.3
С34

Рецензенты:
Научно-технический совет Федерального государственного
унитарного предприятия ОАО «НПП «Рубин»
Кандидат технических наук, доцент кафедры «Прикладная математика»
Пензенского государственного педагогического университета
им. В. Г. Белинского
В. В. Дрождин

С34 Сивохин, А. В. Искусственные нейронные сети [Текст]: Лаб. практи-


кум / А. В. Сивохин, А. А. Лушников, С. В. Шибанов. – Пенза: Изд-во
Пенз. гос. ун-та, 2004. – 136 с.: 8 ил., библиогр. 10 назв.

Рассматриваются вопросы проектирования, обучения, анализа и модели-


рования известных типов нейронных сетей в системе MATLAB 6 с использо-
ванием пакета Neural Networks Toolbox (NNT).
Лабораторный практикум подготовлен на кафедре «Математическое
обеспечение и применение ЭВМ» и предназначен для студентов специально-
стей 220400 и 220100 при изучении дисциплин «Нейрокомпьютерные систе-
мы», «Системы искусственного интеллекта» и «Системное программное
обеспечение».

УДК 681.3

© Издательство Пензенского государственного


университета, 2004
© Сивохин А. В., Лушников А. А.,
Шибанов С. В., 2004

2
Введение
Искусственные нейронные сети основаны на весьма простой био-
логической модели нервной системы, состоящей из огромного числа
(1011) нейронов, каждый из которых принимает взвешенную сумму
входных сигналов и при определенных условиях передает сигнал дру-
гим нейронам. Количество связей нейронов в системе достигает 1015.
Теория нейронных сетей возникла из исследований в области ис-
кусственного интеллекта и связана с попытками воспроизведения
способности нервных биологических систем обучаться и исправлять
ошибки, моделируя низкоуровневую структуру мозга. Исследования
по созданию таких систем на основе высокоуровневого (символьно-
го) моделирования процесса мышления не принесли желаемых ре-
зультатов. Эта теория развивалась в течение последних пяти десяти-
летий и за последние пятнадцать лет нашла широкое практическое
применение: в космонавтике и аэронавтике – для имитации траекто-
рий полета и построения систем автоматического пилотирования; в
военном деле – для управления оружием и слежением за целями; в
электронике – для разработки систем машинного зрения и синтеза
речи; в медицине – для диагностики заболеваний и конструирования
протезов; в производстве – для управления технологическими про-
цессами, роботами и т. д. Такой успех нейронных сетей объясняется
тем, что была создана необходимая элементная баз для реализации
нейронных сетей, а также разработаны мощные инструментальные
средства для их моделирования в виде пакетов прикладных про-
грамм. К числу подобных пакетов относится пакет Neural Networks
Toolbox (NNT) системы математического моделирования MATLAB 6
фирмы Math Works.
Пакет прикладных программ NNT содержит средства для по-
строения нейронных сетей, базирующихся на поведении математиче-

3
ского аналога нейрона. Пакет обеспечивает эффективную поддержку
проектирования, обучения, анализа и моделирования множества из-
вестных типов сетей – от базовых моделей персептрона до самых
современных ассоциативных и самоорганизующихся сетей. В пакете
имеется более 15 таких типов. Для каждого типа архитектуры и обу-
чающих правил имеются М-функции инициализации, обучения,
адаптации, создания, моделирования, отображения, оценки и демон-
страции, а также примеры применения. Обеспечена возможность ге-
нерации переносимого кода с помощью пакета Real Time Workshop,
также входящего в систему MATLAB 6.
Лабораторные работы, описания которых содержатся в данном
практикуме, разработаны с целью научить студентов эффективно
использовать мощный инструментальный пакет NNT системы
MATLAB 6 для проектирования, анализа и моделирования нейрон-
ных сетей. Первые две лабораторные работы позволяют освоить ин-
тегрированную среду системы MATLAB и основы программирова-
ния на языке сверхвысокого уровня этой системы. Остальные лабо-
раторные работы дают возможность познакомиться со многими ти-
пами нейронных сетей, научиться создавать, обучать и исследовать
такие сети. Описательная часть лабораторной работы содержит не-
обходимый минимум сведений по теме, практическая часть включает
достаточное число заданий для приобретения навыков в использова-
нии пакета NNT.

4
Лабораторная работа № 1
Основы программирования
в системе MATLAB
Цель работы: изучение основ проблемно-ориентированной сис-
темы программирования MATLAB, обеспечивающей работу с мас-
сивами строковых и числовых данных, матрицами, структурами,
классами и ячейками с помощью матричных операций, функций,
разнообразных управляющих структур и средств расширения систе-
мы, а также приобретение навыков применения командно-графичес-
кого интерфейса системы для построения и исследования нейронных
сетей различной архитектуры.

Теоретические сведения
Введение
Мощная инструментальная система MATLAB обеспечивает про-
цедурное, операторное, функциональное, логическое, структурное,
объектно-ориентированное и визуальное (средствами пакета Simulink)
программирование. Она базируется на математико-ориентированном
языке сверхвысокого уровня, который упрощает запись алгоритмов и
открывает новые методы их создания.
Язык системы MATLAB по своей структуре напоминает популяр-
ный командный язык Бейсик. Команды языка исполняются в режиме
интерпретации. С его помощью можно создавать текстовые модули-
функции и модули-сценарии. Файлы, где хранятся такие модули,
имеют расширение *.m и называются М-файлами, а находящиеся в
них функции – М-функциями. В системе имеется огромная библио-
тека М-функций в текстовом формате, которые можно модифициро-
вать для достижения желаемых целей. Пользователь может создавать
собственные М-функции и включать их в систему по словарному
принципу.

5
Базовые средства языка программирования
Система MATLAB может использоваться в двух режимах: в ре-
жиме непосредственного счета (командный режим) и в режиме про-
граммирования.
В командном режиме пользователь последовательно вводит коман-
ды входного языка и получает ответ. С помощью этого режима можно
решить множество математических задач различной сложности.
Однако при решении серьезных задач возникает необходимость
сохранения используемых последовательностей вычислений, а также
их дальнейших модификаций. Для решения этой задачи система
MATLAB имеет в своем составе мощный язык программирования
высокого уровня.
Программами в системе MATLAB являются файлы текстового
формата с расширением m, содержащие запись программ в виде
программных кодов.
Для редактирования файлов программ может использоваться лю-
бой текстовый редактор, а также специальный многооконный редак-
тор. Редактор программ системы MATLAB имеет следующие воз-
можности:
цветовая подсветка синтаксиса, позволяющая выявить ошибки;
синтаксический контроль на стадии подготовки М-файла;
установка точек прерывания при интерпретации команд;
автоматическая нумерация строк программы для выдачи сообщений.
Язык программирования системы MATLAB имеет следующие
средства для построения команд и написания М-файлов:
1) данные различного типа: double, numeric, char, cell, array;
2) константы и переменные: 25, pi, eps, ‘Hello’, ans, m, n;
3) операторы, включая операторы математических выражений: +,-,*;
4) встроенные команды и функции: help, clear, plot, sin, cos;
5) функции пользователя: func, map, draw, paint, neuron;
6) управляющие структуры: if, for, while, switch, try, catch, end;
7) системные операторы и функции: realmin, realmax, Inf, Nan;
8) средства расширения языка: пакет NNT, пакет Simulink.

6
M-файлы сценариев и функций
M-файлы системы MATLAB делятся на два класса:
• файлы-сценарии, не имеющие входных параметров;
• файлы-функции, имеющие входные параметры.
Файл-сценарий или Script-файл не имеет списка входных парамет-
ров. Он использует глобальные переменные, т. е. такие переменные,
значения которых могут быть изменены в любой момент сеанса рабо-
ты и в любом месте программы. Для запуска файла-сценария из ко-
мандной строки MATLAB достаточно указать его имя в этой строке.
Файл-сценарий имеет следующую структуру:
%Основной комментарий – одна строка (обязателен)
%Дополнительный комментарий – любое число строк (не обязателен)
Тело файла с любыми выражениями, командами и управ-
ляющими структурами.
Основной комментарий выводится при выполнении команд
lookfor и help имя_каталога. Полный комментарий выводится при
выполнении команды help имя_файла, причём вывод производится
до первой пустой строки.
Файл-функция отличается от файла-сценария прежде всего тем,
что созданная им функция имеет входные параметры, список кото-
рых указывается в круглых скобках. Используемые в файлах-функ-
циях переменные и имена параметров являются локальными пере-
менными, изменение значений которых в теле функции не влияет на
значения, которые те же самые переменные могут иметь за предела-
ми функции.
Файл-функция имеет следующую структуру:

function var=f_name (Список_параметров_передаваемых_ зна-


чений)
%Основной комментарий – одна строка (обязателен)
%Дополнительный комментарий – любое число строк (необя-
зателен)

7
Тело файла с любыми выражениями, командами и управ-
ляющими структурами.
var=выражение

Последняя инструкция “var=выражение” вводится, если требу-


ется, чтобы функция возвращала результат вычислений. Если необ-
ходимо большее количество выходных параметров, структура моду-
ля будет иметь следующий вид:

Function[var1,var2,...]=f_name(Список_параметров_передаваемых_
значений)
%Основной комментарий – одна строка (обязателен)
%Дополнительный комментарий – любое число строк (необя-
зателен)

Тело файла с любыми выражениями, командами и управ-


ляющими структурами.
var1=выражение
var2=выражение
...
Имена var, var1, var2, ... для возвращаемых значений являются
глобальными или известными в теле вызывающей М-функции.
Управляющие структуры
Помимо программ с линейной структурой, инструкции которых
исполняются строго по порядку, MATLAB позволяет создавать про-
граммы, структура которых нелинейна. Для создания таких про-
грамм применяются следующие управляющие структуры:

1. Диалоговый ввод: input (строка);


2. Условный оператор: if ... elsif ... else... end;
3. Циклы типа for...end: for Заголовок_цикла Тело_цикла end;

8
4. Циклы типа while...end: while Условие_цикла Тело_цикла
end;
5. Конструкция переключателя: switch Exp case B1 case b2 …
otherwise end;
6. Конструкция try...catch...end: try Тело_try catch Тело_catch
end;
7. Создание паузы в вычислениях: pause, pause (...), pause on,
pause off.

Для организации диалогового вывода используются функции


input и disp.
Функция input имеет следующий синтаксис:

переменная = input(строка)

При выполнении этой команды вначале выводится строка, затем


происходит остановка работы программы и ожидается ввод значе-
ния. Ввод подтверждается нажатием клавиши Enter, после чего вве-
денное значение присваивается переменной.
Функция disp предназначена для вывода ее параметра на экран:

disp (Выводимое значение)

Условный оператор if в общем виде записывается следующим об-


разом:

if Условие
Список_инструкций_If
elseif Условие
Список_инструкций_Elsif
else
Список_инструкций_Else
end

9
Циклы типа for...end обычно используются для организации вы-
числений с заданным числом повторяющихся циклов. Конструкция
такого цикла имеет следующий вид:

for var=Выражение, Список_инструкций end

Выражение чаще всего записывается в виде s:d:e, где s – началь-


ное значение переменной цикла var, d – приращение этой перемен-
ной и e – конечное значение управляющей переменной, при дости-
жении которого цикл завершается. По умолчанию d равно 1.

Цикл типа while...end выполняется до тех пор, пока остается ис-


тинным условие:

while Условие
Список_инструкций
end

Досрочное завершение циклов реализуется с помощью операто-


ров break или continue.
Для осуществления множественного выбора (или ветвления) ис-
пользуется конструкция с переключателем типа switch:

switch switch_Выражение
case case_Выражение
Список_инструкций
case
{case_Выражение1,case_Выражение2,case_Выражение3,...}
Список_инструкций
...
otherwise,
Список_инструкций
end

10
Case_выражение может быть числом, константой, переменной,
вектором ячеек или даже строчной переменной. В последнем случае
оператор case истинен, если функция strcmp(значение, выражение)
возвращает логическое значение “истина”.
Конструкция блока вывода ошибок try...catch...end имеет следую-
щий синтаксис:

try
Список_инструкций
catch
Список_инструкций
end

Эта конструкция выполняет все списки инструкций. Если в каком-


то списке до оператора catch появляется ошибка, то выводится со-
общение об ошибке, но системная переменная последней ошибки
lasterr не меняется. В выражениях после catch сообщение об ошибке
не выводится.
Во всех управляющих структурах список инструкций, или тело,
представляет собой последовательность выражений, команд или
вложенных управляющих структур, разделяемых пробелом, запятой
или точкой с запятой. Точка с запятой запрещает вывод данных на
экран.
Для остановки программы используется оператор pause. Он ис-
пользуется в следующих формах:
1) pause – останавливает вычисления до нажатия любой клавиши;
2) pause(N) – останавливает вычисления на N секунд;
3) pause on – включает режим обработки пауз;
4) pause off – выключает режим обработки пауз.

11
Практические задания
Задание 1. Разработать файл-сценарий для построения графика
синусоиды линией красного цвета с выведенной масштабной сеткой
в интервале [xmin, xmax].

1. Запустить редактор m-файлов и ввести следующую программу:


%Plot with color red
%Строит график синусоиды линией красного цвета
%с выведенной масштабной сеткой в интервале [xmin, xmax]
x=xmin:0.1:xmax;
plot(x,sin(x),'r')
grid on

2. Сохранить файл под именем «pcr.m».


3. Выполнить в командном окне MATLAB следующую команду:
>> help pcr
Ha экран выведется информация, находящаяся в основном и до-
полнительном комментариях файла:

Plot with color red


Строит график синусоиды линией красного цвета
с выведенной масштабной сеткой в интервале [xmin, xmax]

>>

4. Затем запустить сценарий на выполнение:


>> pcr
??? Undefined function or variable 'xmin'.

Error in ==> C:\MATLAB6p1\work\pcr.m


On line 4 ==> x=xmin:0.1:xmax;

12
На экран выводится сообщение об ошибке, так как сценарий ис-
пользует глобальные переменные, которые не определены. Для ус-
пешного выполнения примера необходимо задать следующие дейст-
вия:

5. Определить переменные xmin и xmax


>> xmin=-10;
>> xmax = 10;
6. Запустить сценарий на выполнение
>> pcr

Задание 2. Разработать файл-функцию для решения предыдущей


задачи, выполнив следующие действия:
1. Запустить редактор m-файлов и ввести следующую программу:

%Plot with color red


%Строит график синусоиды линией красного цвета
%с выведенной масштабной сеткой в интервале [xmin, xmax]
function x=fun(xmin,xmax)
x=xmin:0.1:xmax;
plot(x,sin(x),'r')
grid on

2. Сохранить файл под именем «fun.m».


3. Выполнить в командном окне MATLAB следующую команду:
fun(-10,10);

Обратите внимание на то, что xmin и xmax передаются как пара-


метры и объявлять глобальные переменные не требуется.

13
Задание 3. Разработать файл-сценарий для решения предыдущей
задачи с возможностью ввода значений пользователем, выполнив
следующие действия:

1.Запустить редактор m-файлов и ввести следующую программу:

%Plot with color red


%Строит график синусоиды линией красного цвета
%с выведенной масштабной сеткой в интервале [xmin, xmax]
disp('введите xmin и xmax ');
xmin=input('xmin = ');
xmax=input('xmax = ');
x=xmin:0.1:xmax;
plot(x,sin(x),'r')
grid on

2.Сохранить файл под именем «pcrdialog.m».


3.Выполнить в командном окне MATLAB следующие команды:

>> pcrdialog

Обратите внимание на то, что xmin и xmax объявляются в теле


сценария, поэтому объявлять глобальные переменные не требуется.

14
Лабораторная работа № 2
Массивы, структуры, ячейки
и классы системы MATLAB
Цель работы: изучение принципов работы с матрицами, структу-
рами, ячейками и классами в MATLAB, а также приобретение навы-
ков их применения для построения моделей нейронных сетей и их
исследования.

Теоретические сведения
Векторы, матрицы и многомерные массивы
В системе MATLAB любые данные представляются только в виде
массивов: одномерных (векторов), двумерных (матриц) и многомер-
ных любой размерности.
Система MATLAB выполняет сложные и трудоемкие операции
над векторами и матрицами даже в режиме прямых вычислений без
какого-либо программирования. Поддерживается множество опера-
ций над матрицами, таких как:
1. Создание матриц с заданными свойствами: ones, zeros, rand;
2. Конкатенация матриц: cat (dim, А, В), cat (dim, A1, A2, A3, ...);
3. Перестановка элементов: fliplr, flipud, perms;
4. Вычисление произведений и суммирование: prod, cumprod,
sum;
5. Поворот: rot 90(A), rot 90(A,k);
6. Выделение треугольных частей матриц: tril (x), tril (x,k), triu ;
7. Вычисление сопровождающей матрицы: compan;
8. Матричные операции векторной алгебры: cand, det, rank, norm;
9. Операции с многомерными массивами: +, -, *, .*, /, ./, ^, .^ .
Интересно отметить, что даже обычные числа и переменные в
MATLAB рассматриваются как матрицы размера 1х1, что дает еди-
нообразные формы и методы проведения операций над обычными
числами и массивами. Данная операция называется векторизацией.

15
Векторизация обеспечивает и упрощение записи операций, и суще-
ственное повышение скорости их выполнения. Это также означает,
что большинство функций может работать с аргументами в виде век-
торов и матриц.
Структуры
Массив записей – это новый тип массива, в котором разрешается
накапливать в виде записей разнородные данные. Отличительная
особенность такого массива – наличие именованных полей.
MATLAB поддерживает следующие функции при работе с масси-
вами записей:

Функция Описание
struct Создать массив записей
fieldnames Получить имена полей
getfield Получить содержимое поля
setfield Установить содержимое поля
rmfield Удалить поле
isfield Истинно, если это поле массива записей
isstruct Истинно, если это массив записей

Пользователь может расширить состав функций, создавая специ-


альные М-файлы для обработки конкретных данных.
Определение структуры
Структура – это массив записей с именованными полями, предна-
значенными для хранения данных; причем поле может содержать
данные любого типа: векторы, матрицы, массивы и структуры.

Структуру можно построить двумя способами:


а) используя операторы присваивания;

16
б) используя функцию struct.
Для того чтобы сформировать простейшую структуру размера
1х1, необходимо присвоить данные соответствующим полям. Систе-
ма MATLAB автоматически формирует структуру по мере ее запол-
нения.
Функция struct имеет следующий синтаксис:

str_array=struct('<имя_поля1>’,'<значение1>','<имя_поля2>','
<значение2>',...).

Используя индексацию, можно легко определить значение любого


поля или элемента структуры. Точно также можно присвоить значе-
ние любому полю или элементу поля. Чтобы обратиться к некоторо-
му полю, необходимо ввести точку (.) после имени структуры, за ко-
торым должно следовать имя поля.
Непосредственная индексация – это, как правило, наиболее эф-
фективный способ определить или присвоить значение полю записи.
Однако если использовалась функция fieldnames и известно имя по-
ля, то можно воспользоваться функциями setfield и getfield.
Функция getfield позволяет определить значение поля или эле-
мента поля:

f = getfield(array, {array_index}, 'field', {field_index})

где аргументы array_index и field_index задают индексы для струк-


туры и поля; они не являются обязательными для структуры размера
1х1. Результат применения функции getfield соответствует элементу
следующей структуры

f = array(array_index).field(field_index);

По аналогии функция setfield позволяет присваивать значения по-


лям, используя обращение следующего вида:

17
f = setfield(array, {array_index}, 'field', {field_index}, value)
Выполнение операций с полями и элементами полей абсолютно
аналогично операциям с элементами обычного числового массива. В
обоих случаях надо использовать индексные выражения.
Для обработки структур со специфической архитектурой полей
могут понадобиться специальные функции обработки полей и их
элементов. При написании М-файлов для обработки структур необ-
ходимо помнить, что пользователь должен сам выполнить анализ
возникновения возможных ошибок, связанных с обработкой полей.
Массивы ячеек
В систему MATLAB включен специальный тип массивов ячеек,
элементы которого сами, в свою очередь, являются массивами. Име-
ются следующие функции для работы с массивами ячеек:

Функция Описание
cell Создать массив ячеек
celldisp Показать содержимое массива ячеек
cellplot Показать графическую структуру массива ячеек
num2cell Преобразовать числовой массив в массив ячеек
deal Обмен данными между любыми классами массивов
cell2struct Преобразовать массив ячеек в структуру
struct2cell Преобразовать структуру в массив ячеек
iscell Истинно, если это массив ячеек
Пользователь может расширить состав этих функций, создавая
специальные М-файлы для обработки конкретных данных.
Определение массива ячеек
Массив ячеек – это массив, где элементами являются ячейки, ко-
торые могут содержать любой тип массива, в том числе и массив

18
ячеек. Массивы ячеек позволяют хранить массивы с элементами раз-
ных типов и разных размерностей.
Создать массивы ячеек можно двумя способами:
а) используя операторы присваивания;
б) используя функцию cell, которая позволяет предварительно
разместить массив, а затем присвоить данные ячейкам.
Можно построить массив ячеек, присваивая данные отдельным
ячейкам. В этом случае система MATLAB автоматически строит
массив по мере ввода данных. Существует два способа присвоения
данных отдельным ячейкам.
Индексация ячеек
В этом случае необходимо заключить индексы ячейки в круглые
скобки, используя стандартные обозначения для массива. Заключить
содержимое ячейки в правой части оператора присваивания в фигур-
ные скобки { }.
Индексация содержимого
Для того чтобы индексировать массив ячеек, надо в левой части
оператора присваивания указать элемент ячейки в виде индексов в
фигурных скобках по аналогии с элементами обычного массива, а
также указать содержимое ячейки в правой части оператора присваи-
вания.
Существует также два способа для извлечения данных из массива
ячеек и передачи их либо в некоторый числовой массив, либо в но-
вый массив ячеек:
а) доступ к содержимому ячейки с помощью индексации содер-
жимого;
б) доступ к подмножеству ячеек с помощью индексации ячеек.
Доступ к содержимому ячеек (индексация содер-
жимого)
Используя индексирование содержимого в правой части операто-
ра присваивания, можно получить доступ к некоторым или всем дан-
ным в одной ячейке. Определить переменную в левой части операто-

19
ра присваивания, чтобы запомнить содержимое ячейки. Заключить
индексное выражение в правой части оператора присваивания в фи-
гурные скобки. Это будет означать, что присваивается содержимое
ячеек, а не сами ячейки.
Доступ к подмножеству ячеек (индексация яче-
ек)
Используя индексацию ячеек, можно переназначить любой набор
ячеек другой переменной для создания нового массива ячеек. Ис-
пользуя двоеточие, можно получить доступ к подмножествам ячеек
внутри массива ячеек.
Удаление и переопределение массива ячеек
Удаляя ячейки из массива, можно уменьшить размерность масси-
ва, применив единственный оператор присваивания. По аналогии с
обычным массивом следует использовать индексацию вектора для
удаления строки или столбца ячеек, присваивая при этом пустую
матрицу подмассиву:
A(j : k ) = [ ]
Таким образом, при удалении ячеек фигурные скобки вообще не
применяются в операторах присваивания.
Как и для обычных массивов с помощью функции reshape можно
переопределять размеры массива ячеек, причем общее количество
ячеек должно оставаться неизменным; с помощью функции reshape
ни удалить, ни добавить ячейки нельзя.
Описание списков переменных
Массивы ячеек могут быть использованы для замены следующих
списков переменных:
а) списков входных переменных;
б) списков выходных переменных;
в) операций вывода на экран терминала;
д) квадратных и фигурных скобок при формировании массивов.

20
Когда для индексирования многомерного массива ячеек исполь-
зуются двоеточие и фигурные скобки, то система MATLAB обраба-
тывает содержимое каждой ячейки как отдельную переменную.
Классы
Классы и объекты позволяют добавлять новые типы данных и но-
вые операции. Класс описывает тип переменной и определяет, какие
операции и функции могут быть применены к этому типу перемен-
ной. Объект – это структура или образец некоторого класса.
Добавление классов осуществляется в рамках операционной сре-
ды системы MATLAB, которая обеспечивает возможность хранения
созданных объектов и организации каталога М-файлов, определяю-
щих допустимые методы обработки для данного класса объектов.
Каталог класса включает М-функции, определяющие способы, с по-
мощью которых операторы системы MATLAB, включая арифмети-
ческие, обработки индексов, конкатенации, обрабатывают объекты
данного класса. Переопределение встроенных операторов для нового
класса объектов в рамках объектно-ориентированного подхода назы-
вается переопределением методов.
В языке MATLAB отсутствует механизм объявления переменных.
Например, оператор A = zeros(10, 10) формирует обычную матрицу
размера 10х10, которая является объектом класса double. Точно так-
же оператор s = 'Hello world' создает объект класса char.
То же самое относится и к вновь создаваемым классам. Никаких
объявлений переменных или объектов не требуется. Объекты созда-
ются динамически посредством вызова конструктора класса.
Каталог класса
М-файлы, определяющие методы для объектов данного класса
объединяются в каталог класса, название которого задается как
@<имя_класса>.
Конструктор класса
Каталог класса должен обязательно содержать М-файл, называе-
мый конструктором класса. Название конструктора должно совпа-
дать с названиями класса и каталога без префикса @. Конструктор

21
создает объекты, используя данные в виде массива записей (структу-
ры) и приписывая им метку класса.
Функции isa и class. Эти функции используются конструктором,
но могут применяться и вне каталога класса.
Функция isa(a, 'class_name') проверяет, принадлежит ли объект a
данному классу.
При использовании вне контекста методов функция class допус-
кает только один аргумент.
Команда class(a) возвращает строку, содержащую имя класса для
объекта a.
Преобразование классов. Вызов функции преобразования класса
имеет вид
b = class_name(a),
где a – объект некоторого класса, отличного от class_name. В этом
случае система MATLAB ищет метод с именем class_name в катало-
ге классов для объекта a. Такой метод преобразовывает объект одно-
го класса в объект другого класса. Если данный объект уже является
объектом класса class_name, то система MATLAB вызывает функ-
цию конструктора, который просто возвращает этот объект.
Наиболее важными функциями преобразования классов являются
double и char. Преобразование к классу double создает традицион-
ный массив системы MATLAB, хотя это может и не отражать тре-
буемого соответствия для некоторых классов. Преобразование к
классу char полезно для вывода на печать.
При работе с объектами и методами система MATLAB использует
специальное множество правил, чтобы гарантировать вызов требуе-
мой функции. Если, по крайней мере, один из аргументов является
объектом, система MATLAB рассматривает список параметров слева
направо, чтобы определить их старшинство. Для операторов равного
старшинства выбирается крайний левый. Затем к нему применяются
следующие правила:
1. Если имя вызываемой функции совпадает с именем встроенной
функции, то проверяется, существует ли переопределенная версия
этой функции для этого класса, а затем – для родительского. Если ни
один из этих случаев не имеет место, выдается ошибка.

22
2. Если имя функции совпадает с названием каталога классов,
проверяется, не является ли эта функция функцией преобразования,
и если да, то эта функция преобразования вызывается. В противном
случае вызывается конструктор класса.
3. Если оба случая не подходят, то анализируются следующие
возможности:
а) если есть метод соответствующего типа, то вызывается этот ме-
тод;
б) если есть метод родительского класса, то вызывается метод ро-
дительского класса;
в) если есть функция с таким именем на пути поиска, то вызыва-
ется эта функция;
г) в противном случае генерируется ошибка.
Частные методы и функции. Каталоги классов могут иметь свя-
занные с ними частные каталоги. Такие каталоги могут содержать
как частные методы, которые работают с объектами данного класса,
так и частные функции, которые не работают с объектами, но выпол-
няют общие вычисления. Можно устанавливать частный каталог в
каталоге класса точно так же, как создается любой частный каталог,
т. е. просто создать каталог, именуемый private, внутри каталога
@class_name.
Во многих случаях можно изменить поведение операторов и
функций системы MATLAB, когда в качестве аргумента выступает
объект. Это осуществляется путем переопределения соответствую-
щих функций. Переопределение класса открывает возможность об-
работки с помощью этой функции различных типов данных при про-
извольном количестве входных аргументов.
Переопределение арифметических операций. Каждый встроен-
ный оператор в системе MATLAB имеет имя. Поэтому любой опера-
тор может быть переопределен путем создания М-файла с соответст-
вующим названием в каталоге классов.
Переопределение функций. Можно переопределить любую М-
функцию, создавая функцию с тем же именем в каталоге класса. Ко-
гда функция применяется к объекту, MATLAB прежде всего про-

23
сматривает каталог соответствующего класса, а уже потом другие
пути доступа.
Практические задания
Задание 1.Создать массив ячеек, содержащий данные различного
типа, с помощью индексации ячеек и индексации содержимого.
1. Для создания массива ячеек с помощью индексации ячеек вве-
сти следующие команды:
>> A(1,1)={[1 4 3; 0 5 8; 7 2 9]};
>> A(1,2)={'Anne Smith'};
>> A(2,1)={3+7i};
>> A(2,2)={-pi:pi/10:pi};
>> A
A=
[3x3 double] 'Anne Smith'
[3.0000+ 7.0000i] [1x21 double]

2. Для создания массива ячеек с помощью индексации содержи-


мого ввести следующие команды:
>> A{1, 1} = [1 4 3; 0 5 8; 7 2 9];
>> A{1, 2} = 'Anne Smith';
>> A{2, 1} = 3+7i;
>> A{2, 2} = -pi:pi/10:pi
A=
[3x3 double] 'Anne Smith'
[3.0000+ 7.0000i] [1x21 double]

3. Для отображения содержимого ячеек использовать функцию


celldisp:
>> celldisp(A)
A{1,1} =

24
1 4 3
0 5 8
7 2 9
A{2,1} =
3.0000 + 7.0000i
A{1,2} =
Anne Smith
A{2,2} =
Columns 1 through 9
-3.1416 -2.8274 -2.5133 -2.1991 -1.8850 -1.5708 -1.2566
-0.9425 -0.6283
Columns 10 through 18
-0.3142 0 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850
2.1991
Columns 19 through 21
2.5133 2.8274 3.1416

Задание 2. Создать массив структур, содержащих имя, фамилию и


год рождения.

1. Для создания массива структур ввести следующие команды:


>> S.name = 'Ed';
>> S.fam = 'Plum';
>> S.year = 1979
S=
name: 'Ed'
fam: 'Plum'
year: 1979

>> S(2).name = 'Tony';

25
>> S(2).fam = 'Miller';
>> S(2).year = 1980
S=
1x2 struct array with fields:
name
fam
year

>> S(3) = struct('name','Jerry','fam','Garcia','year',1981)


S=
1x3 struct array with fields:
name
fam
year

Задание 3. Разработать файл-сценарий для решения предыдущей


задачи с возможностью ввода значений пользователем.
1. Запустить редактор m-файлов и ввести следующую программу:
%Ввод структуры S
%Структура имеет три поля:
%имя name, фамилию fam и год рождения year
disp('Введите поля структуры');
S.name=input('name = ');
S.fam=input('fam = ');
S.year=input('year = ');
disp(S)
2. Сохранить файл под именем «strdialog.m».
3. Выполнить в командном окне MATLAB следующую команду:
>> strdialog

26
Обратите внимание на то, что xmin и xmax объявляются в теле
сценария и объявлять глобальные переменные не требуется.

Задание 4. На системном диске, где установлена математическая


система MATLAB, найти папки инструментального пакета по ней-
ронным сетям Neural Network Toolbox (NNT, или ПППНС) и ско-
пировать в рабочий каталог все методы класса network, обеспечи-
вающие создание, инициализацию, обучение, моделирование и ви-
зуализацию нейронной сети. В рабочем каталоге найти М-файл кон-
структоров класса и проанализировать их структуру.

Задание 5. Запустить на пошаговое исполнение конструктор сети


network, который не имеет параметров, и проследить последователь-
ность действий по формированию объекта класса network и заданию
значений по умолчанию для его атрибутов.

Задание 6. Создать объект класса нейронной сети network, испол-


нив команду
net = network,
и вывести на экран все поля и все ячейки этого объекта, используя
функцию celldisр.

Задание 7. Создать объект класса нейронной сети network, испол-


нив команду
net = network(2,3,[1;0;0], [11;00;00], ...
[000;100;010], [001], [001],
и вывести на экран все поля и все ячейки этого объекта, используя
функцию celldisр.

Задание 8. Исполнив команду gensim(net), получить на экране


структурную схему созданной сети, раскрыть её блоки с помощью
двойного щелчка мыши и выяснить смысл параметров конструктора
network. Изменяя значения параметров, проследить их влияние на
элементы структурной схемы.

27
Лабораторная работа № 3

Модели искусственного нейрона


Цель работы: изучение основных моделей искусственного ней-
рона, их математического описания, а также функционального и
структурного графических представлений, исследование функций
активации и рассмотренных моделей нейронов с помощью инстру-
ментального пакета имитационного моделирования Simulink систе-
мы MATLAB.

Теоретические сведения
Простой нейрон
Элементарной ячейкой нейронной сети является нейрон.
Структура нейрона с единственным скалярным входом показана
на рис. 3.1,а.

а б
Рис. 3.1. Простой нейрон

Скалярный входной сигнал р умножается на скалярный весовой


коэффициент w, и результирующий взвешенный вход w*p является
аргументом функции активации нейрона, которая порождает скаляр-
ный выход а.
Нейрон, показанный на рис. 3.1,б, дополнен скалярным смещени-
ем b. Смещение суммируется со взвешенным входом w*p и приво-
дит к сдвигу аргумента функции на величину b. Действие смещения

28
можно свести к схеме взвешивания, если представить что нейрон
имеет второй входной сигнал со значением, равным 1. Вход n функ-
ции активации нейрона по-прежнему остается скалярным и равным
сумме взвешенного входа и смещения b. Эта сумма является аргу-
ментом функции активации f; выходом функции активации является
сигнал а. Константы w и b являются скалярными параметрами ней-
рона. Основной принцип работы нейронной сети состоит в настройке
параметров нейрона с тем, чтобы функционирование сети соответст-
вовало некоторому желаемому поведению. Регулируя веса или пара-
метры смещения, можно “научить” сеть выполнять конкретную ра-
боту; возможно также, что сеть сама будет корректировать свои па-
раметры, чтобы достичь требуемого результата.
Уравнение нейрона со смещением имеет вид
a = f(w*p+b*l).
Как уже отмечалось, смещение b – настраиваемый скалярный па-
раметр нейрона, который не является входом, а константа 1, которая
управляет смещением, рассматривается как вход и может быть учте-
на в виде линейной комбинации векторов входа
⎡ p⎤
a = [w b] ⎢ ⎥ .
⎣1⎦

Функция активации
Функции активации (передаточные функции) нейрона могут
иметь самый разнообразный вид. Функция активации f, как правило,
принадлежит классу сигмоидальных функций с аргументом n и вы-
ходом а.
Ниже рассмотрены три наиболее распространенные функции ак-
тивации.

Единичная функция активации с жестким ограничениям


hardlim. Эта функция описывается соотношением а =
hardlim(n) = 1(n) и показана на рис. 3.2. Она равна 0, если
n < 0, и 1,если n >= 0.

29
Рис. 3.2. Функция активации hardlim

В состав пакета ППП Neural Network Toolbox входит


М-функция hardlim, реализующая функцию активации с жест-
кими ограничениями.
Линейная функция активации purelin. Эта функция описыва-
ется соотношением а = purelin(n) = n и показана на рис. 3.3.

Рис. 3.3. Линейная функция активации purelin

30
Логистическая функция активации logsig. Эта функция опи-
сывается соотношением а = logsig(n) = 1/(1 + ехр(-n)) и показа-
на на рис. 3.4. Она принадлежит к классу сигмоидальных функ-
ций, и ее аргумент может принимать любое значение в диапазоне
от − ∞ до + ∞ , а выход изменяется в диапазоне от 0 до 1. В пакете
ППП Neural Network Toolbox она представлена М-функцией logsig.
Благодаря свойству дифференцируемости эта функция часто исполь-
зуется в сетях с обучением на основе метода обратного распростра-
нения ошибки.

Рис. 3.4. Функция logsig

Символ в квадрате в правом верхнем углу графика характеризует


функцию активации. Это изображение используется на структурных
схемах нейронных сетей.
В пакет ППП Neural Network Toolbox включены и другие функции
активации. Используя язык MATLAB, пользователь может создавать
и свои собственные уникальные функции.
Нейрон с векторным входом
Нейрон с одним вектором входа р с R элементами p1 , p2 ,K, p R
показан на рис. 3.5. Здесь каждый элемент входа умножается на веса
w11 , w12 , K , w1R соответственно и взвешенные значения передаются

31
на сумматор. Их сумма равна скалярному произведению вектора-
строки W на вектор входа р.

Рис. 3.5. Функциональная схема нейрона

Нейрон имеет смещение b, которое суммируется со взвешенной


суммой входов. Результирующая сумма n определяется как
n = w11 p1 + w12 p2 + K + w1R pR + b
и служит аргументом функции активации f. В нотации языка
MATLAB это выражение записывается так:
n = W*p + b.
Структура нейрона, показанная на рис. 3.5, содержит много лиш-
них деталей. При рассмотрении сетей, состоящих из большого числа
нейронов, будет использоваться укрупненная структурная схема
нейрона (рис. 3.6).
Вход нейрона изображается в виде темной вертикальной черты,
под которой указывается количество элементов входа R. Размер век-
тора входа р указывается ниже символа р и равен Rxl. Вектор входа
умножается на вектор-строку W длины R. Как и прежде, константа 1
рассматривается как вход, который умножается на скалярное смеще-
ние b. Входом n функции активации нейрона служит сумма смеще-
ния b и произведения W*p. Эта сумма преобразуется функцией ак-

32
тивации f, на выходе которой получается выходная величина нейро-
на а, которая в данном случае является скалярной величиной. Струк-
турная схема, приведенная на рис. 3.6, называется слоем сети. Слой
характеризуется матрицей весов W, смещением b, операциями ум-
ножения W*p, суммирования и функцией активации f. Вектор вхо-
дов р обычно не включается в характеристики слоя.

Рис. 3.6. Структурная схема нейрона

Каждый раз, когда используется сокращенное обозначение сети,


размерность матриц указывается под именами векторно-матричных
переменных. Эта система обозначений поясняет строение сети и свя-
занную с ней матричную математику.
На укрупненной структурной схеме для обозначения типа функ-
ции активации применяются специальные графические символы; не-
которые из них приведены на рис. 3.7, где а – ступенчатая; б – ли-
нейная; в – логистическая функция.

33
Рис. 3.7. Функции активации
Практические задания
Задание 1. Для функции активации с жесткими ограниче-
ниями hardlim и её производной dhardlim, определяемыми сле-
дующими соотношениями:
⎧0, n < 0;
hardlim(n) = ⎨
⎩1, n ≥ 0;
⎧0, n < 0;
dhardlim(n) = ⎨
⎩0, n ≥ 0,
выполнить следующие действия:
1. Выдать на экран информацию об этих функциях с помощью
следующих команд:
name=hardlim(′name′) % – полное название функции;
dname=hardlim(′deriv′) % – название производной;
inrange=hardlim(′active′) % – диапазон входа;
outrange=hardlim(′output′) % – диапазон выхода;

2. Построить графики функций:

n=-5:0,1:5;
a=hardlim(n);
da=dhardlim(n);
plot(n,a,′r′) % – график функции активации – красный;
hard on

34
plot (n,da,′c′) % – график производной – голубой;

3. Рассчитать векторы выхода А и производной dA_dN для слоя из


трёх нейронов с вектором входа N, состоящим из трёх компонентов:

N=[-0,7; 0,1; 0,8];


A=hardlim(N) % – вектор выхода функции актива;
dA_dN= dhardlim(N,A) % – вектор выхода производной.
4. Рассмотренную последовательность команд оформить в виде
скрипта и записать в М-файл с именем hardlimfile.

Задание 2. Для симметричной функции активации с жёсткими ог-


раничениями hardlims и её производной dhardlims, определяемыми
соотношениями
⎧− 1, n < 0;
hardlims (n) = ⎨
⎩ 1, n ≥ 0;
⎧0, n < 0;
dhardlims (n) = ⎨
⎩0, n ≥ 0,
выдать на экран информацию об этих функциях, построить их гра-
фики и рассчитать векторы выхода, воспользовавшись скриптом из
М-файла hardlimfile. Новый скрипт записать в файл под именем
hardlimsfile.

Задание 3. Для линейной функции активации purelin и ее произ-


водной, dpurelin, определяемыми соотношениями
рurelin = n;
dpurelin = 1,
выдать на экран информацию об этих функциях, построить их гра-
фики и рассчитать векторы выхода, воспользовавшись скриптом из
М-файла hardlimfile. Новый скрипт записать в файл под именем
purelinfile.

35
Задание 4. Для положительной линейной функции активации
poslin и ее производной dposlin, определяемыми соотношениями
⎧0, n < 0;
рoslin = ⎨
⎩n, n ≥ 0;
⎧0, n < 0;
dposlin = ⎨
⎩1, n ≥ 0,

выдать на экран информацию об этих функциях, построить их


графики и рассчитать векторы выхода, воспользовавшись скриптом
из М-файла hardlimfile. Новый скрипт записать в файл под именем
poslinfile.

Задание 5. Для линейной функции активации с ограничениями


saflin и ее производной dsaflin, определяемыми соотношениями
0, n < 0;
soflin(n) = n, 0 ≤ n ≤ 1;
n, n > 0,
0, n < 0;
dsoflin(n)= 1, 0 ≤ n ≤ 1
1, n > 0,
выдать на экран информацию об этих функциях, построить их гра-
фики и рассчитать векторы выхода, воспользовавшись скриптом из
М-файла hardlimfile. Новый скрипт записать в файл под именем sat-
linfile.

Задание 6. Для симетричной линейной функции активации satlins


с ограничениями и ее производной dsatlins, определяемыми соотно-
шениями
-1, n < -1;
satlins(n) = n, -1 ≤ n ≤ 1;
1, n > 1,

36
0, n < -1;
dsatlins(n) = 1, -1 ≤ n ≤ 1
0, n > 1,
выдать на экран информацию об этих функциях, построить их гра-
фики и рассчитать векторы выхода, воспользовавшись скриптом из
М-файла hardlimfile. Новый скрипт записать в файл под именем sat-
linsfile.
Задание 7. Для радиальной базисной функции активации radbas и
ее производной dradbas, определяемыми соотношениями
radbas = e-2n,
dradbas = -2ne-2n,
выдать на экран информацию об этих функциях, построить их гра-
фики и рассчитать векторы выхода, воспользовавшись скриптом из
М-файла hardlimfile. Новый скрипт записать в файл под именем
radbasfile.

Задание 8. Для треугольной функции активации tribas и ее произ-


водной dtribas, определяемыми соотношениями
0, n < -1;
tribas(n) = 1-abs(n), -1 ≤ n ≤ 1;
0, n > 1,

0, n < -1;
dtribas(n) = 1, -1 ≤ n ≤0
-1, 0 < n ≤ 1
0, n > 1,
выдать на экран информацию об этих функциях, построить их гра-
фики и рассчитать векторы выхода, воспользовавшись скриптом из
М-файла hardlimfile. Новый скрипт записать в файл под именем tri-
basfile.

Задание 9. Для логистической функции активации logsig и ее про-


изводной dlogsig определяемыми соотношениями

37
logsig(n) = 1 / (1 + e-n);
dlogsig(n) = e-n / (1 + e-n)2,
выдать на экран информацию об этих функциях, построить их
графики и рассчитать векторы выхода воспользовавшись скриптом
из М-файла hardlimfile. Новый скрипт записать в файл под именем
logsigfile.

Задание 10. Для гиперболической тангенциальной функции акти-


вации tansig и ее производной dtansig определяемыми соотношения-
ми
tansig(n) = 2 / (1 + e-2n) – 1;
dtansig(n) = 1 – tansig2(n),
выдать на экран информацию об этих функциях, построить их гра-
фики и рассчитать векторы выхода, воспользовавшись скриптом из
М-файла hardlimfile. Новый скрипт записать в файл под именем tan-
sigfile.

Задание 11. Для конкурирующей функции активации compet ис-


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

Name = compet(′name′) % – cometitive;


Dname = compet(′dеriv′) % – ″;
Inrange = compet(′active′) % – -in : inf;
Outrange = compet(′outrut′) % – 0 1.

2. Построить столбцовые диаграммы для вектора входа и для


вектора выхода, используя слой из четырех нейронов:
N = [0; 1; - 0.5; 0.5];
A = compet(n);

38
subplot(2, 1, 1), % – подокна 2 × 1; вывод в 1-е;
bar(n), % – столбцовая диаграмма;
ylabet(‘n’) % – метка оси ординат;
subplot(2, 1, 2), bar(a), ylabet(‘a’) % – во 2-м подокне.
3. Рассмотренную последовательность команд оформить в виде
скрипта в М-файл с именем competlile.

Задание 12. Выполнить действия 11-го задания для конкурирую-


щей функции активации с мягким максимумом softmax, записав при
этом новый скрипт в М-файл с именем softmaxfile.

Задание 13. Для простого нейрона с одним двойным входом Р и


функции активации hardlim подобрать весовой коэффициент W и
смещение b таким образом, чтобы обеспечить инвертирование вход-
ного сигнала, т. е. замену нуля единицей, а единицы нулем.

Задание 14. Для нейрона с двумя двойными входами р1 и р2 и


функцией активации hardlim подобрать весовые коэффициенты и
смещение таким образом, чтобы нейрон выполнял функции логиче-
ского сложения и логического умножения.

Задание 15. Для нейрона с двумя двойными входами р1 и р2 и


функцией активации hardlim подбирать весовые коэффициенты W11
и W12 и смещение b таким образом, чтобы классифицировать вход-
ные двойные наборы на два класса – нулевой и первый:
а) {00, 01} – нулевой класс, {10, 11} – первый класс;
б) {11} – нулевой класс, {00, 01, 10} – первый класс;
в) {00, 11} – нулевой класс, {01, 10} – первый класс;
г) {00, 11} – первый класс, {01, 10} – нулевой класс.

39
Задание 16. Для нейрона с двумя непрерывными входами р1 и р2 и
функции активации hardlim построить график разделяющей линии,
определяемой уравнением
W11p1 + W12p2 + b = 0,
считая, что значения весовых коэффициентов W11 W12 и смещения b
заданы. Убедиться, что наборы входов р1 и р2 по разную сторону от
разделяющей линии принадлежат разным классам и что не всякое
множество наборов значений входов можно разделить на два класса,
используя нейрон рассмотренного типа.

Задание 17. Используя блоки имитационного моделирования ин-


струментального пакета Simulink системы MATLAB (блоки источни-
ков и регистраторов сигналов, математические и нелинейные блоки)
построить рассмотренные в заданиях 1 – 16 модели нейронов, про-
вести исследования моделей нейронов и оформить в электронном
виде отчет с помощью генератора отчетов Simulink.

40
Лабораторная работа № 4
Искусственные нейронные сети
Цель работы: изучение архитектуры искусственных нейронных
сетей, способов их графического изображения в виде функциональ-
ных и структурных схем и программного представления в виде объ-
ектов специального класса network, включающих массив структур с
атрибутами сети и набор необходимых методов для создания, ини-
циализации, обучения, моделирования и визуализации сети, а также
приобретение навыков построения сетей различной архитектуры с
помощью инструментального программного пакета Neural Network
Toolbox системы MATLAB.

Теоретические сведения
Хотя отдельные нейроны и способны после некоторой процедуры
обучения решать ряд задач искусственного интеллекта, все же для
эффективного решения сложных задач по распознаванию образов,
идентификации и классификации объектов, распознаванию и синтезу
речи, оптимальному управлению применяют достаточно большие
группы нейронов, образуя из них искусственные нейронные сети в
виде связанных между собой слоёв, напоминающие биологические
нейронные (нервные) сети человека и животных.
Существует множество способов организации искусственных
нейронных сетей, которые могут содержать различное число слоёв
нейронов. Нейроны могут быть связаны между собой как внутри от-
дельных слоёв, так и между слоями. В зависимости от направления
передачи сигнала эти связи могут быть прямыми или обратными.
Слой нейронов, непосредственно принимающий информацию из
внешней среды, называется входным слоем, а слой, передающий ин-
формацию во внешнею среду, – выходным слоем. Остальные слои,
если они имеются в сети, называются промежуточными, или скры-
тыми. В ряде случаев такого функционального распределения слоёв
сети не производится, так что входы и выходы могут присоединяться
к любым слоям и иметь произвольное число компонент.

41
Структура, или архитектура сети искусственных нейронов зависит
от той конкретной задачи, которую должна решать сеть. Она может
быть однослойной без обратных связей или с обратными связями,
двухслойной с прямыми связями, трехслойной с обратными связями
и т. д. Сети с обратными связями называют часто рекуррентными.
Описание архитектуры искусственной нейронной сети помимо
указания числа слоёв и связей между ними должно включать сведе-
ния о количестве нейронов в каждом слое, виде функций активации в
каждом слое, наличии смещений для каждого слоя, наличии компо-
нент входных, выходных и целевых векторов, а в ряде случаев и ха-
рактеристики топологии слоёв. Например, для аппроксимации любой
функции с конечным числом точек разрыва широко используется
сеть с прямой передачей сигналов. В этой сети имеется несколько
слоёв с сигмоидальными функциями активации. Выходной слой со-
держит нейроны с линейными функциями активации. Данная сеть не
имеет обратных связей, поэтому её называют сетью с прямой пере-
дачей сигналов (FF-net).
Графически искусственная нейронная сеть изображается в виде
функциональной или структурой схемы. На функциональной схеме
сети с помощью геометрических фигур изображаются её функцио-
нальные блоки, а стрелками показываются входы, выходы и связи. В
блоках и на стрелках указываются необходимые обозначения и па-
раметры.
Структурная схема сети изображается с помощью типового набо-
ра блоков, соединительных элементов и обозначений, принятых в
инструментальном программном пакете Neural Network Toolbox сис-
темы MATLAB и пакете имитационного моделирования Simulink той
же системы. Структурная схема сети может быть укрупнённой или
детальной, причём степень детализации определяется пользователем.
Системы обозначений блоков, элементов и параметров сети является
векторно-матричной, принятой в системе MATLAB. Если в обозна-
чении используется два индекса, то, как правило, первый индекс (ин-
декс строки) указывает адресата, или пункт назначения, а второй
индекс (индекс столбца) – источник структурной схемы сети. Струк-
турные схемы создаются системой автоматически с помощью коман-
ды gensim. Если элементом вектора или матрицы на структурной

42
схеме является сложный объект, то используются соответственно
ячейка и массив ячеек.
Программным представлением, или вычислительной моделью ис-
кусственной нейронный сети, является объект специального класса
network, который включает массив структур с атрибутами сети и на-
бор методов, необходимых для создания сети, а также для её ини-
циализации, обучения, моделирования и визуализации. Класс Net-
work имеет два общих конструктора, один из которых не имеет па-
раметров и обеспечивает создание массива структур с нулевыми зна-
чениями полей, а второй – имеет минимальный набор параметров
для создания модели нейронной сети, достраиваемой затем до нуж-
ной конфигурации с помощью операторов присваивания. Для созда-
ния нейронных сетей определённого вида используются специаль-
ные конструкторы.

Практические задания
Задание 1. Создать вычислительную модель нейронной сети с
двумя выходами, тремя слоями и одним целевым входом, используя
общий конструктор сети с параметрами

Net = network (numInputs, numLayers, biasConnect, imputConnect,


layerConnect, outputConnect, tartegtConnect).

Связи между слоями должны быть только прямыми, входы необ-


ходимо соединить с первым слоем, а выход – с последним. Выход
должен быть целевым, первый слой должен иметь смещения.
Смысл и значения параметров конструктора для создания модели
сети заданной архитектуры таковы:

numImputs=2 – количество входов сети;


numLayers=3 – количество слоёв в сети;
biasConnect=[1; 0; 0] – матрица связности для смещений раз-
мера numLayers * 1;

43
inputConnect=[1 1; 0 0; 0 0] – матрица связности для входов
размера numLayers * numImputs;
layerConnect=[0 0 0;1 0 0 0 ; 0 1 0] – матрица связности для сло-
ёв размера numLayers * numLayers;
outputConnect=[0 0 1] – матрица связности для выходов разме-
ра 1* numLayers;
targetConnect=[0 0 1] – матрица связности для целей размера 1 *
numLayers.

Порядок выполнения заданий следующий:


1. Создать шаблон сети, выполнив команду
net = network (2, 3, [1; 0; 0], [1 1; 0 0 ; 0 0], …. ,
[0 0 0 ; 1 0 0 ; 0 1 0], [0 0 1])
2. Проверить значения полей вычислительной модели нейронной
сети net и их соответствие заданным значениям в списке параметров.
3. Проверить значения вычисляемых полей модели, которые до-
полняют описание архитектуры сети

numOutputs = 1 – количество выходов сети;


numTargets = 1 – количество целей сети;
numInputDelays = 0 – максимальное значение задержки для
входов сети.
numLayersDelays = 0 – максимальное значение задержки для
слоёв сети.

Заметим, что каждый выход и каждая цель присоединяются к од-


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

44
4. Проанализировать структурную схему построенной сети, вы-
полнив команду gensim(net) и детализируя блоки с помощью двой-
ного щелчка левой клавиши мыши по рассматриваемому блоку. На
структурных схемах искусственных нейронных сетей в пакете NNT
используются следующие обозначения:
а) Neural Network – искусственная нейронная сеть с обозначе-
ниями входов p{1}, p{2}, … и выхода y{1};
б) входы Input1 , или p{1} и Input2 , или p{2};
в) дисплей y{1};
г) Layer 1, Layer 2, Layer 3, … слои нейронов с обозначениями
входов p{1}, p{2], a{1}, a{2}, … и выходов a{1}, a{2}, a{3}, … , y{1};
д) TDL – линии задержки (Time Delay) с именами Delays1,
Delays2, ..., которые обеспечивают задержку входных сигналов или
сигналов между слоями нейронов на 1, 2, 3, … такта;
е) Weights – весовая матрица для входных сигналов или сигналов
между слоями нейронов; размер матрицы весов для каждого вектора
входа S×R, где S – число нейронов входного слоя, а R – число ком-
понент вектора входа, умноженное на число задержек; размер мат-
рицы для сигналов от слоя j к слою i равен S×R, где S – число нейро-
нов в слое i, а R – число нейронов в слое j, умноженное на число
задержек;
ж) dotprod – блок взвешивания входных сигналов и сигналов ме-
жду слоями, на выходе которого получается сумма взвешенных, т. е.
умноженных на соответствующие веса компонент сигнала;
з) mux – концентратор входных сигналов и сигналов между
слоями, преобразует набор скалярных сигналов в вектор, а набор
векторов в один вектор суммарной длины;
и) netsum – блок суммирования компонент для каждого нейрона
слоя: компонент от нескольких векторов входа с учётом задержек,
смещения и т. п.;
к) hardlim, purelin и т. д. – блоки функций активации;
л) pd{1, 1}, pd{1, 2}, ad{2, 1}, ... – сигналы после линий задержки
(d - delay);

45
м) iz{1, 1}, iz{1, 2}, lz{2, 1}, lz{3, 2} – вектор-сигналы с выхода
концентратора;
н) bias – блок весов смещений для слоя нейронов;
о) IW – массив ячеек с матрицами весов входов: IW{i, j} – матри-
цы для слоя i от входного вектора j;
п) LW – массив ячеек с матрицами весов для слоёв: LW{i, j} –
матрицы для слоя i от слоя j.
5. Проанализировать все параметры каждого блока структурной
схемы рассматриваемой нейронной сети и в случае необходимости
обратиться к справочной системе пакета NNT.
6. Задать нулевые последовательности сигналов для входов
P = [0 0 ; 0 0]
и произвести моделирование сети
A = sim(net, P).
7. Задать диапазоны входных сигналов и весовые матрицы с по-
мощью следующих присваиваний:
net.inputs{1}.range = [0 1];
net.inputs{2}.range = [0 1];
net.b{1} = - ¼;
net.IW{1, 1} = [0.5];
net.IW{1, 2} = [0.5];
net.LW{2, 1} = [0.5];
net.LW{3, 2} = [0.5].
Исполнить команду gensim(net) и проверить параметры блока.
8. Вывести на экран поля вычислительной модели и их содержи-
мое, используя функцию celldisp. Убедиться в правильности значе-
ний полей модели.
9. Промоделировать созданную статическую сеть, т. е. сеть без
линий задержки, используя групповое и последовательное представ-
ление входных сигналов
PG = [0.5 1 ; 1 0.5];
PS = {[0.5 1] [1 0.5]};

46
AG = sim(net, PG);
AS = sim(net, PS).
Убедиться, что для статической сети групповое и последователь-
ное представления входных сигналов дают один и тот же результат.
10. Дополнить архитектуру созданной нейронной сети линиями
задержки для входных сигналов и для сигналов между 2-м и 3-м
слоями, превратив таким образом статическую сеть в динамическую:
net.inputWeights{1, 1}.delays = [0 1];
net.inputWeights{1, 2}.delays = [0 1];
net.layerWeights{3, 2}.delays = [0 1 2].
Построить структурную схему динамической сети и выяснить
смысл используемых операторов присваивания.
11. Скорректировать весовые матрицы:
net.IW{1, 1} = [0.5 0.5];
net.IW{1, 2} = [0.5 0.25];
net.LW{3, 2} = [0.5 0.25 1].
12. Промоделировать динамическую сеть, используя групповое и
последовательное представление входных сигналов:
AG = sim(net, PG);
AS = sim(net, PS).
Убедиться, что групповое представление входных сигналов иска-
жает результат, так как в этом случае работа одной сети заменяется
параллельной работой двух (по числу последовательностей) одина-
ковых сетей с нулевыми начальными значениями сигналов на выхо-
дах линий задержки.
13. Вывести на печать поля вычислительной модели и их содер-
жимое, используя функцию celldisp.
14. Сохранить содержимое командного окна в М-файле для по-
следующего использования.

Задание 2. Создать точно такую же динамическую сеть asgnet,


используя конструктор класса network без параметров и задавая зна-
чения соответствующих полей вычислительной модели с помощью

47
операторов присваивания. Убедиться в идентичности сетей net и as-
gnet. Сравнить результаты работы полученных сетей.
Задание 3. Используя блоки имитационного моделирования инст-
рументального пакета Simulink системы MATLAB, построить модель
динамической сети asgnet, провести исследование модели, проверить
адекватность её поведения поведению модели net и оформить элек-
тронный отчёт с помощью генератора Report Generator.

Задание 4. Используя конструктор класса network с параметрами


и операторы присваивания для полей и ячеек объектов этого класса,
построить, выдать на экран и промоделировать искусственные ней-
ронные сети следующей архитектуры:
а) однослойная сеть с тремя нейронами, тремя двухкомпонентны-
ми входами и одним целевым выходом;
б) трёхслойная сеть с прямой передачей сигналов и с тремя ней-
ронами в каждом слое; количество входов – три с двумя, пятью и
тремя компонентами; для всех слоёв имеется смещение; выход –
один;
в) трёхслойная сеть, в которой каждый слой соединён со всеми
остальными; вход – один и состоит из двух компонентов; количество
нейронов в каждом слое – три; слои имеют смещения;
г) трёхслойная динамическая сеть с тремя нейронами в каждом
слое; число входов – три, из них каждый состоит из трёх компонен-
тов; имеются смещения на всех слоях; линии задержки задерживают
сигналы на один и два такта и включены между всеми слоями, а так-
же на входе;
д) квадратная сеть с десятью слоями и десятью нейронами в каж-
дом слое; десять векторов подключаются по одному к каждому слою;
имеется десять выходов от всех слоёв сети; смещения подключены к
каждому слою.

48
Лабораторная работа № 5

Методы и алгоритмы обучения


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

Теоретические сведения
После того как сформирована архитектура нейронной сети, долж-
ны быть заданы начальные значения весов и смещений, или иными
словами, сеть должна быть инициализирована. Такая процедура вы-
полняется с помощью метода init для объектов класса network. Опе-
ратор вызова этого метода имеет вид:
net = init (net).
Перед вызовом этого метода в вычислительной модели сети необ-
ходимо задать следующие свойства:
net.initFcn – для определения функций, которые будут использо-
ваться для задания начальных матриц весов и весов слоёв, а также
начальных векторов смещений;
net.layers {i}. initFcn – для задания функции инициализации i-го
слоя;
net.biases{i}.initFcn – для задания начального вектора смещения
i-го слоя;
net.inputWeights{i,j}.initFcn – для задания функции вычисления
матрицы весов к слою i от входа j;
net.layerWeight{i,j}.initFcn – для задания функции вычисления
матрицы весов к слою i от входа j;
net.initParam – для задания параметров функций инициализации.
Способ инициализации сети определяется заданием свойств и
net.initFcn net.layers{i}.initFcn. Для сетей с прямой передачей сиг-

49
налов по умолчанию используется net.initFcn = ‘initlay’, что разре-
шает для каждого слоя использовать собственные функции инициа-
лизации, задаваемые свойством net.layers{i}.initFcn с двумя возмож-
ными значениями: ‘initwb’ и ’initnw’.
Функция initwb позволяет использовать собственные функции
инициализации для каждой матрицы весов и для каждого вектора
смещений, при этом возможными значениями для свойств
net.inputWeights{i,j}.initFcn и net.layerWeight{i,j}.initFcn являются:
‘initzero’, ‘midpoint’, ’randnc’, ’rands’, а для свойства
net.biases{i}.initFcn – значения ‘initcon’, ‘initzero и ‘rands’. Для
сетей без обратных связей с линейными функциями активации
веса обычно инициализируются случайными значениями из интерва-
ла [-1 1].
Функция initnw реализуют алгоритм Nguyen-Widrow и применя-
ется для слоёв, использующих сигмоидальные функции активации.
Эта функция генерирует начальные веса и смещения для слоя так,
чтобы активные области нейронов были распределены равномерно
относительно области входов, что обеспечивает минимизацию числа
нейронов сети и время обучения.
Другими возможными значениями свойства net.initFcn являются:
‘initcon’, ‘initnw’, ‘initwb’ и ‘initzero’.
Помимо функции initnw следующие функции производят непо-
средственную инициализацию весов и смещений:
initzero присваивает матрицам весов и векторам смещений нуле-
вые значения;
rands присваивает матрицам весов и векторам смещений случай-
ные значения из диапазона [-1 1];
randnr присваивает матрице весов случайные нормированные
строки из диапазона [-1 1];
randnc присваивает матрице весов случайные нормированные
столбцы из диапазона [-1 1];
midpoint присваивает элементам вектора смещения начальные
равные смещения, зависящие от числа нейронов в слое, и использу-
ется вместе с функцией настройки learncon.

50
Таким образом, задание функций инициализации для вычисли-
тельной модели нейронной сети является многоступенчатым и вы-
полняется по следующему алгоритму:
1. Выбрать для свойства net.initFcn одно из возможных значе-
ний: ‘initzero’, ‘initcon’, ‘initnw’, ‘initwb’ или ‘initlay’.
2. Если выбраны значения ‘initzero’, ‘initcon’ или ‘initnw’, то за-
дание функций инициализации сети завершено.
3. Если выбрано значение ‘initwb’, то переход к шагу 6.
4. Если выбрано значение ‘initlay’, то переходим к слоям и для
каждого слоя i свойству net.layers{i}.initFcn необходимо задать одно
из возможных значений: ‘initnw’ или ‘initwb’.
5. Если для i-го слоя выбрано значение ‘initnw’, то для этого слоя
задание функций инициализации завершено.
6. Если для всех слоев сети или для какого-то слоя установлено
свойство ‘initwb’, то для этих слоёв необходимо задать свойства
net.biases{i}.initFcn, выбрав его из набора: ‘initzero’, ‘rands’ или
‘initcon’, а также свойства net.layerWeights{i,j}.initFcn, используя
следующие значения: ‘initzero’, ‘midpoint’, ‘randnc’, ‘randnr’ или
‘rands’.
Заметим, что с помощью оператора revert(net) можно возвратить
значения весов и смещений к ранее установленным значениям.
После инициализации нейронной сети её необходимо обучить
решению конкретной прикладной задачи. Для этих целей нужно со-
брать обучающий набор данных, содержащий интересующие при-
знаки изучаемого объекта, используя имеющийся опыт. Сначала сле-
дует включить все признаки, которые, по мнению аналитиков и экс-
пертов, являются существенными; на последующих этапах это мно-
жество, вероятно, будет сокращено. Обычно для этих целей исполь-
зуются эвристические правила, которые устанавливают связь между
количеством необходимых наблюдений и размером сети. Обычно
количество наблюдений на порядок больше числа связей в сети и
возрастает по нелинейному закону, так что уже при довольно не-
большом числе признаков, например 50, может потребоваться ог-
ромное число наблюдений. Эта проблема носит название "проклятие

51
размерности". Для большинства реальных задач бывает достаточно
нескольких сотен или тысяч наблюдений.
После того как собран обучающий набор данных для проектируе-
мой сети, производится автоматическая настройка весов и смещений
с помощью процедур обучения, которые минимизируют разность
между желаемым сигналом и полученным на выходе в результате
моделирования сети. Эта разность носит название "ошибки обуче-
ния". Используя ошибки обучения для всех имеющихся наблюдений,
можно сформировать функцию ошибок или критерий качества обу-
чения. Чаще всего в качестве такого критерия используется сумма
квадратов ошибок. Для линейных сетей при этом удаётся найти аб-
солютный минимум критерия качества, для других сетей достижение
такого минимума не гарантируется. Это объясняется тем, что для ли-
нейной сети критерий качества, как функция весов и смещения, яв-
ляется параболоидом, а для других сетей – очень сложной поверхно-
стью в N+1-мерном пространстве, где N – число весовых коэффици-
ентов и смещений.
С учётом специфики нейронных сетей для них разработаны спе-
циальные алгоритмы обучения. Алгоритмы действуют итеративно,
по шагам. Величина шага определяет скорость обучения и регулиру-
ется параметром скорости настройки. При большом шаге имеется
большая вероятность пропуска абсолютного минимума, при малом
шаге может сильно возрасти время обучения. Шаги алгоритма при-
нято называть эпохами или циклами.
На каждом цикле на вход сети последовательно подаются все
обучающие наблюдения, выходные значения сравниваются с целе-
выми значениями и вычисляется функция критерия качества обуче-
ния – функция ошибки. Значения функции ошибки, а также её гради-
ента используются для корректировки весов и смещений, после чего
все действия повторяются. Процесс обучения прекращается по сле-
дующим трём причинам, если:
а) реализовано заданное количество циклов;
б) ошибка достигла заданной величины;
в) ошибка достигла некоторого значения и перестала уменьшать-
ся.

52
Во всех этих случаях сеть минимизировала ошибку на некотором
ограниченном обучающем множестве, а не на множестве реальных
входных сигналов при работе модели. Попытки усложнить модель и
снизить ошибку на заданном обучающем множестве могут привести
к обратному эффекту, когда для реальных данных ошибка становится
ещё больше. Эта ситуация называется явлением переобучения ней-
ронной сети.
Для того чтобы выявить эффект переобучения нейронной сети,
используется механизм контрольной проверки. С этой целью часть
обучающих наблюдений резервируется как контрольные наблюдения
и не используется при обучении сети. По мере обучения контроль-
ные наблюдения применяются для независимого контроля результа-
та. Если на некотором этапе ошибка на контрольном множестве пе-
рестала убывать, обучение следует прекратить даже в том случае,
когда ошибка на обучающем множестве продолжает уменьшаться,
чтобы избежать явления переобучения. В этом случае следует
уменьшить количество нейронов или слоёв, так как сеть является
слишком мощной для решения данной задачи. Если же, наоборот,
сеть имеет недостаточную мощность, чтобы воспроизвести зависи-
мость, то явление переобучения скорее всего наблюдаться не будет и
обе ошибки – обучения и контроля – не достигнут требуемого уровня.
Таким образом, для отыскания глобального минимума ошибки
приходится экспериментировать с большим числом сетей различной
конфигурации, обучая каждую из них несколько раз и сравнивая по-
лученные результаты. Главным критерием выбора в этих случаях
является контрольная погрешность. При этом применяется правило,
согласно которому из двух нейронных сетей с приблизительно рав-
ными контрольными погрешностями следует выбирать ту, которая
проще.
Необходимость многократных экспериментов ведёт к тому, что
контрольное множество начинает играть ключевую роль в выборе
нейронной сети, т. е. участвует в процессе обучения. Тем самым его
роль как независимого критерия качества модели ослабляется, по-
скольку при большом числе экспериментов возникает риск переобу-
чения нейронной сети на контрольном множестве. Для того, чтобы
гарантировать надёжность выбираемой модели сети, резервируют

53
ещё тестовое множество наблюдений. Итоговая модель тестируется
на данных из этого множества, чтобы убедиться, что результаты,
достигнутые на обучающем и контрольном множествах, реальны.
При этом тестовое множество должно использоваться только один
раз, иначе оно превратится в контрольное множество.
Итак, процедура построения нейронной сети состоит из следую-
щих шагов:
1. Выбрать начальную конфигурацию сети в виде одного слоя с
числом нейронов, равным половине общего количества входов и вы-
ходов.
2. Обучить сеть и проверить ее на контрольном множестве, доба-
вив в случае необходимости дополнительные нейроны и промежу-
точные слои.
3. Проверить, не переобучена ли сеть. Если имеет место эффект
переобучения, то произвести реконфигурацию сети.
Для того чтобы проектируемая сеть успешно решала задачу, не-
обходимо обеспечить представительность обучающего, контрольно-
го и тестового множества. По крайней мере, лучше всего постараться
сделать так, чтобы наблюдения различных типов были представлены
равномерно. Хорошо спроектированная сеть должна обладать свой-
ством обобщения, когда она, будучи обученной на некотором мно-
жестве данных, приобретает способность выдавать правильные ре-
зультаты для достаточно широкого класса данных, в том числе и не
представленных при обучении.
Другой подход к процедуре обучения сети можно сформулиро-
вать, если рассматривать её как процесс, обратный моделированию.
В этом случае требуется подобрать такие значения весов и смеще-
ний, которые обеспечивали бы нужное соответствие между входами
и желаемыми значениями на выходе. Такая процедура обучения но-
сит название процедуры адаптации и достаточно широко применяет-
ся для настройки параметров нейронных сетей.
По умолчанию для сетей с прямой передачей сигналов в качестве
критерия обучения используется функционал, представляющий со-
бой сумму квадратов ошибок между выходами сети и их целевыми
значениями:

54
1 Q S q
J= ∑∑
2 q =1 i =1
(ti − d iq ) 2 ,

где Q – объём выборки; q – номер выборки; i – номер выхода;


tiq – целевое значение для i-го выхода выборки q; aiq – сигнал на i-м
выходе при подаче входных сигналов q-й выборки. Целью обучения
сети является минимизация этого функционала с помощью измене-
ния весов и смещений.
В настоящее время разработано несколько методов минимизации
функционала ошибки на основе известных методов определения экс-
тремумов функций нескольких переменных. Все эти методы можно
разделить на три класса:
а) методы нулевого порядка, в которых для нахождения миниму-
ма используется только информация о значениях функционала в за-
данных точках;
б) методы первого порядка, в которых используется градиент
функционала ошибки по настраиваемым параметрам, использующий
частные производные функционала;
в) методы второго порядка, в которых используются вторые про-
изводные функционала.
Для линейных сетей задача нахождения минимума функционала
(параболоида) сводится к решению системы линейных уравнений,
включающих веса, смещения, входные обучающие значения и целе-
вые выходы и, таким образом, может быть решена без использования
итерационных методов. Во всех остальных случаях надо использо-
вать методы первого или второго порядка.
Если используется градиент функционала ошибки, то
X k +1 = X k − α k g k ,
где X k и X k +1 – векторы параметров на k-й и k+1-й итерациях;
α k – параметр скорости обучения; g k – градиент функционала, со-
ответствующий k-й итерации.

55
Если используется сопряжённый градиент функционала, то на
первой итерации направление движения p0 выбирают против гради-
ента g 0 этой итерации:
p0 = g 0 .
Для следующих итераций направление pk выбирают как линей-
ную комбинацию векторов g k и pk −1 :
pk = − g k + β k pk −1 ,
а вектор параметров рассчитывают по формуле:
X k +1 = X k + α k pk ,
Для методов второго порядка расчет параметров на k-м шаге про-
изводят по формуле (метод Ньютона):
X k +1 = X k − H k−1 g k ,
где Hk – матрица вторых частных производных целевой функции
(матрица Тессе); gk – вектор градиента на k-й итерации. Вычисление
матрицы Тессе требует больших затрат машинного времени, поэтому
её заменяют приближенными выражениями (квазиньютоновские ал-
горитмы).
Градиентными алгоритмами обучения являются:
GD – алгоритм градиентного спуска;
GDM – алгоритм градиентного спуска с возмущением;
GDA – алгоритм градиентного спуска с выбором параметра ско-
рости настройки;
Rprop – пороговый алгоритм обратного распространения ошибки;
GDX – алгоритм градиентного спуска с возмущением и адаптаци-
ей параметра скорости настройки.
Алгоритмами, основанными на использовании метода сопряжен-
ных градиентов, являются:
CGF – алгоритм Флетчера–Ривса;
CGP – алгоритм Полака–Ребейры;
CGB – алгоритм Биеле–Пауэлла;

56
SCG – алгоритм Молера.
Квазиньютоновскими алгоритмами являются:
DFGS – алгоритм Бройдена, Флетчера, Гольдфарба и Шанно;
OSS – одношаговый алгоритм метода секущих плоскостей (алго-
ритм Баттини);
LM – алгоритм Левенберга–Марквардта;
BR – алгоритм Левенберга–Марквардта с регуляризацией по Байесу.
В процессе работы алгоритмов минимизации функционала ошиб-
ки часто возникает задача одномерного поиска минимума вдоль за-
данного направления. Для этих целей используется метод золотого
сечения GOL, алгоритм Брента BRE, метод половинного деления и
кубической интерполяции HYB, алгоритм Чараламбуса CHA и алго-
ритм перебора с возвратом BAC.

Практические задания
Задание 1. Адаптировать параметры однослойной статической
линейной сети с двумя входами для аппроксимации линейной зави-
симости вида t = 2 p1 + p2 , выполнив следующие действия:
1. С помощью конструктора линейного слоя
net = newlin(PR, s, id, lr),
где PR – массив размера Rx2 минимальных и максимальных значе-
ний для R векторов входа; s – число нейронов в слое; id – описание
линий задержек на входе слоя; lr – параметр скорости настройки,
сформировать линейную сеть:
net = newlin([-1 1; -1 1], 1, 0, 0).
2. Подготовить обучающие последовательности в виде массивов
ячеек, используя зависимости t = 2 p1 + p2 и четыре пары значений
p1 и p2 (произвольные):
P = {[-1; 1] [-1/3; 1/4] [1/2; 0] [1/6; 2/3]};
T = { -1 -5/12 1 1 }.
3. Для группировки представления обучающей последовательно-
сти преобразовать массивы ячеек в массивы чисел:

57
P1 = [P{:}], T1 = [T{:}].
4. Выполнить команды net и gensim(net), проанализировать поля
вычислительной модели и структурную схему сети и записать в тет-
радь значения полей, определяющих процесс настройки параметров
сети (весов и смещений):
net.initFcn – функция для задания начальных матриц весов и век-
торов смещений;
net.initParam – набор параметров для функции initFcn, ко-
торые можно определить с помощью команды help(net.initFcn), где
initFcn – заданная функция инициализации: initcon, initlay, initnw,
initnwb, initzero;
net.adaptFcn – функция адаптации нейронной сети, используемая
при вызове метода adapt класса network: adaptwb или trains;
net.adaptParam – параметры функции адаптации, определяемые с
помощью команды help(net.adaptFcn);
net.trainFcn – функция обучения нейронной сети, используемая
при вызове метода train класса network: trainb, trainbfg, traingbr,
trainc, traincgb, traincgt, traincgp, trainngd, traingda, traingdm,
traingdx, trainlm, trainoss, trainr, trainrp, trainscg;
net.trainParam – параметры функции обучения, определяемые с
помощью команды help(net.trainFcn);
net.performFcn – функция оценки качества обучения, используе-
мая при вызове метода train: mae, mse, msereg, sse;
net.performParam – параметры функции оценки качества обуче-
ния, определяемые с помощью команды help(net.performFcn);
net.layers{1}.initFcn – функция инициализации параметров слоя:
initnw, initwb;
net.layers{1}.transferFcn – функция активации, которая для
линейного слоя должна быть purelin;
net.layers{1}.netInputFcn – функция накопления для слоя:
netprod, netsum;
net.biases{1}.initFcn – функция инициализации вектора смеще-
ний: initcon, initzero, rands;

58
net.biases{1}.lean – индикатор настройки: 0 – с помощью метода
adapt, 1 – с помощью метода train;
net.biases{1}.learnFcn – функция настройки вектора смещений:
learncon, learngd, learngdm, learnnp, learnwh;
net.biases{1}.learnParam – параметры функции настройки, опре-
деляемые с помощью команды help.(net.biases{1}.learnFcn);
net.inputWeights{1, 1}.initFcn – функция инициализации весов
входа: initzero, midpoint, randnc, randnr, rands;
net.inputWeights{1,1}.learn – индикатор настройки: 0 – с помо-
щью метода adapt, 1 – с помощью метода train;
net.inputWeights{1,1}.learnFcn – функция настройки весов:
learngd, learngdm, learnhd, learnis, learnk, learnlv1, learnlv2,
learnos, learnnp, learnpn, learnsom, learnnwh;
net.inputWeights{1,1}.learnParam – параметры функции настрой-
ки, определяемые с помощью команды help(net.inputWeights {1,1}.
learnParam);
net.inputWeights{1,1}.weightFcn – функция для вычисления
взвешенных входов для слоя: dist, dotprod, mandist,negdist, norm-
prod;
для многослойных сетей параметры net.inputWeights{i,j}, связан-
ные с обучением такие, как initFcn, learn, learnFcn, learnParam,
weightFcn, имеют тот же смысл и могут принимать такие же значе-
ния, что и соответствующие параметры для net.inputWeights{1,1}.
5. Выполнить один цикл адаптации сети с нулевым параметром
скорости настройки:

[net1, a, e,] = adapt(net, P, T,);


net1.IW{1,1} % – матрица весов после адаптации;
a % – четыре значения выхода;
e % – четыре значения ошибки.

6. Инициализировать нулями веса входов и смещений и задать


параметры скорости настройки для них соответственно 0.2 и 0:

59
net.IW{1} = [0 0];
net.b{1} = 0;
net.inputWeights{1,1}.learnParm.lr = 0.2;
net.biases{1}.learnParam.lr =0.

Нулевое значение параметра скорости настройки для смещения


обусловлено тем, что заданная зависимость t = 2 p1 + p2 не имеет
постоянной составляющей.
7. Выполнить один цикл адаптации с заданным значением пара-
метра скорости адаптации:

[net1, a, e] = adapt (net, P, T);


net1.IW{1,1} % – значения весов в сети net1 изменились;
a % – четыре значения выхода сети net1;
e % – четыре значения ошибки сети net1.

8. Выполнить адаптацию сети net с помощью 30 циклов:

for i = 1:30,
[net, a{i}, e{i}] = adapt(net, P, T);
W(i, :) = net.IW{1,1};
end;
cell2mat(a{30}) % – значения выхода на последнем цикле;
cell2mat(e{30}) % – значение ошибки на последнем цикле;
W(30, :) % – веса после 30 циклов;
mse(cell2mat(e{30}) % – функция ошибок: 0.0017176.

Здесь cell2mat – функция преобразования массива числовых ячеек


в массив чисел, а mse – функция среднеквадратичной ошибки.
9. Построить графики зависимости значений выходов сети и ве-
совых коэффициентов, а также среднеквадратичной ошибки от числа
циклов, используя функцию subplot для деления экрана на окна:

60
subplot(3,1,1)
for i = 1:1:30, plot(i, cell2mat(a{i}), ′k′),
hold on
end;
xlabel(′′), ylabel(′Выходы a(i)′)
grid
subplot(3,1,2)
plot(0:30, [[0 0]; W], ′k′)
xlabel(′′), ylabel(′Веса входов W(i) ′)
grid
subplot(3,1,3)
for i = 1:30, E(i) = mse(e{i}); end
semilogy(1:30, E, ′+k′)
xlabel(′Циклы′), ylabel(′Ошибка′), grid

10. Адаптировать рассматриваемую модель статической сети для


аппроксимации той же зависимости и с теми же требованиями к по-
грешности, используя групповой способ представления обучающей
последовательности:

P = [-1 -1/3 1/2 1/6; 1 1/4 0 2/3];


T = [-1 -5/12 1 1];
net = newlin([-1 1; -1 1], 1, 0, 0, 0.2);
net = IW{1} = [0 0]; % – присваивание начальных весов;
net.l{1} = 0; % – присваивание начального смещения;
net.inputWeughts{1,1}.learnParam.lr = 0.2;
EE = 10;
i = 1; % – для подсчета количества циклов;
while EE > 0.0017176
[net, a{i}, e{i}, pf] = adapt(net, P, T);

61
W(i, :) = net .IW{1,1};
EE = mse(e{i});
ee(i) = EE;
i = i + 1;
end;

11. Проанализировать результаты и сделать их сравнение с ре-


зультатами для последовательного представления обучающей после-
довательности:

W(63, :)
cell2mat(a{63})
EE = mse(e{63})
mse(e{1})

12. Для полученных результатов построить графики и сравнить


их с предыдущими:

subplot(3,1,1)
for i = 1:1:63, plot(i, cell2mat(a{i}), ′k′),
hold on
end;
xlabel(′′), ylabel(′Выходы a(i′′), grid
subplot(3,1,2)
plot(0:63, [[0 0]; W], ′k′)
xlabel(′′), ylabel(′Веса входов W(i)′), grid
subplot(3,1,3)
semilogy(1:63, ee, ′+k′)
xlabel(′Циклы′), ylabel(′Ошибка′), grid

Задание 2. Адаптировать параметры однослойной динамической


сети с одним входом и одной линией задержки для аппроксимации

62
рекурентного соотношения y (t ) = 2 p(t ) + p(t − 1) , выполнив сле-
дующие действия:
1. Так как для динамических сетей групповой способ представле-
ния обучающего множества не используется, подготовить данные
для последовательной адаптации в виде массивов ячеек значений
входа и цели:

P = {-1/2 1/3 1/5 1/4); % – значения входа p(t);


T = {-1 1/6 11/15 7/10}; % – значения цели y(t).
2. Выполнить адаптацию и построение графиков

net = newlin([-1 1], 1, [0 1], 0.5); % – help(newlin);


Pi = {0}; % – начальное условие для линии задержки;
net.IW{1} = [0 0]; % – веса для основного и задержанного входов;
net.biasConnect = 0; % – значение смещения;
EE = 10; i = 1;
while EE > 0.0001
[net, a{i}, e{i}, pf] = adapt(net, P, T);
W(i, :) = net.IW{1,1};
EE = mse(e{i});
ee(i) = EE;
i = i +1;
end
W(22, :)
a{22}
EE
subplot(3,1,1)
for i = 1:1:22, plot(i, cell2mat(a{i}), ′k′)
hold on
end;
xlabel(′′), ylabel(′Выходы a(i)′), grid

63
subplot(3,1,2)
plot(0:22,[[0 0]; W], ′k′)
xlabel(′′), ylabel(‘Веса входов W(i)′), grid
subplot(3,1,3)
semilogy(1:22, ee, ′+k′)
xlabel(′Циклы ′), ylabel(′Ошибка′)grid
Задание 3. Обучить нейронную сеть, для которой модель и зави-
симость выхода от входов приведены в задании 1, выполнив коман-
ды и используя последовательный и групповой способы представле-
ния обучающей последовательности:
а) для последовательного способа:

net=newlin ([-1 1; -1 1], 1, 0, 0);


net.IW{1}= [0 0];
net.b{1} = 0;
P = {[-1 1][-1/3; 1/4][1/2 0][1/6;2/3]};
T = {-1 –5/12 1 1}
net.inputWeights{1, 1}.learnParam.lr = 0.2;
net.biases{1}.learnParam.lr = 0;
net.trainParam.epochs = 30;
net1=train (net,P,T);
W = net1.IW{1} % – параметры после обучения:
Y = sim(net1,p)
EE = mse([Y{:}] – [T{:}]) % – ошибка 1.3817*e-003

б) для группового способа:

P = [-1 -1/3; 1/2 1/6; 1 1/4 0 2/3];


T = [-1 –5/12 1 1]
net1=train (net,P,T);
W = net1.IW{1} % – параметры после обучения:
Y = sim(net1,P)

64
EE = mse(y-T) % – та же ошибка 1.3817*e-003

Задание 4. Обучить динамическую линейную сеть, рассмотрен-


ную во 2-м задании и сравнить результаты, выполнив следующие
команды:

net = newlin([-1 1] , 1,[0 1], 0.5)


Pi = {0} % – начальное условие линии задержки;
net.IW{1} = [0 0] % – начальные веса входов;
net.biasConnect = 0; % – смещение отсутствует;
net.trainParam.epochs = 22;
P = {-1/2 1/3 1/5 1/4}; % – вектор входа;
T = {-1 1/6 11/15 7/10}; % – вектор цели;
net1 = train(net, P, T, Pi); % – обучение сети;
W = net1.IW{1} % – веса после обучения сети;
Y = sim(net1, P); % – моделирование новой сети;
EE = mse( [Y{:}] - [T{:}] ) % – ошибка = 3.6514е-005.

Задание 5. Создать и инициализировать трёхслойную сеть с двумя


входами для последующего обучения сети методом обратного рас-
пространения ошибки, выполнив следующие действия:
1. Создать шаблон сети:
net5 = network(2, ... % – число входов;
3, ... % – число слоёв сети;
[1; 1; 1], ... % – связь смещений;
[1 1 ; 0 0; 0 0], ... % – связь входов;
[ 0 0 0 ; 1 0 0 ; 0 1 0], ... % – связь слоёв;
[0 0 1], ... % – связь выходов;
[0 0 1] ); % – связь целей.

65
2. Настроить параметры сети для инициализации с помощью ал-
горитма Нгуена–Видроу для обеспечения возможности использова-
ния метода обратного распространения:
net5.initFcn = ′initlay′; % – для сети;
net5.layers{1}.initFcn = ′initnw′; % – для 1-го слоя;
net5.layers{2}.initFcn = ′initnw′; % – для 2-го слоя;
net5.layers{3}.initFcn = ′initnw′; % – для 3-го слоя.
3. Проинициализировать сеть для её последующего обучения ме-
тодом обратного распространения ошибки:
net5 = init(net5);
net5.IW{1, 1} % – матрица весов для 1-го входа;
net5.IW{1, 2} % – матрица весов для 2-го входа;
net5.LW{2, 1} % – матрица весов для 2-го слоя;
net5.LW{3, 2} % – матрица весов для 3-го слоя;
net5.b{1} % – матрица смещения для 1-го слоя;
net5.b{2} % – матрица смещения для 2-го слоя;
net5.b{3} % – матрица смещения для 3-го слоя.
4. Промоделировать сеть с начальными значениями весов и сме-
щений:
P = [0.5 1 ; 1 0.5]; % – значения входных векторов;
Y = sim(net5) % – моделирование сети.

Задание 6. Создать и инициализировать трёхслойную сеть с двумя


входами для последующего обучения различными методами, выпол-
нив следующие действия:
1. Создать шаблон сети, воспользовавшись шаблоном net5:
net6 = net5; % – создание новой копии сети;
net6 = revert(net5); % – возврат к настройке параметров по
умолчанию.
2. Настроить параметры сети с помощью функции инициализа-
ции нулевых значений весов и смещений initzero:
net6.initFcn = ′initlay′;

66
net6.layers{1}.initFcn = ′initnw′;
net6.layers{2}.initFcn = ′initnw′;
net6.layers{3}.initFcn = ′initnw′;
net6.inputWeights{1 ,1}.initFcn = ′initzero′;
net6.inputWeights{1 ,2}.initFcn = ′initzero′;
net6.layerWeights{2 ,1}.initFcn = ′initzero′;
net6.layerWeights{3 ,2}.initFcn = ′initzero′;
net6.biases{1}.initFcn = ′initzero′;
net6.biases{2}.initFcn = ′initzero′;
net6.biases{3}.initFcn = ′initzero′;
net6.init(net6); % – инициализация сети.
3. Выдать на экран матрицы весов и смещения, используя коман-
ды 3-го пункта 5-го задания.
4. Промоделировать сеть и возвратить её к исходным значениям
весов и смещений:
Ynet6 = sim(net6);
net6 = revert(net6).

Задание 7. Создать и инициализировать трёхслойную сеть с дву-


мя входами, используя следующие функции инициализации:
а) rands – для задания случайных весов и смещений.
б) randnc – для задания случайной матрицы с нормированными
столбцами;
в) randnv – для задания случайной матрицы с нормированными
строками;
г) initcon – для задания равных смещений;
д) midpoint – для задания матрицы средних значений;
Для создания и инициализации сети использовать команды 6-го
задания, заменяя в них функцию initzero на рассматриваемые функ-
ции инициализации, а сеть net6 – на сеть net7.
Задание 8. Создать двухслойную нейронную сеть с прямой пере-
дачей сигнала, одним входом, двумя нейронами в первом слое и од-

67
ним нейроном во втором слое, настроить сеть для обучения с исполь-
зованием алгоритма градиентного спуска GD, обучить эту сеть и пу-
тём её моделирования оценить качество обучения. Порядок выпол-
нения задания следующий:
1. Создать нейронную сеть с прямой передачей сигнала:

net8 = newff([0 5], …. % – диапазоны значений входа;


[2 1], ….. % – количество нейронов в слоях;
{′tansig′, % – функция активации для 1-го слоя;
′logsig′} % – функция активации для 2-го слоя;
′traingd′); % – имя функции обучения.
2. Убедиться, что веса и смещения каждого слоя инициализиро-
ваны с помощью алгоритма Нгуена–Видроу:

net8.initFcn % – должно быть ′initlay′;


net8.layers{1}.initFcn % – должно быть ′initnw′;
net8.layers{2}.initFcn % – должно быть ′initnw′;
net8.IW{1,1} % – вес входа;
net8.LW{2,1} % – веса для 2-го слоя.
net8.b{1}
net8.b{2}

3. Задать обучающие последовательности входов и целей T:

P = [0 1 2 3 4 5]; % – вектор входа;


T = [0 0 0 1 1 1]; % – вектор целей.

4. Выдать на экран параметры обучающей функции traingd и их


значений по умолчанию:

info = traingd(′pdefaults′)
info =

68
epochs: 100 % – максимальное количество циклов
обучения;
show: 25 % – интервал вывода данных;
goal: 0 % – предельное значение критерия обучения;
time: Inf % – максимальное время обучения;

min_grad: 1.0e-006 % – максимальное значение градиента


критерия % качества;
max_fail: 5 % – максимально допустимый уровень
% превышения ошибки контрольного
% подмножества по сравнению с обучающим.
Процедура обучения прекратится, когда будет выполнено одно из
следующих условий:
а) значение функции качества стало меньше предельного goal;
б) градиент критерия качества стал меньше значения min_grad;
в) достигнуто предельное значение циклов обучения epochs;
г) превышено максимальное время, отпущенное на обучение time;
д) ошибка контрольного подмножества превысила ошибку обу-
чающего более чем в max_fail раз.

Функция traingd предполагает, что функции взвешивания


dotprod, накопления netsum и активации transig или rogsig имеют
производные. Для вычисления производных критерия качества обу-
чения perf по переменным веса и смещения используется метод об-
ратного распространения. В соответствии с методом градиентного
спуска вектор настраиваемых переменных получает следующее при-
ращение:
dx = lr * dperf / dx ,
где tr – параметр скорости настройки, равный по умолчанию 0,01.
Функцией одновременного поиска минимума вдоль заданного на-
правления в данной сети является функция srchbac.
5. Обучить рассматриваемую сеть:

69
net8.trainParam.epochs = 500;
net8.trainParam.90al = 0.01;
[net8, TR] = train(net8, P, T);
TR % – характеристики процедуры обучения.
6. Произвести моделирование сети и оценить качество ее обуче-
ния:

Ynet8 = sim(net8, P) % – целевые значения.

Задание 9. Повторить 8-е задание для следующих функций обуче-


ния: traingda, traingdm, traingdx, trainrp, traincgf, traincgp,
traincgb, trainscg, trainbfg, trainoss, trainlm. Сравнить полученные
результаты.

Задание 10. Создать и обучить сеть для аппроксимации синусои-


дальной функции, зашумленной нормально распределенным шумом,
выполнив следующие действия:
1. Задать обучающие последовательности:

P = [-1: .05: 1];


T = sin[2*pi*P] + 0.1*randn(size(P));

2. Сформировать сеть с прямой передачей сигнала:

net10 = newff([-1 1], [20 1], {′transig′, ′purelin′}, … ′trainbr′);

3. Настроить сеть:

net10.trainParam.epochs = 50;
net10.trainParam.show = 10; % для отображения.

4. Обучить сеть и построить график аппроксимируемой функции


и график выхода сети:

70
net10 = train(net, P, T);
Y = sim(net, P);
plot(P, Y, P, T, ‘+’) % – два графика.
5. Изменяя количество нейронов в первом слое, исследовать ка-
чество аппроксимации.
Задание 11. Создать сеть и произвести ее последовательную адап-
тацию, выполнив следующие команды:

net11 = newff([-1 2; 0 5], [3, 1], … {′tansig′, ′purelin′}, ′traingd′);


net11.inputWeights{1, 1}.learnFcn = ′learngd′;
net11.layerWeights{2, 1}.learnFcn = ′learngd′;
net11.biases{1}.learnFcn = ′learngd′;
net11.biases{2}.learnFcn = ′learngd′;
net11.layerWeights{2, 1}.learnParam.lr = 0.2;
P = [-1 -1 2 2; 0 5 0 5];
T = [-1 -1 1 1];
P = num2cell(P,1);
T = num2cell(T,1);
net11.adaptParam.passes = 50;
[net11, a, e] = adapt(net11, P,T);
a = sim(net11, P) % [-1.02] [-0.99624] [1.0279] [1.0021];
mse(e) % – должно быть 5,5909е-004.

Задание 12. Создать сеть и произвести ее последовательную адап-


тацию, используя следующие функции настройки весов и смещений:
learngdm, learnlv1, learnlv2, learnk, learncon, learnis, learnos, learn-
som, learnh, learnhd. Сравнить алгоритм настройки для одной и той
же обучающей последовательности.

Задание 13. Создать, обучить и апробировать многослойную ней-


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

71
вступительные экзамены по математике, физике и русскому языку.
Правила приема таковы:
1. Проходной балл для абитуриентов, не имеющих льгот, должен
быть равен 11;
2. Удовлетворительные оценки по математике и физике для этой
категории абитуриентов недопустимы;
3. Абитуриенты, имеющие льготы, зачисляются при любых по-
ложительных оценках по всем трем предметам.
Для обучения сети следует использовать все изученные методы
адаптации и обучения и провести анализ их эффективности. Следует
также определить минимальное количество слоев и нейронов, обес-
печивающее удовлетворительное решение поставленной задачи. Для
формирования обучающего, контрольного и тестового множества
построить дискретную имитационную модель, используя инструмен-
тальный пакет Simulink.

72
Лабораторная работа № 6

Исследование персептронных сетей


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

Теоретические сведения
Персептрон – это однослойная нейронная сеть с S нейронами и R
входами, каждый из которых может состоять из нескольких элемен-
тов. Передаточной функцией каждого нейрона является ступенчатая
функция типа hardlim или hardlims. Помимо основных входов, ней-
роны персептрона имеют вход для постоянного смещения, равного
единице. Элементы входов и смещения взвешиваются с помощью
функции скалярного произведения dotprod и суммируются с помо-
щью функции накопления netsum.
Создание персептрона производится следующей функцией:
net = newp(PR, S, tf, lf),
где net – объект класса network;
PR – массив размера Rx2 минимальных и максимальных значений
для R векторов входа;
S – число нейронов персептрона;
tf – передаточная функция из списка { hardlim, hardlims }, при-
чем по умолчанию задается hardlim;
lf – обучающая функция из списка {learnp, learnpn}, причем по
умолчанию – learnp.

При создании персептрона, матрица весов и вектор смещений


инициализируются нулями с помощью функций initzero.
Обучение персептрона производится с помощью функции адапта-
ции adapt, которая корректирует веса и смещения по результатам об-

73
работки каждой пары входных и выходных значений (обучение с
учителем). Применение функции adapt гарантирует, что любая зада-
ча классификации с линейно отделимыми векторами будет решена за
конечное число циклов настройки. Функция обучения train, когда
настройка параметров сети выполняется не после каждого прохода, а
в результате всех проходов обучающего множества, в ряде случаев
не обеспечивает сходимости процесса настройки, поэтому не исполь-
зуется для обучения персептрона.
Настройка весов и смещений, реализуемая функциями learnp и
learnpn, производится по следующим правилам:
а) для входных сигналов вычисляются выходные;
б) определяются ошибки как разность между целевым выходом и
соответствующим выходным сигналом;
в) производится корректирование весов и смещений путем сло-
жения старых значений с приращениями, каждое из которых равно
произведению соответствующего сигнала на ошибку того нейрона,
для которого корректируется параметр.
Для того, чтобы сделать время обучения нечувствительным к
большим или малым выбросам векторов входа, производят нормиро-
вание входных данных при вычислении приращений весов и смеще-
ний:
pni = pi (sqrt(1+ p12 +…+ pr2)).
Такое нормирование обеспечивается применением функции
learnp для настройки как весов, так и смещений. Также автоматиче-
ски свойству net.adaptFcn задается значение adaptwb, что позволяет
использовать любые функции для настройки весов и смещений, а
свойству net.adaptParam – набор параметров по умолчанию.
Адаптация персептрона производится функцией-методом
adapt(net,P,T), где P – входные векторы; T – целевые значения.
Процесс адаптации продолжается до тех пор, пока не будет достиг-
нуто требуемое значение критерия качества обучения в виде средней
абсолютной ошибки, вычисляемой функцией mae.

74
Практические задания
Задание 1. Создать персептрон с одним нейроном и одноэлемент-
ным входом, диапазон значений которого от 0 до 1, и проанализиро-
вать значения параметров его вычислительной модели, выполнив
следующие действия:
1. Создать и инициализировать персептрон:
net = newp([0 1], 1) % – на экране весь объект;
net.inputWeights{1,1} % – веса входа объекта;
net.biases{1} % – смещение нейрона;
net.IW{1,1} % – значение весов;
net.b{1} % – значение смещения;
net.IW{1,1}=[3] % – задание веса;
net.b{1}=[4] % – задание смещения;
net = init(net); % – инициализация нулями;
net.IW{1,1} % – нулевое значение веса;
net.b{1} % –нулевое значение смещения;
net.inputWeights{1,1}.initFcn=′rands′;
net.biases{1}.initFcn=′rands′;
net = init(net); % – инициализация случайными значе
% ниями;
net.IW{1,1}, net.b{1} % – новые значения;
p = {[0] [1] [0.5]}; % – последовательность входов;
a = sim(net, p) % – моделирование сети;

Задание 2. Создать персептрон с одним нейроном и одним двух-


элементным вектором входа, значения элементов которого изменя-
ются в диапазоне от –2 до 2, настроить веса и смещение для реализа-
ции разделяющей линии
-p1 + p1 + 1 = 0,

75
а затем с помощью моделирования определить классы значений
входного вектора, выполнив следующие действия:
1. Создать персептрон:
net = newp([-2 2; -2 2], 1).

2. Произвести ручную инициализацию:


net.IW{1,1} = [-1 1] ;
net.b{1} = [1].

3. Произвести проверку персептрона:


p = [1;1];
a = sim(net, p) % a = 1;
p = [1;-1];
a = sim(net, p) % a = 0.

4. Определить классы значений вектора:


p = {[-2;-2] [-2;-1] [-2;0] [-2;1] [-2;2]…
[-1;-2] [-1;-1] [-1;0] [-1;1] [-1;2]…
[0;-2] [0;-1] [0;0] [0;1] [0;2]…
[1;-2] [1;-1] [1;0] [1;1] [1;2]…
[2;-2] [2;-1] [2;0] [2;1] [2;2];
a = sim(net, p) % [0]-0-й класс; [1]-1-й класс.

Задание 3. Создать персептрон с одним нейроном и двоичным


входом и настроить его параметры, сначала для выполнения логиче-
ской функции AND, а затем для выполнения логической функции
OR, выполнив следующие действия:

1. Создать персептрон:
net = newp([0 1;0 1], 1).

2. Подготовить обучающие последовательности:


p={[0;0] [0;1] [1;0] [1;1]};

76
p1=cat(2, p{:});
T1=num2cell(p1(1,:) & p1(2,:)) % – функция AND;
T2=num2cell(p1(1,:) | p1(2,:)) % – функция OR.

3. Настроить параметры персептрона для выполнения логической


функции AND, используя процедуру адаптации:
net.adaptParam.passes = 10; % – число проходов;
net.adapt(net,p,T1); % – настройка на AND;
net.IW{1,1},net.b{1} % – линия 2p1 + p2 –3=0;
Y =sim(net,p) % – моделирование AND.

4. Настроить параметры персептрона для выполнения логиче-


ской функции OR, используя процедуру обучения:
net.trainParam.epochs=20; % – число циклов;
net = init(net); % – инициализация;
net = train(net,p,T2); % – настройка на OR;
net.IW{1,1},net.b{1} % – линия 2p1 + 2p2 –2=0;
Y = sim(net,p) % – моделирование OR.

Задание 4. Используя пошаговый режим адаптации и обучения,


проследить изменения весов, смещения, выходного значения и
ошибки для персептрона, рассмотренного в третьем задании. Для
этих целей использовать команды:
net.adaptParam.passes = 1;
net.trainParam.epochs = 1;
[net,Y,e]=adapt(net,p,T1); % – для AND;
[net, Y,e]=train(net,p,T2); % – для OR;
net.IW{1,1},net.b{1} % – настраиваемые параметры.

77
Задание 5. Создать, обучить и апробировать персептрон для при-
нятия решения о зачислении в высшее учебное заведение абитуриен-
тов, сдавших вступительные экзамены.

78
Лабораторная работа № 7

Исследование линейных нейронных


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

Теоретические сведения
Линейная сеть – это один слой из S нейронов и R входов, каждый
из которых может состоять из нескольких элементов. Передаточной
функцией каждого нейрона слоя является линейная функция purelin.
Это является единственным отличием линейной сети от персептрона.
Благодаря линейной передаточной функции каждый выход сети мо-
жет принимать любое значение, в то время как выход персептрона
ограничен значениями 1 и 0.
Линейные сети, как и персептроны, способны решать только ли-
нейно отделимые задачи классификации, однако в них используется
правило обучения по методу Вудроу–Хоффа, основанное на исполь-
зовании функции наименьших квадратов, которое является более
мощным, чем правило обучения персептрона.
Помимо основных входов нейроны линейной сети имеют вход для
постоянного смещения, равного единице. Элементы входов и смеще-
ния взвешиваются с помощью функции скалярного произведения
dotprod и суммируются с помощью функции накопления netsum.
Линейная нейронная сеть может быть создана одним из следую-
щих способов:
net=newlin(PR, S, id, lr),

79
net=newlin(PR, S, 0, P),
net=newlind(P, T),
где PR – массив размера R*2 минимальных и максимальных значе-
ний для R векторов входа;
S – число нейронов;
id – описание линии задержки на входе сети, по умолчанию [0];
lr – параметр скорости настройки, по умолчанию 0,01;
P – обучающие последовательности входов размера R*Q, причем
Q – количество последовательностей;
Т – последовательность целей для Р размера S*Q;
0 – нуль. .
Первый способ применяется, когда в сеть включаются задержки,
т. е. для создания динамических адаптивных линейных нейронных
сетей ADALIN (ADApture Linear Neuron networks), которые по-
зволяют корректировать веса и смещения при поступлении на вход
каждого элемента обучающего множества. Такие сети широко при-
меняются при решении задач обработки сигналов и в системах
управления.
Второй способ формирует линейный слой с параметром скорости
настройки, гарантирующим максимальную степень устойчивости для
данного входа Р. В этом случае линии задержки не используются и
сеть является статической.
Для первого и второго способа инициализация сети проводится
при ее создании с помощью функции initzero. Адаптация и обучение
сети затем осуществляется с помощью функции adaptwb, которая
модифицирует веса и смещения, используя функцию Видроу – Хоф-
фа hearnwh до тех пор, пока не будет достигнуто требуемое значе-
ние критерия качества обучения в виде средней квадратичной ошиб-
ки, вычисляемой функцией mse.
Третий способ формирует и настраивает линейную статическую
сеть, решая систему линейных алгебраических уравнений на основе
метода наименьших квадратов. Он используется для подбора коэф-
фициентов аппроксимирующей функции и для идентификации пара-

80
метров динамических систем в задачах управления. Матричная за-
пись решаемой системы линейных алгебраических уравнений такова:
[W b]*[P;ones]=T,
при этом должно выполняться условие
S*R + S = Q.
Функция learnwh вычисляет приращение весов входов и смеще-
ний по следующим векторным формулам:

pn = p/(sqrt(1+P(1)^2)+… +P(R)^2);
dW = lr*e*pn;
db = lr*e.

При работе с моделями линейных сетей могут возникнуть ситуа-


ции, когда число настраиваемых параметров недостаточно, чтобы
выполнить все условия; в этом случае сеть считается переопределен-
ной. Если число параметров слишком велико, сеть считается недооп-
ределенной. И в том и в другом случае метод наименьших квадратов
осуществляет настройку, стремясь минимизировать ошибку сети.
Архитектура однослойной линейной сети полностью определяет-
ся задачей, которая должна быть решена, причем число входов сети и
число нейронов в слое определяются числом входов и выходов зада-
чи соответственно.

Практические задания
Задание 1. Выполнить задания с 1-го по 5-е лабораторной рабо-
ты № 6 и для линейной нейронной сети с таким же числом нейронов
и входов, что и у соответствующего персептрона, заменив функцию
newp функцией newlin, оставляя параметры неизменными и исполь-
зуя значения параметров id и lr по умолчанию, т. е. [0] и 0,01 соот-
ветственно.

Задание 2. Построить поверхность ошибок для линейной сети с


одним нейроном и одним входом, используя функцию errsurf и вы-
полнив следующие команды:

81
Р = [1 -1.2];
T = [0.5 1];
net = newlind(P,T);
Y = sim(net, P) % – 0.5 и 1;
net.IW{1,1} % – -0.22727;
net.b{1} % – 0.72727;
w_rangle = -1: 0.1: 0 % – диапазон весов;
b_ rangle = 0.5: 0.1: 1 % – диапазон смещений;
ES = errsulf(P, T, w_ rangle, b_ rangle, 'purelin');
contour(w_ rangle, b_ rangle, ES, 20) % – 20 уровней;
hold on
plot(-2.2727e – 001, 7.2727e – 001, 'x') % –точка
hold off % – знаком 'x' отмечены оптимальные значения
веса и % смещения.

Задание 3. Создать с помощью функции newlin линейную сеть с


одним нейроном и одним входом, обучить эту сеть, используя про-
цедуру train, и построить поверхность функции критерия качества и
траекторию обучения, выполнив следующие действия:
1. Сформировать обучающее множество и рассчитать максималь-
ное значение параметра обучения maxlr:
P = [1 -1.2];
T = [0.5 1];
maxlr = 0.40*maxlinlr(P,'bias').

2. Создать линейную сеть:


net = newlin([-2 2], 1, [0], maxlr);
gensim(net).

3. Рассчитать функцию критерия качества:


w_rangle = -1: 0.2: 1; b_rangle = -1: 0.2: 1;

82
ES = errsulf(P, T, w_rangle, b_rangle, 'purelin').

4. Построить поверхность функции критерия качества:


surfc(w_ rangle, b_ rangle, ES).
5. Рассчитать траекторию обучения:
Х = zeros(1, 50); Y = zeros(1, 50);
net.IW{1,1} = 1; net.b{1} = -1 % – начальные значения;
X(1) = net.IW{1}; Y(1) = net.b{1};
net.trainParam.goal = 0.001;
net.trainParam.epochs = 1;

6. Вычислить веса и смещения:


for I=2:50,
[net, tr] = train(net, P, T);
X(I) = net.IW{1, 1};
Y(I) = net.b{1};
end

7. Построить линии уровня и траекторию обучения:


clc; % очистка экрана
contour(w_ rangle, b_ rangle, ES, 20) % 20 линий
hold on
plot(X,Y,'_ *') % – построение траектории
hold off

8. Оценить значения параметров настройки для двух значений це-


ли goal:
net.IW{1, 1} = 1; net.b{1} = -1;
net.trainParam.epochs = 50;
net.trainParam.goal = 0.001; % – первое значение;
[net, tr] = train(net, P, T);

83
net.IW{1, 1}, net.b{1} % - [-0.22893] [0.70519];
net.trainParam.goal = 0.00001; % – второе значение
[net, tr] = train(net, P, T);
net.IW{1, 1}, net.b{1} % – [-0.22785] [0.72495]
Задание 4. Сформировать линейную сеть с одним нейроном, од-
ним входом, принимающим значения из диапазона [-1, 1], и линией
задержки типа [0 1 2] для воспроизведения заданного отклика неко-
торой системы, выполнив следующие действия:

1. Создать линейную сеть заданной архитектуры с параметром


скорости настройки, равным 0,01:
net = newlin([-1 1], 1, [0 1 2], 0.01);
gensim(net).

2. Сформируем две обучающие последовательности:


Р1 = {0 –1 1 1 0 –1 1 0 0 1};
Т1 = {0 –1 0 2 1 –1 0 1 0 1};
Р2 = {1 0 –1 –1 1 1 1 0 –1};
T2 = {2 1 –1 –2 0 2 2 1 0}.

3. Выполнить обучение для последовательностей Р1 и Т1:


net = train(net, P1, T1);
net.IW{1, 1}, net.b{1}, % – [0.875] [0.8875] [-0.1336] [0.0619];
Y1 = sim(net, [P1 P2]);

4. Выполнить обучение сети на всем объеме обучающих данных:


net = init(net);
P3 = [P1 P2];
T3 = [T1 T2];
net.trainParam.epochs = 200;
net.trainParam. goal = 0.01;

84
net = train(net, P3, T3);
net.IW{1, 1}, net.b{1} % – [0.9242] [0.9869] [0.0339] [0.0602]
Y3 = sim(net, P3) % – дискретная модель:
% Yk = 0.9242rk+0.9869 rk-1+0.0339 rk-2+0.0602.
5. Построить графики отклика Т3 и приближений Y1 и Y3:
plot(0:0,01:20, T3, 'G'), hold on % – зеленый;
plot(0:0,01:20, Y1, 'B'), hold on % – синий;
plot(0:0,01:20, Y3, 'R'), hold off % – красный.

Задание 5. Сформировать линейную сеть из одного нейрона и од-


ного входа, который обеспечивает для заданного входа Р, близкий к
цели Т, выполнив следующие команды:
P = 0:3;
T = [0.0 2.0 4.1 5.9]; % – зависимость t = 2p;
net = newlind(P, T);
gensim(net)
net.IW{1, 1}, net.b{1} % – [1.9800] [0.3000];
Y = sim(net, P) % – [0.0300] [2.0100] [3.9900] [5.9700].

Задание 6. Сформировать линейную сеть из одного нейрона и од-


ного входа с двумя элементами для классификации значений входа,
выполнив следующие действия:
P = [2 1 -2 -1; 2 -2 2 1];
T = [0 1 0 1];
net = newlin([-2 2; -2 2], 1);
net.trainParam.goal = 0.1;
[net, tr] = train(net, P, T);
net.IW{1, 1}, net.b{1}
A = sim(net, P);
err = T-A % – погрешности сети весьма значительны.

85
Задание 7. Сформировать линейную сеть из одного нейрона, од-
ного входа и одного выхода для цифровой фильтрации сигнала, вы-
полнив следующие действия:

1. Создать сеть и произвести ее инициализацию:


net = newlin([0 10], 1); % – диапазон входа от 0 до 10;
net.inputWeights{1, 1}.delays = [0 1 2];
net.IW{1, 1} = [7 8 9;] % – произвольная инициализация
net.b{1} = [0]; весов и смещения
pi = {1 2}; % – начальные условия на линиях
задержки.

2. Определить входной сигнал и выходной сигнал фильтра в виде


последовательности значений:
P = {3 4 5 6}; % – входной сигнал;
T = {10 20 30 40}; % – требуемый выходной сигнал.

3. Промоделировать необученную сеть:


[a, pf] = sim(net, P, pi);
% a = [46] [70] [94] [118] pf = [5] [6].

4. Выполнить адаптацию сети с помощью 10 циклов:


net.adaptParam.passes = 10;
[net, y, E, pf, af] = adapt(net, P, T, pi);
y % - y = [10.004] [20.002] [29.999] [39.998].

Задание 8. Сформировать сеть ADALINE с одним нейроном и од-


ним входом, значения которого изменяются от –1 до +1, двумя ли-
ниями задержки и одним выходом для предсказаний значений де-
терминированного процесса p(t), выполнив следующие действия:
1. Сформировать колебательное звено, реакция которого на сту-
пенчатый сигнал будет использована в качестве детерминированного
процесса p(t):
clear

86
sys = ss(tf(1, [1 1 1])); % – колебательное звено
time = 0:0.2:10; % – интервал процесса
[Y, time] = step(sys, 0:0.2:10).

2. Сформировать обучающее множество:


p = y(1: length(time)-2)' ; % – входной сигнал
t = y(3: length(time))' ; % – целевой выход
time = 0:0.2:10;
[Y, time] = step(sys, 0:0.2:10 ).

3. Сформировать сеть ADELINE и множества Р и Т:


net = newlin([-1 1], 1, [1 2]); % - lr = 0.01;
P = num2sell(p);
T = num2cell(t).

4. Настроить сеть:
pi = {0 0} % – начальные значения для задержек;
net.adaptParam.passes = 5;
[net, Y, E, Pf, Af] = adapt(net, P, T, pi);
Y1 = cat(1, Y{:}) % – массив ячеек в массив чисел.

5. Построить графики:
plot(time, Y1, 'b:', time, P, 'r-', …
xlabel('Время, c'), ylabel('Процессы'))
title('Обучение нейронной сети').

6. Промоделировать сеть ADALINE:


x = sim(net, P);
x1 = cat(1, x{:});
plot(time, x1, 'b', time, p, 'r');

87
title('Моделирование нейронной сети').

88
Лабораторная работа № 8

Исследование радиальных базисных


сетей
общего вида
Цель работа: изучение архитектуры радиальных базисных ней-
ронных сетей общего вида и специальных функций для их создания
и автоматической настройки весов и смещений, ознакомление с де-
монстрационными примерами и их скриптами; приобретение навы-
ков построения таких сетей для классификации векторов и аппрок-
симации функций.
Теоретические сведения
Радиальная, базисная сеть общего вида – это двухслойная ней-
ронная сеть с R входами, каждый из которых может состоять из не-
скольких элементов. Передаточной функцией нейронов входного
слоя является колоколообразная симметричная функция следующего
вида:
2
radbas(n) = e − n .
Эта функция имеет максимум, равный 1, при n = 0 и плавно убы-
вает при увеличении n, достигая значения 0.5 при n = ±0.833. Пере-
даточной функцией нейронов выходного слоя является линейная
функция perelin.
Функция взвешивания для входного слоя вычисляет евклидово
расстояние между каждой строкой матрицы весов и каждым столб-
цом матрицы входов:
dist ( wi , p j ) = sqrt (( wi − p j ) 2 ) .
Затем эта величина умножается на смещение нейрона и поступает
на вход передаточной функции, так что

a{i} = radbas(net.prod(dist(net.IW{1, 1}, p).net.b{i})).

89
Для нейронов выходного слоя функцией взвешивания является
скалярное произведение dotprod, а функцией накопления – функция
суммирования взвешенных входов и взвешенного смещения netsum.
Для того чтобы понять поведение радиальной базисной сети об-
щего вида, необходимо проследить прохождение вектора входа p.
При задании значений элементам вектора входа каждый нейрон
входного слоя выдает значение в соответствии с тем, как близок век-
тор входа к вектору весов каждого нейрона. Таким образом, нейроны
с векторами весов, значительно отличающимися с вектором входа p,
будут иметь выходы, близкие к 0, и их влияние на выходы линейных
нейронов выходного слоя будет незначительное. Напротив, входной
нейрон, веса которого близки к вектору p, выдаст значение, близкое
к единице.
Для построения радиальных базисных сетей общего вида и авто-
матической настройки весов и смещений используются две функции
newrbe и newrb. Первая позволяет построить радиальную базисную
сеть с нулевой ошибкой, вторая позволяет управлять количеством
нейронов входного слоя. Эти функции имеют следующие параметры:

net = newrbe(P, T, SPREAD),


net = newrb(P, T, GOAL, SPREAD),

где P – массив размера RxQ входных векторов, причем R – число


элементов вектора входа, а Q – число векторов в последовательно-
сти;
T – массив размера SxQ из Q векторов цепи и S классов;
SPREAD – параметр влияния, определяющий крутизну функции
radbas, значение по умолчания которого равно единице;
GOAL – средняя квадратичная ошибка, при этом значение по
умолчанию равно 0.0.
Параметр влияния SPREAD существенно влияет на качество ап-
проксимации функции: чем больше его значение, тем более гладкой
будет аппроксимация. Слишком большое его значение приведет к
тому, что для получения гладкой аппроксимации быстро изменяю-

90
щейся функции потребуется большое количество нейронов: слишком
малое значение параметра SPREAD потребует большего количества
нейронов для аппроксимации гладкой функции. Обычно параметр
влияния SPREAD выбирается большим, чем шаг разбиения интерва-
ла задания обучающей последовательности, но меньшим размера са-
мого интервала.
Функция newrbe устанавливает веса первого слоя равным P′, а
смещения – равными 0.8326/ SPREAD, в результате радиальная ба-
зисная функция пересекает значение 0.5 при значениях евклидового
расстояния ±SPREAD. Веса второго слоя LW{2,1} и смещения b{2}
определяются путем моделирования выходов первого слоя A{1} и
последующего решения системы линейных уравнений:

[LW{2,1} b{2}]*[A{1}; ones] = T.

Функция newrb формирует сеть следующим образом. Изначально


первый слой не имеет нейронов. Сеть моделируется и определяется
вектор входа с самой большой погрешностью, добавляется нейрон с
функцией активации radbas и весами, равными вектору входа, затем
вычисляются весовые коэффициенты линейного слоя, чтобы не пре-
высить средней допустимой квадратичной ошибки.

Практические задания
Задание 1. Создать радиальную базисную сеть с нулевой ошибкой
для обучающей последовательности P = 0:3 и T = [0.0 2.0 4.1 5.9],
проанализировать структурную схему построенной сети и значения
параметров ее вычислительной модели, выполнив следующие дейст-
вия:
1. Создать радиальную базисную сеть с нулевой ошибкой:
P = 0:3;
T = [0.0 2.0 4.1 5.9];
net = newrbe(P, T);

2. Проанализировать структурную схему построенной сети:

91
gensim(net);

3. Проанализировать параметры вычислительной модели сети:


net
net.layers{1}.size % – число нейронов в первом слое;
net.layers{2}.size % – число нейронов во втором слое;
net.layers{1}.initFcn
net.layers{1}.netInputFcn
net.layers{1}.transferFcn
net.layers{2}.initFcn
net.layers{2}. transferFcn
net.layers{2}.netInputFcn
net.inputWeights{1, 1}.initFcn
net.inputWeights{1, 1}.weightFcn
net.inputWeights{2, 1}.initFcn
net.inputWeights{2, 1}.weightFcn
net.inputWeights{1, 1}.learnFcn
net.IW{1, 1}, net.b{1}
net.LW{2, 1}, net.b{2}
net.inputWeights{1, 1}, net.biases{1}
net.inputWeights{2, 1}, net.biases{2}

4. Выполнить моделирование сети и построить графики:


plot(P, T, ‘*r’, ′MarkerSize′, 2, ′LineWidth′, 2)
hold on
V=sim(net, P);
plot(P, V, ′*b′, ′MarkerSize′, 9, ′LineWidth′, 2)
P1=0.5:2.5;
Y=sim(net, P1);

92
plot(P1, Y, ′*k′, ′MarkerSize′, 10, ′LineWidth′, 2)

Задание 2. Создать радиальную базисную сеть для обучающей по-


следовательности P = 0:3 и T = [0.0 2.0 4.1 5.9] при средней квадра-
тичной ошибке 0.1, проанализировать структурную схему построен-
ной сети и значения параметров ее вычислительной модели, выпол-
нив действия задания и заменив в командах функцию newrbe(P, T)
на newrb(P, T, 0.1).

Задание 3. Создать радиальную базисную сеть с нулевой ошибкой


для большого числа значений входа и цели, выполнив следующие
действия:
1. Задать обучающую последовательность и построить для нее
график:
P = -1:0.1:1;
T = [-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 …
0.4609 0.1336 -0.2013 -0.4344 -0.5000 -0.3930…
-0,1647 0.988 0.3072 0.3960 0.3449 0.1816
-0.0312 -0.2189 -0.3201];
plot(P, T, ′*r′, ′MarkerSize′, 4, ′LineWidth′, 2)
hold on

2. Создать сеть и определить число нейронов в слоях:


net = newrbe(P, T);
net.layers{1}.size % – в первом слое – 21 нейрон;
net.layers{2}.size % – во втором слое – 1 нейрон;
gensim(net);

3. Выполнить моделирование сети и построить график:


V = sim(net, P);
plot(P, V, ′*b′, ′MarkerSize′, 5, ′LineWidth′, 2)
P = [-0.75 -0.25 0.25 0.75]
V = sim(net, P);
hold on

93
plot(P, V, ′*b′, ′MarkerSize′, 10, ′LineWidth′, 2).

Задание 4. Создать радиальную базисную сеть для большого чис-


ла значений входа и цели при средней квадратичной ошибке 0.01,
выполнив действия задания 3 и заменив функцию newrbe(P, T) на
функцию newrb(P, T, 0.01).

Задание 5. Провести аппроксимацию функции f(x) с помощью ра-


диальных базисных функций ϕi (x) в виде следующего разложения
в ряд:
n
f ( x) = ∑ α i ϕi ( x) ,
i =1

здесь коэффициенты разложения по радиальным базисным функци-


ям:
p = -3:0.1:3;
a1 = radbas(P);
a2 = padbas(P-1.5);
a3 = radbas(P+2);
a = a1 + a2 + 0.5*a3;
plot(P, a1, p, a2, p, 0.5*a3, p, a).
Как видно из графика, разложение по радиальным базисным
функциям обеспечивает необходимую гладкость. Разложение ука-
занного вида может быть реализовано на двухслойной нейронной
сети, первый слой которой состоит из радиальных базисных нейро-
нов, а второй – из единственного нейрона с линейной характеристи-
кой, на котором суммируются выходы нейронов первого слоя.

Задание 6. Исследовать гладкость аппроксимации при следующих


значениях параметра SPREAD: 1, 0.01 и 12, используя команды из
четвертого задания.

94
Лабораторная работа № 9

Исследование радиальных базисных


сетей
типа GRNN
Цель работы: изучение архитектурных особенностей радиальных
базисных нейронных сетей типа GRNN и специальных функций для
их создания, автоматической настройки весов и смещений и норми-
рованного взвешивания; ознакомление с демонстрационным приме-
ром и его скриптом, а также приобретение навыков построения таких
сетей для решения задач обобщенной регрессии, анализа временных
рядов и аппроксимации функций.

Теоретические сведения
Радиальная базисная сеть типа GRNN(Generalized Regression
Neural Network), или обобщенная регрессионная сеть имеет архи-
тектуру, аналогичную архитектуре радиальной базисной сети общего
вида, и отличается от нее структурой второго слоя, в котором ис-
пользуется блок normprod для вычисления нормированного скаляр-
ного произведения строки массива весов LW{2,1} и вектора выхода
первого слоя а{1} в соответствии со следующим соотношением:
n{2} = LW{2,1} * a{1}/sum(a{1}).
В общем виде функция normprod определяется так:
normprod(W,P) = W * P/sum(P/1),
где W – матрица весов размера S × R,
P – массив входов размера R × Q,
sum(P,1) – сумма элементов массива Р по столбцам.
Создание сети осуществляется фукцией
net = newgrnn(P,T,SPREAD).
Эта функция устанавливает веса первого слоя равным Р′, а сме-
щение – равным величине 0.8326/SPREAD, что приводит к радиаль-
ным базисным функциям, которые пересекают величину 0.5 при зна-

95
чениях взвешенных входов ± SPREAD. Веса второго слоя устанав-
ливаются равными Т. Смещения отсутствуют.
Первый слой сети GRNN – это радиальный базисный слой с чис-
лом нейронов, равными числу элементов Q обучающего множества.
В качестве начального приближения для матрицы весов выбирается
массив Р′, смещение для этого слоя устанавливается равным вектор-
столбцу с элементами 0.8326/SPREAD. Функция dist вычисляет рас-
стояние между вектором входа и вектором веса нейрона. Вход пере-
даточной функции равен поэлементному произведению взвешенного
входа сети на вектор смещения. Входом каждого нейрона первого
слоя является значение функции radbas. Если вектор веса нейрона
равен транспонированному вектору входа, то взвешенный вход Ра-
вен 0, а выход равен 1. Если расстояние между вектором входа и век-
тором веса нейрона равно SPREAD, то выход нейрона будет равен 0.5.
Второй слой сети GRNN – это линейный слой с числом нейронов,
также равным числу элементов Q обучающего множества, причем в
качестве начального приближения для матрицы весов LW{2,1} вы-
бирается массив Т. Если на вход подается вектор Рi, близкий к одно-
му из векторов входа Р из обучающего множества, то этот вектор
сгенерирует значение выхода слоя, близкое к единице. Это приведет
к тому, что выход второго слоя будет близок к ti.
Если параметр влияния SPREAD мал, радиальная базисная функ-
ция характеризуется резким спадом и диапазон входных значений, на
который реагируют нейроны входного слоя, оказывается весьма ма-
лым. При увеличении этого параметра диапазон увеличивается и вы-
ходная функция становится более гладкой.

Практические задания
Задание 1. Создать обобщенную регрессионную сеть для обу-
чающей последовательности Р=0:3 и Т[0.0 2.0 4.1 5.9], проанализи-
ровать ее структурную схему и значения параметров вычислитель-
ной модели, выполнить моделирование сети для различных входов,
построить графики и оценить влияние на выходные значения пара-
метра SPREAD, выполнив следующие команды:
P = 0:3;

96
T = [0.0 2.0 4.1 5.9];
net = newgrnn(P,T) % – параметр SPREAD = 1.0;
gensim (net)
plot(P,T, ′*r′, ′MarkerSize′, 2, ′LineWidth′, 2)
hold on
V = sim(net, P)
plot(P,V, ′o8′, ′MarkerSize′, 8, ′LineWidth′, 2)
P1 = 0.5:2.5;
Y = sim(net, P1);
plot(P1,V, ′+k′, ′MarkerSize′, 10, ′LineWidth′, 2)
Y = sim(net, 0:0.5:3) % – для нового входа;
net = newgrnn(P, T, 0.1) % – параметр SPREAD = 0.1;
Y = sim(net, 0:0.5:3) % – сравнить результаты.

Задание 2. Построить обобщенную регрессионную сеть для реше-


ния задачи аппроксимации и экстраполяции нелинейной зависимо-
сти, восстанавливаемой по экспериментальным точкам, выполнив
следующие команды:
P = [1 2 3 4 5 6 7 8 ]; % – экспериментальные;
T = [0 1 2 3 2 1 2 1 ]; % – данные в 8 точках;
SPREAD = 0.7; % – значение меньше шага Р, равного 1;
net = newgrnn(P, T, SPREAD)
net.layers{1}.size, net.layers{2}.size % - 8 и 8;
A = sim(net, P);
plot(P, T, ′*k′, ′MarkerSize′, 10), hold on
plot(P, A, ′ok′, ′MarkerSize′, 10) % – аппроксимация;
P2 = -1: 0.1: 10; % – диапазон Р2 больше диапазона Р;
A2 = sim(net, P2);
plot(P2, A2, ′-k′, ′LineWidth′, 2) % – экстраполяция;
hold on,
plot(P, T, ′*k′, ′MarkerSize′, 10) % – сравнить точки.

97
98
Лабораторная работа № 10

Исследование радиальных базисных


сетей
типа PNN
Цель работы: изучение архитектурных особенностей радиальных
базисных нейронных сетей типа PNN и специальных функций для их
создания, автоматической настройки весов и смещений и конкури-
рующей активации; ознакомление с демонстрационным примером и
его скриптом; приобретение навыков построения таких сетей для
решения задач классификации на основе подсчёта вероятности при-
надлежности векторов к рассматриваемым классам и для решения
других вероятностных задач.

Теоретические сведения
Радиальная базисная сеть типа PNN (Probabilistic Neural
Networks), или вероятностная нейронная сеть, имеет архитектуру,
аналогичную архитектуре радиальной базисной сети общего вида, и
отличается от неё структурой второго слоя, в котором используются
функция взвешивания dotprod (скалярное произведение сигналов и
весов), функция накопления netsum и передаточная функция compet –
конкурирующая функция, преобразующая вектор входа слоя нейро-
нов таким образом, чтобы нейрон с самым большим входом имел
выход, равной единице, а все другие нейроны имели выходы, равные
нулю. Смещения используются только в первом слое.
Создание вероятностей сети осуществляется функцией
net=newpnn(P,T,spread),
где Р – массив размера R*Q из Q входных векторов с R элементами;
T – массив размера S*Q из Q векторов цели и S классов;
SPREAD – параметр влияния, значение по умолчанию 1.0.
Для вероятностей сети необходимо задать обучающее множество
из Q пар векторов входа и целей. Каждый вектор цели имеет K эле-
ментов, указывающих класс принадлежности и, таким образом, каж-

99
дый вектор входа ставится в соответствие одному из К классов. В
результате образуется матрица связанности T размера K*Q, состоя-
щая из нулей и единиц, строки которой соответствуют классам при-
надлежности, а столбцы – векторам входа. Таким образом, если эле-
мент Т(i,j) матрицы связанности равен единице, то это означает,
что j-й входной вектор принадлежит к классу i.
Весовая матрица входного слоя IW формируется как и для ради-
альной базисной сети общего вида с использованием векторов входа
из обучающего множества.
Весовая матрица второго слоя соответствует матрице связан-
ности Т, которая строится с помощью функции ind2vec.

Практические задания
Задание 1. Создать вероятностную нейронную сеть для обучающей
последовательности, состоящей из вектора входа Р=[1 2 3 4 5 6 7] и
индекса классов Тс=[1 2 3 2 2 3 1], проанализировать её структурную
схему и параметры вычислительной модели, выполнить моделирова-
ние сети и оценить правильность классификации, выполнив следую-
щие команды:
Р=[1 2 3 4 5 6 7]; % – значения входа;
Tc=[1 2 3 2 2 3 1]; % – индексы классов (3);
T=ind2uec(Tc); % – матрица связанности (целей);
net=newpnn(P,T); % – создание сети PNN;
gensim(net); % – структура сети;
net; % – параметры сети;
Y=sim(net,P); % – моделирование сети;
Yc=iecc2ind(Y); % – классы входных векторов;
% 1 2 3 2 2 3 1.

Задание 2. Создать вероятностную нейронную сеть для определе-


ния принадлежности двухэлементных входных векторов к одному из
трёх классов на основании обучающей последовательности 7 входов
Р[0 0; 1 1; 0 3; 1 4; 3 1; 4 1; 4 3] и индекса классов Тс=[1 1 2 2 3 3 3],

100
значения в котором определяют класс соответствующего вектора
входа, выполнив команды:

Р=[0 0; 1 1; 0 3; 1 4; 3 1; 4 1; 4 3 ]’; % – 7 векторов.


Тс=[1 1 2 2 3 3 3 ]; % – классы.
T= ind2vec(Tc); % – формирование разряженной матрицы
% связанности;
T= full (T); % – преобразование к полной матрице;
net= newpnn; % – создание вероятностной сети;
net.layers {1}.size % – число нейронов 1-го слоя;
net.layers {2}.size % – число нейронов 2-го слоя;
Y= sim (net, P); % – моделирование сети;
Yc= vec2ind(Y); % – формирование индекса классов;
Pt= [1 3; 0 1; 5 2]’; % – векторы для тестирования;
A= sim (net, Pt); % – тестирование сети;
Ac= vec2ind (A); % – формирование индекса классов.

Задание 3. Проанализировать структурные схемы, значения пара-


метров вычислительных моделей и результаты моделирования ней-
ронных сетей, используемых в следующих демонстрационных при-
мерах:
Demorb1 – рациональные базисные сети;
Demorb3 – использование не перекрывающихся функций актива-
ции (передаточных функций);
Demorb4 – использование перекрывающихся передаточных
функций;
Demogrn1 – аппроксимация функций с помощью сети типа GRNN;
Demogrn1 – классификация векторов с помощью сети типа PNN.

Для анализа использовать скрипты примеров.

101
Лабораторная работа № 11

Исследование самоорганизующихся
слоев Кохонена
Цель работы: изучение архитектуры самоорганизующихся ней-
ронных слоев Кохонена и специальных функций для их создания,
инициализации, взвешивания, накопления, активации, настройки ве-
сов и смещений, адаптации и обучения; ознакомление с демонстра-
ционными примерами и их скриптами, а также приобретение навы-
ков построения самоорганизующихся слоев для исследования топо-
логической структуры данных, их объединением в кластеры (груп-
пы) и распределением по классам.

Теоретические сведения
Самоорганизующийся слой Кохонена – это однослойная нейрон-
ная сеть с конкурирующей передаточной функцией compet, которая
анализирует выходные значения нейронов слоя и выдаёт в качестве
результата наибольшее из этих значений (значение нейрона-победи-
теля).
Инициализация весов входов производится с помощью функции
средних значений
W = midpoint (S,PR),
где S – число нейронов в слое Кохонена;
PR – матрица размера Rx2, задающая диапазоны Pmin [ j j
]
, Pmax из-
менения R элементов входного вектора;
W – матрица весов размера SxR для входов слоя, столбцы которой

имеют значения
(Pj
min + Pmax
j
).
2
Инициализация весов смещений нейронов слоя производится с
помощью функции равных смещений
B = initcon(S,PR),

102
которое каждому нейрону задаёт одно и то же смещение, равное
exp(1)*S. Например, для S=5 это смещение равно 5*2.71828=
=1.359740*101.
Взвешивание входов слоя Кохонена реализуется в виде отрица-
тельного евклидова расстояния между каждой строкой Wi матрицы
весов W и каждым столбцом Pj матрицы входов P, которое вычисля-
ется функцией negdist(W,P). Суммирование взвешенных входов со
смещениями производится функцией netsum.
Формирование самоорганизующегося слоя Кохонена осуществля-
ется функцией
net = newc(PR,S,KLr,clr),
где KLr – параметр функции настройки весов, значение по умолча-
нию которого равно 0.01;
clr – параметр функции настройки смещений, значение по умол-
чанию которого равно 0.001.
Эта функция формирует однослойную сеть с R нейронами и R
входами. Веса входов устанавливаются равными половине диапазо-
на соответствующего вектора входа для всех нейронов. Также для
всех нейронов устанавливается одно и то же смещение, равное e*s.
Выходы нейронов поступают на конкурирующую передаточную
функцию compet, которая определяет победителя. Номер активного
нейрона-победителя I* определяет ту группу (кластер), к которой
наиболее близок входной вектор.
Для того чтобы сформированная таким образом сеть решала зада-
чу кластеризации данных, необходимо предварительно настроить ее
веса и смещения по обучающей последовательностью векторов с по-
мощью функций настройки learnk и learncon соответственно, ис-
пользуя процедуру адаптации adapt или процедуру обучения train.
Функция learnk рассчитывает приращение весов dW в зависимо-
сти от вектора входа P, выхода а, весов w и параметра скорости на-
стройки lr в соответствии с правилом Кохонена:

103
⎧⎪lr ∗ (p ' − w), a j ≠ 0;
dw = ⎨
⎪⎩0, a j = 0.
Таким образом, вектор веса, наиболее близкий к вектору входа,
модифицируется так, чтобы расстояние между ними стало ещё
меньше. Результат такого обучения заключается в том, что победив-
ший нейрон, вероятно, выиграет конкуренцию и в том случае, когда
будет представлен новый входной вектор, близкий к предыдущему, и
его победа менее вероятна, когда будет представлен вектор, сущест-
венно отличающийся от предыдущего. Когда на вход сети поступает
всё большее и большее число векторов, нейрон, являющийся бли-
жайшим, снова корректирует свой весовой вектор w. В конечном
счёте, если в слое имеется достаточное количество нейронов, то каж-
дая группа близких векторов окажется связанной с одним из нейро-
нов слоя. В этом и заключается свойство самоорганизации слоя
Кохонена.
Одно из ограничений всякого конкурирующего слоя состоит в
том, что некоторые нейроны оказываются незадействованными, или
“мертвыми”. Это происходит оттого, что нейроны, имеющие началь-
ные весовые векторы, значительно удаленные от векторов входа, ни-
когда не выигрывают конкуренции, независимо от продолжительно-
сти обучения. Для ликвидации нечувствительности таких нейронов
используют положительные смещения, которые добавляются к отри-
цательным расстояниям удаленных нейронов. Функция learncon
производит такую корректировку смещений следующим образом.
В начале процедуры настройки сети всем нейронам присваивается
одинаковый характер активности C0 = 1/S. В процессе настройки эта
величина для активных нейронов увеличивается, а для неактивных
нейронов уменьшается:
ΔC = lr ∗ (a − c) .
Нетрудно убедиться, что для всех нейронов, кроме нейрона-
победителя, приращения отрицательны. Функция learcon рас-
считывает приращения вектора смещений следующим образом:
Δb = exp(1 − log(c)) − b .

104
Увеличение смещений для неактивных нейронов позволяет рас-
ширить диапазон покрытия входных значений, и неактивный нейрон
начинает формировать кластер, что улучшает кластеризацию вход-
ных данных.

Практические задания
Задание 1. Создать слой Кохонена для двух векторов входа, про-
анализировать его структурную схему и параметры вычислительной
модели, произвести обучение сети и моделирование, выполнив сле-
дующие команды:

P = [.1 .8 .1 .9; .2 .9 .1 .8]; % – для обучения слоя;


net = newc([01;01],2); % – создание слоя;
gensim (net); % – структура слоя;
net = train(net,P); % – обучение слоя;
w = net.Iw{1,1}; % – веса после обучения;
b =net.b{1}; % – смещение после обучения;
plot(P(1,:),P(2,:),’+k’)
title (′Векторы входа′),xlabel(′P(1,:)′), ylabel(′P(2,:)′)
hold on
plot (w, ′or′)
P1= [0.2:0.1:0.7; 0.2:0.1:0.7];
y = sim(net,P1)
yc = vec2ind(Y)

Задание 2. Создать слой Кохонена, который для 48 случайных


векторов формирует 8 кластеров, выполнив следующие команды:

c = 8; % – число кластеров;
n =6; % – число векторов в классе;
x = [-10 10; -5 5]; % – диапазон входов;
[r,q] = size(x); % – r число строк; q – число столбцов;

105
minU = min(x′)′ % – минимальные значения;
maxU = max(x′)′ % – максимальные значения;
v = rand(r,c)*((maxv - minU)*ones(1,c)+minU*ones(1,c));
t = c*n % – число точек;
v = [v v v v v v]; % – 48 двухэлементных векторов;
v =v+randn(r,t)*d; % – координаты точек;
P = v; % – векторы с отклонениями (нормальный закон);
plot (P(1,:),P(2,:), ′+k′)
title (‘Векторы входа’),xlabel(′P(1,:)′), ylabel(′P(2,:) ′)
net =newc([-2 12; -1 6],8 0.1);
wo = net.IW{1,1} % – веса после инициализации;
bo = net.b{1} % – смещения после инициализации;
co = exp(1)/60 % – начальная активность;
net.trainParam.epochs = 500; % – обучение;
net = train(net, P) , a = sim(net, P), ac = vec2ind(a)
net.IW{1} % – веса после обучения;
bn = net.b{1} % – смещения после обучения;
cn = exp(1)/bn % – активность после обучения;
net = newc([-2 12; -1 6], 8 0.1);
co = exp(1). /net.b{1} % – начальная активность;
net.adaptParam.passes = 500;
[net, y,e] = adapt (net, mat2cell(p)) % – адаптация;
a = sim(net, P) % – моделирование после
ac = vec2ind(a) % адаптации.

Задание 3. Построить график приращений вектора смещений и


проанализировать пример democ1.

Задание 4. С помощью слоя Кохонена произвести кластеризацию


оценок абитуриентов.

106
Лабораторная работа № 12

Исследование самоорганизующихся
карт Кохонена
Цель работы: изучение архитектуры самоорганизующихся ней-
ронных сетей в виде карт Кохонена и специальных функций для соз-
дания карты и её топологии, взвешивания, накопления, настройки
весов (размещение нейронов), адаптации и обучения; ознакомление с
демонстрационными примерами и их скриптами, а также приобрете-
ние навыков построения самоорганизующихся карт для решения за-
дач кластеризации входных векторов.

Теоретические сведения
Cамоорганизующаяся карта Кохонена – это однослойная нейрон-
ная сеть без смешения с конкурирующей функцией compet, имею-
щая определенную топологию размещения нейронов в N-мерном
пространстве. В отличие от слоя Кохонена карта Кохонена после
обучения поддерживает такое топологическое свойство, когда близ-
ким входным векторам соответствуют близко расположенные актив-
ные нейроны.
Первоначальная топология размещения нейронов в карте Кохоне-
на формируется при создание карты с помощью функции newsom,
одним из параметров которого является имя топологической функ-
ции gridtop, nextop или randtop, что соответствует размещению
нейронов в узлах либо прямоугольной, либо гексагональной сетки,
либо в узлах сетки со случайной топологией.
Расстояния между нейронами и векторами входов вычисляются с
помощью следующих функций:
dist – евклидово расстояние d=sqrt((posi-pj).^2);
boxdist – максимальное координатное смещение
d=max(abs(posi-pj));
mandist – расстояние суммарного координатного смещения
d=sum(abs(posi-pj));

107
linkdist – расстояние связи
⎧1, dist ( posi − p j ) ≤ 1;% − евклидово пространство;

⎪2, ∀k , d ik1 = d kj = 1;% − один промежуточный;
⎪3, ∀(k , k ), d k = d
⎪ 1 2 i 1 k1k21 = d k1 j = 1;
d ij = ⎨
⎪........................................................................................
⎪ N , ∀(k , k ...k ), d k = d = ... = d = 1;
⎪ 1 2 n i 1 k1k 2 knj

⎪⎩S , в остальных случаях


Формирование саморганизующейся карты Кохонена осуществля-
ется функцией
net=newsom(PR,[d1, d2,…],tfcn, dfсn, olr, osteps, tlr, tnd)),
где Pr – массив размера R*2 минимальных значений векторов входа;
d1, d2…– число нейронов по i-й размерности карты. По умолча-
нию – двумерная карта с числом нейронов 5*8;
tfсn – функция топологии карты, по умолчанию nextop;
dfcn – функция расстояния, по умолчанию linkdist;
olr – параметр скорости обучения на этапе размещения, по умол-
чанию 0.9;
osteps – число циклов обучения на этапе подстройки, по умолча-
нию 1000;
tlr – параметр скорости на этапе подстройки, по умолчанию 0.02;
tnd – размер окрестности на этапе подстройки, по умолчанию 1.
Настройка карты Кохонена производится по каждому входному
вектору независимо от того, применяется метод адаптации или метод
обучения. В любом случае функция learnsom выполняет настройку
карты нейронов.
Прежде всего определяется нейрон-победитель и корректируется
его вектор весов и векторы соседних нейронов согласно соотноше-
нию
dw=lr*A2*(p′ – w),
где lr – параметр скорости обучения, равный olr для этапа упорядо-
чения нейронов и tlr для этапа подстройки;

108
A2 – массив соседства для нейронов, расположенных в окрестно-
сти нейрона-победителя i:
⎧1, a(i, q) = 1;

A2(i, q) = ⎨0.5, a(j, q) = 1 & D(i, j) ≤ nd;
⎪0, в остальных случаях.

Здесь а(i,q) – элемент выхода нейронной сети;
D(i,j) – расстояние между нейронами i и j;
nd – размер окрестности нейрона-победителя.
Таким образом, вес нейрона-победителя изменяется пропорцио-
нально половинному параметру скорости обучения, а веса соседних
нейронов – пропорционально половинному значению этого парамет-
ра.
Весь процесс обучения карты Кохонена делится на два этапа:
А) этап упорядоченности векторов весовых коэффициентов в про-
странстве признаков;
Б) этап подстройки весов нейронов по отношению к набору век-
торов входа.
На этапе упорядочения используется фиксированное количество
шагов. Начальный размер окрестности назначается равным макси-
мальному расстоянию между нейронами для выбранной топологии и
затем уменьшается до величины, используемой на следующем этапе,
и вычисляется по следующей формуле:
nd=1.00001+(max(d)-1)(1-s/S),
где max(d) – максимальное расстояние между нейронами; s – номер
текущего шага, а S – количество циклов на этапе упорядочения.
Параметр скорости обучения изменяется по правилу
lr =tlr+(olr-tlr)(1-s/S).
На этапе подстройки, который продолжается в течение оставшей-
ся части процедуры обучения, размер окрестности остается посто-
янным и равным
nd=tnd+0.00001,
а параметр скорости обучения изменяется по следующему правилу
lr= tlr*S/s.

109
Параметр скорости обучения продолжает уменьшаться, но очень
медленно. Малое значение окрестности и медленное уменьшение
параметра скорости обучения хорошо настраивают сеть при сохра-
нении размещения, найденного на предыдущем этапе. Число шагов
на этапе подстройки должно значительно превышать число шагов на
этапе размещения. На этом этапе происходит тонкая настройка весов
нейронов по отношению к набору векторов входов.
Нейроны карты Кохонена будут упорядочиваться так, чтобы при
равномерной плотности векторов входа нейроны также были распре-
делены равномерно. Если векторы входа распределены неравномер-
но, то и нейроны будут иметь тенденцию распределяться в соответ-
ствии с плотностью размещения векторов входа.
Таким образом, при обучении карты Кохонена решается не только
задачи кластеризации входных векторов, но и выполняется частичная
классификация.

Практические задания
Задание 1. Рассчитать положение нейронов на четырехмерной
сетке с прямоугольной топологией размера 5*4*3*2 и сделать по-
пытку построить график расположения нейронов, выполнив сле-
дующие команды:
pos=gridtop(5,4,3,2) % – массив координат узлов размера N*S,
% где N – количество измерений, равное 4,
N
%а S = ∏ dim i – количество узлов сетки,
i =1
% равное произведению числа нейронов по
% каждому измерению 5*4*3*2=120;
plotsom(pos) % – вывод только трех размерностей.

Задание 2. Рассчитать положение нейронов на двухмерной сетке с


прямоугольной топологией размера 3*2 и построить график распо-
ложения нейронов, выполнив следующие команды:
рos =gridtop(2,3) % 0 1 0 1 0 1
%0 0 1 1 2 2
plotsom(pos) % – плоский график.

110
Задание 3. Рассчитать положение нейронов на двухмерной сетке с
прямоугольной топологией размера 3*2 и построить график распо-
ложения нейронов, выполнив следующие команды:
рos =gridtop(3,2) % 0 1 0 1 0 1
%0 0 1 1 2 2
plotsom(pos) % – плоский график.

Задание 4. Рассчитать положение нейронов на трехмерной сетке с


гексагональной топологией размера 5*4*3 с 60 нейронами и постро-
ить график их расположения, выполнив следующие команды:
рos =Hextop(5,4,3) % – массив размера 3*60;
рlotsom(pos) % – построение графика.

Задание 5. Сформировать гексагональную сетку размером 2*3 и


построить график, выполнив команды:
pos=hextop(2,3) % 0 1.0 0.5 1.5 0 1.0
% 0 0 0.866 0.866 1.7321 1.7321
plotsom(pos)

Задание 6. Создать сетку размера 2*3 со случайным расположени-


ем узлов и построить график расположения нейронов, выполнив сле-
дующие действия:
pos=randtop(2,3) % 0.062 0.647 0.49 и т. д.
% 0 0.122 0,904 и т. д.
plotsom(pos) % – построение графика.

Задание 7. Создать сетку размера 5*4*3 со случайным расположе-


нием узлов и построить график расположения нейронов, выполнив
следующие действия:
pos=randtop(5,4,3) % – создание сетки ;
plotsom(pos) % – построение графика.

111
Задание 8. Вычислить евклидово расстояние между нейронами се-
ти с теологией, для которой задана матрица для 10 нейронов в трех-
мерном пространстве, выполнив следующие команды:
pos=rand(3,10) % – случайная матрица координат;
d=dist(pos) % – евклидово расстояние между нейронами.

Задание 9. Вычислить расстояние максимального смещения коор-


динат нейронов, размещенных в трехмерном пространстве, выполнив
команды:
pos = rand(3,10); % – случайная матрица координат
d = boxdist(pos) % – максимальное координатное смещение,
% которые для векторов х и – у вычисляются
% следующим образом: d = max(abs(x-y)).

Задание 10. Вычислить суммарные координатные смещения для


сетки из 10 нейронов в трехмерном пространстве со случайной мат-
рицей координат, выполнив следующие действия:
pos = rand(3,10) % – случайные координаты для 10 нейронов.
d = mandist(pos) % – суммарные координатные смещения,
% которые для векторов х и – у вычисляются
% следующим образом: d = sum(abs(x-y)).

Задание 11. Вычислить расстояние связи между нейронами, рас-


пределёнными случайным образом в трехмерном пространстве, вы-
полнив следующие команды:
pos = rand(3,10) % – массив случайных координат
для 10 % нейронов.
d = linkdist(pos) % – расстояния связи между нейронами,
% определяемые следующим образом:
%–011111111111
%–101111111111
%–110111111111
% – 1 1 1 0 2 1 2 1 1 1 1 1 и т. д.

112
Задание 12. Создать гексагональную карту Кохонена разме-
ром 2х3, проанализировать ее структурную схему и параметры вы-
числительной модели, произвести обучение карты и ее моделирова-
ние, а также построить необходимые графики, выполнив следующие
команды:
net = newsom([0 2; 0 1],[2 3]); % – два входа.
net, net.layers{1} % – вычислительная модель.
P = [0.1 0.3 1.2 1.1 1.8 1.7 0.1 0.3 1.2 1.1 1.8 1.7;…….
0.2 0.1 0.3 0.1 0.3 0.2 1.8 1.8 1.9 1.9 1.7 1.8];
plotsom(net.IW{1,1}, net.layers{1}.distances)
hold on
plot(P(1,:),P(2,:),′*k′,′MarkerSize′,10)
net.trainParam.epochs = 2000;
net.trainParam.show = 100;
net = train(net,P);
plot(P(1,:),P(2,:),′*′,′MarkerSize′,10)
hold on
plotsom(net.IW{1,1}, net.layers{1}.distances)
net.IW{1,1}
a = sim(net,[1.5;1] % – a = (3,1) 1.

Задание 13. Создать одномерную карту Кохонена из 10 нейронов,


обучить её на последовательности из 100 двухэлементных векторов
единичной длины, распределенных равномерно в пределах от 0
до 90º, построить график распределения векторов по кластерам и вы-
полнить моделирование сети для одного вектора входа, выполнив
следующие команды:
аngels=0 : 0.5 +pi/99 : 0.5*pi;
p=[sin(angels); cos(angels)];
plot(P(1, 1:10:end), P(2, 1:10:end), ′*8′)
hold on
net=newsom([0 1 ;0 1], [10]);

113
net.trainparam.epochs=2000;
net.trainparam.show=100;
[net,tr]=train(net,P);
plotsom(net.iw{1,1}, net.layers{1}.distances)
figure(2)
a=sim(net,P) % – моделирование на обучающем
% множестве и построение
% столбцовой диаграммы.
a=sim(net,[1;0]) % – отнесен к 10-му кластеру.

Задание 14. Создать двухмерную карту Кохонена размеров 5*6 с


гексагональной топологией, обучить на последовательности из 1000
двухэлементных случайных векторов, элементы которых распреде-
лены по равномерному закону в интервале [-1; 1], и выполнить моде-
лирование, используя команды:
P=rands(2,1000)
plot(P(1,:), P(2,:), ′+′)
net.trainparam.epochs=1000;
net.trainparam.show=100;
net=train(net,P);
plotsom(net, /w{1, 2}, net.layers{1}.distances)
a=sim(net, P); bar(sum(a′)) % – столбцы;
a=sim(net, [0.5; 0.3], holdon
plot(0.5, 0.3, ′*k′).

114
Лабораторная работа № 13

Исследование самоорганизующихся
LVQ-сетей
Цель работы: изучение архитектуры самоорганизующихся ней-
ронных сетей типа LVQ и специальных функций для их создания,
настройки весов и обучения; ознакомление с демонстрационными
примерами и их скриптами, а также приобретение навыков построе-
ния таких сетей для решения задач классификации входных векто-
ров.

Теоретические сведения
Самоорганизующиеся нейронные сети типа LVQ (Learning
Vector Quantization), или сети для классификации входных векто-
ров, состоят из двух слоёв без смещения. Входной слой является
конкурирующим и используется для кластеризации векторов. Вы-
ходной слой является линейным с передаточной функцией purelin и
обеспечивает соотнесение кластеров с целевыми классами, заданны-
ми пользователем. На каждый кластер во входном слое должен быть
задан один нейрон, причём количество классов не должно быть
больше количества кластеров.
Поскольку заранее известно, как кластеры первого слоя соотно-
сятся с целевыми классами второго слоя, то это позволяет заранее
задать элементы матрицы весов LW второго слоя. Однако чтобы
найти правильный кластер для каждого вектора обучающего множе-
ства, необходимо выполнить процедуру обучения сети.
Для создания LVQ-сетей используется функция newlog, обраще-
ние к которой имеет следующий вид:
net = newlvg(PR, S1, PC, LR, LF),
где PR – массив размером Rх2 минимальных и максимальных значе-
ний R векторов входа;
S1 – число нейронов входного слоя (число кластеров);

115
PC – вектор размером 1хS2, указывающий распределение по до-
лям каждого класса из набора классов S2;
LR – параметр скорости настройки, по умолчанию 0.01;
LF – функция настройки параметров, по умолчанию learnlv2.
В результате выполнения функции newlog создаётся двухслойная
сеть. Первый слой использует функции взвешивания negdist, накоп-
ления netsum и передаточную функцию compet. Второй слой ис-
пользует функции взвешивания dotprod, накопления netsum и пере-
даточную функцию purelin. Слои не имеют смещений. Веса первого
слоя инициализируются с помощью функции midpoint; веса второго
слоя устанавливаются так, чтобы каждому нейрону на выходе соот-
ветствовал единственный нейрон первого слоя. Адаптация и обуче-
ние выполняются с помощью функций adaptwb, которая модифици-
рует веса первого слоя, используя функцию настройки learnlv1.
LVQ – сеть обучается на основе множества пар – выход обучаю-
щей последовательности:
{p1, t1}, {p2, t2}, …, {pQ, tQ}.
Каждый целевой вектор имеет единственный элемент, равный
единице, а остальные элементы равны нулю.
Предположим, что при задании вектора входа p(q) весовые коэф-
фициенты нейрона i* входного слоя наиболее близки к вектору вхо-
да p(q) и нейрон i* выигрывает конкуренцию. Тогда конкурирующая
функция compet выдаст единицу в качестве i*-го элемента вектора
выхода a1 первого слоя сети, причём все другие элементы a1 будут
равны нулю. Во втором, линейном слое, произведение матрицы ве-
сов LW×a1 выявляет некоторый столбец LW, в котором единичное
значение указывает на класс k*. Таким образом, сеть связывает век-
тор входа p(q) с классом k*. Это назначение может оказаться либо
правильным, либо ошибочным. Поэтому в процессе обучения необ-
ходимо откорректировать строку i* матрицы IW таким образом, что-
бы приблизить её к вектору p(q), если назначение правильное, и уда-
лить от вектора p(q) если назначение неправильное:
i*IW(q) = i*IW(q-1)+LR(p(q)-i*IW(q-1)), a2k* = tk* = 1;
i*IW(q) = i*IW(q-1)-LR(p(q)-i*IW(q-1)), (a2k* = 1) ≠ (tk*= 0).

116
Это правило гарантирует, что при правильной классификации
нейрон-победитель приближается к векторам входа данного класса, а
при неправильной классификации удаляется от них. Оно различается
функцией настройки весов слоя LVQ-сети learnlv1. Другая функция
настройки весов learnlv2 позволяет улучшить настройку параметров.
Она производит корректировку двух весовых векторов, близких к
входному. Два весовых вектора с евклидовыми расстояниям di и dj
до вектора входа p считаются близкими, если выполняется условие
min(di*/ dj*, dj*/ di*) > 0.5 ÷ 0.7.
Если при этом строка i* принадлежит к области в пространстве
признаков, соответствующей требуемому классу, а строка j* не при-
надлежит, то корректировка весов производится следующим обра-
зом:
⎧i * IW(q) = i * IW(q − 1) + lr(p(q)) − i * IW(q − 1);

⎩ j * IW(q) = i * IW(q − 1) + lr(p(q)) − j * IW(q − 1).

Практические задания
Задание 1. Создать нейронную LVQ-сеть для обучающей после-
довательности двухэлементных векторов, имеющих 4 нейрона во
входном слое и 2 нейрона в выходном с распределением [0.6 0.4],
проанализировать её структурную схему и значения параметров вы-
численной модели, обучить сеть и промоделировать её на обучаю-
щей последовательности, выполнив следующие команды:
P = [-3 -2 -2 0 0 0 0 +2 +2 +3; …
0 +1 -1 2 1 -1 -2 +1 -1 0];
Tc = [1 1 1 2 2 2 2 1 1 1 ]; % – индексы классов;
T = ind2vec(Tc); % – разряженная целевая матрица;
T = full(T); % – полная целевая матрица;
net = newlvq(minmax(P), 4, [0.6 0.4]); % – параметры вычисли-
% тельной модели
gensim(net); % – структурная схема LVQ-сети;
net = train(net, P, T); % – обучение сети со значениями
%параметров по умолчанию;
Y = sim(net, P) % – моделирование LVQ-сети;

117
Yc = vec2ind(Y) % – индексы классов, которые
% получила сеть;
% Сравнить Yc и Tc.
Задание 2. Повторить первое задание для всевозможных векторов
индексов Tс и выявить случаи несовпадения Yc и Tc, т. е. случаи не-
правильной классификации.

Задание 3. Создать нейронную LVQ-сеть с теми же параметрами,


что и в первом задании, обучить сеть, промоделировать её, построить
график распределения входных векторов по кластерам и разделяю-
щую линию областей точек, принадлежащих разным классам, вы-
полнив следующие команды:
P = [-3 -2 –2 0 0 0 0 +2 +2 +3; …
0 +1 –1 2 1 –1 –2 +1 –1 0]

Tc = [1 1 1 2 2 2 2 1 1 1 ]; % – индексы классов;
T = full(ind2vec(Tc));
net = newlvg(minmax(P), 4, [0.6 0.4]);
net.inputWeights{1, 1}
net.IW{1, 1} % – веса входного слоя после инициализации;
net.LW{2,1} % – веса выходного слоя после инициализации;
net.b{1}, net.b{2}
net.trainParam.epoch = 2000;
net.trainParam.show = 100;
net.trainParam.lr = 0.05;
net = train(net, P, T);
net.IW{1, 1} % – веса выходного слоя после обучения;
net.LW{2, 1} % – веса выходного слоя после обучения;
I1 = find(Tc = = 1); % – вектор индексов первого класса;
I2 = find(Tc = = 2); % – вектор индексов второго класса;
axis([-4, 4, -3, 3]) % – диапазоны для X и Y;
P1 = P(: , I1) % – векторы первого класса;

118
P2 = P(: , I2) % – векторы второго класса;
V = net.IW{1, 1} % – веса выходного слоя;
plot(P1(1, :), P1(2, :), ′+ k′), hold on
plot(P2(1, :), P2(2, :), ′¯b′), hold on
plot(V(:, 1), V(:, 2), ′or′)
Y = sim(net, P)
Yc=vec2ind(Y)
% Построение разделяющей линии для классов:
function P = mesh2P(x, y) % – начало М-функции;
%Вычисление массива координат прямоугольной сетки
[X,Y] = meshgrid(X, Y);
P = cat(3, X, Y);
[n1, n2, n3] = size(P);
P = permute(P, [3 2 1]);
P = reshape(P, [n3 n1*n2]);
% конец М-функции.
X = -4 : 0.2 : 4;
Y = -3 : 0.2 : 3;
P = mesh2P(X, Y);
Y = sim(net, P);
Yc = vec2ind(Y);
I1 = find(Yc = = 1); I2 = find(Yc = = 2);
plot(P(1, I1),P(2, I2), ′+k′), hold on
plot(P(1, I1),P(2, I2), ′*b′).

Задание 4. Создать нейронную LVQ-сеть для разбиения двухэле-


ментных векторов на 8 кластеров и 4 класса, обучить сеть, промоде-
лировать её, построить график распределения векторов по кластерам
и разделяющую границу векторов, модифицируя команды 3-го зада-
ния.

119
Лабораторная работа № 14

Исследование сетей Элмана


Цель работы: изучение архитектуры рекуррентных нейронных
сетей Элмана и специальных функций для их создания, инициализа-
ции, настройки весов и смещений, обучения; ознакомление с демон-
страционным примером и его скриптом, а также приобретение навы-
ков построения сетей управления движущимися объектами, построе-
ния систем технического зрения и решения других динамических
задача.

Теоретические сведения
Сети Элмана относятся к классу рекуррентных нейронных сетей.
Характерной особенностью архитектуры рекуррентных сетей являет-
ся наличие блоков динамической задержки и обратных связей. Это
позволяет таким сетям обрабатывать динамические модели.
Сети Элмана состоят их двух слоёв – выходного и входного, при
этом входной слой охвачен динамической обратной связью с исполь-
зованием линии задержки. Динамическая обратная связь позволяет
учесть предысторию наблюдаемых процессов и накопить информа-
цию для выработки правильной стратегии управления. В ряде при-
менений используется несколько слоёв нейронов.
Во входном слое двухслойной сети Элмана используется переда-
точная функция гиперболического тангенса transig, в выходном
слое – линейная функция purelin. Такое сочетание передаточных
функций позволяет максимально точно аппроксимировать функции с
конечным числом точек разрыва. Для этих целей необходимо также,
чтобы выходной слой имел достаточно большое число нейронов.
Все эти слои Элмана имеют смещения. Функциями взвешивания и
накопления являются функции dotprod и ntesum соответственно.
Выход последнего слоя является выходом сети. Веса и смещения
инициализируются с помощью функции initnw, реализующей алго-
ритм Нгуена–Видроу. Aдаптация реализуется с помощью функции
adaptwb, которая устанавливает режим, при котором веса и смеще-

120
ния каждого слоя могут быть настроены с использованием собствен-
ных функций настройки. Для сетей Элмана такими функциями могут
быть либо функция настройки методом градиентного спуска с воз-
мущением leargdm. Критерием качества обучения может быть одна
из двух функций: mse или msereg.
Сети Элмана создаются функцией
net = newelm(PR, [S1, S2, …, SN],
{TF1, TF2, …, TFN},
BTF, BLF, PF),
где PR – массив размера R × 2 минимальных и максимальных значе-
ний для R векторов входа;
S1, S2, …, SN – количество нейронов в слоях;
TF1, TF2, …, TFN – функции активации в слоях, по умолчанию
tansig;
BTF – обучающая функция, реализующая метод обратного рас-
пространения, по умолчанию traingdx;
BLF – функция настройки, реализующая метод обратного распро-
странения, по умолчанию learngdm;
PF – критерий качества обучения, по умолчанию mse.
Динамическое описание входного слова определяется рекуррент-
ными уравнениями:
⎧⎪n1 (k ) = LW 11a 1 (k − 1) + IW 11 p + b1 , a 1 (0) = a 10 ;
⎨ 1
⎪⎩a (k ) = transig (n1 (k )).
Второй линейный слой является безынерционным и описывается
соотношениями:
n2(k) = LW21a1(k) + b2;
a2(k) = purelin(n2(k)).

Задание 1. Создать рекуррентную нейронную сеть Элмана, кото-


рая для случайной булевой последовательности из нулей и единиц
выдаёт булеву последовательность, имеющую единицы только в том

121
случае, когда во входной последовательности встретились две еди-
ницы подряд:
P = round ( rand ( 1, 20 ) );
T = [ 0 ( P ( 1 : end – 1 ) + P ( 2 : end ) = = 2 ) ];
Pseq = con2seq(P); % – массив ячеек Pseq;
Tseq = con2seq(T); % – массив ячеек Tseq;
net – newelm ( [0 1], [10, 1], {′tansig′, ′logsig′}) % – сеть с 10 ней-
% ронами во входном слое;
gensim(net)
net.trainParam.goal = 0.001;
net.trainParam.epochs = 1000;
net = train(net, Pseq, Tseq);
Y = sim(net, Pseq)
Y1 = seq2con(Y);
E = round(T – Y1{1}) % – нулевые ошибки.

Задание 2. Создать сеть Элмана для детектирования амплитуды


гармонического сигнала, выполнив следующие действия:
1. Создать выборки из двух синусоид с амплитудами 1.0 и 2.0:

p1 = sin(1 : 20);
p2 = sin(1 : 20) * 2;

2. Сформировать целевые векторы:

t1 = ones(1, 20);
t2 = ones(1, 20) * 2.

3. Сформировать набор векторов входа и целей:

p = [p1 p2 p1 p2];

122
t = [t1 t2 t1 t1].
4. Сформировать обучающие последовательности:

Pseq = con2seq(p); % – массив ячеек;


Tseq = con2seq(t); % – массив ячеек;

5. Создать сеть Элмана:

net = newelm( [ -2 2], [10, 1], …


{′tansig′, ′purelin′}, …
′traingdx′)
net.layers{1}, net.IW{1, 1}, net.LW{1, 1}
net.layers{2}, net.LW{2, 1}.

6. Обучить сеть:

net.trainParam.epochs = 1000;
net.trainParam.show = 25;
net.trainParam.goal = 0.01;
[net, tr] = train(net, Pseq, Tseq);
net.IW{1, 1}, net.LW{1, 1}, net.LW{2, 1}.

7. Проверить сеть на обучающей последовательности:

figure(2)
a = sim(net, Pseq);
time = 1 : length(p);
plot(time, t, ′- -′, time, cat(2, a {:} ) )
axis([1 80 0.8 2.2]).

123
8. Проверить сеть на произвольной последовательности:

p3 = sin(1 : 20) * 1.6;


t3 = ones(1, 20) * 1.6;
p4 = sin(1 : 20) * 1.2;
t4 = ones(1, 20) * 1.2;
p9 = [p3 p4 p3 p4];
t9 = [t3 t4 t3 t4];
pgseq = con2seq(pg);
figure(3);
a = sim(met, pgseq);
time = 1 : length(pg);
time = 1 : length(pg);
plot(time, tg, ‘- -’, time, cat(2, a{ : } ) )
axis( [1 80 0.8 2.2] ).

9. Обучить и проверить сеть для четырех гармонических сигна-


лов.

124
Лабораторная работа № 15

Исследование сетей Хопфилда


Цель работы: изучение архитектуры рекуррентных нейронных
сетей Хопфилда и специальных функций для их создания, взвешива-
ния входов, накопления и активизации; ознакомление с демонстра-
ционными примерами и их скриптами, а также приобретение навы-
ков построения таких сетей для решения задач распознавания обра-
зов и создания ассоциативной памяти.

Теоретические сведения
Сеть Хопфилда относится к классу рекуррентных нейронных
сетей. Она имеет один нейронный слой с функциями взвешивания
dotprod, накопления netsum и линейной ограниченной функцией
активизации satlins. Слой охвачен динамической обратной связью с
весами LW{1,1} и имеет смещения.
Сети Хопфилда обладают тем отличительным свойством, что при
поступлении на вход некоторого вектора признаков в виде началь-
ных условий, они за конечное число тактов времени приходят в со-
стояние устойчивого равновесия, зависящего от входного вектора.
Это позволяет ассоциировать входной вектор с некоторым состояни-
ем сети, или объектом предметной области. Состояния устойчивого
равновесия называются также аттракторами сети. Помимо целевых
аттракторов в сети могут иметь место паразитные, которые не соот-
ветствуют никаким векторам входа. При создании сети Хопфилда
специальные алгоритмы синтеза сводят к минимуму число таких
паразитных точек равновесия и обеспечивают максимальный размер
области притяжения для точек равновесия.
Функция для создания сети Хопфилда имеет вид:
net=newhop(T),
где Т – массив размера R*Q,объединяющий Q целевых векторов со
значениями +1 или -1 для элементов;
R – число элементов вектора входа.

125
После того как начальные условия заданы в виде массива T, опре-
деляющего ряд целевых вершин замкнутого гиперкуба, сеть для ка-
ждой вершины генерирует выход, который по обратной связи пода-
ётся на вход. Этот процесс при создании сети повторяется много раз,
пока её выход не установится в положение равновесия для каждой из
целевых вершин. При подаче затем произвольного входного вектора
сеть Хопфилда переходит в результате рекурсивного процесса к од-
ной из точек равновесия, наиболее близкой к входному сигналу.
Динамическая модель рекуррентного слоя одной из модификаций
сети Хопфилда описывается следующим образом:

⎧⎪a 1 (k ) = satlins( LW 11a 1 (k − 1) + b1 );


⎨ 1
⎪⎩a (0) = p.
Когда сеть Хопфилда спроектирована, она может быть проверена
с одним или большим числом векторов входа. Весьма вероятно, что
векторы входа, близкие к целевым точкам равновесия, найдут свои
цели. Способность сети Хопфилда быстро обрабатывать наборы век-
торов входа позволяет проверить сеть за относительно короткое вре-
мя. Сначала следует проверить, что точки равновесия целевых векто-
ров действительно принадлежат вершинам гиперкуба, а затем можно
определить области притяжения этих точек и обнаружить паразит-
ные точки равновесия.

Практические задания
Задание 1. Создать сеть Хопфилда с двумя устойчивыми точками
в трёхмерном пространстве, выполнив следующие команды:

T =[-1 -1 1 ; 1 -1 1] ′ ; % – целевые вершины;


net =newhop(T); % – создание сети;
net, gensim(net) % – параметры и структура сети;
Ai = T ; % – начальные условия для линий задержки;
Y = sim(net,2,[], Ai); % – сеть устойчива;
Ai ={[-0.9 ; -0.8 ; 0.7]};
Y=sim(net,{1 5},{}, Ai); % – сеть обеспечила переход

126
% к устойчивому состоянию
% [-1 -1 1]′.
Задание 2. Создать сеть Хопфилда с четырьмя устойчивыми точ-
ками в двухмерном пространстве, выполнив следующие команды:

T = [1 -1; -1 1; 1 1; -1 -1] ′
plot(T(1, : ),T(2, : ), ′*r′) % – точки равновесия;
axis([-1.1 1.1 -1.1 1.1]);
title(′Точки равновесия проектируемой сети′);
xlabel(′a(1)′), ylabel(′a(2)′)
net =newhop(T);
W=net.LW{1,1}
b=net.b{1,1}
Ai = T;
Y=sim(net,4,[],Ai)
plot(T(1, : ),T(2, : ), ′*r′), hold on
axis([-1.1 1.1 -1.1 1.1])
xlabel(‘a(1)’), ylabel(′a(2)′)
new=newhop(T);
[Y,Pf,Af]=sim(net,4,[],T);
for i=1:25
a={rands(2,1)};
[Y,Pf,Af]=sim(net,{1,20},{},a);
record=[cell2mat(a),cell2mat(Y)]
start=cell2mat(a);
plot(start(1.1), start(2.1),′kx′.record(1,:),record(2,:))
end

127
Лабораторная работа № 16

Применение нейронных сетей


для проектирования систем управле-
ния
динамическими процессами
Цель работы: овладение методами решения задач идентифика-
ции, проектирования и моделирования систем управления динамиче-
скими процессами и способами их применения на практике.

Теоретические сведения
Применение нейронных сетей для решения задач управления ди-
намическими процессами позволяет выделить два этапа проектиро-
вания систем управления такими процессами:
1. Этап идентификации динамического процесса, для которого
проектируется система управления.
2. Этап синтеза закона управления и его реализация с помощью
нейронной сети.
На этапе идентификации разрабатывается модель управляемого
процесса в виде нейронной сети, которая на этапе синтеза использу-
ется для построения регулятора.
Динамические модели систем управления с нейросетевыми регу-
ляторами размещены в разделе Control Systems библиотеки блоков
для моделирования нейронных сетей Neural Network Blockset, дос-
туп к которым обеспечивается браузером Library Browser пакета
Simulink или командой neural. В этой библиотеке имеются также
следующие разделы:
Net Input Function – раздел блоков функций накопления: netprod
и netsum;
Transfer Function – раздел блоков передаточных функ-
ций(функций активации): hardlim, hardlims, purelin, satlin, satlins,
poslin, logsig, transig, radbas, tribas, softmax и compet;

128
Weight function – раздел блоков функций взвешивания: dotprod,
normprod, dist и negdist.
В разделе блоков управляющих систем Control Systems имеется
три вида нейронных регуляторов:
Neural Net Predictive Controller – регулятор с предсказанием бу-
дущих реакций процесса на случайные сигналы управления. Алго-
ритм оптимизации вычисляет управляющие сигналы, которые мини-
мизируют разность между желаемыми и действительными измене-
ниями сигнала на выходе модели и таким образом оптимизируют
управляемый процесс. Построение модели управляемого процесса
выполняется автономно с использованием нейронной сети, которая
обучается в групповом режиме с использованием одного из алгорит-
мов обучения. Реализация такого регулятора требует значительного
объема вычислений, поскольку расчеты по оптимизации выполняют-
ся на каждом такте управления.
Narmal2(Nonlinear Autoregressive – Moving Average) – регуля-
тор на основе модели авторегрессии со скользящим средним. Дан-
ный регулятор представляет собой модифицированную нейросете-
вую модель управляемого процесса, полученную на этапе автоном-
ной идентификации. Вычисления в реальном времени связаны толь-
ко с реализацией нейронной сети.
Model Reference Controller – регулятор на основе эталонной мо-
дели. Такой регулятор требует обучения нейронной сети управляе-
мого процесса и нейронной сети регулятора. При этом обучение ре-
гулятора оказывается достаточно сложным, поскольку обучение ос-
новано на динамическом варианте метода обратного распростране-
ния ошибки, так как нейронная сеть использует линии задержки. Ре-
гуляторы на основе эталонной модели применимы к различным
классам управляемых процессов.
Для каждой из трёх архитектур регуляторов используется одна и
та же процедура идентификации управляемого процесса. Нейронная
модель во всех случаях представляет собой двухслойную сеть с пря-
мой передачей сигнала и с линиями задержки на каждом слое. Вход-
ной, или скрытый (hiden) слой может иметь произвольное число
нейронов. Выходной слой имеет только один нейрон. Для входного
слоя функции взвешивания, накопления и активизации являются со-

129
ответственно dotprod, netsum и logsig. Выходной слой имеет такие
же функции взвешивания и накопления, а функцией активизации для
него является линейная функция purelin. Известно, что сети с такой
архитектурой могут воспроизводить весьма сложные нелинейные
зависимости между входом и выходом сети.
Настройка параметров нейронной сети, являющейся моделью
объекта, выполняется автономно методом последовательного обуче-
ния с использованием данных, полученных при испытаниях реально-
го объекта. Для обучения сети может быть использован любой из
обучающих алгоритмов для нейронных сетей. Использование кон-
трольного и тестового множеств обучающих данных позволяет из-
бежать явления переобучения сети. Изменяя число нейронов в пер-
вом слое, количество линий задержки на входе и выходе сети, а так-
же интервал квантования, или дискретности, можно обеспечить тре-
буемую точность моделирования управляемого процесса.
Диалоговая панель для идентификации управляемого процесса
Plant Identification входит в состав всех трёх регуляторов раздела
Control Systems библиотеки нейронных блоков системы Simulink,
является универсальным средством и может быть использована для
построения нейросетевых моделей любых динамических объектов,
которые могут быть представлены блоками этой системы.
С помощью управляющих элементов панели Plant Identification
можно задать архитектуру нейронной сети, параметры обучающей
последовательности и параметры обучения, а также управлять про-
цессом идентификации и оценивать качество этого процесса.
Набор управляющих элементов для задания архитектурных па-
раметров нейронной сети следующий:
1. Size of the Hiden Layer – количество нейронов на входном или
скрытом слое;
2. No. Delayed Plant Inputs – число линий задержки для входного
слоя;
3. No. Delayed Plant Outputs – число линий задержки для выход-
ного слоя;

130
4. Samling Interval – интервал квантования или шаг дискретно-
сти, в секундах, между двумя последовательными моментами отсчё-
та данных;
5. Notmalize Training Data – переключатель нормирования для
преобразования обучающих данных к диапазону [0 1].
Набор управляющих элементов для задания характеристик обу-
чающей последовательности таков:
1. Training Samples – число точек отсчёта для получения обу-
чающей последовательности в виде пар значений вход-выход для
управляемого процесса, определяемого моделью Simulink;
2. Maximum Plant Input – максимальное значение входного сиг-
нала;
3. Minimum Plant Input – минимальное значение входного сиг-
нала;
4. Maximum Interval Value (sec) – максимальный интервал иден-
тификации, в секундах;
5. Minimum Interval Value (sec) – минимальный интервал иден-
тификации, в секундах;
6. Limit Output Data – переключатель для ограничения значений
выходного сигнала;
7. Maximum Plant Output – максимальное значение выходного
сигнала, задаваемое при включённом переключателе Limit Output
Data;
8. Minimum Plant Output – максимальное значение выходного
сигнала, задаваемое при включённом переключателе Limit Output
Data;
9. Simulink Plant Model – для задания модели управляемого про-
цесса, реализованной с помощью блоков Simulink, имеющий порты
входа и выхода и сохранённой в файле *.mdl; выбор модели произ-
водится с помощью кнопки Browse; имя модели отображается в спе-
циальном окне.
Параметры обучения задаются следующим образом:
1. Training Epochs – количество циклов обучения;
2. Training Function – для задания обучающей функции;

131
3. Use Current Weights – переключатель для использования те-
кущих весов нейронной сети;
4. Use Validation Data – переключатель для использования кон-
трольного множества в объёме 25 % от обучающего множества;
5. Use Testing Data – переключатель для использования тестово-
го множества в объёме 25% от обучающего множества.
Для идентификации управляемого процесса необходимо выпол-
нить следующие действия:
1. Задать архитектуру нейронной сети, которая будет моделью
управляемого процесса.
2. Задать параметры обучения.
3. Выбрать модель Simulink для управляемого процесса.
4. Сгенерировать обучающую последовательность заданного
объёма, запустив модель Simulink с помощью кнопки Generate
Training Data. Генерация обучающей последовательности произво-
дится с помощью воздействия ряда ступенчатых сигналов на модель
управляемого процесса и снятия значений на выходе и входе модели
через каждый шаг квантования. Графики входного и выходного сиг-
нала отображаются в окне Plant Input-Output Data.
5. По завершении генерации обучающей последовательности не-
обходимо либо принять эти данные, нажав на кнопку Accept Data, и
тогда они будут использованы для обучения нейронной сети, либо
отвергнуть их, нажав кнопку Reject Data, и повторить процесс иден-
тификации управляемого процесса, представленного моделью Simu-
link.
6. После получения обучающей последовательности необходимо
установить требуемые параметры обучения и с помощью кнопки
Train Network запустить процесс обучения нейронной сети.
7. После завершения обучения его результаты отображаются на
графиках изменения ошибки сети для обучающей, контрольной и
тестирующей последовательностей, а также выходных значений мо-
дели и сети при подаче на вход указанных последовательностей.
8. Если результаты обучения приемлемы, то надо сохранить па-
раметры нейросетевой модели управляемого процесса и приступить

132
к синтезу регулятора того или иного класса, нажав кнопки Apply
и Ok.
9. Если результаты обучения неприемлемы, то следует нажать
кнопку Cаncel и повторить процесс идентификации сначала, изменяя
архитектуру сети и параметры обучающей последовательности.
10. Обучающую последовательность можно импортировать из
рабочей области или из файла, нажав на кнопку Import Data. Если
необходимо обучающую последовательность сохранить в рабочей
области или в файле для подбора параметров архитектуры нейрон-
ной сети, то следует после получения данных нажать на кнопку
Export Data.
11. Удалить только что сгенерированные данные при необходи-
мости можно с помощью кнопки Erase Generated Data.
Таким образом, диалоговая панель Plant Identification позволяет
идентифицировать управляемый процесс, представленный в виде
имитационной модели Simulink, построить двухслойную нейронную
сеть прямой передачи сигнала с необходимым числом нейронов и
линий задержки, обучить эту сеть для получения нейронной модели
управляемого процесса, оценить качество обучения и работу ней-
ронной сети. Для регулятора на основе авторегрессии со скользящим
средним, этап его синтеза отсутствует, так как такой регулятор пред-
ставляет собой полученную нейросетевую модель управляемого
процесса с предсказанием. Для регуляторов на основе эталонной мо-
дели с предсказанием, этап синтеза необходим.
Управление с предсказанием использует принцип управляющего
горизонта, когда нейросетевая модель управляемого процесса пред-
сказывает реакцию объекта управления на определенном интервале
времени в будущем. Предсказания используются программой чис-
ленной оптимизации для того, чтобы вычислить управляющий сиг-
нал, который минимизирует следующий критерий качества управле-
ния:
N2 Nu
Y= ∑
j= N1
[Yr (t + j) − Ym (t + j)]2 + ρ ∑[U′(t + j − 1) − U′(t + j − 2)] ,
j=1
2

где константы N1, N2, Nu задают пределы, внутри которых вычисля-


ются ошибка слежения и мощность управляющего сигнала;

133
U′ (t) – пробный управляющий сигнал;
Yr(t) – желаемый управляющий сигнал;
Ym(t) – истинная реакция модели управляемого сигнала;
ρ – коэффициент, определяющий вклад, вносимый мощностью
управления в критерий качества.
Структурная схема регулятора с предсказанием представлена на
рисунке.

Yr U′ Ym
Оптимизация U Модель объекта в виде
нейронной сети

U Управляемый Yp
процесс
Блок оптимизации определяет значения U′, которые минимизи-
руют критерий качества управления, а соответствующий сигнал
управляет процессом.
Синтез регулятора с предсказанием осуществляется с помощью
диалоговой панели Neural Network Predictive Control, на которой
имеются следующие управляющие элементы:
Cost Horizon (N2) – верхний предел суммирования в показателе
качества, при этом нижний предел N1 всегда равен единице;
Control Horizon (Nu) – верхний предел при оценке мощности
управления;
Control Weightin Factor (ρ) – коэффициент веса для составляю-
щей мощности управления;
Search Parameter (α) – параметр одномерного поиска, задающий
порог уменьшения показателя качества;
Minimization Routine – параметр для выбора процедуры одно-
мерного поиска;
Iterations Per Sample Time – число итераций на один такт дис-
кретности.

134
После установки параметров оптимизации необходимо их ввести
в регулятор с помощью кнопок Apply и OK и произвести моделиро-
вание полученной системы.
Для регулятора на основе эталонной модели необходимо постро-
ить две нейронные сети: сеть для модели объекта управления и сеть
для самого регулятора. Нейронная сеть модели объекта управления
строится точно так же, как и для регуляторов рассмотренного вида.
Для этих целей надо на основной панели Model Reference Control,
которая вызывается двойным щелчком левой кнопки мыши по блоку
регулятора, воспользоваться кнопкой Plant Identification. Щелчок по
этой кнопке вызывает диалоговую панель Plant Identification, кото-
рая имеет такой же набор управляющих элементов, как и для других
регуляторов. С помощью этой панели надо задать архитектуру ней-
ронной сети для управляемого объекта, задать характеристики обу-
чающей последовательности и параметры обучения, произвести
идентификацию управляемого объекта и обучить нейронную сеть. С
помощью кнопок Apply и OK завершить построение модели объекта
и возвратиться к основной диалоговой панели Model Reference
Control для синтеза нейронной модели регулятора.
Архитектура нейронной модели регулятора аналогична архитек-
туре нейронной модели объекта, поэтому управляющие элементы на
панели Model Reference Control такие же, что и на панели Plant
Identification, отсутствуют управляющие элементы для задания ха-
рактеристик выходного сигнала, так как он непосредственно посту-
пает на вход модели объекта, а обучающая последовательность раз-
бивается на сегменты, для чего имеется специальное поле Controller
Training Segments.
Для синтеза регулятора необходимо определить все требуемые
параметры на панели, сгенерировать обучающие последовательно-
сти, нажав на кнопку Training Data и обучить нейронную сеть с по-
мощью кнопки Train Controller, используя текущие веса и режим
обучения с накоплением (если необходимо). Затем нажать на кнопку
Apply для завершения процесса синтеза регулятора.
По окончании построения регулятора необходимо нажать но
кнопку OK, вернуться в окно Simulink и выполнить моделирование

135
работы системы нейронного регулирования для оценки характери-
стик регулятора.

Практические задания
Задание 1. Создать нейронную модель регулятора с предсказани-
ем для управлением каталитическим реактором с непрерывным по-
мешиванием. Динамическая модель управляемого процесса описы-
вается следующими обыкновенными нелинейными дифференциаль-
ными уравнениями:
⎧ dh
⎪⎪ = w1 (t ) + w2 (t ) − 0,2 h ;
dt
⎨ dCb w (t ) w (t ) K1Cb
⎪ = (Cb1 − Cb) 1 + (Cb2 − Cb ) 2 − ,
⎪⎩ dt h h (1 + K 2Cb )2
где h – уровень жидкости в резервуаре, который не регулируется;
w1(t) – скорость потока продукта с концентрацией Cb1;
w2(t) – скорость потока продукта с концентрацией Cb2;
Cb – концентрация продукта на выходе объекта;
K1 и K2 – константы скорости расхода продукта.
Цель регулирования состоит в поддержании концентрации про-
дукта путем регулирования скорости потока w2(t).
Для синтеза модели процесса использовать следующие значения
его параметров:
Cb1 = 29,4; Cb2 = 29,4; K1 = K2 = 1; w1(t) = 1; w2(t) = 0,1.
Основные этапы синтеза таковы:
1. Построение модели Simulink для управляемого процесса и её
исследование.
2. Идентификация процесса и синтез его нейронной модели.
3. Задание параметров оптимизации и синтез регулятора.
4. Моделирование регулируемой системы и анализ качества ре-
гулирования.

136
Задание 2. Создать нейронную модель регулятора с использова-
нием нелинейной авторегрессии со скользящим средним. Управляе-
мым объектом является магнит, который движется в электромагнит-
ном поле электромагнита. Уравнение движения этой системы имеет
вид
d2y α i 2 (t ) β dy (t )
= − g + − ,
dt 2 Μ y (t ) Μ dt
где y(t) – расстояние движущегося магнита от электромагнита;
g – ускорение силы тяжести;
α – постоянная магнитного поля, зависящая от числа витков об-
мотки и намагниченности электромагнита;
i(t) – управляющий ток электромагнита:
М – масса магнита;
β – коэффициент вязкого трения.

Задание 3. Создать нейронную модель регулятора на основе эта-


лонной модели. Регулируемым объектом является звено робота, опи-
сываемое дифференциальным уравнением
d 2ϕ dϕ
2
= −10 sin ϕ − 2 +u,
dt dt
где φ – угол поворота звена;
u – момент, развиваемый двигателем постоянного тока.
Цель обучения регулятора состоит в том, чтобы положение звена
отслеживало выход эталонной модели
d 2 yr dy
2
= −9 y r − 6 r + 9 r ,
dt dt
где yr – выход эталонной модели;
r – задающий сигнал на выходе модели.
Основные этапы синтеза нейронного регулятора таковы:
1. Построение модели Simulink для управляемого объекта и эта-
лонной моделей и их исследование.
2. Идентификация объекта и синтез его нейронной модели.

137
3. Идентификация эталонной модели и синтез регулятора.
4. Моделирование регулируемой системы и анализ качества ре-
гулирования.

138
Cписок литературы
1. Дьяконов, В. Matlab 6: учебный курс [Текст] / В. Дьяконов. –
СПб.: Питер, 2001. – 592 с.
2. Медведев, В. Г. Нейронные Сети Matlab 6 / В. Г. Медведев;
под общ. ред. к.т.н. В. Г. Потемкина. – М.: ДИАЛОГ-МИФИ, 2002. –
496 с. – (Пакеты прикладных программ; Кн.4).
3. Галушкин, А. И. Теория нейронных сетей [Текст] / А. И. Га-
лушкин. – М.: ИПРЖР, 2000. – 416 с.
4. Галушкин, А. И. Нейрокомпьютеры [Текст]. – М.: ИПРЖР,
2000. – 532 с.
5. Нейрокомпьютеры и интеллектуальные работы [Текст] / под
ред. В. Г. Неелова. – Киев: Пресса Украины, 1999. – 150 с.
6. Дунин-Барковский, В. П. Информационные процессы в ней-
ронных структурах [Текст] / В. П. Дунин-Барковский. – М.: Наука,
1978.
7. Сивохин, А. В. Искусственные нейронные сети [Текст] /
А. В. Сивохин; учеб. пособие / под ред. профессора Б. Г. Хмелев-
ского. – Пенза: Изд-во Пенз. гос. ун-та, 2002. – 70 с.
8. Щербаков, М. А. Искусственные нейронные сети: Конспект
лекций [Текст] / М. А. Щербаков. – Пенза: Изд-во Пенз. гос. тех. ун-
та, 1996. – 44 с.
9. Осовский, С. Нейронные сети для обработки информации
[Текст] / С. Осовский; пер. с польского И. Д. Рудинского. – М.: Фи-
нансы и статистика, 2002. – 344 с.
10. Дьяконов, В. П. Matlab 6/6.1/6.5 + Simulink 4/5. Основы приме-
нения. [Текст]. Полное руководство пользователя / В. П. Дьяконов. –
М.: СОЛОН-Пресс, 2002. – 768 с.

139
СОДЕРЖАНИЕ
Введение...................................................................................................................... 3
Лабораторная работа № 1. Основы программирования в системе MATLAB....... 5
Лабораторная работа № 2. Массивы, структуры, ячейки
и классы системы MATLAB.................................................................................... 15
Лабораторная работа №3. Модели искусственного нейрона................................ 28
Лабораторная работа №4. Искусственные нейронные сети ................................. 41
Лабораторная работа № 5. Методы и алгоритмы обучения искусственных
нейронных сетей....................................................................................................... 49
Лабораторная работа № 6. Исследование персептронных сетей ......................... 73
Лабораторная работа № 7. Исследование линейных нейронных сетей............... 78
Лабораторная работа № 8. Исследование радиальных базисных сетей
общего вида .............................................................................................................. 87
Лабораторная работа № 9. Исследование радиальных базисных сетей
типа GRNN................................................................................................................ 93
Лабораторная работа № 10. Исследование радиальных базисных сетей
типа PNN ................................................................................................................... 96
Лабораторная работа № 11. Исследование самоорганизующихся
слоев Кохонена ......................................................................................................... 99
Лабораторная работа № 12. Исследование самоорганизующихся
карт Кохонена......................................................................................................... 104
Лабораторная работа № 13. Исследование самоорганизующихся LVQ-сетей . 112
Лабораторная работа № 14. Исследование сетей Элмана................................... 117
Лабораторная работа № 15. Исследование сетей Хопфилда .............................. 122
Лабораторная работа № 16. Применение нейронных сетей для
проектирования систем управления динамическими процессами..................... 125
Список литературы ................................................................................................ 135

140

Вам также может понравиться