Загрузил Ramiz Alekper

Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6

Реклама
ПАКЕТЫ ПРИК ЛАДНЫХ ПРОГРАММ
В. С. МЕДВЕДЕВ,
В. Г. ПОТЕМКИН
НЕЙРОННЫЕ СЕТИ
MATLAB 6
Под общей редакцией
кандидата технических наук В. Г. Потемкина
1
УДК 681.
Пакеты прикладных программ
Выпускается с 1999 года
Медведев В. С., Потемкин В. Г.
Нейронные сети. MATLAB 6./Под общ. ред. В. Г. Потемкина. – М.: ДИАЛОГМИФИ, 2001. – 630 с. – (Пакеты прикладных программ; Кн. 4).
ISBN 5-86404-144-0 (Кн. 4)
В книге содержится описание пакета прикладных программ Neural Network Toolbox
(ППП NNT) версии 4 (выпуски 11 и 12), функционирующего под управлением ядра системы MATLAB версий 5.3 и 6.
Книга состоит из двух частей. Первая часть содержит теорию и описание различных
типов нейронных сетей; вторая – включает справочный материал, связанный с описанием
М-функций пакета.
Рассмотрено 15 типов нейронных сетей, для каждой из которых описана архитектура,
методы адаптации, обучения и настройки параметров. Показано применение нейронных
сетей для решения прикладных задач фильтрации и предсказания сигналов, подавления
шумов, распознавания образов, построения систем управления.
Приведено полное описание вычислительной модели нейронной сети в виде массива
записей. Архитектура нейронной сети представлена ее S-моделью, которая воспроизводится с помощью системы SIMULINK. Пакет программ дополнен библиотекой Neural
Network Toolbox Block Library, содержащей блоки, необходимые для формирования Sмодели нейронной сети.
Большое количество вспомогательных графических функций помогает пользователю
создавать наглядные проекты нейронных сетей для различных приложений.
Книга предназначена для инженеров, научных работников, аспирантов и студентов,
занимающихся созданием технических систем на основе нейронных сетей и использующих в своей практике современные вычислительные инструменты и средства прикладного программирования.
Учебно-справочное издание
Медведев Владимир Степанович, Потемкин Валерий Георгиевич
Нейронные сети. MATLAB 6.
Под общ. ред. В. Г. Потемкина.
ISBN 5-86404-144-0 (Кн. 4)
ISBN 5-86404-135-1
ЗАО «Диалог-МИФИ», 2001
2
© Медведев В. С., Потемкин В. Г., 2001
© Оригинал-макет, оформление обложки,
Нейронные сети. MATLAB 6
ПРЕДИСЛОВИЕ
Предлагаемая вниманию читателя книга входит в серию "Пакеты прикладных программ". Эта серия книг [54–56] посвящена описанию прикладного программного обеспечения фирмы MathWorks, функционирующего под управлением ядра системы MATLAB.
Нейронные сети представляют новое направление в практике создания технических
систем. Возможности нейронных сетей выполнять операции сравнения по образцу и классификации объектов, недоступные для традиционной математики, позволяют создавать
искусственные системы для решения задач распознавания образов, диагностики заболеваний, автоматического анализа документов и многих других нетрадиционных приложений.
Теория нейронных сетей развивается в течение последнего полувека, но практическое
ее применение стало возможно только в последние 10–15 лет, когда была создана необходимая элементная база для реализации нейронных сетей. Обращаем внимание читателей
на ряд обзорных работ по нейронным сетям на русском языке [57, 58].
Тем не менее данная книга занимает особое место, поскольку в ней описан реальный
инструмент для расчета и проектирования нейронных сетей. Книга состоит из двух частей.
Часть 1 содержит теорию и описание конкретных нейронных сетей. В нее также включен
раздел по системе MATLAB 6 и GUI-интерфейсу для работы с ППП NNT. Часть 2 включает справочный материал по описанию М-функций пакета.
Значительное внимание уделено проектированию контроллеров для систем управления на основе нейронных сетей. Рассмотрено несколько весьма сложных систем управления, для которых процедура проектирования контроллера занимает значительное время.
В первую очередь это модель химического реактора с непрерывным перемешиванием, где
используется модель управляемого процесса для предсказания поведения реактора в процессе его функционирования. Другая модель – управление движущимся объектом в магнитном поле. Здесь в качестве модели управляемого процесса используется нелинейная
авторегрессионная модель со скользящим средним, которая входит в состав регулятора
и реализуется в виде нейронной сети. Еще один пример связан с управлением роботом,
здесь нейронные сети используются для построения как модели управляемого объекта,
так и самого регулятора. Работа с этими системами возможна только при наличии ядра
системы MATLAB версии 6 и системы Simulink версий 4 (R12) или 5.
Читателю следует выбрать стиль работы с книгой. Начинающему знакомиться
с теорией и практикой нейронных сетей рекомендуется в первую очередь просмотр демонстрационных примеров и формирование сетей с помощью GUI-интерфейса NNTool.
Опытному пользователю, создающему собственные архитектуры нейронных сетей, следует применять режим работы из командного окна, который позволяет воспользоваться
всеми возможностями ППП NNT. Следует также обратить внимание на интерфейс ППП
NNT с системой SIMULINK, что позволяет наглядно отображать архитектуру сети и выполнять моделирование как статических, так и динамических нейронных сетей.
3
При чтении книги читатель найдет большое количество примеров формирования
и расчета нейронных сетей. Все операторы в этих примерах проверены и в точности соответствуют приводимым результатам. Таким образом, читатель, предполагающий активно
использовать компьютер при изучении материала этой книги, сможет воспроизводить
примеры в среде системы MATLAB с установленным ППП NNT. Кроме того, мы
предполагаем к моменту выхода книги разместить на сайте www.mathworks.ru М-файлы
этих сценариев, которые будут доступны для копирования. Это позволит избавиться
от возможных непреднамеренных ошибок пользователя.
Авторы выражают благодарность О. А. Мишулиной за полезные советы при подготовке рукописи книги, способствовавшие ее улучшению.
В. С. Медведев,
В. Г. Потемкин,
сентябрь 2001 г.
4
Нейронные сети. MATLAB 6
ВВЕДЕНИЕ
В последние годы наблюдается повышенный интерес к нейронным сетям, которые
нашли применение в самых различных областях человеческой деятельности – бизнесе,
медицине, технике. Нейронные сети используются при решении задач прогнозирования,
классификации, управления. Такой впечатляющий успех определяется несколькими причинами [46–49]:


Нейронные сети – это исключительно мощный метод имитации процессов и явлений,
позволяющий воспроизводить чрезвычайно сложные зависимости. Нейронные сети
по свой природе являются нелинейными, в то время как на протяжении многих лет
для построения моделей использовался линейный подход. Кроме того, во многих случаях нейронные сети позволяют преодолеть "проклятие размерности", обусловленное
тем, что моделирование нелинейных явлений в случае большого числа переменных
требует огромного количества вычислительных ресурсов.
Другая особенность нейронных сетей связана с тем, что они используют механизм
обучения. Пользователь нейронной сети подбирает представительные данные, а затем
запускает алгоритм обучения, который автоматически настраивает параметры сети.
При этом от пользователя, конечно, требуется какой-то набор эвристических знаний
о том, как следует отбирать и подготавливать данные, выбирать нужную архитектуру
сети и интерпретировать результаты, однако уровень знаний, необходимый для
успешного применения нейронных сетей, гораздо скромнее, чем, например, при использовании традиционных методов.
Тем не менее искусственные нейронные сети основаны на весьма простой биологической модели нервной системы. Нервная система человека, построенная из элементов,
называемых нейронами, имеет ошеломляющую сложность. Около 1011 нейронов участвуют примерно в1015 передающих связях, имеющих длину метр и более. Каждый нейрон
обладает многими качествами, общими с другими элементами организма человека, но его
уникальной способностью является прием, обработка и передача электрохимических сигналов по нервным путям, которые образуют коммуникационную систему мозга.
Интенсивность сигнала, получаемого нейроном (следовательно, и возможность его
активации), сильно зависит от активности линии связи. Каждая линия связи имеет определенную протяженность, и специальные химические вещества передают сигнал вдоль
нее. Предполагается, что обучение заключается в первую очередь в изменении интенсивности связей. Например, в классическом опыте Павлова каждый раз непосредственно перед кормлением собаки звонил колокольчик и собака быстро научилась связывать звонок
колокольчика с пищей.
Мозг, построенный из очень большого числа нейронов (каждый из которых принимает взвешенную сумму входных сигналов и при определенных условиях имеет возможность передавать сигнал дальше), способен решать чрезвычайно сложные задачи. Такую
же модель реализуют и искусственные нейронные сети.
Теория нейронных сетей возникла из исследований в области искусственного интеллекта, а именно из попыток воспроизвести способность нервных биологических систем
обучаться и исправлять ошибки, моделируя низкоуровневую структуру мозга. Основой
5
исследований по искусственному интеллекту в 60–80-е гг. были экспертные системы. Такие системы основывались на высокоуровневом моделировании процесса мышления
(в частности, на представлении, что процесс нашего мышления построен на манипуляциях с символами). Скоро стало ясно, что подобные системы, хотя и могут принести пользу
в некоторых областях, не отражают ключевых свойств человеческого интеллекта. Согласно
одной из точек зрения причина этого состоит в том, что они не в состоянии воспроизвести
структуру мозга. Чтобы создать искусственный интеллект, необходимо построить систему с архитектурой похожей на строение мозга.
Искусственные нейронные сети также составлены из множества простых элементов,
действующих параллельно. Как и в природе, функция нейронной сети в значительной
степени определяется связями между элементами. Нейронную сеть можно обучать для
выполнения конкретной функции, регулируя значения коэффициентов (весов) связи.
Обычно искусственные нейронные сети настраиваются или обучаются так, чтобы конкретные входы преобразовывались в заданный целевой выход. Сеть настраивается (обучается), основываясь на сравнении сигналов выхода и цели до тех пор, пока выход сети не
будет соответствовать цели. Чтобы обучить сеть при таком управляемом обучении, как
правило, используется много пар значений сигналов вход/цель.
Нейронные сети обучаются выполнять сложные функции в различных областях приложений, включая распознавание образов, идентификацию, классификацию объектов,
распознавание речи, системы технического зрения и системы управления. В этих случаях
применяются достаточно простые нейронные сети, но даже они оказываются мощным
инструментом в арсенале специалиста.
Сегодня могут быть построены искусственные нейронные сети для решения таких задач, которые являются трудными как для компьютеров, построенных по традиционной
схеме, так и для человека.
Теория нейронных сетей развивается в течение последних пяти десятилетий, но
нашла широкое применение только в последние 15 лет. Поэтому строгая терминология
в области нейронных сетей еще не установилась. Этим теория нейронных сетей отличается от теории управления или оптимизации, где терминология, основные математические
методы и процедуры проектирования выверены при решении практических задач в течение многих лет.
ППП Neural Network Toolbox служит средством, которое помогает пользователям развивать методы проектирования и расширять область применения нейронных сетей.
Поскольку данная область исследований характеризуется значительной новизной, данное
пособие описывает только основные положения теории нейронных сетей и используемые
в ней методы и процедуры, а на примерах поясняет, как применять их. Мы полагаем, что
понимание примеров и их приложений весьма существенно для успешного использования
этого ППП.
Нейронные сети нашли применение во многих областях техники, где они используются для решения многочисленных прикладных задач:

в космонавтике и аэронавтике – для построения систем автоматического пилотирования самолетов, имитации траекторий полета, разработки перспективных конструкций
автопилотов, моделирования и обнаружения неисправностей агрегатов летательных аппаратов, управления воздушным движением, обработки аэрокосмической информации;
6
Нейронные сети. MATLAB 6











в автомобилестроении – для проектирования автоматических систем управления;
в банковском деле – для автоматического чтения документов и их контроля, оценки
эффективности кредитных вложений;
в военном деле – для управления оружием, слежения за целями, выделения и распознавания объектов, построения новых типов датчиков, обработки звуковых, радиолокационных и телевизионных изображений, постановки и подавления помех, идентификации сигналов и изображений;
в электронике – для управления процессом проектирования и размещения микросхем на плате, нелинейного моделирования и анализа отказа микросхем, для построения систем машинного зрения и синтеза речи;
в финансовом деле – для анализа кредитных потоков, оценки недвижимости, общего
финансового анализа, прогнозирования стоимости валюты;
в страховом деле – для определения оптимальной стратегии страхования;
в промышленном производстве – для управления производственными процессами,
анализа продукции, диагностики работы машин, контроля качества, тестирования
продукции, анализа качества сварочных работ, шлифовальных операций, анализа
и синтеза химических веществ, прогнозирования цены продукта;
в медицине – для анализа раковых клеток, диагностики заболеваний, конструирования протезов, оптимизации времени трансплантации, планирования расходов больницы, консультаций в отсутствие специалистов;
в нефтегазовой промышленности – для разведки месторождений;
в робототехнике – для управления роботами, построения контроллеров роботов
и манипуляторов и систем технического зрения;
при передаче данных – для сжатия и отображения данных, распознавания речи, классификации гласных звуков, преобразования текста в речь, для синхронного перевода.
Этот перечень можно продолжить и далее. Широкое применение нейронных сетей,
значительные ресурсы, вкладываемые в создание программного обеспечения и аппаратуры для реализации нейронных сетей, показывают, что имеется большая заинтересованность в разработке искусственных нейронных сетей.
Используемые обозначения
Обозначения скаляров, векторов и матриц:
скаляры – курсивные строчные буквы: a, b, c;
векторы – прямые строчные полужирные буквы: a, b, c;
матрицы – прямые прописные полужирные буквы: A, B, C.
Обозначения весовых матриц:
весовая матрица – W(t);
элемент матрицы – wij(t), где i – номер строки, j – номер столбца, t – время или итерация;
вектор-столбец – wj(t) (вектор, соответствующий столбцу j матрицы W);
вектор-строка – wi(t) (вектор, соответствующий строке i матрицы W);
вектор смещений – b(t);
элемент вектора смещений – bi(t).
Введение
7
Обозначения для слоев нейронной сети:
верхний индекс из одного символа применяется для того, чтобы указать принадлежность некоторого элемента слою. Например, вектор входа слоя 3 обозначается как p3;
верхний индекс из двух символов применяется для того, чтобы указать источник сигнала (l) и пункт назначения (k); он используется для обозначения матриц весов входа IWk,l
и матриц весов слоя LWk,l. Например, матрица весов от слоя 2 к слою 4 будет обозначаться как LW42.
Пример структурной схемы нейронной сети:
На рисунке приведены обозначения, используемые при изображении структурных
схем нейронных сетей.
Связь математических обозначений с обозначениями, принятыми в алгоритмах и программах ППП. При переходе от математических обозначений к кодам системы MATLAB
следует руководствоваться следующими правилами:

верхние индексы соответствуют индексам массива ячеек: p1  p{1};
нижние индексы соответствуют индексам массива чисел: p2  p(2), p12  p{1}(2);
индекс в круглых скобках соответствует второму индексу массива ячеек: p1(k)  p{1, k}.
8
Нейронные сети. MATLAB 6


Часть 1. ППП NEURAL NETWORK TOOLBOX
1. СИСТЕМА MATLAB 6
Семейство программных продуктов MATLAB 6 поставляется на двух компакт-дисках,
и в соответствии с инструкцией пользователь должен инсталлировать те программные
продукты, которые необходимы для последующей работы. Требования, предъявляемые
к ресурсам персонального компьютера, следующие:






рекомендуемые процессоры – Pentium, Pentium Pro, Pentium II, Pentium III или AMD
Athlon;
операционные системы Microsoft Windows 95, Windows 98, Windows NT 4.0 с пакетом
Service Pack 5 или Windows 2000;
устройство CD-ROM для выполнения инсталляции;
требования к оперативной памяти – минимум 64 M для Windows 95, 98, NT 4.0
и 2000, крайне рекомендуется использовать 128 M, поскольку потери в производительности при 64 M составляют около 40 %;
объем требуемого пространства памяти на диске зависит в основном от размеров
используемой справочной системы, рекомендуется не менее 4 Г;
рекомендуется применять 8-битовый графический адаптер и дисплей с палитрой
не менее 256 цветов.
Далее предполагается, что необходимая установка выполнена и вы готовы к сеансу
работы в среде MATLAB 6.
1.1. Операционная среда MATLAB 6
Работа с системой MATLAB начинается с того, что вы запускаете систему с иконки
рабочего стола системы Windows. В результате на дисплее открывается рабочий стол системы (рис. 1.1).
Он содержит элементы графического интерфейса пользователя, которые предназначены для работы с файлами, переменными и приложениями, связанными с MATLAB.
На рис. 1.1 вы видите три открытых окна: командное окно Command Window, в котором
расположена командная строка, окно (панель) запуска приложений Launch Pad с кнопками развертки/свертки и окно предыстории вызовов Command History.
Кроме того, имеются клавиши для переключения окна запуска Launch Pad на окно рабочей области Workspace и окна предыстории Command History на окно текущего каталога Current Directory. Здесь же показан вертикальный разделитель окон, перемещение которого управляет размещением окон в поле экрана. Отметим также информационное окно
текущего каталога на инструментальной панели рабочего стола, а также кнопки вызова
подсказки, закрытия и отделения командного окна от рабочего стола. Последняя кнопка
позволяет перейти в режим работы предшествующих версий системы MATLAB.
9
Рис. 1.1
Описанный рабочий стол появляется по умолчанию при запуске системы MATLAB 6.
Вы можете изменить состав и размещение рабочих окон, открывая новые, закрывая имеющиеся, а также изменяя их размеры с помощью вертикальных и горизонтальных разделителей. Кроме того, можно отделять окна от рабочего стола и помещать их на рабочий
стол, используя меню View инструментальной панели.
Для настройки таких параметров рабочего стола, как тип и размер шрифта, цвета символов командной строки, следует воспользоваться опцией Preferences меню File (рис. 1.2).
Рис. 1.2
10
Нейронные сети. MATLAB 6
Командное окно
Командное окно Command Window показано на рис. 1.3 и предназначено для работы
с переменными, файлами и функциями системы MATLAB.
Рис. 1.3
В отличие от предшествующих версий в среде системы MATLAB 6 все операторы как
в зоне просмотра командного окна, так и в командной строке могут быть активизированы
с помощью правой кнопки мыши. При этом появляется контекстное меню со следующими
опциями: Evaluate Selection (Вычислить выделенное), Open Selection (Открыть выделенное),
Help on Selection (Справка по выделенному), Copy (Копировать), Paste (Вставить).
Окно предыстории
Окно предыстории вызова операторов Command History показано на рис. 1.4. Оно содержит строки операторов, которые вводились в командном окне с начала сеанса работы.
Рис. 1.4
1. Система MATLAB 6
11
Эти строки можно активизировать к выполнению двойным щелчком левой кнопки
мыши, можно переносить из окна на командную строку, а можно использовать правую
кнопку мыши. При этом появляется контекстное меню со следующими опциями:
Copy (Копировать), Evaluate Selection (Вычислить выделенное), Create M-File (Создать
М-файл), Delete Selection (Удалить выделенное), Delete to Selection (Удалить до выделенного), Delete Entire History (Удалить всю предысторию).
Окно запуска
Окно, или панель запуска, Launch Pad показано на рис. 1.5 и предназначено для вызова
программных продуктов, включенных в состав инсталлированной версии системы MATLAB.
Рис. 1.5
Активизация кнопки вызова подменю для каждого из продуктов позволяет обратиться
к средству подсказки Help, демонстрационным примерам Demos. Применительно к ядру
системы MATLAB можно активизировать либо окно текущего каталога Current Directory,
либо окно рабочей области Workspace, либо средство управления путями доступа Path.
Можно также вызвать средство построения графического интерфейса пользователя
GUIDE (GUI Builder), обратиться через Интернет к странице Product Page (Web) на сайте
фирмы The MathWorks Inc., где приведено описание продуктов семейства MATLAB.
И вновь доступно контекстное меню со следующими опциями: Open (Открыть), Edit
Source (Отредактировать источник), Refresh (Обновить).
Окно текущего каталога
Окно для просмотра текущего каталога Current Directory показано на рис. 1.6; оно
позволяет открывать, просматривать и выполнять поиск информации в файлах системы
MATLAB, имеющих необходимое расширение.
12
Нейронные сети. MATLAB 6
Рис. 1.6
Контекстное меню, связанное с правой кнопкой мыши, позволяет реализовать следующие действия: Open (Открыть), Run (Выполнить), View Help (Просмотреть справку),
Open as Text (Открыть как текст), Import Data… (Импортировать данные…), New
(Открыть новый... ), Rename (Переименовать), Delete (Удалить), Cut (Вырезать), Copy
(Копировать), Paste (Вставить), File Filter (Задать список расширений), Add to Path
(Добавить к пути доступа), Refresh (Обновить).
На инструментальной панели системы MATLAB 6 имеется информационное окно
Current Directory, с помощью которого всегда обеспечивается доступ к списку ранее вызванных текущих каталогов, как это показано на рис. 1.7. Это позволяет быстро переходить от одного каталога к другому, получая доступ к интересующим файлам.
Рис. 1.7
1. Система MATLAB 6
13
Окно рабочей области
Окно рабочей области Workspace показано на рис. 1.8 и содержит список переменных
(именованные массивы), накопленных в памяти в процессе работы, расширение списка
переменных при обращении к функциям, выполнении М-файлов и загрузке сохраненных
переменных.
Рис. 1.8
На рис. 1.8 показан список переменных, охватывающий все типы данных: это массивы действительных и комплексных (complex) чисел удвоенной точности double array, разновидности этих массивов, описываемые глобальной переменной global и переменными
логического типа logical. Кроме того, список содержит массив строк char array, массив
разреженной матрицы sparse array, массив записей struct array, массив ячеек cell array,
а также специальные типы целочисленных массивов uint8 и uint32 и объект типа inline
object. Для каждой переменной указывается размер массива Size, объем памяти Bytes
и тип массива Class.
Окно рабочей области, как и все окна рабочего стола системы MATLAB 6, сопровождается контекстным меню, которое включает следующие опции: Open Selection… (Открыть выделенное…), Graph Selection (Построить график), Select All (Выделить все),
Import Data (Импорт данных), Save Selection As… (Сохранить выделенное как…), Save
Workspace As… (Сохранить рабочую область как…), Delete Selection (Удалить выделенное), Delete Workspace (Удалить рабочую область).
На рис. 1.9 показана глубина вложенности опции Graph Selection, что позволяет в режиме контекста строить любые типы графиков. Это определяет совершенно новый стиль
работы в среде системы MATLAB 6, когда многие предварительные действия вообще
не требуют обращения к командной строке и могут быть реализованы с использованием
только правой кнопки мыши.
14
Нейронные сети. MATLAB 6
Рис. 1.9
После завершения сеанса работы данные в рабочей области не сохраняются, и пользователь должен предусмотреть их сохранение в виде файла данных. Это реализуется либо
с помощью опции контекстного меню Save Workspace As…, либо с помощью этой же
опции из меню File, либо с использованием команды save. Любая из этих операций приводит к созданию специального двоичного файла с расширением .mat. Чтобы прочитать
МАТ-файл и разместить его в рабочей области, следует воспользоваться опцией Import
Data… или использовать команду load.
Окно рабочей области помимо перечисленных функций выполняет функции обозревателя (средства просмотра) данных. Достаточно выполнить двойной щелчок по левой
клавише мыши, чтобы вызвать редактор данных Array Editor.
На рис. 1.10 показан редактор данных, который позволяет в интерактивном режиме
просматривать и корректировать одномерные и двумерные числовые массивы, массивы
строк и массивы строковых ячеек.
Рис. 1.10
1. Система MATLAB 6
15
Справочная подсистема
В состав системы MATLAB 6 входит чрезвычайно мощная подсистема справки Help.
Объем документации, к которой организуется доступ, составляет более 250 М и поставляется на отдельном компакт-диске. Обеспечивается доступ не только к встроенной системе
Help, но и к документам в формате HTML, а также к полнотекстовым документам в формате PDF.
Рис. 1.11
Экран справочной системы делится на 2 области: область навигатора Help Navigator,
где пользователь может указать интересующую его тему, термин или функцию, относящиеся к продуктам семейства MATLAB, и область для просмотра найденной информации. Остановимся подробнее на описании этих областей.
Навигатор справочной системы позволяет установить в поле Product Filter меру использования источников информации: в полном (All) или ограниченном объеме
(Selected). С помощью кнопки Contents tab вывести заголовки и оглавления документов;
с помощью кнопки Index tab вывести на экран индексный указатель, а с помощью кнопки
Search tab обратиться к поисковой системе. Наконец, кнопка Favorites tab позволяет просмотреть и изменить список справочных документов, определенных в качестве первоочередных для просмотра.
Как только требуемая информация найдена, она выводится в окно просмотра. При
этом обеспечивается возможность перехода к другим страницам, используя стрелки
в верхней и нижней частях страницы или клавиши "вперед" и "назад" инструментальной
панели этого окна. Здесь же вы можете увидеть кнопку вывода на печать содержимого
страницы, а также окно для поиска Find in page, окно с названием документа-источника,
а также кнопку создания закладки Add to Favorites.
16
Нейронные сети. MATLAB 6
Рис. 1.12
И вновь, как это свойственно среде MATLAB 6, пользователь имеет доступ к контекстному меню со следующими опциями: Evaluate Selection (Вычислить выделенное),
Open Selection (Открыть выделенное), Help on Selection (Справка о выделенном), Back
(Назад), Forward (Вперед), Reload (Перезагрузить раздел), Copy (Копировать).
1.2. GUI-интерфейс для ППП NNT
Отличительной особенностью 12-го выпуска программных продуктов фирмы MathWorks является включение в их состав различных инструментальных средств организации
диалога с пользователем. Как правило, это GUI-интерфейсы. Не является исключением
и пакет по нейронным сетям ППП NNT, в состав которого входит инструментальное
средство NNTool. Этот графический интерфейс позволяет, не обращаясь к командному
окну системы MATLAB, выполнять создание, обучение, моделирование, а также импорт
и экспорт нейронных сетей и данных, используя только инструментальные возможности
GUI-интерфейса. Конечно, такие инструменты наиболее эффективны лишь на начальной
стадии работы с пакетом, поскольку имеют определенные ограничения. В частности, интерфейс NNTool допускает работу только с простейшими однослойными и двухслойными
нейронными сетями, но при этом пользователь выигрывает во времени и эффективности
освоения новых объектов.
Вызов GUI-интерфейса NNTool возможен либо командой nntool из командной строки,
либо из окна запуска приложений Launch Pad с помощью опции NNTool из раздела Neural
Network Toolbox. После вызова на экране терминала появляется окно Network/Data Manager (Управление сетью/данными) (рис. 1.13)
1. Система MATLAB 6
17
Рис. 1.13
Здесь:
Help – кнопка вызова окна подсказки Network/Data Manager Help (рис. 1.14);
New Data… – кнопка вызова окна формирования данных Create New Data (рис. 1.15);
New Network… – кнопка вызова окна создания новой нейронной сети Create New
Network (рис. 1.16);
Import…– кнопка вызова окна для импорта или загрузки данных Import or Load
to Network/Data Manager (рис. 1.17);
Export… – кнопка вызова окна для экспорта или записи данных в файл Export or
Save from Network/Data Manager (рис. 1.18).
Кнопки View, Delete становятся активными только после создания и активизации
данных, относящихся к последовательностям входа, цели, выхода или ошибок сети.
Кнопка View позволяет просмотреть, а кнопка Delete удалить активизированные данные.
Кнопки View, Delete, Initialize…, Simulate…, Train…, Adapt… становятся активными после создания и активизации самой нейронной сети. Они позволяют просмотреть,
удалить, инициализировать, промоделировать, обучить или адаптировать нейронную сеть
и будут описаны ниже.
Прежде всего рассмотрим назначение и способы работы с перечисленными выше
окнами.
Окно Network/Data Manager Help. Это окно подсказки показано на рис. 1.14 и описывает правила работы с диспетчером Network/Data Manager при создании нейронной
сети.
18
Нейронные сети. MATLAB 6
Рис. 1.14
Чтобы создать нейронную сеть, необходимо выполнить следующие операции:




Сформировать последовательности входов и целей (кнопка New Data), либо загрузить
их из рабочей области системы MATLAB или из файла (кнопка Import).
Создать новую нейронную сеть (кнопка New Network), либо загрузить ее из рабочей
области системы MATLAB или из файла (кнопка Import).
Выбрать тип нейронной сети и нажать кнопку Train…, чтобы открыть окно для задания параметров процедуры обучения.
Открыть окно Network для просмотра, инициализации, моделирования, обучения
и адаптации сети.
Окно Create New Data. Это окно показано на рис. 1.15 и включает 2 области редактирования текста для записи имени вводимых данных (область Name) и ввода самих данных
(область Value), а также 6 кнопок для указания типа вводимых данных.
1. Система MATLAB 6
19
Рис. 1.15
Различают следующие типы данных:
Inputs (Входы) – последовательность значений входов;
Targets (Цели) – последовательность значений цели;
Input Delay States (Состояния ЛЗ входа) – начальные условия линии задержки на входе;
Layer Delay States (Состояния ЛЗ слоя) – начальные условия линии задержки в слое;
Outputs (Выходы) – последовательность значений выхода сети;
Errors (Ошибки) – разность значений целей и выходов.
Как правило, пользователь задает только последовательности входа и цели, т. е. типы
данных Inputs и Targets. При этом следует помнить, что при адаптации нейронной сети
данные должны быть представлены в виде массива ячеек.
Окно Create New Network. Это окно показано на рис. 1.16 и включает поля для задания параметров создаваемой сети. В зависимости от типа сети количество полей и их
названия изменяются.
Рис. 1.16
Обратимся к описанию полей.
Network Name (Имя сети) – стандартное имя сети, присваиваемое GUI-интерфейсом
NNTool; в процессе создания новых сетей порядковый номер будет изменяться автоматически.
20
Нейронные сети. MATLAB 6
Network Type (Тип сети) – список сетей, доступных для работы с интерфейсом
NNTool. Для удобства этот список повторен в нижеследующей таблице. Интерфейс
NNTool позволяет создавать нейронные сети только с одним или двумя слоями.
№ п/п
Тип сети
1
2
Competitive
Cascade-forward
backprop
3
Elman backprop
4
Feed-forward
backprop
5
Time delay
backprop
6
9
10
Generalized
regression
Hopfield
Linear layer
(design)
Linear layer (train)
LVQ
11
12
Perceptron
Probabalistic
13
Radial basis
(exact fit)
Radial basis
(fewer neurons)
7
8
14
15
Self-organizing
map
Название сети
Число слоев
Обучаемые параметры
Конкурирующая сеть
Каскадная сеть с прямым
распространением сигнала
и обратным распространением ошибки
Сеть Элмана с обратным
распространением ошибки
1
2
IW{1, 1}, b{1}
IW{1, 1}, b{1},
LW{2, 1},
IW{2, 1}, b{2}
2
Сеть с прямым распространением сигнала и обратным
распространением ошибки
Сеть с запаздыванием
и обратным распространением ошибки
Обобщенная регрессионная сеть
Сеть Хопфилда
Линейный слой (создание)
2
IW{1, 1}, b{1},
LW{2, 1}, b{2},
LW{1, 1}
IW{1, 1}, b{1},
LW{2, 1}, b{2}
2
IW{1, 1}, b{1},
LW{2, 1}, b{2}
2
1
1
IW{1, 1}, b{1},
LW{2, 1}
LW{1, 1}, b{1}
IW{1, 1}, b{1}
Линейный слой (обучение)
Сеть для классификации
входных векторов
Персептрон
Вероятностная сеть
1
2
IW{1, 1}, b{1}
IW{1, 1}, LW{2, 1}
1
2
Радиальная базисная сеть
с нулевой ошибкой
Радиальная базисная сеть
с минимальным числом
нейронов
Самоорганизующаяся
карта Кохонена
2
IW{1, 1}, b{1}
IW{1, 1}, b{1},
LW{2, 1}
IW{1, 1}, b{1},
LW{2, 1}
IW{1, 1}, b{1},
LW{2, 1}, b{2}
2
1
IW{1, 1}
Примечания:



Для сетей 2, 3, 7 в данной версии интерфейса NNTool не обеспечивается просмотр
структурных схем.
Сети 5, 9 допускают введение линий задержек на входе.
Сети 3 допускают введение линий задержек в слое.
1. Система MATLAB 6
21

Сети с двумя слоями имеют последовательную структуру, когда выход первого слоя служит входом второго слоя. Исключение составляют сети 3, которые допускают наличие
обратной связи в первом слое и передачу входного сигнала на входы обоих слоев.
Продолжим описание полей.
Input ranges (Диапазоны входа) – допустимые границы входов, которые либо назначаются пользователем, либо определяются автоматически по имени входной последовательности, выбираемой из списка Get from Inp… .
Training function (Функция обучения) – список обучающих функций.
Adaption learning function (Функции настройки для режима адаптации) – список
функций настроек.
Performance function (Функция качества обучения) – список функций оценки
качества обучения.
Number of layers (Количество слоев) – количество слоев нейронной сети.
Properties for (Свойства) – список слоев: Layer 1 (Слой 1), Layer 2 (Слой 2).
Number of neurons (Количество нейронов) – количество нейронов в слое.
Transfer function (Функция активации) – функция активации слоя.
Окно Import or Load to Network/Data Manager. Это окно показано на рис. 1.17
и включает 3 поля.
Рис. 1.17
Source (Источник) – поле для выбора источника данных. Это либо рабочая область
системы MATLAB (кнопка выбора Import from MATLAB Workspace), либо файл (кнопка
выбора Load from disk file).
Если выбрана первая кнопка, то в поле Select a Variable вы можете видеть все переменные рабочей области и, выбрав одну из них, например Р1, можете определить ее в поле Destination (Назначение) как последовательность входа Inputs (Входы).
Если выбирается кнопка Load from disk file, то активизируется поле MAT-file Name
и кнопка Browse, что позволяет начать поиск и загрузку файла из файловой системы.
22
Нейронные сети. MATLAB 6
Окно Export or Save from Network/Data Manager. Это окно показано на рис. 1.18
и позволяет передать данные из рабочей области GUI-интерфейса NNTool в рабочую область системы MATLAB или записать их в виде файла на диске.
Рис. 1.18
В данном случае нами выбрана переменная network1, которая принадлежит к классу
network object и описывает нейронную сеть. После того как эта переменная экспортирована в рабочую область, можно, например, построить модель нейронной сети в системе
Simulink с помощью оператора gensim.
Диалоговая панель Network показана на рис. 1.19.
Рис. 1.19
Она открывается только в том случае, когда в окне Network/Data Manager выделена
созданная сеть и становятся активными кнопки View, Initialize, Simulate, Train, Adapt.
1. Система MATLAB 6
23
Панель имеет 6 закладок:
View (Просмотреть) – структура сети;
Initialize (Инициализация) – задание начальных весов и смещений;
Simulate (Моделирование) – моделирование сети;
Train (Обучение) – обучение сети;
Adapt (Адаптация) – адаптация и настройка параметров сети;
Weights (Веса) – просмотр установленных весов и смещений.
Особенности работы с соответствующими окнами будут рассмотрены на приведенных ниже примерах создания конкретных нейронных сетей.
Пример. Нейронная сеть с прямой передачей сигнала.
Создать и обучить нейронную сеть выполнению операции y = x12 + x2, если заданы
последовательности входа P = [1 0.5 0 1; –2 0 0.5 1] и цели T = [–1 0.25 0.5 2].
Сформируем последовательности входов и целей в рабочей области GUI-интерфейса
NNTool, используя окно Create New Data.
Выберем нейронную сеть типа feed-forward backprop с прямой передачей сигнала
и с обратным распространением ошибки. Схема этой сети показана на рис. 1.19.
Выполним инициализацию сети, для чего выберем закладку Initialize, откроется диалоговая панель, показанная на рис. 1.20. Диапазоны значений исходных данных выберем
по входам из ниспадающего меню Get from input. Для ввода установленных диапазонов и
инициализации весов надо воспользоваться кнопками Set Ranges (Установить диапазоны)
и Initialize Weights (Инициализировать веса). Если требуется вернуться к прежним диапазонам, то следует выбрать кнопки Revert Ranges (Вернуть диапазоны) и Revert Weights
(Вернуть веса).
Рис. 1.20
Затем выполняется обучение сети, для чего выбирается закладка Train и открывается
диалоговая панель, показанная на рис. 1.21.
24
Нейронные сети. MATLAB 6
Рис. 1.21
Панель имеет три закладки:
Training Info (Информация об обучающих последовательностях) (рис. 1.21);
Training Parametrs (Параметры обучения) (рис. 1.22);
Optional Info (Дополнительная информация) (рис. 1.23).
Рис. 1.22
Последняя закладка применяется, когда в процессе обучения используются контрольные и тестовые последовательности.
1. Система MATLAB 6
25
Рис. 1.23
Применяя эти закладки, можно установить имена последовательностей входа и цели,
а также параметров процедуры обучения.
Теперь можно приступить к обучению сети (кнопка Train Network).
Рис. 1.24
Качество обучения сети с прямой передачей сигнала на выбранной обучающей
последовательности поясняется на рис. 1.24. Практически нулевая точность достигается
за 13 циклов обучения.
Соответствующие веса и смещения можно увидеть, если выбрать закладку Weights
(рис. 1.25).
26
Нейронные сети. MATLAB 6
Рис. 1.25
Для удобства работы можно экспортировать созданную нейронную сеть в рабочую
область системы MATLAB и получить информацию о весах и смещениях непосредственно в рабочем окне системы:
network1.IW{1, 1}, network1.b{1}
ans =
–1.9390
–2.2747
ans =
1.1389
network1.LW{2, 1}, network1.b{2}
ans =
–1.5040
ans =
0.5024
Результаты обучения можно просмотреть в окне Network/Data Manager, выбрав
кнопку Manager (рис. 1.25). Появляется окно (рис. 1.26); теперь, активизируя имена последовательностей выхода или ошибок network1_outputs и network1_errors, можно просмотреть результаты, используя кнопку View. Получаем выходные данные, практически
равные целям, и ошибки порядка 10-14.
Рис. 1.26
1. Система MATLAB 6
27
Пример. Классификация входных векторов.
Создать нейронную сеть в виде персептрона, который разделяет векторы входа на два
класса. Обозначим эти классы как 0 и 1. Обучающую последовательность сформируем
в виде двух массивов ячеек: массива входов Р = {[2; 2] [1; 2] [–2; 2] [–1; 1] [1; –2]} и массива целей Т = {0 0 1 1 1}, который задает принадлежность каждого вектора входа
к определенному классу. Выполним эту операцию в рабочей области системы MATLAB,
а затем импортируем их в рабочую область интерфейса NNTool.
Зададим персептрон с одним нейроном, функцией активации HARDLIM и правилом
настройки LEARNP. Для этого из списка нейронных сетей выберем тип сети Perceptron
(рис. 1.27) и зададим требуемые параметры.
Рис. 1.27
Чтобы увидеть структурную схему сети, воспользуемся кнопкой View (рис. 1.28).
Рис. 1.28
Теперь выполним инициализацию сети, используя закладку Initialize, а затем адаптацию и настройку параметров сети, используя закладку Adapt окна Network. Для этого
следует указать имена входа и цели, а также задать количество циклов адаптации (в данном случае достаточно трех циклов) и нажать кнопку Adapt Network.
В результате настройки будут установлены следующие значения весов и смещений,
которые можно увидеть, выбрав закладку Weights. Для данной сети вектор весов равен
28
Нейронные сети. MATLAB 6
IW{1, 1} = [–3 –2], а смещение b{1} = 1. Таким образом, линия переключения, разделяющая плоскость на 2 области, описывается следующим образом:
L: –3p1 – 2p2 + 1 = 0.
Перейдя в окно Network/Data Manager, можно просмотреть значения сигналов
на выходе и ошибку сети (рис. 1.29, а и б соответственно). Нетрудно убедиться, что на
обучающей последовательности сеть обучена точно классифицировать входные векторы.
а
б
Рис. 1.29
Пример динамической линейной сети:
Спроектировать динамическую линейную нейронную сеть для предсказания синусоидальной функции по четырем предшествующим значениям.
Архитектура сети: линейная нейронная сеть с линией задержки по входу на 4 такта,
с одним входом, значения которого заключены в диапазоне [–1 1], и одним выходом.
Обучающая последовательность:
входная последовательность
time = 0:0.1:10;
P = sin(time);
последовательность целей
T = P;
Поскольку предполагается адаптивная настройка параметров сети, то обучающая
последовательность должна быть представлена в виде массива ячеек
P = con2seq(P);
T = P;
Целесообразно сформировать эти последовательности в рабочей области системы
MATLAB, а затем импортировать их в рабочую область интерфейса NNTool.
Затем выберем сеть типа Linear layer (train) с линией задержки по входу (рис. 1.30),
инициализируем ее, установим начальные значения весов, выполним адаптацию сети,
предварительно установив имена последовательностей входа и цели, а также указав количество циклов адаптации – 250.
1. Система MATLAB 6
29
Рис. 1.30
По окончании проектирования экспортируем нейронную сеть в рабочую область системы MATLAB.
Теперь можно построить модель нейронной сети в системе Simulink и построить ее
схему (рис. 1.31):
gensim(network1)
Рис. 1.31
Эта схема в отличие от иллюстративных схем на рис. 1.19 и 1.29 является в полной
мере функциональной схемой и может быть применена для моделирования нейронной
сети.
Используя описание нейронной сети, можно просмотреть веса и смещение в рабочем
окне системы MATLAB:
IW = network1.IW{1,1}
IW =
0.8135
0.4798
b = network1.b{1}
b =
0.0024
0.1716
–0.1143
–0.3858
Извлечем информацию об ошибке сети и построим соответствующий график
(рис. 1.32). Обратите внимание на специальную форму применения оператора cat, которая
позволяет преобразовать массив числовых ячеек в числовой массив.
30
Нейронные сети. MATLAB 6
E = cat(2,network1_errors{:});
plot(time(10:101), E(10:101))
Рис. 1.32
Из анализа рисунка следует, что погрешность обучения не превышает 0.01.
Знакомство с возможностями графического интерфейса NNTool позволяет сделать
вывод, что это средство может быть весьма полезным на начальной стадии изучения
и сравнительного анализа нейронных сетей.
1.3. Демонстрационные примеры ППП NNT
Перечень всех демонстрационных примеров, включенных в ППП NNT, можно получить по команде help nndemos.
Персептроны
demop1
demop4
demop5
demop6
Классификация с использованием персептрона с двумя входами
Формирование входных векторов внешнего слоя
Обучение с использованием нормированной функции настройки
Пример линейно неразделимых векторов
Линейные сети
demolin1
demolin2
demolin4
demolin5
demolin6
demolin7
demolin8
Пример функционирования линейной сети
Обучение линейного нейрона
Задача линейной аппроксимации
Задача с неполными данными
Задача с линейно зависимыми данными
Оценка влияния параметра скорости настройки
Адаптируемый линейный слой
Радиальные базисные сети
demorb1
demorb3
demorb4
1. Система MATLAB 6
Радиальные базисные сети
Пример неперекрывающихся функций активации
Пример перекрывающихся функций активации
31
demogrn1
demopnn1
Сеть GRNN и аппроксимация функций
Сеть PNN и классификация векторов
Сети кластеризации и классификации данных
Самоорганизующиеся сети
democ1
demosm1
demosm2
Настройка слоя Кохонена
Одномерная карта Кохонена
Двумерная карта Кохонена
LVQ-сети
demolvq1
Классификация векторов
Рекуррентные сети
Сети Элмана
appelm1
Сеть Элмана
Сети Хопфилда
demohop1
demohop2
demohop3
demohop4
Пример двумерной модифицированной сети Хопфилда
Пример неустойчивой точки равновесия
Пример трехмерной модифицированной сети Хопфилда
Пример устойчивых паразитных точек равновесия
Применение нейронных сетей
applin1
applin2
appelm1
appcr1
Предсказание стационарного сигнала
Предсказание нестационарного сигнала
Детектирование амплитуды с помощью сети Элмана
Распознавание символов
Нейронные сети и системы управления (среда Simulink)
predcstr
narmamaglev
mrefrobotarm
Управление каталитическим реактором
Управление магнитной подушкой
Управление звеном робота
Все демонстрационные примеры описаны в тексте книги.
32
Нейронные сети. MATLAB 6
2. МОДЕЛЬ НЕЙРОНА И АРХИТЕКТУРА СЕТИ
2.1. Модель нейрона
2.1.1. Простой нейрон
Элементарной ячейкой нейронной сети является нейрон. Структура нейрона с единственным скалярным входом показана на рис. 2.1, а.
а
Рис. 2.1
б
Скалярный входной сигнал p умножается на скалярный весовой коэффициент w, и результирующий взвешенный вход w*p является аргументом функции активации нейрона f,
которая порождает скалярный выход a.
Нейрон, показанный на рис. 2.1, б, дополнен скалярным смещением b. Смещение
суммируется со взвешенным входом w*p и приводит к сдвигу аргумента функции f
на величину b. Действие смещения можно свести к схеме взвешивания, если представить,
что нейрон имеет второй входной сигнал со значением, равным 1. Вход n функции активации нейрона по-прежнему остается скалярным и равным сумме взвешенного входа
и смещения b. Эта сумма является аргументом функции активации f; выходом функции
активации является сигнал a. Константы w и b являются скалярными параметрами нейрона. Основной принцип работы нейронной сети состоит в настройке параметров нейрона
таким образом, чтобы поведение сети соответствовало некоторому желаемому поведению. Регулируя веса или параметры смещения, можно обучить сеть выполнять конкретную работу; возможно также, что сеть сама будет корректировать свои параметры, чтобы
достичь требуемого результата.
Уравнение нейрона со смещением имеет вид
a  f (w * p  b *1) .
(2.1)
Как уже отмечалось, смещение b – настраиваемый скалярный параметр нейрона, который не является входом, а константа 1, которая управляет смещением, рассматривается,
как вход и может быть учтена в виде линейной комбинации векторов входа
 p
a  w b   .
1
(2.2)
33
2.1.2. Функция активации
Функции активации (передаточные функции) нейрона могут иметь самый различный
вид. Функция активации f, как правило, принадлежит к классу сигмоидальных1 функций
с аргументом n и выходом a.
Рассмотрим три наиболее распространенные формы функции активации.
Единичная функция активации с жестким ограничениям hardlim. Эта функция описывается соотношением a = hardlim(n) = 1(n) и показана на рис. 2.2. Она равна 0, если
n < 0, и 1, если n  0.
a
1
n
-5
0
5
Рис. 2.2.
В состав ППП Neural Network Toolbox входит М-функция hardlim, реализующая
функцию активации с жесткими ограничениями. Теперь можно построить график этой
функции, применяя операторы языка MATLAB:
n = –5:0.1:5;
plot(n,hardlim(n),'c+:');
В результате получим график функции hardlim в диапазоне значений входа от –5 до + 5
(рис. 2.2).
Линейная функция активации purelin. Эта функция описывается соотношением
a = purelin(n) = n и показана на рис. 2.3.
Рис. 2.3.
Логистическая функция активации logsig. Эта функция описывается соотношением
a = logsig(n) = 1/(1 + exp(–n)) и показана на рис. 2.4. Она принадлежит к классу сигмоидальных функций, и ее аргумент может принимать любое значение в диапазоне от – до
+, а выход изменяется в диапазоне от 0 до 1. В ППП Neural Network Toolbox она представлена М-функцией logsig. Благодаря свойству дифференцируемости эта функция часто
используется в сетях с обучением на основе метода обратного распространения ошибки.
1 Сигмоидальной (S-образной) функцией называется непрерывная функция, имеющая две гори-
зонтальные асимптоты и одну точку перегиба.
34
Нейронные сети. MATLAB 6
Рис. 2.4.
Символ в квадрате в правом верхнем углу графика характеризует функцию активации. Это изображение используется на структурных схемах нейронных сетей.
В ППП Neural Network Toolbox включены и другие функции активации. Используя
язык MATLAB, пользователь может создавать и свои собственные уникальные функции.
2.1.3. Нейрон с векторным входом
Нейрон с одним вектором входа p с R элементами p1, p2, …, pR показан на рис. 2.5.
Здесь каждый элемент входа умножается на веса w11, w12, … , w1R соответственно и взвешенные значения передаются на сумматор. Их сумма равна скалярному произведению
вектора – строки W на вектор входа p.
Рис. 2.5
Нейрон имеет смещение b, которое суммируется со взвешенной суммой входов.
Результирующая сумма n равна
n = w11 p1 + w12 p2 + … + w1R pR + b
(2.3)
и служит аргументом функции активации f. В нотации языка MATLAB это выражение
записывается так:
n = W*p + b.
(2.4)
Структура нейрона, показанная выше, содержит много лишних деталей. При рассмотрении сетей, состоящих из большого числа нейронов, будет использоваться укрупненная
структурная схема нейрона (рис. 2.6).
2. Модель нейрона и архитектура сети
35
Рис. 2.6
Вход нейрона изображается в виде темной вертикальной черты, под которой указывается количество элементов входа R. Размер вектора входа p указывается ниже символа p
и равен R1. Вектор входа умножается на вектор-строку W длины R. Как и прежде,
константа 1 рассматривается как вход, который умножается на скалярное смещение b.
Входом n функции активации нейрона служит сумма смещения b и произведения W*p.
Эта сумма преобразуется функцией активации f, на выходе которой получаем выход
нейрона a, который в данном случае является скалярной величиной. Структурная схема,
приведенная на рис. 2.6, называется слоем сети. Слой характеризуется матрицей весов
W, смещением b, операциями умножения W*p, суммирования и функцией активации f.
Вектор входов p обычно не включается в характеристики слоя.
Каждый раз, когда используется сокращенное обозначение сети, размерность матриц
указывается под именами векторно-матричных переменных. Эта система обозначений
поясняет строение сети и связанную с ней матричную математику.
На укрупненной структурной схеме для обозначения типа функции активации применяются специальные графические символы; некоторые из них приведены на рис. 2.7, где.
а – ступенчатая, б – линейная, в – логистическая функция.
hardlim
а
purelin
б
Рис. 2.7
logsig
в
2.2. Архитектура нейронных сетей
Реальная нейронная сеть может содержать один или большее количество слоев
и соответственно характеризоваться как однослойная или как многослойная.
2.2.1. Однослойные сети
Развернутая схема сети из одного слоя с R входными элементами и S нейронами
показана на рис. 2.8.
36
Нейронные сети. MATLAB 6
Рис. 2.8
В этой сети каждый элемент вектора входа соединен со всеми входами нейрона и это
соединение задается матрицей весов W; при этом каждый i-й нейрон включает суммирующий элемент, который формирует скалярный выход n(i). Совокупность скалярных
функций n(i) объединяется в S-элементный вектор входа n функции активации слоя.
Выходы слоя нейронов формируют вектор-столбец a, и, таким образом, описание слоя
нейронов имеет вид:
a  f(W * p  b) .
(2.5)
Количество входов R в слое может не совпадать с количеством нейронов S. В каждом
слое, как правило, используется одна и та же функция активации. Однако можно создавать составные слои нейронов с использованием различных функций активации, соединяя
сети, подобные изображенной на рис. 2.8, параллельно. Обе сети будут иметь те же самые
входы, и каждая сеть будет генерировать определенную часть выходов. Элементы вектора
входа передаются в сеть через матрицу весов W, имеющую вид:
 w11
w
W   21


 wS1
w12  w1R 
w22  w2 R 
.
  

wS 2  wSR 
(2.6)
Заметим, что индексы строк матрицы W указывают адресатов (пункты назначения)
весов нейронов, а индексы столбцов – какой источник является входом для этого веса.
Таким образом, элемент матрицы весов w12 = W(1, 2) определяет коэффициент, на который умножается второй элемент входа при передаче его на первый нейрон.
Для однослойной сети с S нейронами укрупненная структурная схема показана
на рис. 2.9.
2. Модель нейрона и архитектура сети
37
Рис. 2.9
Здесь p – вектор входа размера R×1, W – весовая матрица размера S×R, a, b, n – векторы размера S×1.
2.2.2. Многослойные сети
Рассмотрим сети, имеющие несколько слоев. Будем называть весовые матрицы, соединенные с входами, весами входа слоя, а весовые матрицы для сигналов, исходящие из
слоя, назовем весами выхода слоя. Далее, будем использовать верхние индексы, чтобы
указать источник и адресат для различных весов и других элементов нейронной сети.
Чтобы пояснить это, рассмотрим сначала только один, первый слой многослойной сети
(рис. 2.10).
Рис. 2.10
Обозначим весовую матрицу, связанную с входами, через IW11, верхние индексы которой указывают, что источником входов является первый слой (второй индекс) и адресатом является также первый слой (первый индекс). Элементы этого слоя, такие, как смещение b1, вход функции активации n1 и выход слоя a1, имеют верхний индекс 1, чтобы
обозначить, что они связаны с первым слоем. В дальнейшем для матриц весов входа
и выхода слоя будут использованы обозначения IW(Input Weight) и LW(Layer Weight)
соответственно.
Когда сеть имеет несколько слоев, то каждый слой имеет свою матрицу весов W, вектор смещения b и вектор выхода a. Чтобы различать весовые матрицы, векторы выхода
и т. д. для каждого из этих слоев, введем номер слоя как верхний индекс для представляющей интерес переменной. Использование этой системы обозначений для сети из трех
слоев можно видеть на показанной ниже структурной схеме и из уравнений, приведенных
в нижней части рис. 2.11.
38
Нейронные сети. MATLAB 6
Рис. 2.11
Сеть, показанная выше, имеет R входов, S нейронов в первом слое, S нейронов во
втором слое и т. д. Для общности будем считать, что различные слои имеют различное
число нейронов. На смещения для каждого нейрона подан постоянный входной сигнал 1.
Заметим, что выходы каждого промежуточного слоя служат входами для следующего
слоя. Таким образом, слой 2 может быть рассмотрен как один слой сети с S1 входами, S2
нейронами и S1  S2 матрицей весов W2. Вход к слою 2 есть 1, а выход - 2. Теперь, когда
обозначены все векторы и матрицы слоя 2, можно трактовать его как самостоятельную
однослойную сеть. Такой подход может быть использован к любому слою сети.
Слои многослойной сети имеют различные назначения. Слой, который образует
выход сети, называется слоем выхода. Все другие слои называются скрытыми слоями.
Трехслойная сеть, показанная выше, имеет выходной слой (слой 3) и 2 скрытых слоя
(слой 1 и слой 2). Эта же трехслойная сеть может быть представлена в виде укрупненной
структурной схемы (рис. 2.12).
1
2
Рис. 2.12
Заметим, что выход третьего слоя а обозначен через y. Эта сделано для того, чтобы
подчеркнуть, что выход последнего слоя является выходом сети.
Многослойные сети обладают весьма мощными возможностями. Например, двухслойная сеть, в которой первый слой содержит сигмоидальную, а второй слой – линейную
функцию активации, может быть обучена аппроксимировать с произвольной точностью
любую функцию с конечным числом точек разрыва.
3
2. Модель нейрона и архитектура сети
39
В заключение можно сформулировать следующие выводы. Вход функции активации
нейрона определяется смещением и суммой взвешенных входов. Выход нейрона зависит
как от входов нейрона, так и от вида функции активации. Один нейрон не может решать
сложные задачи, однако несколько нейронов, объединенных в один или несколько слоев,
обладают большими возможностями.
Архитектура сети состоит из описания того, сколько слоев имеет сеть, количества нейронов в каждом слое, вида функции активации каждого слоя и информации о соединении слоев.
Архитектура сети зависит от той конкретной задачи, которую должна решать сеть.
Работа сети состоит в вычислении выходов сети на основе известных входов с целью
формирования желаемого отображения вход/выход. Конкретная задача определяет число
входов и число выходов сети. Кроме числа нейронов в выходном слое сети, для проектировщика важно число нейронов в каждом слое. Большее количество нейронов в скрытых
слоях обеспечивает более мощную сеть. Если должно быть реализовано линейное
отображение, то следует использовать нейроны с линейными функциями активации.
При этом надо помнить, что линейные нейронные сети не могут формировать нелинейные
отображения. Использование нелинейных функций активации позволяет настроить
нейронную сеть на реализацию нелинейных связей между входом и выходом.
Сети со смещением позволяют формировать более сложные связи между входами
и выходами, чем сети без смещения. Например, нейрон без смещения, когда все входы
нулевые, будет всегда задавать вход функции активации равным нулю, однако нейрон
со смещением может быть обучен так, чтобы при тех же условиях задать вход функции
активации произвольной формы.
В многослойных сетях часто применяются нелинейные сигмоидальные функции активации типа логистической (см. рис. 2.7, в) или гиперболического тангенса (рис. 2.13).
a
+1
0
n
-1
a = tansig(n)
Рис. 2.13
Если последний слой многослойной сети использует такие функции активации, то выходы сети будут ограничены. Когда в выходном слое используются линейные нейроны, то выходы сети могут принимать произвольные значения. В ППП NNT предусмотрены
М-функции, позволяющие вычислять производные функций активации. Чтобы получить
информацию об имени нужной функции, следует воспользоваться следующим оператором:
<имя_функции_активации>('deriv')
Например, обращение вида
tansig('deriv')
ans = dtansig
дает возможность узнать, что имя М-функции, позволяющей вычислить производную
гиперболического тангенса, dtansig.
40
Нейронные сети. MATLAB 6
2.2.3. Сети с прямой передачей сигнала
Однослойная сеть с S нейронами с функциями активации logsig, имеющая R входов,
показана на рис. 2.14.
Входы
Слой нейронов
n1
a1
p

p1
p2
Слой нейронов
Вход
W
a
n
1R
SR
n2

p3
b
a2
R
pR
S1
S
S1
a = f(Wp+b)
b2
1
S1
1
b1
1
nS
aS

bS
1
a = f(Wp+b)
Рис. 2.14
Эта сеть, не имеющая обратных связей, называется сетью с прямой передачей сигнала.
Такие сети часто имеют один или более скрытых слоев нейронов с сигмоидальными
функциями активации, в то время как выходной слой содержит нейроны с линейными
функциями активации. Сети с такой архитектурой могут воспроизводить весьма сложные
нелинейные зависимости между входом и выходом сети.
Для пояснения обозначений в многослойных нейронных сетях внимательно изучите
двухслойную сеть, показанную на рис. 2.15
Вход
Выходной слой
Скрытый слой
p1
IW11
21
1
2
a1
n1
LW21
41
42
1
b
41
a1= tansig(IW11 p1 + b1)
34
1
41
a2
n2
b2
31
31
4
3
31
a2= purelin(LW21 a1 + b2)
Рис. 2.15
Эта сеть может быть использована для аппроксимации функций. Она может достаточно точно воспроизвести любую функцию с конечным числом точек разрыва, если задать достаточное число нейронов скрытого слоя.
2. Модель нейрона и архитектура сети
41
2.3. Создание, инициализация и моделирование сети
Формирование архитектуры сети
Первый шаг при работе с нейронными сетями – это создание модели сети. Для создания сетей с прямой передачей сигнала в ППП NNT предназначена функция newff. Она
имеет 4 входных аргумента и 1 выходной аргумент – объект класса network. Первый
входной аргумент – это массив размера R2, содержащий допустимые границы значений
(минимальное и максимальное) для каждого из R элементов вектора входа; второй – массив для задания количества нейронов каждого слоя; третий – массив ячеек, содержащий
имена функций активации для каждого слоя; четвертый – имя функции обучения.
Например, следующий оператор создает сеть с прямой передачей сигнала:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');
Эта сеть использует 1 вектор входа с двумя элементами, имеющими допустимые границы значений [–1 2] и [0 5]; имеет 2 слоя с тремя нейронами в первом слое и одним
нейроном во втором слое; используемые функции активации: tansig – в первом слое,
purelin – во втором слое; используемая функция обучения – traingd.
М-функция newff не только создает архитектуру сети, но и инициализирует ее веса
и смещения, подготавливая нейронную сеть к обучению. Однако существуют ситуации,
когда требуется специальная процедура инициализации сети.
Инициализация сети
После того как сформирована архитектура сети, должны быть заданы начальные
значения весов и смещений, или, иными словами, сеть должна быть инициализирована.
Такая процедура выполняется с помощью метода init для объектов класса network. Оператор вызова этого метода имеет вид:
net = init(net);
Способ инициализации зависит от выбора параметров сети net.initFcn и net.layers{i}.initFcn,
которые устанавливают ту или иную функцию инициализации. Параметр net.initFcn
задает функцию инициализации для всей сети. Для сетей с прямой передачей сигнала по
умолчанию используется функция инициализации initlay, которая разрешает для каждого
слоя сети использовать собственную функцию инициализации, определяемую свойством
net.layers{i}.initFcn.
Для сетей с прямой передачей сигнала обычно применяется одна из двух функций
инициализации слоя: initwb или initnw.
Функция initwb позволяет использовать собственные функции инициализации для каждой
матрицы весов входа и вектора смещений, задавая параметры net.inputWeights{i, j}.initFcn
и net.biases{i}.initFcn. Для сетей без обратных связей с линейными функциями активации
веса обычно инициализируются случайными значениями из интервала [–1 1].
Функция initnw применяется для слоев, использующих сигмоидальные функции активации. Она генерирует начальные веса и смещения для слоя так, чтобы активные области
нейронов были распределены равномерно относительно области значений входа. Это
имеет несколько преимуществ по сравнению со случайным распределением весов и смещений: во-первых, избыток нейронов минимален, поскольку активные области всех
нейронов соответствуют области значений входа, во-вторых, обучение выполняется
42
Нейронные сети. MATLAB 6
быстрее, так как для каждой области значений входа найдутся нейроны с той же областью
определения аргумента.
В рассмотренном выше примере создания сети с прямой передачей сигнала метод init
вызывается автоматически при обращении к М-функции newff. Поэтому инициализация
сети выполняется по умолчанию. Если же пользователь хочет применить специальный
метод инициализации или принудительно установить значения весов и смещений, то он
может непосредственно обратиться к функции init.
Например, если мы хотим заново инициализировать веса и смещения в первом слое,
используя функцию rands, то надо ввести следующую последовательность операторов:
net.layers{1}.initFcn = 'initwb';
net.inputWeights{1,1}.initFcn = 'rands';
net.biases{1,1}.initFcn = 'rands';
net.biases{2,1}.initFcn = 'rands';
net = init(net);
Моделирование сети
Статические сети. Статическая нейронная сеть характеризуется тем, что в ее составе
нет элементов запаздывания и обратных связей. Ее поведение не зависит от типа вектора
входа, поскольку последовательно подаваемые векторы можно рассматривать как действующие одновременно или как один объединенный вектор. Поэтому в качестве модели
статической сети рассмотрим сеть, показанную на рис. 2.16.
Рис. 2.16
Это однослойная сеть с двухэлементным вектором входа и линейной функцией активации. Для задания такой сети предназначена М-функция newlin из ППП Neural Network
Toolbox, которая требует указать минимальное и максимальное значение для каждого
из элементов входа; в данном случае они равны –1 и 1 соответственно, а также количество
слоев, в данном случае 1.
% Формирование однослойной линейной сети net с двухэлементным
% входным сигналом со значениями от –1 до 1
net = newlin([–1 1;–1 1],1);
Определим весовую матрицу и смещение равными W = [1 2], b = 0, и зададим эти
значения, используя описание структуры сети
net.IW{1,1} = [1 2]; % Присваивание значений весов
net.b{1} = 0; % Присваивание значения смещения
2. Модель нейрона и архитектура сети
43
Предположим, что на сеть подается такая последовательность из четырех векторов
входа:

 1
  ,

 0 

 0  0  1  
 1 , 1 ,  1  .
     

(2.7)
Поскольку сеть статическая, можно перегруппировать эту последовательность в следующий числовой массив:
P = [–1 0 0 1; 0 –1 1 –1];
Теперь можно моделировать сеть:
A = sim(net,P) % Моделирование сети net с вектором входа P и выходом A
A = –1 –2 2 –1
Результат нужно интерпретировать следующим образом. На вход сети подается
последовательность из четырех входных сигналов, и сеть генерирует вектор выхода
из четырех элементов. Результат был тот же самый, если бы имелось 4 одинаковых сети,
функционирующих параллельно, и на каждую сеть был подан один из векторов входа
и генерировался один из выходов.
Динамические сети. Когда сеть содержит линии задержки, вход сети надо рассматривать
как последовательность векторов, подаваемых на сеть в определенные моменты времени.
Чтобы пояснить этот случай, рассмотрим простую линейную сеть, которая содержит 1
элемент линии задержки (рис. 2.17).
Рис. 2.17
Построим такую сеть:
% Создание однослойной линейной сети с линией задержки [0 1]
net = newlin([–1 1],1,[0 1]);
Зададим следующую матрицу весов W = [1 2] и нулевое смещение:
net.IW{1,1} = [1 2]; % Присваивание значений весов
net.biasConnect = 0; % Присваивание значений смещений
Предположим, что входная последовательность имеет вид {–1, –1/2, 1/2, 1}, и зададим
ее в виде массива ячеек
P = {–1 –1/2 1/2 1};
Теперь можно моделировать сеть, используя метод sim:
44
Нейронные сети. MATLAB 6
A = sim(net,P) % Моделирование сети net с входным сигналом P и выходом A
A = [–1] [–5/2] [–1/2] [2]
Действительно,
1
  1 / 2
 1/ 2 
 1 
   1 1 2   1    5 / 2 1 2  1 / 2   1 / 2 1 2 1 / 2  2 .
0
 




 
1 2 

(2.8)
Введя массив ячеек, содержащий последовательность входов, сеть сгенерировала массив ячеек, содержащий последовательность выходов. В данном случае каждый выход
формируется согласно соотношению
a(t) = p(t) + 2p(t–1).
(2.9)
При изменении порядка следования элементов во входной последовательности будут
изменяться значения на выходе.
Если те же самые входы подать на сеть одновременно, то получим совершенно иную
реакцию. Для этого сформируем следующий вектор входа:
P = [–1 –1/2 1/2 1];
После моделирования получаем:
A = sim(net,P) % Моделирование сети
A = –1 –1/2 1/2 1
Результат такой же, как если применить каждый вход к отдельной сети и вычислить
ее выход. Поскольку начальные условия для элементов запаздывания не указаны, то по
умолчанию они приняты нулевыми. В этом случае выход сети равен
 1  1 / 2 1 / 2
[1 2] 
0
0
0
1
  1  1 / 2 1 / 2 1 .
0
(2.10)
Если требуется моделировать реакцию сети для нескольких последовательностей сигналов на входе, то надо сформировать массив ячеек, размер каждой из которых совпадает
с числом таких последовательностей. Пусть, например, требуется приложить к сети 2 последовательности:
p1 (1)  [1] , p1 (2)  [1 / 2] , p1 (3)  [1 / 2] ,
p1 (4)  [1] ;
p 2 (1)  [1] , p 2 (2)  [1 / 2] , p 2 (3)  [1 / 2] , p 2 (4)  [1] .
(2.11)
Вход P в этом случае должен быть массивом ячеек, каждая из которых содержит два
элемента по числу последовательностей
P = {[–1 1] [–1/2 1/2] [1/2 –1/2] [1 –1]};
Теперь можно моделировать сеть:
A = sim(net,P); % Моделирование сети net с входным сигналом P и выходом A
Результирующий выход сети равен
A = {[–1 1] [–5/2 5/2] [–1/2 1/2] [2 –2]}
В самом деле,
2. Модель нейрона и архитектура сети
45
 1 1
{ 1 2 
,
 0 0   1 1


 1 / 2  1 / 2
1 2 
   1 / 2 1 / 2 ,
 1 / 2 1 / 2 
 1 / 2 1 / 2
  5 / 2 5 / 2 ,
1 
 1
1 2 
1 
  2  2 }
1 / 2  1 / 2
1 2 
1
На рис. 2.18 показан формат массива P, представленного Q выборками (реализациями),
при моделировании сети.
Q-я выборка
{[p1(1), p2(1), …, pQ(1)], [p1(2), p2(2), … , pQ(2)], …, [p1(TS), p2(TS), …, pQ(TS)]}
Первая выборка
Рис. 2.18
В данном случае это массив ячеек с одной строкой, каждый элемент которой объединяет Q реализаций вектора p – [p1(TS), p2(TS), …, pQ(TS)] – для некоторого момента времени TS. Если на вход сети подается несколько векторов входа, то каждому входу будет
соответствовать 1 строка массива ячеек. Представление входов как массива ячеек соответствует последовательному представлению наблюдаемых данных во времени.
Представление вектора входа может быть интерпретировано иначе, если сформировать временные последовательности для каждой реализации, как это показано на
рис. 2.18. Тогда можно говорить о том, что на вход сети подается Q выборок из интервала
времени [1, TS], которые могут быть описаны числовым массивом P вида
P = [[p1(1), p1(2), …, p1(TS)]; [p2(1), p2(2), …, p2(TS)]; …
…; [pQ(1), pQ(2), …, pQ(TS)]].
(2.12)
Представление входов как числового массива выборок в формате double соответствует групповому представлению данных, когда реализации вектора входа для всех значений
времени на интервале выборки обрабатываются потоком.
46
Нейронные сети. MATLAB 6
3. ОБУЧЕНИЕ НЕЙРОННЫХ СЕТЕЙ
При решении с помощью нейронных сетей прикладных задач необходимо собрать достаточный и представительный объем данных для того, чтобы обучить нейронную сеть
решению таких задач. Обучающий набор данных – это набор наблюдений, содержащих
признаки изучаемого объекта. Первый вопрос, какие признаки использовать и сколько
и какие наблюдения надо провести.
Выбор признаков, по крайней мере первоначальный, осуществляется эвристически на
основе имеющегося опыта, который может подсказать, какие признаки являются наиболее
важными. Сначала следует включить все признаки, которые, по мнению аналитиков или
экспертов, являются существенными, на последующих этапах это множество будет
сокращено.
Нейронные сети работают с числовыми данными, взятыми, как правило, из некоторого ограниченного диапазона. Это может создать проблемы, если значения наблюдений
выходят за пределы этого диапазона или пропущены.
Вопрос о том, сколько нужно иметь наблюдений для обучения сети, часто оказывается непростым. Известен ряд эвристических правил, которые устанавливают связь между
количеством необходимых наблюдений и размерами сети. Простейшее из них гласит, что
количество наблюдений должно быть в 10 раз больше числа связей в сети. На самом деле
это число зависит от сложности того отображения, которое должна воспроизводить
нейронная сеть. С ростом числа используемых признаков количество наблюдений возрастает по нелинейному закону, так что уже при довольно небольшом числе признаков, скажем 50, может потребоваться огромное число наблюдений. Эта проблема носит название
"проклятие размерности".
Для большинства реальных задач бывает достаточным нескольких сотен или тысяч
наблюдений. Для сложных задач может потребоваться большее количество, однако очень
редко встречаются задачи, где требуется менее 100 наблюдений. Если данных мало, то
сеть не имеет достаточной информации для обучения, и лучшее, что можно в этом случае
сделать, – это попробовать подогнать к данным некоторую линейную модель.
3.1. Процедуры адаптации и обучения
После того как определено количество слоев сети и число нейронов в каждом из них,
нужно назначить значения весов и смещений, которые минимизируют ошибку решения.
Это достигается с помощью процедур обучения. Путем анализа имеющихся в распоряжении аналитика входных и выходных данных веса и смещения сети автоматически настраиваются так, чтобы минимизировать разность между желаемым сигналом и полученным
на выходе в результате моделирования. Эта разность носит название ошибки обучения.
Таким образом, процесс обучения – это процесс подгонки параметров той модели процесса или явления, которая реализуется нейронной сетью. Ошибка обучения для конкретной
конфигурации нейронной сети определяется путем прогона через сеть всех имеющихся
наблюдений и сравнения выходных значений с желаемыми, целевыми значениями. Эти
разности позволяют сформировать так называемую функцию ошибок (критерий качества
обучения). В качестве такой функции чаще всего берется сумма квадратов ошибок. При
47
моделировании нейронных сетей с линейными функциями активации нейронов можно
построить алгоритм, гарантирующий достижение абсолютного минимума ошибки обучения. Для нейронных сетей с нелинейными функциями активации в общем случае нельзя
гарантировать достижения глобального минимума функции ошибки.
При таком подходе к процедуре обучения может оказаться полезным геометрический
анализ поверхности функции ошибок. Определим веса и смещения как свободные параметры модели и их общее число обозначим через N; каждому набору таких параметров
поставим в соответствие одно измерение в виде ошибки сети. Тогда для всевозможных
сочетаний весов и смещений соответствующую ошибку сети можно изобразить точкой
в N+1-мерном пространстве, а все такие точки образуют некоторую поверхность, называемую поверхностью функции ошибок. При таком подходе цель обучения нейронной сети
состоит в том, чтобы найти на этой многомерной поверхности глобальный минимум.
В случае линейной модели сети и функции ошибок в виде суммы квадратов такая поверхность будет представлять собой параболоид, который имеет единственный минимум,
и это позволяет отыскать такой минимум достаточно просто.
В случае нелинейной модели поверхность ошибок имеет гораздо более сложное строение и обладает рядом неблагоприятных свойств, в частности может иметь локальные
минимумы, плоские участки, седловые точки и длинные узкие овраги.
Определить глобальный минимум многомерной функции аналитически невозможно,
и поэтому обучение нейронной сети, по сути дела, является процедурой изучения поверхности функции ошибок. Отталкиваясь от случайно выбранной точки на поверхности
функции ошибок, алгоритм обучения постепенно отыскивает глобальный минимум. Как
правило, для этого вычисляется градиент (наклон) функции ошибок в данной точке, а затем эта информация используется для продвижения вниз по склону. В конце концов алгоритм останавливается в некотором минимуме, который может оказаться лишь локальным
минимумом, а если повезет, то и глобальным.
Таким образом, по существу алгоритмы обучения нейронных сетей аналогичны алгоритмам поиска глобального экстремума функции многих переменных. Среди последних
следует выделить алгоритмы сопряженных градиентов [12] и Левенберга – Марквардта
(Levenberg – Marquardt) [17].
Однако c учетом специфики нейронных сетей для них разработаны специальные алгоритмы обучения, среди которых следует выделить алгоритм обратного распространения
ошибки [39, 42].
При использовании алгоритма обратного распространения ошибки сеть рассчитывает
возникающую в выходном слое ошибку и вычисляет вектор градиента как функцию весов
и смещений. Этот вектор указывает направление кратчайшего спуска по поверхности для
данной точки, поэтому если продвинуться в этом направлении, то ошибка уменьшится.
Последовательность таких шагов в конце концов приведет к минимуму того или иного
типа. Определенную трудность здесь вызывает выбор величины шага.
При большой длине шага сходимость будет более быстрой, но имеется опасность перепрыгнуть через решение или уйти в неправильном направлении. Классическим примером такого явления при обучении нейронной сети является ситуация, когда алгоритм
очень медленно продвигается по узкому оврагу с крутыми склонами, перепрыгивая с одного склона на другой. Напротив, при малом шаге, вероятно, будет выбрано верное
направление, однако при этом потребуется очень много итераций. На практике величина
48
Нейронные сети. MATLAB 6
шага выбирается пропорциональной крутизне склона (градиенту функции ошибок); такой
коэффициент пропорциональности называется параметром скорости настройки. Правильный выбор параметра скорости настройки зависит от конкретной задачи и обычно
осуществляется опытным путем; этот параметр может также зависеть от времени, уменьшаясь по мере выполнения алгоритма.
Алгоритм действует итеративно, и его шаги принято называть эпохами или циклами.
На каждом цикле на вход сети последовательно подаются все обучающие наблюдения,
выходные значения сравниваются с целевыми значениями и вычисляется функция ошибки. Значения функции ошибки, а также ее градиента используются для корректировки
весов и смещений, после чего все действия повторяются. Начальные значения весов
и смещений сети выбираются случайным образом, и процесс обучения прекращается либо
когда реализовано определенное количество циклов, либо когда ошибка достигнет некоторого малого значения или перестанет уменьшаться.
Явление переобучения
Одна из наиболее серьезных трудностей при обучении сети заключается в том, что
в ряде случаев мы минимизируем не ту ошибку, которую на самом деле нужно минимизировать; требуется минимизировать ошибку, которая появляется в сети, когда на нее подаются совершенно новые наблюдения. Весьма важно, чтобы нейронная сеть обладала
способностью приспосабливаться к этим новым наблюдениям. Что же происходит на самом деле? Сеть обучается минимизировать ошибку на некотором ограниченном обучающем множестве. Это не отвечает требованиям теории о наличии идеального и бесконечно
большого обучающего множества. И это не соответствует той реальной ситуации, когда
надо минимизировать конкретную функцию ошибок для заранее неизвестной модели.
Это порождает проблему, которая известна как явление переобучения. Обратимся к задаче аппроксимации некоторой функции многочленом [1]. Графики многочленов часто
имеют весьма замысловатые формы, и чем выше степень многочлена, тем сложнее их
форма. Если имеется некоторый набор данных, то можно поставить цель подобрать для
него аппроксимирующий многочлен и таким образом получить подходящую математическую модель для этого набора данных. Поскольку исходные данные, как правило, заданы
с погрешностями, то нельзя считать, что лучшая модель задается кривой, которая проходит точно через заданные точки. Многочлен низкого порядка может оказаться достаточно
грубым для аппроксимации данных, в то время как многочлен высокого порядка может
точно следовать данным, принимая при этом весьма замысловатую форму, не имеющую
никакого отношения к форме истинной зависимости. Последняя ситуация и демонстрирует то, что называется явлением переобучения.
При работе с нейронными сетями пользователь сталкивается с той же проблемой.
Сети с большим количеством весов позволяют воспроизводить очень сложные функции,
и в этом смысле они склонны к переобучению. Сеть же с небольшим количеством весов
может оказаться недостаточно гибкой, чтобы смоделировать имеющуюся зависимость.
Например, однослойная линейная сеть способна воспроизводить только линейные функции. Если использовать многослойные линейные сети, то ошибка всегда будет меньше,
но это может свидетельствовать не о хорошем качестве модели, а о том, что проявляется
явление переобучения.
3. Обучение нейронных сетей
49
Для того чтобы выявить эффект переобучения, используется механизм контрольной проверки. Часть обучающих наблюдений резервируется как контрольные наблюдения и не используется при обучении сети. Вместо этого по мере работы алгоритма эти наблюдения применяются для независимого контроля результата. Вначале ошибка сети на обучающем
и контрольном множествах будет одинаковой; если они существенно отличаются, то, вероятно, это означает, что разбиение наблюдений на 2 множества не обеспечило их однородность.
По мере обучения сети ошибка убывает, и, пока обучение уменьшает функцию ошибок,
ошибка на контрольном множестве также будет убывать. Если же контрольная ошибка перестала убывать или стала расти, это указывает на то, что сеть начала слишком близко следовать
исходным данным и обучение следует остановить. В этом случае следует уменьшить количество нейронов или слоев, ибо сеть является слишком мощной для решения данной задачи.
Если же, наоборот, сеть имеет недостаточную мощность, чтобы воспроизвести имеющуюся
зависимость, то явление переобучения скорее всего наблюдаться не будет и обе ошибки –
обучения и проверки – не достигнут достаточно малого уровня.
Возникающие при работе с нейронными сетями проблемы отыскания глобального
минимума или выбора размера сети приводят к тому, что при практической работе приходится экспериментировать с большим числом сетей различных конфигураций, порой обучая каждую из них несколько раз и сравнивая полученные результаты. Главным критерием выбора в этих случаях является контрольная погрешность. При этом применяется
правило, согласно которому из двух нейронных сетей с приблизительно равными контрольными погрешностями следует выбирать ту, которая проще.
Необходимость многократных экспериментов ведет к тому, что контрольное множество начинает играть ключевую роль в выборе модели нейронной сети, т. е. становится
частью процесса обучения. Тем самым его роль как независимого критерия качества
модели ослабляется, поскольку при большом числе экспериментов возникает риск переобучения нейронной сети на контрольном множестве. Для того чтобы гарантировать
надежность выбираемой модели сети, резервируют еще одно – тестовое множество
наблюдений. Итоговая модель тестируется на данных из этого множества, чтобы убедиться, что результаты, достигнутые на обучающем и контрольном множествах реальны. Разумеется, для того чтобы хорошо играть свою роль, тестовое множество должно быть использовано только 1 раз: если его использовать повторно для корректировки процесса
обучения,
то оно фактически превратится в контрольное множество.
Итак, процедура построения нейронной сети состоит из следующих шагов:



выбора начальной конфигурации сети; например, в виде одного слоя с числом нейронов, равным 1/2 общего количества входов и выходов;
моделирования и обучения сети с оценкой контрольной ошибки и использованием
дополнительных нейронов или промежуточных слоев;
выявления эффекта переобучения и корректировки конфигурации сети.
Свойство обобщения
При описании процедуры обучения нейронных сетей неявно использовалось предположение, что обучающее, контрольное и тестовое множества являются представительными для решаемой задачи. Обычно в качестве обучающих берутся данные, испытанные
50
Нейронные сети. MATLAB 6
на ряде примеров. Если обстоятельства изменились, то закономерности, имевшие место
в прошлом, могут больше не действовать.
Кроме того, нейронная сеть может обучаться только на тех данных, которыми она
располагает. Предположим, что известно обучающее множество для системы стабилизации самолета при полете в спокойной атмосфере, а требуется спроектировать систему
стабилизации на основе нейронной сети для условий полета при сильных возмущениях.
Тогда едва ли можно ожидать от сети правильного решения в совершенно новой для нее
ситуации.
Классическим примером непредставительной модели нейронной сети является следующая ситуация. При проектировании системы машинного зрения, предназначенной для
автоматического распознавания целей, сеть обучалась на 100 картинках, содержащих
изображения танков, и на 100 других картинках, где танков не было. После обучения сети
был достигнут стопроцентно "правильный" результат. Но когда на вход сети были поданы
новые данные, она безнадежно провалилась. В чем же была причина? Выяснилось, что
фотографии с танками были сделаны в пасмурный, дождливый день, а фотографии без
танков – в солнечный день. Сеть научилась улавливать разницу в общей освещенности.
Чтобы сеть могла результативно работать, ее следовало обучать на данных, где бы присутствовали все погодные условия и типы освещения, при которых сеть предполагается использовать, и это не говоря еще о рельефе местности, угле и дистанции съемки и т. д. [1].
Коль скоро сеть минимизирует общую погрешность, большое значение приобретают
пропорции, в которых представлены данные различных типов. Сеть, обученная на 900
"хороших" и 100 "плохих" наблюдениях, будет искажать результат в пользу хороших
наблюдений, поскольку это позволит алгоритму уменьшить общую погрешность. Если
в реальной ситуации "хорошие" и "плохие" объекты представлены в другой пропорции, то
результаты, выдаваемые сетью, могут оказаться неверными. Примером этого может быть
задача выявления заболеваний. Пусть, например, при обычных обследованиях в среднем
90 % людей оказываются здоровыми и сеть, таким образом, обучается на данных, в которых пропорция здоровые/больные равна 90/10. Затем эта же сеть применяется для диагностики пациентов с определенными жалобами, среди которых соотношение здоровые/больные уже 50/50. В этом случае сеть будет ставить диагноз чересчур осторожно
и не будет распознавать заболевание у некоторых больных. Если же, наоборот, сеть обучить на данных "с жалобами", а затем протестировать на "обычных" данных, то она будет
выдавать повышенное число неправильных диагнозов о наличии заболевания. В таких
ситуациях обучающие данные нужно скорректировать так, чтобы были учтены различия
в распределении данных (например, можно повторить редкие наблюдения или удалить
часто встречающиеся). Как правило, лучше всего постараться сделать так, чтобы наблюдения различных типов были представлены равномерно, и соответственно этому интерпретировать результаты, которые выдает сеть.
Способность сети, обученной на некотором множестве данных, выдавать правильные
результаты для достаточно широкого класса новых данных, в том числе и не представленных при обучении, называется свойством обобщения нейронной сети.
Другой подход к процедуре обучения сети можно сформулировать, если рассматривать ее как процедуру, обратную моделированию. В этом случае требуется подобрать такие значения весов и смещений, которые обеспечивали бы нужное соответствие между
входами и желаемыми значениями на выходе. Такая процедура обучения носит название
3. Обучение нейронных сетей
51
процедуры адаптации и достаточно широко применяется для настройки параметров
нейронных сетей.
3.1.1. Способы адаптации и обучения
В ППП Neural Network Toolbox реализовано 2 способа адаптации и обучения: последовательный и групповой, в зависимости от того, применяется ли последовательное или
групповое представление входов.
Адаптация нейронных сетей
Статические сети. Воспользуемся следующей моделью однослойной линейной сети
с двухэлементным вектором входа, значения которого находятся в интервале [–1 1],
и нулевым параметром скорости настройки:
% Формирование однослойной статической линейной сети с двумя входами
% и нулевым параметром скорости настройки
net = newlin([–1 1;–1 1],1, 0, 0);
Требуется адаптировать параметры сети так, чтобы она формировала линейную зависимость вида
t  2 p1  p2 .
Последовательный способ. Рассмотрим случай последовательного представления обучающей последовательности. В этом случае входы и целевой вектор формируются в виде
массива формата cell:
% Массив ячеек векторов входа
P = {[–1; 1] [–1/3; 1/4] [1/2; 0] [1/6; 2/3]};
T = {–1 –5/12 1 1}; % Массив ячеек векторов цели
P1 = [P{:}], T1=[T{:}] % Переход от массива ячеек к массиву double
P1 =
–1
–0.33333
0.5
0.16667
1
0.25
0
0.66667
T1 = –1
–0.41667
1
1
Сначала зададим сеть с нулевыми значениями начальных весов и смещений:
net.IW{1} = [0 0]; % Присваивание начальных весов
net.b{1} = 0;
% Присваивание начального смещения
В ППП NNT процедуры адаптации реализуются на основе метода adapt. Для управления процедурой адаптации используется свойство net.adaptFcn, которое задает метод
адаптации; для статических сетей по умолчанию применяется метод adaptwb, который
позволяет выбирать произвольные функции для настройки весов и смещений. Функции
настройки весов и смещений задаются свойствами net.inputWeights{i, j}.learnFcn,
net.layerWeights{i, j}.learnFcn и net.biases{i, j}.learnFcn.
Выполним 1 цикл адаптации сети с нулевым параметром скорости настройки:
% Последовательная адаптация сети с входами P и целями T
[net1,a,e] = adapt(net,P,T);
% net1-новая сеть, a-выход, e-ошибка обучения
52
Нейронные сети. MATLAB 6
В этом случае веса не модифицируются, выходы сети остаются нулевыми, поскольку
параметр скорости настройки равен нулю и адаптации сети не происходит. Погрешности
совпадают со значениями целевой последовательности
net1.IW{1, 1}, a, e
ans =
0
0
a = [0]
[0]
e = [–1] [–0.41667]
[0]
[1]
[0]
[1]
Зададим значения параметров скорости настройки и весов входа и смещения:
net.IW{1} = [0 0]; % Присваивание начальных весов
net.b{1} = 0;
% Присваивание начального смещения
net.inputWeights{1,1}.learnParam.lr = 0.2;
net.biases{1,1}.learnParam.lr = 0;
Нулевое значение параметра скорости настройки для смещения обусловлено тем, что
выявляемая зависимость не имеет постоянной составляющей.
Выполним 1 цикл настройки:
[net1,a,e] = adapt(net,P,T);
net1.IW{1, 1}, a, e
ans = 0.34539
–0.069422
a = [0]
[–0.11667]
[0.11]
[–0.091833]
e = [–1]
[–0.3]
[0.89]
[1.0918]
Теперь выполним последовательную адаптацию сети в течение 30 циклов:
% Последовательная адаптация сети с входами P и целями T за 30 циклов
net = newlin([–1 1;–1 1],1, 0, 0);
net.IW{1} = [0 0]; % Присваивание начальных весов
net.b{1} = 0;
% Присваивание начального смещения
Зададим значения параметров скорости настройки для весов входа и смещения:
net.inputWeights{1,1}.learnParam.lr = 0.2;
net.biases{1,1}.learnParam.lr = 0;
P = {[–1; 1] [–1/3; 1/4] [1/2; 0] [1/6; 2/3]}; % Массив векторов входа
T = {–1 –5/12 1 1}; % Массив векторов цели
for i=1:30,
[net,a{i},e{i}] = adapt(net,P,T);
W(i,:)=net.IW{1,1};
end
mse(cell2mat(e{30})) % Среднеквадратичная ошибка адаптации
ans = 0.0017176
W(30,:) % Веса после 30 циклов
ans = 1.9199 0.925
cell2mat(a{30})
ans = –0.9944
–0.40855
0.95663
0.93005
cell2mat(e{30})
ans = –0.0055975 –0.0081125
0.043367
0.069947
Построим графики зависимости значений выходов сети и весовых коэффициентов
в зависимости от числа итераций (рис. 3.1):
subplot(3,1,1)
3. Обучение нейронных сетей
53
plot(0:30,[[0 0 0 0];cell2mat(cell2mat(a'))],'k') % Рис 3.1,a
xlabel(''), ylabel('Выходы a(i)'),grid
subplot(3,1,2)
plot(0:30,[[0 0]; W],'k') % Рис 3.1,б
xlabel(''), ylabel('Веса входов w(i)'),grid
subplot(3,1,3)
for i=1:30, E(i) = mse(e{i}); end
semilogy(1:30, E,'+k') % Рис. 3.1,в
xlabel(' Циклы'), ylabel('Ошибка'),grid
Рис. 3.1
Первый выход тот же, что и при нулевом значении параметра скорости настройки, так
как до предъявления сети первого входа никаких модификаций не происходит. Второй
выход отличается, так как параметры сети были модифицированы. Веса продолжают
изменяться при подаче нового входа. Если сеть соответствует задаче, корректно заданы
обучающие последовательности, начальные условия и параметр скорости настройки,
то в конечном счете погрешность может быть сведена к нулю.
В этом можно убедиться, изучая процесс адаптации, показанный на рис. 3.1. Условие
окончания адаптации определяется погрешностью приближения к целевому вектору; в
данном случае мерой такой погрешности является среднеквадратичная ошибка mse(e{i}),
которая должна быть меньше 0.015.
На рис. 3.1, а показаны выходы нейронов в процессе адаптации сети, на рис. 3.1, б –
коэффициенты восстанавливаемой зависимости, которые соответствуют элементам
вектора весов входа, а на рис. 3.1, в – ошибка обучения. Как следует из анализа графиков,
за 12 шагов получена ошибка обучения 1.489e–3.
Предлагаем читателю самостоятельно убедиться, что для исследуемой зависимости
обучающие последовательности вида
54
Нейронные сети. MATLAB 6
P = {[–1; 1] [–1/2; 1/2] [1/2; –1/2] [1; –1]}; % Массив векторов входа
T = {–1 –1/2 1/2 1}; % Массив векторов цели
не являются представительными.
Групповой способ. Рассмотрим случай группового представления обучающей последовательности. В этом случае входы и целевой вектор формируются в виде массива формата
double.
P = [–1 –1/3 1/2 1/6; 1 1/4 0 2/3];
T = [–1 –5/12 1 1];
Используется та же модель статической сети с теми же требованиями к погрешности
адаптации. При обращении к М-функции adapt по умолчанию вызываются функции
adaptwb и learnwh; последняя выполняет настройку параметров сети на основе алгоритма
WH, реализующего правило Уидроу – Хоффа (Widrow – Hoff).
Основной цикл адаптации сети с заданной погрешностью выглядит следующим образом:
% Групповой способ адаптации сети с входами P и целями T
net3 = newlin([–1 1;–1 1],1, 0, 0.2);
net3.IW{1} = [0 0]; % Присваивание начальных весов
net3.b{1} = 0;
% Присваивание начального смещения
net3.inputWeights{1,1}.learnParam.lr = 0.2;
P = [–1 –1/3 1/2 1/6; 1 1/4 0 2/3];
T = [–1 –5/12 1 1];
EE = 10; i=1;
while EE > 0.0017176
[net3,a{i},e{i},pf] = adapt(net3,P,T);
W(i,:) = net3.IW{1,1};
EE = mse(e{i});
ee(i)= EE;
i = i+1;
end
Результатом адаптации при заданной погрешности являются следующие значения коэффициентов линейной зависимости, значений выходов нейронной сети, приближающихся к значениям желаемого выхода, а также среднеквадратичная погрешность адаптации:
W(63,:)
ans = 1.9114
cell2mat(a(63))
ans = –1.003
EE = mse(e{63})
EE = 0.0016368
mse(e{1})
ans = 0.7934
0.84766
–0.36242
1.0172
0.94256
Процедура адаптации выходов и параметров нейронной сети иллюстрируется рис. 3.2.
subplot(3,1,1)
plot(0:63,[zeros(1,4); cell2mat(a')],'k') % Рис.3.2,a
xlabel(''), ylabel('Выходы a(i)'),grid
subplot(3,1,2)
plot(0:63,[[0 0]; W],'k') % Рис.3.2,б
xlabel(''), ylabel('Веса входов w(i)'),grid
3. Обучение нейронных сетей
55
subplot(3,1,3)
semilogy(1:63, ee,'+k') % Рис.3.2,в
xlabel('Циклы'), ylabel('Ошибка'),grid
Рис. 3.2
Как следует из анализа графиков, для достижения требуемой точности адаптации требуется 12 шагов. Сравнивая рис. 3.2 и 3.1, можно убедиться, что существует различие в динамике процедур адаптации при последовательном и групповом представлении данных.
Динамические сети. Эти сети характеризуются наличием линий задержки, и для них
последовательное представление входов является наиболее естественным.
Последовательный способ. Обратимся к линейной модели нейронной сети с одним входом и одним элементом запаздывания. Установим начальные условия на линии задержки,
а также для весов и смещения равными 0, а параметр скорости настройки равным 0.5:
net = newlin([–1 1],1,[0 1],0.5);
Pi = {0}; % Начальное условие для элемента запаздывания
net.IW{1} = [0 0]; % Значения весов
net.biasConnect = 0; % Значение смещения
Чтобы применить последовательный способ адаптации, представим входы и цели как
массивы ячеек:
P = {–1/2
T = { –1
1/3
1/6
1/5 1/4}; % Вектор входа
11/15 7/10}; % Вектор цели
Попытаемся приспособить сеть для формирования нужного выхода на основе следующего соотношения:
y(t) = 2p(t) + p(t–1).
56
Нейронные сети. MATLAB 6
Используем для этой цели М-функцию adapt и основной цикл адаптации сети с заданной погрешностью, как это уже было описано выше:
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
Сеть адаптировалась за 22 цикла. Результатом адаптации при заданной погрешности
являются следующие значения коэффициентов линейной зависимости, значений выходов
нейронной сети, приближающихся к значениям желаемого выхода, а также среднеквадратичная погрешность адаптации:
W(22,:)
ans = 1.983
0.98219
a{22}
ans = [–0.98955]
[0.17136]
EE
EE = 7.7874e–005
[0.72272]
[0.69177]
Построим графики зависимости выходов системы и весовых коэффициентов от числа
циклов обучения (рис. 3.3):
subplot(3,1,1)
plot(0:22,[zeros(1,4); cell2mat(cell2mat(a'))],'k') % Рис.3.3,a
xlabel(''), ylabel('Выходы a(i)'),grid
subplot(3,1,2)
plot(0:22,[[0 0]; W],'k') % Рис.3.3,б
xlabel(''), ylabel('Веса входов w(i)'),grid
subplot(3,1,3)
semilogy(1:22,ee,'+k') % Рис.3.3,в
xlabel('Циклы'), ylabel('Ошибка'),grid
3. Обучение нейронных сетей
57
Рис. 3.3
На рис. 3.3, а показаны выходы нейронов в процессе адаптации сети, а на рис. 3.3, б –
коэффициенты восстанавливаемой зависимости, которые соответствуют элементам вектора весов входа.
Групповой способ представления обучающего множества для адаптации динамических
систем не применяется.
Обучение нейронных сетей
Статические сети. Воспользуемся рассмотренной выше моделью однослойной линейной
сети с двухэлементным вектором входа, значения которого находятся в интервале [–1 1],
и нулевым параметром скорости настройки, как это было для случая адаптации:
% Формирование однослойной статической линейной сети с двумя входами
% и нулевым параметром скорости настройки
net = newlin([–1 1;–1 1],1, 0, 0);
net.IW{1} = [0 0]; % Значения весов
net.b{1} = 0; % Значения смещений
Требуется обучить параметры сети так, чтобы она формировала линейную зависимость вида
t  2 p1  p2 .
Последовательный способ. Для этого представим обучающую последовательность
в виде массивов ячеек
P = {[–1; 1] [–1/3; 1/4] [1/2; 0] [1/6; 2/3]}; % Массив векторов входа
T = {–1 –5/12 1 1}; % Массив векторов цели
Теперь все готово к обучению сети. Будем обучать ее с помощью функции train в течение 30 циклов.
58
Нейронные сети. MATLAB 6
В этом случае для обучения и настройки параметров сети используются функции
trainwb и learnwh соответственно.
% Параметр скорости настройки весов
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}
W = 1.9214
0.92599
y = sim(net1, P)
y = [–0.99537]
[–0.40896]
EE = mse([y{:}]–[T{:}])
EE = 1.3817e–003
[0.96068]
[0.93755]
Зависимость величины ошибки обучения от числа циклов обучения приведена
на рис. 3.4.
Рис. 3.4
Это тот же самый результат, который был получен для группового способа адаптации
с использованием функции adapt.
Групповой способ. Для этого представим обучающую последовательность в виде массивов
формата double array:
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);
TRAINWB, Epoch 0/10, MSE 0.793403/0.
TRAINWB, Epoch 10/10, MSE 0.00243342/0.
TRAINWB, Maximum epoch reached.
Параметры сети после обучения равны следующим значениям:
3. Обучение нейронных сетей
59
W = net1.IW{1}
W = 1.9214
0.92599
y = sim(net1, P)
y = –0.99537
–0.40896
EE = mse(y–T)
EE = 1.3817e–003
0.96068
0.93755
Этот результат полностью совпадает с результатом последовательного обучения этой
же сети.
Динамические сети. Обучение динамических сетей выполняется аналогичным образом
с использованием метода train.
Последовательный способ. Обратимся к линейной модели нейронной сети с одним входом и одним элементом запаздывания.
Установим начальные условия для элемента запаздывания, весов и смещения равными 0, а параметр скорости настройки равным 0.5:
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}; % Вектор входа
Обучим сеть формировать нужный выход на основе соотношения y(t) = 2p(t) + p(t–1),
тогда
T = { –1
1/6
11/15 7/10}; % Вектор цели
Используем для этой цели М-функцию train:
net1 = train(net, P, T, Pi);
Параметры сети после обучения равны следующим значениям:
W = net1.IW{1}
W = 1.9883
0.98414
y = sim(net1, P)
y = [–0.99414]
[0.17069]
EE = mse([y{:}]–[T{:}])
EE = 3.6514e–005
[0.7257]
[0.6939]
График зависимости ошибки обучения от числа циклов приведен на рис. 3.5.
60
Нейронные сети. MATLAB 6
Рис. 3.5
Предлагаем читателю самостоятельно выполнить сравнение результатов обучения
с результатами адаптации этой же сети.
Групповой способ представления обучающей последовательности для обучения динамических систем не применяется.
3.2. Методы обучения
Как только начальные веса и смещения нейронов установлены пользователем или
с помощью датчика случайных чисел, сеть готова для того, чтобы начать процедуру ее
обучения. Сеть может быть обучена решению различных прикладных задач – аппроксимации функций, идентификации и управления объектами, распознавания образов, классификации объектов и т. п. Процесс обучения требует набора примеров ее желаемого
поведения – входов p и желаемых (целевых) выходов t; во время этого процесса веса
и смещения настраиваются так, чтобы минимизировать некоторый функционал ошибки.
По умолчанию в качестве такого функционала для сетей с прямой передачей сигналов
принимается среднеквадратичная ошибка между векторами выхода a и t. Ниже обсуждается несколько методов обучения для сетей с прямой передачей сигналов.
При обучении сети рассчитывается некоторый функционал, характеризующий качество обучения:
M
J
M
1 QS q
  (ti  aiqS ) 2 ,
2 q1 i 1
(3.1)
где J – функционал; Q – объем выборки; M – число слоев сети; q – номер выборки;
SM – число нейронов выходного слоя; a q  [aiqM ] – вектор сигнала на выходе сети;
t q  [tiq ] – вектор желаемых (целевых) значений сигнала на выходе сети для выборки
с номером q.
3. Обучение нейронных сетей
61
Затем с помощью того или иного метода обучения определяются значения настраиваемых параметров (весов и смещений) сети, которые обеспечивают минимальное значение
функционала ошибки. Большинство методов обучения основано на вычислении градиента
функционала ошибки по настраиваемым параметрам.
3.2.1. Обучение однослойной сети
Наиболее просто градиент функционала вычисляется для однослойных нейронных
сетей. В этом случае M = 1 и выражение для функционала принимает вид:
1
J
1
1 Q S q
1 Q S q
qS1 2
(
t

a
)

 i i
 (ti  f (niq )) 2 , i  1, S ,
2 q 1 i 1
2 q 1 i 1
где f (niq ) – функция активации; niq 
для i-го нейрона; p
q
 [ piq ]
(3.2)
R
 wij p qj – сигнал на входе функции активации
j 0
– вектор входного сигнала; R – число элементов вектора входа;
S – число нейронов в слое; wij – весовые коэффициенты сети.
Включим вектор смещения в состав матрицы весов W  [ wij ], i  1, S , j  1, R , а вектор входа дополним элементом, равным 1.
Применяя правило дифференцирования сложной функции, вычислим градиент функционала ошибки, предполагая при этом, что функция активации дифференцируема:
Q
Q
 ( f (niq ))
J
  (t iq  f (niq ))
  (t iq  f (niq )) f (niq ) p qj .
wij
wij
q 1
q 1
(3.3)
Введем обозначение
qi  (tiq  f (niq )) f (niq )  (tiq  aiq ) f (niq ), i  1, S ,
(3.4)
и преобразуем выражение (3.3) следующим образом:
Q
J
   qi f (niq ) p qj , i  1, S .
wij
q 1
(3.5)
Полученные выражения упрощаются, если сеть линейна. Поскольку для такой сети
выполняется соотношение aiq  niq , то справедливо условие f (niq )  1 . В этом случае
выражение (3.3) принимает вид:
J
 (tiq  aiq ) p qj , i  1, S , j  0, R .
wij
(3.6)
Выражение (3.6) положено в основу алгоритма WH, применяемого для обучения линейных нейронных сетей [45].
Линейные сети могут быть обучены и без использования итерационных методов,
а путем решения следующей системы линейных уравнений:
62
Нейронные сети. MATLAB 6
R
 wij p qj  tiq , i  1, S , q  1, Q ,
(3.7)
j 0
или в векторной форме записи:
Wp  t , W  [ wij ], p  [ p qj ], t  [tiq ], i  1, S , j  0, R, q  1, Q .
(3.8)
Если число неизвестных системы (3.7) равно числу уравнений, то такая система может быть решена, например, методом исключения Гаусса с выбором главного элемента.
Если же число уравнений превышает число неизвестных, то решение ищется с использованием метода наименьших квадратов.
3.2.2. Обучение многослойной сети
Архитектура многослойной сети существенно зависит от решаемой задачи. Для линейных нейронных сетей может быть установлена связь между суммарным количеством
весов и смещений с длиной обучающей последовательности. Для других типов сетей число слоев и нейронов в слое часто определяется опытом, интуицией проектировщика и эвристическими правилами.




Обучение сети включает несколько шагов:
выбор начальной конфигурации сети с использованием, например, следующего эвристического правила: количество нейронов промежуточного слоя определяется половиной суммарного количества входов и выходов;
проведение ряда экспериментов с различными конфигурациями сети и выбор той,
которая дает минимальное значение функционала ошибки;
если качество обучения недостаточно, следует увеличить число нейронов слоя или
количество слоев;
если наблюдается явление переобучения, следует уменьшить число нейронов в слое
или удалить один или несколько слоев.
Нейронные сети, предназначенные для решения практических задач, могут содержать
до нескольких тысяч настраиваемых параметров, поэтому вычисление градиента может
потребовать весьма больших затрат вычислительных ресурсов. С учетом специфики многослойных нейронных сетей для них разработаны специальные методы расчета градиента,
среди которых следует выделить метод обратного распространения ошибки [18, 37, 41].
Метод обратного распространения ошибки
Термин "обратное распространение" относится к процессу, с помощью которого могут
быть вычислены производные функционала ошибки по параметрам сети. Этот процесс может
использоваться в сочетании с различными стратегиями оптимизации. Существует много вариантов и самого алгоритма обратного распространения. Обратимся к одному из них.
Рассмотрим выражение для градиента критерия качества по весовым коэффициентам
для выходного слоя M:
3. Обучение нейронных сетей
63
J


wijM wijM
i  1, S M ;
Q S
1 Q S

a qM
  (t kq  a kqM ) 2    (t kq  a kqM ) kM ;
 2 q 1 k 1

wij
q 1 k 1


M
M
(3.9)
j  0, S M 1 ,
где S M – число нейронов в слое; a kqM – k-й элемент вектора выхода слоя M для элемента
выборки с номером q.
Правило функционирования слоя M:
 S M 1

akqM  f M   wklM alq ( M 1) , m  1, S M .
 l 0

(3.10)
Из уравнения (3.8) следует
a kqM 

wijM 
0,
qM

f (ni )a qj ( M 1) ,
i  1, S M ,
j  0, S M 1 .
k i
k i
(3.11)
После подстановки (3.11) в (3.9) имеем:
Q
J


(tiq  aiqM ) f k' (niqM )aiq ( M 1) .

wijM
q 1
Если обозначить
qM
 (tiqM  aiqM ) f M' (niqM ) , i  1, , S M ,
i
(3.12)
то получим
J
wijM
q ( M 1)
  qM
; i  1, S M ;
i aj
j  0, S M 1.
(3.13)
Перейдем к выводу соотношений для настройки весов wijM 1 слоя M–1
Q S
nkqM a kq ( M 1) q ( M 1)
J
q
qM
'
qM


(
t

a
)
f
(
n
)
ai


k
k
M
k
wijM 1
aiq ( M 1) wijM 1
q 1 k 1
M
Q SM
  (t kq  a kqM ) f M' (nkqM ) wkM
q 1 k 1
nkqM
f M' 1 (niq ( M 1) )a qj ( M 2 ) 
aiq ( M 1)
(3.14)
  qi ( M 1) a qj ( M 2 ) ,
где
qi ( M 1) 
64
SM
SM

k 1
 k 1

q ( M 1)
 '
), i  1, S M 1.
 (t kq  akqM ) f M' (nkqM )wkM f M' 1 (niq( M 1) )   qM
k  f M 1 (ni
Нейронные сети. MATLAB 6
Для слоев M–2, M–3, …,1 вычисление частных производных критерия J по элементам
матриц весовых коэффициентов выполняется аналогично. В итоге получаем следующую
общую формулу:
Q
J


qi ( r 1) a qj ( r 1) , r  1, M , i  1, S r ,

wijr
q 1
j  0, S r 1 ,
(3.15)
где r – номер слоя
 S r 1 q ( r 1) r 1  ' qr
  k
qr

wki  f r (ni ), r  1, M  1,
i
 k 1


qM
 (tiq  aiqM ) f M' (niqM ),
i
i  1, S M .
На рис. 3.6 представлена схема вычислений, соответствующая выражению (3.15).
Слой 1
Слой M-1
n1
p=a0
1
W
aM-2
a1
1
f1(n )
...
nM-1
M-1
fM-1(nM-1)
W
t
Слой M
aM-1
nM
WM
aM
fM(nM)
e
f1'(n1)
fM'(nM)
fM-1'(nM-1)
1
 M-1
.*
...
**
J/W1
(WM-1)T
**
J/WM-1
M
.*
(WM)T
.*
**
J/WM
Рис. 3.6
На этой схеме символом * обозначена операция поэлементного умножения векторов,
а символом ** – умножение вектора  на aT; символ, обозначающий номер элемента выборки, для краткости опущен.
Характеристика методов обучения
Методы, используемые при обучении нейронных сетей, во многом аналогичны методам определения экстремума функции нескольких переменных. В свою очередь, последние делятся на 3 категории – методы нулевого, первого и второго порядка.
В методах нулевого порядка для нахождения экстремума используется только информация о значениях функции в заданных точках.
В методах первого порядка используется градиент функционала ошибки по настраиваемым параметрам
(3.16)
x k 1  x k   k g k ,
где x k – вектор параметров;  k – параметр скорости обучения; g k – градиент функционала, соответствующие итерации с номером k.
3. Обучение нейронных сетей
65
Вектор в направлении, противоположном градиенту, указывает направление кратчайшего спуска по поверхности функционала ошибки. Если реализуется движение в этом
направлении, то ошибка будет уменьшаться. Последовательность таких шагов в конце
концов приведет к значениям настраиваемых параметров, обеспечивающим минимум
функционала. Определенную трудность здесь вызывает выбор параметра скорости обучения α k . При большом значении параметра α k сходимость будет быстрой, но существует
опасность пропустить решение или уйти в неправильном направлении. Классическим
примером является ситуация, когда алгоритм очень медленно продвигается по узкому
оврагу с крутыми склонами, перепрыгивая с одного на другой. Напротив, при малом шаге, вероятно, будет выбрано верное направление, однако при этом потребуется очень много итераций. В зависимости от принятого алгоритма параметр скорости обучения может
быть постоянным или переменным. Правильный выбор этого параметра зависит от конкретной задачи и обычно осуществляется опытным путем; в случае переменного параметра его значение уменьшается по мере приближения к минимуму функционала.
В алгоритмах сопряженного градиента [12] поиск минимума выполняется вдоль
сопряженных направлений, что обеспечивает обычно более быструю сходимость, чем
при наискорейшем спуске. Все алгоритмы сопряженных градиентов на первой итерации
начинают движение в направлении антиградиента
p 0  g 0 .
(3.17)
Тогда направление следующего движения определяется так, чтобы оно было сопряжено
с предыдущим. Соответствующее выражение для нового направления движения является
комбинацией нового направления наискорейшего спуска и предыдущего направления:
p k  g k  β k p k 1 .
(3.18)
Здесь p k – направление движения, g k – градиент функционала ошибки, β k – коэффициент соответствуют итерации с номером k. Когда направление спуска определено,
то новое значение вектора настраиваемых параметров x k 1 вычисляется по формуле
x k 1  x k  α k p k .
(3.19)
Методы второго порядка требуют знания вторых производных функционала ошибки.
К методам второго порядка относится метод Ньютона. Основной шаг метода Ньютона
определяется по формуле
x k 1  x k  H k 1g k ,
(3.20)
где x k – вектор значений параметров на k-й итерации; H – матрица вторых частных производных целевой функции, или матрица Гессе; g k – вектор градиента на k-й итерации.
Во многих случаях метод Ньютона сходится быстрее, чем методы сопряженного градиента, но требует больших затрат из-за вычисления гессиана. Для того чтобы избежать вычисления матрицы Гессе, предлагаются различные способы ее замены приближенными
выражениями, что порождает так называемые квазиньютоновы алгоритмы (алгоритм
метода секущих плоскостей OSS [1], алгоритм LM Левенберга – Марквардта [17]).
66
Нейронные сети. MATLAB 6
3.3. Алгоритмы обучения
Алгоритмы обучения, как правило, функционируют пошагово; и эти шаги принято
называть эпохами или циклами. На каждом цикле на вход сети последовательно подаются
все элементы обучающей последовательности, затем вычисляются выходные значения
сети, сравниваются с целевыми и вычисляется функционал ошибки. Значения функционала, а также его градиента используются для корректировки весов и смещений, после чего
все действия повторяются. Начальные значения весов и смещений выбираются случайным образом, а процесс обучения прекращается, когда выполнено определенное количество циклов либо когда ошибка достигнет некоторого малого значения или перестанет
уменьшаться.
При такой формализации задачи обучения предполагаются известными желаемые
(целевые) реакции сети на входные сигналы, что ассоциируется с присутствием учителя,
а поэтому такой процесс обучения называют обучением с учителем. Для некоторых типов
нейронных сетей задание целевого сигнала не требуется, и в этом случае процесс обучения называют обучением без учителя.
Ниже для обозначения алгоритмов используются их англоязычные сокращения, ассоциирующиеся с названиями алгоритмов в ППП Neural Network Toolbox.
3.3.1. Градиентные алгоритмы обучения
Алгоритм GD
Алгоритм GD, или алгоритм градиентного спуска, используется для такой корректировки весов и смещений, чтобы минимизировать функционал ошибки, т. е. обеспечить
движение по поверхности функционала в направлении, противоположном градиенту
функционала по настраиваемым параметрам.
Рассмотрим двухслойную нейронную сеть прямой передачи сигнала с сигмоидальным
и линейным слоями для обучения ее на основе метода обратного распространения ошибки
(рис. 3.7):
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');
Рис. 3.7
Последовательная адаптация. Чтобы подготовить модель сети к процедуре последовательной адаптации на основе алгоритма GD, необходимо указать ряд параметров. В
первую очередь это имя функции настройки learnFcn, соответствующее алгоритму градиентного спуска, в данном случае это М-функция learngd:
3. Обучение нейронных сетей
67
net.biases{1,1}.learnFcn = 'learngd';
net.biases{2,1}.learnFcn = 'learngd';
net.layerWeights{2,1}.learnFcn = 'learngd';
net.inputWeights{1,1}.learnFcn = 'learngd';
С функцией learngd связан лишь один параметр скорости настройки lr. Текущие приращения весов и смещений сети определяются умножением этого параметра на вектор градиента.
Чем больше значение параметра, тем больше приращение на текущей итерации. Если параметр
скорости настройки выбран слишком большим, алгоритм может стать неустойчивым; если параметр слишком мал, то алгоритм может потребовать длительного счета.
При выборе функции learngd по умолчанию устанавливается следующее значение
параметра скорости настройки:
net.layerWeights{2,1}.learnParam
ans =
lr: 0.01
Увеличим значение этого параметра до 0.2:
net.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);
Последний параметр, который требуется установить при последовательном обучении, –
это число проходов net.adaptParam.passes:
net.adaptParam.passes = 50;
Теперь можно выполнить настройку параметров, используя процедуру адаптации:
[net,a,e] = adapt(net,p,t);
Чтобы проверить качество обучения, после окончания обучения смоделируем сеть:
a = sim(net,p)
a =
[–1.02]
[–0.99624]
mse(e)
ans = 5.5909e–004
[1.0279]
[1.0021]
Групповое обучение. Для обучения сети на основе алгоритма GD необходимо использовать М-функцию traingd взамен функции настройки learngd. В этом случае нет необходимости задавать индивидуальные функции обучения для весов и смещений, а достаточно
указать одну обучающую функцию для всей сети.
Вновь создадим ту же двухслойную нейронную сеть прямой передачи сигнала с сигмоидальным и линейным слоями для обучения по методу обратного распространения ошибки:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');
Функция traingd характеризуется следующими параметрами, заданными по умолчанию:
68
Нейронные сети. MATLAB 6
net.trainParam
ans =
epochs: 100
goal: 0
lr: 1.0000e–002
max_fail: 5
min_grad: 1.0000e–010
show: 25
time: Inf
Здесь epochs – максимальное количество циклов (эпох) обучения; goal – предельное
значение критерия обучения; lr – параметр скорости настройки; max_fail – максимально
допустимый уровень превышения ошибки контрольного подмножества по сравнению
с обучающим; min_grad – минимальное значение градиента; show – интервал вывода информации, измеренный в циклах; time – предельное время обучения.
Установим новые значения параметров обучения, зададим обучающую последовательность в виде массива double и выполним процедуру обучения:
net.trainParam.show = 50;
net.trainParam.lr = 0.05;
net.trainParam.epochs = 300;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис.3.8
На рис. 3.8 приведен график изменения ошибки в зависимости от числа выполненных
циклов обучения. Этот график строится автоматически при исполнении функции train.
Рис. 3.8
Для проверки качества обучения промоделируем спроектированную сеть:
a = sim(net,p)
a = –1.0042
–0.9958
3. Обучение нейронных сетей
0.9987
0.9984
69
Более тщательно ознакомиться с методом градиентного спуска можно с помощью
демонстрационной программы nnd12sd1, которая иллюстрирует работу алгоритма GD.
Алгоритм GDM
Алгоритм GDM, или алгоритм градиентного спуска с возмущением [18], предназначен для настройки и обучения сетей прямой передачи. Этот алгоритм позволяет преодолевать локальные неровности поверхности ошибки и не останавливаться в локальных минимумах. С учетом возмущения метод обратного распространения ошибки реализует
следующее соотношение для приращения вектора настраиваемых параметров:
w k  mc w k 1  (1  mc ) lr g k ,
(3.21)
где w k – приращение вектора весов; mc – параметр возмущения; lr – параметр скорости
обучения; g k – вектор градиента функционала ошибки на k-й итерации.
Если параметр возмущения равен 0, то изменение вектора настраиваемых параметров
определяется только градиентом, если параметр равен 1, то текущее приращение равно
предшествующему как по величине, так и по направлению.
Вновь рассмотрим двухслойную нейронную сеть прямой передачи сигнала с сигмоидальным и линейным слоями (см. рис. 2.6)
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traingdm');
Последовательная адаптация. Чтобы подготовить модель сети к процедуре последовательной адаптации на основе алгоритма GDM, необходимо указать ряд параметров.
В первую очередь это имя функции настройки learnFcn, соответствующее алгоритму градиентного спуска с возмущением, в данном случае это М-функция learngdm:
net.biases{1,1}.learnFcn = 'learngdm';
net.biases{2,1}.learnFcn = 'learngdm';
net.layerWeights{2,1}.learnFcn = 'learngdm';
net.inputWeights{1,1}.learnFcn = 'learngdm';
С этой функцией связано 2 параметра – параметр скорости настройки lr и параметр
возмущения mc.
При выборе функции learngdm по умолчанию устанавливаются следующие значения
этих параметров:
net.layerWeights{2,1}.learnParam
ans =
lr: 0.01
mc: 0.9
Увеличим значение параметра скорости обучения до 0.2:
net.layerWeights{2,1}.learnParam.lr = 0.2;
Мы теперь почти готовы к обучению сети. Осталось задать обучающее множество
и количество проходов, равное 50:
p
t
p
t
70
=
=
=
=
[–1 –1 2 2;0 5 0 5];
[–1 –1 1 1];
num2cell(p,1);
num2cell(t,1);
Нейронные сети. MATLAB 6
net.adaptParam.passes = 50;
tic, [net,a,e] = adapt(net,p,t); toc
elapsed_time = 4.78
a, mse(e)
ans = [–1.0124]
[–0.98648]
[1.0127]
ans = 1.4410e–004
[0.9911]
Эти результаты сравнимы с результатами работы алгоритма GD, рассмотренного ранее.
Групповое обучение. Альтернативой последовательной адаптации является групповое
обучение, которое основано на применении функции train. В этом режиме параметры сети
модифицируются только после того, как реализовано все обучающее множество, и градиенты, рассчитанные для каждого элемента множества, суммируются, чтобы определить
приращения настраиваемых параметров.
Для обучения сети на основе алгоритма GDM необходимо использовать М-функцию
traingdm взамен функции настройки learngdm. Различие этих двух функций состоит
в следующем. Алгоритм функции traingdm суммирует градиенты, рассчитанные на каждом цикле обучения, а параметры модифицируются только после того, как все обучающие
данные будут представлены. Если проведено N циклов обучения и для функционала
ошибки оказалось выполненным условие J N  1.04 J N 1 , то параметр возмущения mc
следует установить в 0.
Вновь обратимся к той же сети
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traingdm');
Функция traingdm характеризуется следующими параметрами, заданными по умолчанию:
net.trainParam
ans =
epochs: 100
goal: 0
lr: 0.0100
max_fail: 5
mc: 0.9000
min_grad: 1.0000e–010
show: 25
time: Inf
По сравнению с функцией traingd здесь добавляется только 1 параметр возмущения mc.
Установим следующие значения параметров обучения:
net.trainParam.epochs = 300;
net.trainParam.goal = 1e–5;
net.trainParam.lr = 0.05;
net.trainParam.mc = 0.9;
net.trainParam.show = 50;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис. 3.9
На рис. 3.9 приведен график изменения ошибки обучения в зависимости от числа
выполненных циклов.
3. Обучение нейронных сетей
71
Рис. 3.9
a = sim(net,p)
a = –0.9956
–0.9998
0.9969
1.0009
Поскольку начальные веса и смещения инициализируются случайным образом, графики ошибок на рис. 3.8 и 3.9 будут отличаться от одной реализации к другой.
Более тщательно ознакомиться с методом градиентного спуска с возмущением можно
с помощью демонстрационной программы nnd12mo, которая иллюстрирует работу алгоритма GDM.
Практика применения описанных выше алгоритмов градиентного спуска показывает,
что эти алгоритмы слишком медленны для решения реальных задач. Ниже обсуждаются
алгоритмы группового обучения, которые сходятся в десятки и сотни раз быстрее. Ниже
представлены 2 разновидности таких алгоритмов: один основан на стратегии выбора параметра скорости настройки и реализован в виде алгоритма GDA, другой – на стратегии
выбора шага с помощью порогового алгоритма обратного распространения ошибки и реализован в виде алгоритма Rprop.
Алгоритм GDA
Алгоритм GDA, или алгоритм градиентного спуска с выбором параметра скорости
настройки, использует эвристическую стратегию изменения этого параметра в процессе
обучения.
Эта стратегия заключается в следующем. Вычисляются выход и погрешность инициализированной нейронной сети. Затем на каждом цикле обучения вычисляются новые
значения настраиваемых параметров и новые значения выходов и погрешностей. Если
отношение нового значения погрешности к прежнему превышает величину max_perf_inc
(по умолчанию 1.04), то новые значения настраиваемых параметров во внимание не принимаются. При этом параметр скорости настройки уменьшается с коэффициентом lr_dec
(по умолчанию 0.7). Если новая погрешность меньше прежней, то параметр скорости
настройки увеличивается с коэффициентом lr_inc (по умолчанию 1.05).
Эта стратегия способствует увеличению скорости и сокращению длительности обучения.
Алгоритм GDA в сочетании с алгоритмом GD определяет функцию обучения traingda,
а в сочетании с алгоритмом GDM – функцию обучения traingdx.
72
Нейронные сети. MATLAB 6
Вновь обратимся к той же нейронной сети (см. рис. 3.8), но будем использовать функцию обучения traingda:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traingda');
Функция traingda характеризуется следующими параметрами, заданными по умолчанию:
net.trainParam
ans =
epochs:
goal:
lr:
lr_inc:
lr_dec:
max_fail:
max_perf_inc:
min_grad:
show:
100
0
0.0100
1.0500
0.7000
5
1.0400
1.0000e–006
25
Здесь epochs – максимальное количество циклов обучения; goal – предельное значение
критерия обучения; lr – параметр скорости настройки; lr_inc – коэффициент увеличения
скорости настройки; lr_dec – коэффициент уменьшения скорости настройки; max_fail –
максимально допустимый уровень превышения ошибки контрольного подмножества по
сравнению с обучающим; max_perf_inc – пороговый коэффициент отношения погрешностей; min_grad – минимальное значение градиента; show – интервал вывода информации,
измеренный в циклах; time – предельное время обучения.
Установим следующие значения этих параметров:
net.trainParam.epochs = 300;
net.trainParam.goal = 1e–5;
net.trainParam.lr = 0.05;
net.trainParam.mc = 0.9;
net.trainParam.show = 50;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис. 3.10
На рис. 3.10 приведен график изменения ошибки обучения в зависимости от числа
выполненных циклов.
3. Обучение нейронных сетей
73
Рис. 3.10
a = sim(net,p)
a = –0.9959
–1.0012
0.9963
0.9978
Нетрудно заметить, что количество циклов обучения по сравнению с предыдущим примером сократилось практически в 3 раза при сохранении той же погрешности обучения.
Демонстрационная программа nnd12vl иллюстрирует производительность алгоритма
с переменным параметром скорости настройки.
Алгоритм Rprop
Алгоритм Rprop, или пороговый алгоритм обратного распространения ошибки,
реализует следующую эвристическую стратегию изменения шага приращения параметров
для многослойных нейронных сетей.
Многослойные сети обычно используют сигмоидальные функции активации в скрытых слоях. Эти функции относятся к классу функций со сжимающим отображением, поскольку они отображают бесконечный диапазон значений аргумента в конечный диапазон
значений функции. Сигмоидальные функции характеризуются тем, что их наклон приближается к нулю, когда значения входа нейрона существенно возрастают. Следствием
этого является то, что при использовании метода наискорейшего спуска величина градиента становится малой и приводит к малым изменениям настраиваемых параметров, даже
если они далеки от оптимальных значений.
Цель порогового алгоритма обратного распространения ошибки Rprop (Resilient propagation) [36] состоит в том, чтобы повысить чувствительность метода при больших значениях входа функции активации. В этом случае вместо значений самих производных используется только их знак.
Значение приращения для каждого настраиваемого параметра увеличивается с коэффициентом delt_inc (по умолчанию 1.2) всякий раз, когда производная функционала
ошибки по данному параметру сохраняет знак для двух последовательных итераций.
Значение приращения уменьшается с коэффициентом delt_dec (по умолчанию 0.5) всякий
раз, когда производная функционала ошибки по данному параметру изменяет знак
по сравнению с предыдущей итерацией. Если производная равна 0, то приращение остается неизменным. Поскольку по умолчанию коэффициент увеличения приращения со74
Нейронные сети. MATLAB 6
ставляет 20 %, а коэффициент уменьшения – 50 %, то в случае попеременного увеличения
и уменьшения общая тенденция будет направлена на уменьшение шага изменения параметра. Если параметр от итерации к итерации изменяется в одном направлении,
то шаг изменения будет постоянно возрастать.
Алгоритм Rprop определяет функцию обучения trainrp.
Вновь обратимся к сети, показанной на рис. 3.8, но будем использовать функцию
обучения trainrp:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},trainrp');
Функция trainrp характеризуется следующими параметрами, заданными по умолчанию:
net.trainParam
ans =
epochs: 100
show: 25
goal: 0
time: Inf
min_grad: 1.0000e–006
max_fail: 5
delt_inc: 1.2000
delt_dec: 0.5000
delta0: 0.0700
deltamax: 50
Здесь epochs – максимальное количество циклов обучения; show – интервал вывода информации, измеренный в циклах; goal – предельное значение критерия обучения; time –
предельное время обучения; min_grad – минимальное значение градиента; max_fail – максимально допустимый уровень превышения ошибки контрольного подмножества по
сравнению с обучающим; delt_inc – коэффициент увеличения шага настройки; delt_dec –
коэффициент уменьшения шага настройки; delta0 – начальное значение шага настройки;
deltamax – максимальное значение шага настройки.
Установим следующие значения этих параметров:
net.trainParam.show = 10;
net.trainParam.epochs = 300;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис.3.11
На рис. 3.11 приведен график изменения ошибки обучения в зависимости от числа
выполненных циклов обучения.
3. Обучение нейронных сетей
75
Рис. 3.11
a = sim(net,p)
a = –0.9974
–1.0010
0.9995
0.9984
Нетрудно заметить, что количество циклов обучения по сравнению с алгоритмом
GDA сократилось практически еще в 3 раза и составило по отношению к алгоритму GD
значение, близкое к 8.5.
3.3.2. Алгоритмы метода сопряженных градиентов
Основной алгоритм обратного распространения ошибки корректирует настраиваемые
параметры в направлении наискорейшего уменьшения функционала ошибки. Но такое
направление далеко не всегда является самым благоприятным направлением, чтобы за
возможно малое число шагов обеспечить сходимость к минимуму функционала. Существуют направления движения, двигаясь по которым можно определить искомый минимум гораздо быстрее. В частности, это могут быть так называемые сопряженные направления, а соответствующий метод оптимизации – это метод сопряженных градиентов [18].
Если в обучающих алгоритмах градиентного спуска, управление сходимостью осуществляется с помощью параметра скорости настройки, то в алгоритмах метода сопряженных градиентов размер шага корректируется на каждой итерации. Для определения
размера шага вдоль сопряженного направления выполняются специальные одномерные
процедуры поиска минимума. В состав ППП Neural Network Toolbox включено 5 специализированных М-функций для организации одномерного поиска: scrchbac, scrchbre,
srchcha, srchgol, scrchhyb.
Любая из этих функций может быть использована в сочетании с любой из обучающих
функций метода сопряженных градиентов. Есть наилучшие сочетания таких функций, но
это зависит от конкретного приложения. И хотя по умолчанию с каждой функцией обучения связана определенная функция одномерного поиска, пользователь может осуществлять их переназначение.
Все алгоритмы метода сопряженных градиентов на первой итерации начинают поиск
в направлении антиградиента
(3.22)
p 0  g 0 .
76
Нейронные сети. MATLAB 6
Когда выбрано направление, требуется определить оптимальное расстояние (шаг поиска), на величину которого следует изменить настраиваемые параметры:
(3.23)
x k 1  x k  α k p k .
Затем определяется следующее направление поиска как линейная комбинация нового
направления наискорейшего спуска и вектора движения в сопряженном направлении:
(3.24)
p k  g k  β k p k 1 .
Различные алгоритмы метода сопряженного градиента различаются способом вычисления константы  k.
Ниже описаны 4 алгоритма метода сопряженных градиентов.
Алгоритм CGF
Алгоритм CGF, реализующий метод Флетчера – Ривса [12, 18], использует следующее
выражение для вычисления константы метода:
βk 
g Tk g k
g Tk 1g k 1
.
(3.25)
В данном случае константа равна отношению квадрата нормы градиента на текущей
к квадрату нормы градиента на предыдущей итерации.
Вновь обратимся к сети, показанной на рис. 3.8, но будем использовать функцию
обучения traincgf:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traincgf');
Функция traincgf характеризуется следующими параметрами, заданными по умолчанию:
net.trainParam
ans =
epochs:
show:
goal:
time:
min_grad:
max_fail:
searchFcn:
scale_tol:
alpha:
beta:
delta:
gama:
low_lim:
up_lim:
maxstep:
minstep:
bmax:
100
25
0
Inf
1.0000e–006
5
'srchcha'
20
0.0010
0.1000
0.0100
0.1000
0.1000
0.5000
100
1.0000e–006
26
Здесь epochs – максимальное количество циклов обучения; show – интервал вывода информации, измеренный в циклах; goal – предельное значение критерия обучения; time – предельное
время обучения; min_grad – минимальное значение градиента; max_fail – максимально допустимый уровень превышения ошибки контрольного подмножества по сравнению с обучаю3. Обучение нейронных сетей
77
щим; searchFcn – имя функции одномерного поиска; scale_tol – коэффициент для вычисления
шага tol процедуры одномерного поиска tol = delta/scale_tol; alpha – коэффициент, определяющий порог уменьшения критерия качества; beta – коэффициент, определяющий выбор шага;
delta – начальный шаг разбиения интервала; gama – параметр, регулирующий изменение критерия качества; low_lim – нижняя граница изменения шага; up_lim – верхняя граница изменения шага; maxstep – максимальное значение шага; minstep – минимальное значение шага;
bmax – максимальное значение шага для процедуры srchhyb.
Установим следующие значения параметров:
net.trainParam.epochs = 300;
net.trainParam.show = 5;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис.3.12
На рис. 3.12 приведен график изменения ошибки обучения в зависимости от числа
выполненных циклов обучения.
Рис. 3.12
a = sim(net,p)
a = –1.0015
–0.9978
0.9999
0.9986
Алгоритм Флетчера – Ривса CGF работает намного быстрее, чем градиентный алгоритм CGM с выбором параметра скорости настройки, а иногда и быстрее, чем алгоритм
Rprop, как в рассматриваемом случае; хотя на практике это зависит от конкретной задачи.
Алгоритмы метода сопряженных градиентов требуют не намного больше памяти, чем
градиентные алгоритмы, поэтому их можно рекомендовать для обучения нейронных
сетей с большим количеством настраиваемых параметров.
Демонстрационная программа nnd12cg иллюстрирует работу алгоритмов минимизации на основе метода сопряженных градиентов.
78
Нейронные сети. MATLAB 6
Алгоритм CGP
Другой вариант алгоритма сопряженного градиента – это алгоритм CGP Полака – Рибейры (Polak – Ribiére) [12, 18]. Для этого алгоритма константа метода k выражается следующим образом:
βk 
g Tk g k
g Tk 1g k 1
.
(3.26)
Таким образом, коэффициент равен скалярному произведению приращения градиента
на текущий градиент, деленному на квадрат нормы градиента на предыдущей итерации.
Вновь обратимся к сети, показанной на рис. 3.7, но будем использовать функцию обучения traincgp:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traincgp');
Функция traincgp характеризуется теми же параметрами, заданными по умолчанию,
что и функция traincgf.
Изменим установку следующих параметров:
net.trainParam.epochs = 300;
net.trainParam.show = 5;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис.3.13
На рис. 3.13 приведен график изменения ошибки обучения в зависимости от числа
выполненных циклов обучения.
Рис. 3.13
a = sim(net,p)
a = –1.0014
–1.0015
0.9977
0.9983
Характеристика сходимости алгоритма CGP во многом похожа на характеристику алгоритма
CGF. На практике трудно предсказать, какой алгоритм лучше применить для решения конкретной
задачи. Однако требования по памяти для алгоритма CGP несколько больше, поскольку требуется
на каждой итерации 4 вектора, в то время как для алгоритма CGF – только 3.
3. Обучение нейронных сетей
79
Алгоритм CGB
Для всех алгоритмов метода сопряженных градиентов направление поиска периодически переустанавливается на направление антиградиента, или, иными словами, выполняется рестарт. Это происходит в тех случаях, когда возникают проблемы со сходимостью.
Например, если количество итераций превысило число настраиваемых параметров сети,
либо возникли иные условия, свидетельствующие о плохой сходимости. Одна из таких
стратегий рестарта реализована в алгоритме CGB, предложенном Биеле (Beale) и Пауэллом (Powell) [2, 33]. Согласно этой стратегии рестарт выполняется, если текущее и предшествующее направления градиентов слабоортогональны, и это условие определяется
следующим образом:
g Tk 1g k  0.2 g k
2
.
(3.27)
Рассмотрим работу этого алгоритма на примере нейронной сети (см. рис. 3.8)
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traincgb');
Функция traincgb характеризуется теми же параметрами, заданными по умолчанию,
что и функция traincgf.
Изменим установку следующих параметров:
net.trainParam.epochs = 300;
net.trainParam.show = 5;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис.3.14
На рис. 3.14 приведен график изменения ошибки обучения в зависимости от числа
выполненных циклов обучения.
Рис. 3.14
a = sim(net,p)
a =
–1.0015
–1.0038
1.0045
1.0004
Характеристики алгоритма CGB в данном случае превосходят показатели сходимости
алгоритма CGP, хотя для другой задачи или других начальных параметров это может оказаться не так. С точки зрения требований к оперативной памяти для алгоритма CGB требуется 6 векторов, в то время как для алгоритма CGP – 4.
80
Нейронные сети. MATLAB 6
Алгоритм SCG
Все рассмотренные выше алгоритмы, основанные на методе сопряженных градиентов, реализуют на каждой итерации процедуру одномерного поиска. Эта дорогостоящая
в вычислительном отношении процедура требует на каждой итерации несколько раз вычислять реакцию сети. Алгоритм SCG, предложенный Моллером (Moller) [29], позволяет
избежать излишних затрат. Этот алгоритм объединяет идеи метода сопряженных градиентов с квазиньютоновыми методами, и в частности использует подход, реализованный в
алгоритме LM Левенберга – Марквардта.
Вновь обратимся к сети, показанной на рис. 3.7, но будем использовать функцию
обучения trainrp:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'trainscg');
Функция trainrp характеризуется следующими параметрами, заданными по умолчанию:
net.trainParam
ans =
epochs: 100
show: 25
goal: 0
time: Inf
min_grad: 1.0000e–006
max_fail: 5
sigma: 5.0000e–005
lambda: 5.0000e–007
Первые 6 параметров рассматривались ранее. Поясним назначение последних двух
параметров; параметр sigma управляет весом аппроксимированной матрицы Гессе, параметр lambda позволяет учесть степень неточности аппроксимации.
Изменим установки некоторых параметров:
net.trainParam.epochs = 300;
net.trainParam.show = 10;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис.3.15
На рис. 3.15 приведен график изменения ошибки обучения в зависимости от числа
выполненных циклов обучения.
3. Обучение нейронных сетей
81
Рис. 3.15
a = sim(net,p)
a = –1.0007
–1.0012
0.9986
1.0018
Алгоритм SCG может потребовать большего числа итераций, чем другие алгоритмы
метода сопряженных градиентов, но при этом количество вычислений на каждой итерации существенно сокращено. Требования по памяти для алгоритма SCG примерно такие
же, как и для метода CGF.
3.3.3. Квазиньютоновы алгоритмы
Алгоритм BFGS
Альтернативой методу сопряженных градиентов для ускоренного обучения нейронных
сетей служит метод Ньютона. Основной шаг этого метода определяется соотношением
x k 1  x k  H k 1g k ,
(3.28)
где x k – вектор настраиваемых параметров; H k – матрица Гессе вторых частных производных функционала ошибки по настраиваемым параметрам; g k – вектор градиента
функционала ошибки. Процедуры минимизации на основе метода Ньютона, как правило,
сходятся быстрее, чем те же процедуры на основе метода сопряженных градиентов.
Однако вычисление матрицы Гессе – это весьма сложная и дорогостоящая в вычислительном отношении процедура. Поэтому разработан класс алгоритмов, которые основаны
на методе Ньютона, но не требуют вычисления вторых производных. Это класс квазиньютоновых алгоритмов, которые используют на каждой итерации некоторую приближенную оценку матрицы Гессе.
Одним из наиболее эффективных алгоритмов такого типа является алгоритм BFGS,
предложенный Бройденом, Флетчером, Гольдфарбом и Шанно (Broyden, Fletcher, Goldfarb
and Shanno) [9]. Этот алгоритм реализован в виде М-функции trainbfg.
Вновь обратимся к сети, показанной на рис. 3.7, но будем использовать функцию
обучения trainbfg:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'trainbfg');
82
Нейронные сети. MATLAB 6
Параметры функции trainbfg практически совпадают с параметрами функции traincgf,
за исключением используемой программы одномерного поиска, которая в данном случае
заменена М-функцией srchbac.
Установим параметры обучающей процедуры по аналогии с предшествующими примерами:
net.trainParam.epochs = 300;
net.trainParam.show = 5;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис.3.16
На рис. 3.16 приведен график изменения ошибки в зависимости от числа выполненных
циклов обучения.
Рис. 3.16
a = sim(net,p)
a = –1.0011
–1.0001
0.9999
1.0003
Алгоритм BFGS требует большего количества вычислений на каждой итерации
и большего объема памяти, чем алгоритмы метода сопряженных градиентов, хотя, как
правило, он сходится на меньшем числе итераций. Требуется на каждой итерации хранить
оценку матрицы Гессе, размер которой определяется числом настраиваемых параметров
сети. Поэтому для обучения нейронных сетей больших размеров лучше использовать алгоритм Rprop или какой-либо другой алгоритм метода сопряженных градиентов. Однако
для нейронных сетей небольших размеров алгоритм BFGS может оказаться эффективным.
Алгоритм OSS
Алгоритм OSS (One Step Secant), или одношаговый алгоритм метода секущих плоскостей, описан в работе Баттити (Battiti) [1]. В нем сделана попытка объединить идеи метода
сопряженных градиентов и схемы Ньютона. Алгоритм не запоминает матрицу Гессе, полагая ее на каждой итерации равной единичной. Это позволяет определять новое направление поиска не вычисляя обратную матрицу.
Вновь обратимся к сети, показанной на рис. 3.7, но будем использовать функцию обучения trainoss:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'trainoss');
3. Обучение нейронных сетей
83
Функция trainoss характеризуется теми же параметрами, заданными по умолчанию,
что и функция trainbfg.
Установим параметры обучающей процедуры по аналогии с предшествующими примерами:
net.trainParam.epochs = 300;
net.trainParam.show = 5;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net=train(net,p,t); % Рис.3.17
На рис. 3.17 приведен график изменения ошибки обучения в зависимости от числа
выполненных циклов обучения.
Рис. 3.17
a = sim(net,p)
a = –1.0020
–0.9988
0.9994
1.0002
Этот алгоритм требует меньших объемов памяти и вычислительных ресурсов на цикл
по сравнению с алгоритмом BFGS, но больше, чем алгоритм CGF. Таким образом, алгоритм OSS может рассматриваться как некий компромисс между алгоритмами методов
сопряженных градиентов и Ньютона.
Алгоритм LM
Алгоритм LM Левенберга – Марквардта [17] реализует следующую стратегию для
оценки матрицы Гессе. В предположении, что функционал определяется как сумма квадратов ошибок, что характерно при обучении нейронных сетей с прямой передачей, гессиан может быть приближенно вычислен как
H  JT J ,
а градиент рассчитан по формуле
g  JT e ,
(3.29)
(3.30)
где J  J – матрица Якоби производных функционала ошибки по настраиваемым параW
метрам; e – вектор ошибок сети. Матрица Якоби может быть вычислена на основе стандартного метода обратного распространения ошибки, что существенно проще вычисления
матрицы Гессе.
84
Нейронные сети. MATLAB 6
Алгоритм LM использует аппроксимацию гессиана следующего вида:

x k 1  x k  J T J  μI

1
JT ek .
(3.31)
Когда коэффициент  равен 0, мы получаем метод Ньютона с приближением гессиана
в форме (3.29); когда значение  велико, получаем метод градиентного спуска с маленьким шагом. Поскольку метод Ньютона имеет большую точность и скорость сходимости
вблизи минимума, задача состоит в том, чтобы в процессе минимизации как можно быстрее перейти к методу Ньютона. С этой целью параметр  уменьшают после каждой
успешной итерации и увеличивают только тогда, когда пробный шаг показывает, что
функционал ошибки возрастает. Такая стратегия обеспечивает уменьшение ошибки после
каждой итерации алгоритма.
Вновь обратимся к сети, показанной на рис. 3.8, но будем использовать функцию обучения trainlm:
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'trainlm');
Функция trainlm характеризуется следующими параметрами, заданными по умолчанию:
net.trainParam
ans =
epochs:
goal:
max_fail:
mem_reduc:
min_grad:
mu:
mu_dec:
mu_inc:
mu_max:
show:
time:
100
0
5
1
1.0000e–010
0.0010
0.1000
10
1.0000e+010
25
Inf
В этом перечне появилось несколько новых параметров. Параметр mu – начальное значение для коэффициента . Это значение умножается либо на коэффициент mu_dec, когда
функционал ошибки уменьшается, либо на коэффициент mu_inc, когда функционал ошибки
возрастает. Если mu превысит значение mu_max, алгоритм останавливается. Параметр
mem_reduc позволяет экономить объем используемой памяти, что обсуждается ниже.
Установим параметры обучающей процедуры по аналогии с предшествующими
примерами:
net.trainParam.epochs = 300;
net.trainParam.show = 5;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис.3.18
На рис. 3.18 приведен график изменения ошибки обучения в зависимости от числа
выполненных циклов обучения.
3. Обучение нейронных сетей
85
Рис. 3.18
a = sim(net,p)
a = –1.0000
–0.9998
1.0000
0.9999
Как видим, здесь потребовалось всего 3 цикла обучения. Этот алгоритм, видимо,
является самым быстродействующим и пригоден для обучения больших нейронных сетей
с несколькими сотнями настраиваемых параметров. Этот алгоритм имеет очень эффективную реализацию в системе MATLAB, являющейся интерпретатором векторной машины, где операция скалярного произведения реализуется с высокой точностью и быстродействием на математическом сопроцессоре компьютера. Поэтому достоинства алгоритма
Левенберга – Марквардта становятся еще более ощутимыми при работе в среде системы
MATLAB.
Демонстрационный пример nnd12m иллюстрирует применение алгоритма LM.
Экономия памяти. Главный недостаток алгоритма LM состоит в том, что он требует
памяти для хранения матриц больших размеров. Например, размер матрицы Якоби составляет Qn, где Q – число обучающих наборов и n – число параметров сети. Это означает, что при оценке гессиана согласно соотношению (3.28) потребуются значительные ресурсы для ее хранения и вычисления. Как это часто делается при работе с матрицами,
выполним ее декомпозицию, т. е. представим ее в виде разбиения на несколько подматриц. Допустим, что выделены 2 подматрицы; тогда соотношение (3.28) может быть записано в виде:
J T 
J T J J 1T J 2 
(3.32)
H  J T J   1T  J 1 J 2    1T 1
.
T
J
J
J
J
J
2 2
 2
 2 1
В этом случае уже не требуется хранить полную матрицу Якоби, а оценка гессиана
может быть вычислена с использованием подматриц меньших размеров. Причем в процессе формирования матрицы Гессе использованные подматрицы могут быть удалены
из оперативной памяти.
При применении М-функции trainlm с помощью параметра mem_reduc можно указывать,
на какое число подматриц разбивается исходная матрица. Если параметр mem_reduc равен 1,
то используется полная матрица Якоби; если mem_reduc = 2, то матрица Якоби разбивается
86
Нейронные сети. MATLAB 6
по строкам на 2 части и сначала обрабатывается одна половина, а затем вторая. Это экономит
половину объема памяти, требуемой для вычисления полного якобиана. Что же касается
быстродействия, то оно будет частично потеряно. И если вам доступна достаточная оперативная память, то лучше устанавливать параметр mem_reduc равным 1. Это особо касается системы MATLAB, которая позволяет извлечь все преимущества при использовании математического сопроцессора. Если же все-таки имеющаяся память оказалась исчерпанной, то следует
назначить параметр mem_reduc равным 2 и выполнить расчеты заново. Если и при этом памяти
не будет достаточно, следует еще увеличить значение этого параметра.
3.3.4. Алгоритмы одномерного поиска
Рассмотренные выше алгоритмы оптимизации являются стратегиями, которые обеспечивают минимизацию функционала обучения. В процессе работы этих алгоритмов, как правило,
возникает задача одномерного поиска минимума вдоль заданного направления. Это могут
быть направления антиградиента или сопряженные направления. В рамках ППП Neural
Network Toolbox используется 5 функций одномерного поиска. При работе того или иного
алгоритма они задаются параметром srchFcn, который определяет имя функции поиска.
Для многих процедур эта функция задается по умолчанию, но она может быть изменена
по желанию пользователя при определении процедуры обучения нейронной сети.
Алгоритм GOL
Алгоритм GOL, или алгоритм золотого сечения [18], реализуемый с помощью функции srchgol, выполняет одномерный поиск минимума функции с помощью последовательного перебора, и это не требует вычисления производной. В первую очередь алгоритм
определяет интервал, в котором находится минимум целевой функции. Это достигается
путем вычисления последовательности точек с интервалом delta и последующим удвоением этого интервала на каждом шаге вдоль направления поиска. Если целевая функция
между двумя последовательными шагами начинает возрастать, то интервал, в котором
находится минимум, найден. Следующий шаг состоит в уменьшении размера интервала,
содержащего минимум. Для этого используется принцип половинного деления. Соответствующая процедура продолжается до тех пор, пока интервал неопределенности
не уменьшится до величины tol, равной delta/scale_tol.
Демонстрационная программа nnd12sd1 иллюстрирует одномерный поиск минимума
функции методом золотого сечения в сочетании с алгоритмом градиентного спуска GD.
Алгоритм BRE
Алгоритм BRE, или алгоритм Брента (Brent) [3], – это алгоритм одномерного поиска,
который является комбинацией метода золотого сечения и квадратичной интерполяции.
Методы последовательного перебора, подобные методу золотого сечения, имеют скорость
сходимости первого порядка, в то время как полиномиальные методы интерполяции имеют асимптотическую скорость сходимости более высокую, чем линейная. С другой стороны, сходимость метода золотого сечения носит глобальный характер, т. е. обеспечивается на любом шаге работы алгоритма, в то время как сходимость метода полиномиальной интерполяции является лишь локальной (асимптотической) и может потребовать
3. Обучение нейронных сетей
87
выполнения большого числа итераций. Метод Брента направлен на то, чтобы объединить
лучшие свойства обоих методов.
Одномерный поиск по методу Брента начинается с использования алгоритма золотого
сечения, но при этом вычисляются некоторые дополнительные точки. По этим точкам
рассчитывается аппроксимирующая квадратичная функция и вычисляется ее минимум.
Если этот минимум находится в пределах исследуемого интервала, то он используется для
уточнения квадратичной аппроксимации в пределах этого же интервала. Если минимум
находится за пределами интервала, то продолжается поиск методом золотого сечения.
Алгоритм имеет то преимущество, что не требует вычисления производной, поскольку это требует больших вычислительных ресурсов. Однако общее число точек, в которых
требуется вычисление целевой функции, может оказаться большим, чем в алгоритмах,
которые используют информацию о производной этой функции.
В рамках ППП Neural Network Toolbox этот алгоритм реализован в виде М-функции scrchbre.
Алгоритм HYB
Алгоритм HYB – это гибридный алгоритм, подобный алгоритму BRE, но использует
другую комбинацию методов, а именно метод половинного деления и кубическую интерполяцию [41]. Алгоритм метода половинного деления предполагает вычисление целевой
функции и ее производной в срединной точке исследуемого интервала, и это позволяет
отбросить одну из половин. Таким образом организуется процедура последовательного
перебора, которая обеспечивает глобальную сходимость, но характеризуется лишь линейной скоростью. Кубическая интерполяция строится с использованием значений целевой
функции и ее производной в конечных точках интервала. Если минимум аппроксимирующей функции попадает в исследуемый интервал, то он используется для уточнения кубической аппроксимации в пределах этого же интервала. Если минимум находится
за пределами интервала, то продолжается поиск методом золотого сечения. В противном
случае используется алгоритм половинного деления.
Следует заметить, что алгоритм HYB требует вычисления производных, и это приводит
к большему объему вычислений на каждом шаге по сравнению с алгоритмами GOL или BRE.
В рамках ППП Neural Network Toolbox этот алгоритм реализован в виде М-функции scrchhyb.
Алгоритм CHA
Алгоритм CHA, или алгоритм Чараламбуса (Charalambous) [8], – это специальный
алгоритм одномерного поиска, разработанный для обучения нейронных сетей на основе
алгоритма градиентного спуска GD. Подобно двум предшествующим алгоритмам он
реализует гибридный метод поиска и использует кубическую интерполяцию в сочетании
с методом деления интервала на части.
Этот алгоритм используется по умолчанию для большинства алгоритмов метода сопряженного градиента, так как опыт показал, что он обеспечивает прекрасные результаты
при решении практических задач. Алгоритм требует вычисления производной в дополнение к вычислению самого функционала ошибки, однако он организован таким образом,
что локализует минимум за меньшее количество шагов. Это справедливо не для всех задач, встречающихся на практике, и тогда пользователь может обратиться к другим алгоритмам одномерного поиска.
В рамках ППП Neural Network Toolbox этот алгоритм реализован в виде М-функции srchcha.
88
Нейронные сети. MATLAB 6
Алгоритм BAC
Алгоритм BAC, или алгоритм перебора с возвратами [9], – это наилучший алгоритм
одномерного поиска для квазиньютоновых алгоритмов минимизации. Он начинает работать с вектором приращений настраиваемых параметров, найденным в алгоритме минимизации, т. е. реализует одномерный поиск в направлении настройки параметров сети.
Выбор шага поиска в этом направлении регулируется параметром lambda, который первоначально устанавливается равным 1. На первой итерации алгоритм использует значение
целевой функции и ее производной, чтобы построить квадратичную аппроксимацию целевой функции вдоль направления поиска. Минимум этой аппроксимирующей функции
выбирается в качестве приближения к оптимальной точке и затем оценивается функционал ошибки в этой точке. Если значение функционала недостаточно мало, то строится
кубическая интерполяция и ее минимум выбирается в качестве новой оптимальной точки.
Этот процесс продолжается до тех пор, пока не будет достигнуто существенное уменьшение функционала ошибки.
В рамках ППП Neural Network Toolbox этот алгоритм реализован в виде М-функции
srchbac. Эта функция используется по умолчанию при работе с квазиньютоновыми алгоритмами минимизации, хотя она и не всегда может оказаться наилучшей при решении
конкретной практической задачи.
3.3.5. Расширение возможностей процедур обучения
Очень трудно определить, какой обучающий алгоритм будет самым быстрым при решении той или иной практической задачи. Это зависит от многих факторов, включая
сложность задачи, число элементов обучающего множества, число настраиваемых параметров сети и конечную ошибку. Вообще говоря, для сетей, которые содержат до нескольких сотен параметров, алгоритм LM имеет самую быструю сходимость. Это преимущество особенно значимо, если требуется высокая точность обучения. Алгоритмы
методов Ньютона и секущих плоскостей занимают следующее место для нейронных сетей
умеренных размеров. Алгоритм BFGS требует значительного объема памяти для хранения
матрицы Гессе, но при этом значительно превосходит по быстродействию алгоритмы метода сопряженных градиентов.
Среди алгоритмов метода сопряженных градиентов алгоритм CGB Пауэлла – Биеле
требует наибольших объемов памяти, но обычно имеет самую быструю сходимость.
Алгоритмы Rprop и SCG не требуют использования процедур одномерного поиска
и предъявляют незначительные требования к памяти. Они работают достаточно быстро
и могут быть рекомендованы для решения задач большой размерности. Алгоритм CGS
с переменным параметром скорости настройки обычно работает намного медленнее других алгоритмов и требует приблизительно столько же памяти, как алгоритм Rprop, но при
решении некоторых практических задач он может оказаться весьма полезным, поскольку
возникают ситуации, когда оказываются предпочтительными алгоритмы с медленной
сходимостью, например при использовании стратегии прерывания.
При решении практических задач рекомендуется начинать с алгоритма LM. Если при
этом требуется слишком много памяти, то следует перейти к алгоритму BFG или одному
из алгоритмов метода сопряженных градиентов. Алгоритм Rprop также характеризуется
высоким быстродействием и предъявляет относительно малые требования к объему
используемой памяти.
3. Обучение нейронных сетей
89
Табл. 3.1 иллюстрирует характеристики различных алгоритмов при решении с помощью нейронных сетей одной частной задачи регрессионного анализа.
Таблица 3.1
М-функция
ППП
traingds
trainrp
trainscg
traincgf
traincgp
traincgb
trainoss
trainbfg
trainlm
Алгоритм
GDS
Rprop
SCG
CGF
CGP
CGB
OSS
BFGS
LM
Время, с
Циклы
обучения
Число операций, Mflops
57.71
12.95
16.06
16.40
16.16
15.03
18.46
10.86
1.87
980
185
106
81
89
74
101
44
6
2.50
0.56
0.70
0.99
0.75
0.59
0.75
1.02
0.46
Сеть типа 1–10–1, имеющая 1 вход, 10 скрытых нейронов и 1 выход, обучалась с использованием последовательности из 41 элемента, представляющих пары вход – целевой
выход, пока не была достигнута среднеквадратичная погрешность обучения, равная 0.01.
Для каждого алгоритма обучения было выполнено 20 прогонов, чтобы получить усредненные показатели, приведенные в таблице. Рассматривать эти показатели надо весьма
осторожно, поскольку приведенные данные относятся к конкретной задаче и могут существенно измениться при решении какой-либо другой задачи.
Обратите внимание, что нет прямой связи между количеством операций с плавающей
точкой и временем выполнения алгоритма. Это связано с тем, что некоторые алгоритмы
используют особые приемы при реализации встроенных функций системой MATLAB.
Это в первую очередь касается реализации алгоритма LM.
Переобучение
Одно из явлений, которое наблюдается в процессе обучения нейронных сетей, – это
явление переобучения. Оно заключается в том, что ошибки обучения на элементах обучающего множества оказываются очень малыми, но когда сети представляются новые
данные, то погрешность существенно возрастает. Это означает, что сеть заучила примеры,
но не научилась решать задачу, т. е. приспосабливаться к новым данным.
Рассмотрим нейронную сеть типа 1–30–1 с одним входом, 30 скрытыми нейронами
и одним выходом, которую необходимо обучить аппроксимировать функцию синуса, если
заданы ее приближенные значения, которые получены как сумма значений синуса и случайных величин, распределенных по нормальному закону:
net = newff([–1 1],[30,1],{'tansig','purelin'},'trainbfg');
net.trainParam.epochs = 300;
net.trainParam.show = 50;
net.trainParam.goal = 1e–5;
p = [–1:0.05:1];
t = sin(2*pi*p)+0.1*randn(size(p)); % Возмущенные значения функции
t1 = sin(2*pi*p); % Обучающая последовательность
[net,tr] = train(net,p,t); % Рис.3.19
90
Нейронные сети. MATLAB 6
На рис. 3.19 приведен график изменения ошибки обучения в зависимости от числа
циклов обучения.
Рис. 3.19
Для того чтобы убедиться, что в данном случае мы сталкиваемся с явлением переобучения, построим графики аппроксимируемой функции, ее приближенных значений и результата аппроксимации (рис. 3.20):
an = sim(net,p); % Значения аппроксимирующей функции
plot(p,t,'+',p,an,'–',p,t1,':') % Рис.3.20
Рис. 3.20
Анализ сигналов на рис. 3.20 показывает, что построенная нейронная сеть действительно точно отслеживает входной сигнал, но не восстанавливает функцию синуса.
Один из способов исправить ситуацию заключается в том, чтобы использовать сеть
с меньшим числом нейронов, т. е. меньшей мощности, которая не могла бы точно воспроизводить на выходе входной сигнал. Демонстрационный пример nnd11gn иллюстрирует,
3. Обучение нейронных сетей
91
как количество скрытых нейронов влияет на точность обучения сети при аппроксимации
сигналов разной сложности; там же вы сможете наблюдать явление переобучения, которое при аппроксимации сигналов небольшой сложности можно предотвратить за счет сокращения числа скрытых нейронов.
К сожалению, заранее трудно предсказать, насколько мощной должна быть сеть для
конкретного приложения. Поэтому рассмотрим 2 регулярных подхода, которые позволяют преодолеть явление переобучения.
Метод регуляризации
Первый подход связан с использованием метода регуляризации, предложенного
в 1963 г. российским математиком А. Н. Тихоновым [50]. Суть этого метода заключается
в том, чтобы видоизменить функционал качества таким образом, чтобы он всегда имел минимум и положение этого минимума непрерывно зависело от параметра регуляризации.
Модификация функционала качества. Типичный функционал качества, который используется при обучении нейронных сетей с прямой передачей, – это функционал средней
суммы квадратов ошибки обучения
mse 
1
N
N
 ( ei ) 2 
i 1
1
N
N
 (t
i 1
i
 ai ) 2 .
(3.33)
Если модифицировать функционал добавлением слагаемого вида
msw 
1
n
n
 w2j ,
(3.34)
j 1
то это будет означать, что большие значения настраиваемых параметров при обучении
сети будут существенно штрафоваться, а это вынудит реакцию сети быть более гладкой и
снизит вероятность возникновения явления переобучения.
Введем параметр регуляризации  и построим следующий регуляризирующий функционал:
msereg  γ mse  (1 - γ) msw.
(3.35)
Рассмотрим нейронную сеть типа 1–5–1 с одним входом, пятью скрытыми нейронами
и одним выходом. Эта сеть использует те же типы нейронов, что и предыдущая сеть, но
количество скрытых нейронов в 6 раз меньше, предельное количество циклов обучения
сокращено до 100, а параметр регуляризации равен 0.9998.
net = newff([–1 1],[5,1],{'tansig','purelin'},'trainbfg');
net.trainParam.epochs = 100;
net.trainParam.show = 50;
net.trainParam.goal = 1e–5;
net.performFcn = 'msereg';
net.performParam.ratio = 0.9998;
p = [–1:0.05:1];
t = sin(2*pi*p)+0.1*randn(size(p)); % Возмущенные значения функции
t1 = sin(2*pi*p); % Обучающая последовательность
[net,tr] = train(net,p,t); % Рис.3.21,а
an = sim(net,p); % Значения аппроксимирующей функции
plot(p,t,'+',p,an,'–',p,t1,':') % Рис.3.21,б
92
Нейронные сети. MATLAB 6
На рис. 3.21, а показан график изменения ошибки обучения, из которого следует, что
ошибка обучения составляет величину порядка 0.01; на рис. 3.21, б показаны результаты
аппроксимации, из которых следует, что при использовании пяти нейронов в скрытом
слое переобучение не наблюдается, кривая выхода аппроксимирует функцию синуса,
но точность аппроксимации недостаточна.
а
б
Рис. 3.21
Сложность применения метода регуляризации состоит в том, что очень трудно определить оптимальное значение параметра регуляризации и количество требуемых нейронов. Ниже представлен алгоритм, который позволяет автоматически установить параметр
регуляризации.
Автоматическая регуляризация. Автоматический выбор параметра регуляризации может быть реализован на основе правила Байеса. Этот подход был предложен Д. МакКейем (D. MacKay) [27] и состоит в том, что веса и смещения сети рассматриваются как
случайные величины с известным законом распределения. Параметр регуляризации связан с дисперсией этого распределения и может быть оценен с использованием статистических методов. Детальное описание процедуры регуляризации с использованием правила
Байеса и алгоритма Левенберга – Марквардта можно найти в работе [11]. Соответствующая процедура реализована в виде М-функции trainbr.
Вновь обратимся к нейронной сети типа 1–20–1, предназначенной для решения задачи
аппроксимации функции синуса.
net = newff([–1 1],[20,1],{'tansig','purelin'},'trainbr');
Функция trainbr характеризуется следующими параметрами, заданными по умолчанию:
net.trainParam
ans =
epochs:
show:
goal:
time:
min_grad:
max_fail:
mem_reduc:
mu:
100
25
0
Inf
1e–010
5
1
0.005
3. Обучение нейронных сетей
93
mu_dec: 0.1
mu_inc: 10
mu_max: 1e+010
Этот список соответствует списку параметров М-функции trainlm.
Установим следующие значения этих параметров:
net = newff([–1 1],[20,1],{'tansig','purelin'},'trainbr');
net.trainParam.epochs = 50;
net.trainParam.show = 10;
randn('seed',192736547);
p = [–1:.05:1];
t = sin(2*pi*p)+0.1*randn(size(p));
net = init(net);
net = train(net,p,t); % Рис.3.22
Рис. 3.22
На рис. 3.22 показаны изменения суммы квадратов ошибок и весов, а также оптимальное количество настраиваемых параметров нейронной сети. В данном случае после
обучения используется приблизительно 18 – из общего числа 61 – параметров сети типа
1–20–1.
Построим графики исследуемых функций:
an = sim(net,p); % Значения аппроксимирующей функции
t1 = sin(2*pi*p); % Значения аппроксимируемой функции
plot(p,t,'+',p,an,'–',p,t1,':') % Рис. 3.23
Рис. 3.23 иллюстрирует реакцию построенной нейронной сети при решении задачи
аппроксимации. В отличие от рис. 3.19, на котором видно, что в сети существует переобучение, здесь мы видим, что реакция сети близка к основной функции синуса. Следовательно, сеть хорошо приспособлена к новым входам. Можно попробовать реализовать
более мощную исходную сеть, но при этом в реакции сети никогда не будет проявляться
эффект переобучения. Таким образом, процедура обучения trainbr представляет собой
некоторую регулярную процедуру для определения оптимального числа настраиваемых
параметров и, как следствие, оптимального размера сети.
94
Нейронные сети. MATLAB 6
Рис. 3.23
Формирование представительной выборки
Другой способ преодоления эффекта переобучения связан с организацией целенаправленной процедуры прерывания обучения. Для этого из исходных данных выделяется
3 подмножества. Первое – обучающее подмножество (training set), второе – контрольное
подмножество (validation set) и третье – тестовое подмножество (test set). Обучающее
подмножество используется для настройки параметров сети; контрольное подмножество
используется в течение всего процесса обучения для того, чтобы контролировать представительность используемой выборки. Как правило, ошибка для контрольного подмножества на начальной фазе обучения уменьшается, так же как и ошибка для обучающего подмножества. Однако когда ошибка для контрольного подмножества начинает увеличиваться, это означает, что в сети начал проявляться эффект переобучения. В этом случае
фиксируется итерация, на которой ошибка для контрольного подмножества была минимальной, и восстанавливаются соответствующие значения настраиваемых параметров
сети. Соответствующая длина выборки признается представительной.
Ошибка для тестового подмножества обычно не используется в процессе обучения,
а применяется для сравнения различных моделей. Однако полезно рассчитывать погрешность для тестового подмножества в течение всего процесса обучения. Если соответствующая ошибка достигает минимума при ином числе итераций, чем для контрольного подмножества, то это может указывать на неудачное выделение подмножеств из набора
исходных данных.
Процедура прерывания обучения может быть реализована с любой из обучающих
функций, описанных ранее. Для этого просто следует передать информацию о признании
выборки представительной самой обучающей функции. Следующая последовательность
операторов показывает, как организовать процедуру прерывания обучения.
Вновь обратимся к задаче аппроксимации функции синуса. Сформируем обучающее
подмножество на интервале входных значений от –1 до 1 с шагом 0.05 в виде суммы
функции синуса и погрешности, описываемой случайной величиной, распределенной
по нормальному закону с дисперсией 0.01:
p = [–1:0.05:1];
t = sin(2*pi*p)+ 0.1*randn(size(p));
3. Обучение нейронных сетей
95
Затем сформируем контрольное подмножество. Определим входы в диапазоне
от –0.975 до 0.975 и, чтобы сделать задачу более реалистичной, добавим некоторую помеху, распределенную по нормальному закону:
v.P = [–0.975:.05:0.975];
v.T = sin(2*pi*v.P)+0.1*randn(size(v.P));
Тестовое подмножество в данном примере не используется.
Вновь сформируем нейронную сеть типа 1–20–1 и обучим ее. Обратите внимание, что
контрольное подмножество в виде массива структуры передается функции обучения
в качестве шестого входного параметра. В данном случае используется обучающая функция traingdx, хотя может быть применена и любая другая функция обучения.
net = newff([–1 1],[20,1],{'tansig','purelin'},'traingdx');
net.trainParam.epochs = 300;
net.trainParam.show = 25;
net = init(net);
[net,tr] = train(net,p,t,[],[],v); % Рис.3.24
Анализ рис. 3.24 показывает, что ошибка контрольного подмножества превысила
ошибку обучающего подмножества вблизи 70-й итерации и далее эта ошибка постоянно
превышала ошибку обучающего подмножества, пока на 141-й итерации их отношение
не превысило величину maxfail, по умолчанию равную 5, и произошло прерывание процедуры обучения.
Рис. 3.24
Построим графики исследуемых функций (рис. 3.25):
an = sim(net,p); % Значения аппроксимирующей функции
t1 = sin(2*pi*p); % Значения аппроксимируемой функции
plot(p,t,'+',p,an,'–',p,t1,':')% Рис.3.25
96
Нейронные сети. MATLAB 6
Рис. 3.25
Из анализа рис. 3.25 следует, что в сети отсутствует эффект переобучения, хотя реакция
на выходе сети не такая гладкая, как при использовании метода регуляризации (рис. 3.23).
Предварительная обработка и восстановление данных
Вычислительная процедура обучения нейронной сети связана с проведением больших
объемов вычислений с данными, диапазоны изменения которых могут существенно различаться и которые имеют случайные разбросы, обусловленные погрешностью их измерения
или задания. Поскольку обработка таких данных выполняется на компьютерах, имеющих
ограниченный диапазон представления чисел и ограниченную точность выполнения операций
умножения и алгебраического сложения в арифметике с плавающей точкой, то необходимо
предпринять определенные меры, чтобы такая обработка не привела к потере точности.
Для этого осуществляется предварительная обработка данных с целью привести значения
элементов обучающего множества к определенному диапазону (масштабирование данных),
ограничить разброс случайных величин (нормировка данных), избавиться от несущественных
данных (факторный анализ). Поскольку эти операции являются вспомогательными и связаны
только с особенностями вычислений, то необходимо предусмотреть восстановление масштабов данных на выходе нейронной сети. Все это направлено на то, чтобы обеспечить достоверность вычислений, повысить точность обучения и в конечном счете обеспечить эффективность функционирования проектируемой нейронной сети.
Для этой цели в составе ППП Neural Network Toolbox предусмотрены следующие М-функции для предварительной подготовки и восстановления данных при обучении нейронных сетей:
Операция
Обработка обучающего
множества
Масштабирование
Нормировка
Факторный анализ
Регрессионный анализ
Обработка выходных данных
Обработка входных данных
premnmx
postmnmx
tramnmx
prestd
poststd
trastd
prepca
–
–
postreg
trapca
–
Масштабирование. Перед тем как начинать процедуру обучения, бывает полезно провести масштабирование векторов входа и целей так, чтобы их элементы оказались в определенном интервале значений. В частности, М-функция premnmx предназначена для приведения данных к интервалу [–1 1].
3. Обучение нейронных сетей
97
% Масштабирование входов и целей
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t);
net = train(net,pn,tn); % Обучение сети
Входными параметрами этой функции являются массивы p и t, соответствующие входам и
целевым выходам. Элементы выходных массивов pn и tn имеют значения в интервале [–1 1].
Векторы minp и maxp включают минимальные и максимальные значения исходных векторов
входа, а векторы mint и maxt – минимальные и максимальные значения исходных векторов целей. После завершения процедуры обучения эти векторы используются для масштабирования
векторов входов и целей, подаваемых на вход сети. Эти параметры становятся неотъемлемой
частью параметров, определяющих сеть, как, например, ее веса и смещения.
Если выполнено масштабирование входов и целей с использованием М-функции
premnmx, то выходы сети будут иметь значения в интервале [–1 1]. Для приведения
вектора выхода к исходным единицам измерения используется М-функция postmnmx.
Ее следует применять после того, как выполнено моделирование сети:
an = sim(net,pn); % Моделирование сети с масштабированным входом
a = postmnmx(an,mint,maxt); % Восстановление исходного масштаба
Если функция масштабирования premnmx использовалась для обучения сети, то при
последующей работе с такой сетью необходимо масштабировать новые входные последовательности, используя М-функцию tramnmx:
pnewn = tramnmx(pnew,minp,maxp); % Масштабирование поступающих входов
anewn = sim(net,pnewn); % Моделирование сети
anew = postmnmx(anewn,mint,maxt); % Восстановление исходного масштаба
Нормировка. В тех случаях, когда обучающее множество включает случайные величины,
распределенные по нормальному закону, приведение элементов к единому масштабу
связано с процедурой нормировки данных с использованием величин среднего значения
и стандартного отклонения. Эта процедура выполняется с помощью М-функции prestd,
которая нормирует входы и цели так, чтобы они имели среднее значение, равное 0,
и стандартное отклонение, равное 1.
[pn,meanp,stdp,tn,meant,stdt] = prestd(p,t);
Входными параметрами этой функции являются массивы p и t, соответствующие входам и целевым выходам. Элементы выходных массивов pn и tn будут иметь среднее значение, равное 0, и стандартное отклонение, равное 1. Векторы meanp и stdp включают
средние значения и стандартные отклонения исходных векторов входа, а векторы meant
и stdt – средние значения и стандартные отклонения исходных векторов целей. После завершения процедуры обучения эти векторы используются для масштабирования векторов
входов и целей, подаваемых на вход сети. Эти величины становятся неотъемлемой частью
параметров, определяющих сеть, как, например, ее веса и смещения.
Если выполнено масштабирование входов и целей с использованием М-функции
prestd, то выходы сети будут нормированы так, что их среднее значение равно 0, а стандартное отклонение – 1. Для приведения вектора выхода к исходным единицам измерения
используется М-функция poststd. Ее следует применять после того, как выполнено моделирование сети:
an = sim(net,pn); % Моделирование сети с нормированным входом
a = poststd(an,meant,stdt); % Восстановление исходных единиц измерения
98
Нейронные сети. MATLAB 6
Если функция нормировки prestd использовалась для обучения сети, то при последующей работе с такой сетью необходимо нормировать новые входные последовательности,
используя М-функцию trastd:
pnewn = trastd(pnew,meanp,stdp); % Нормировка векторов входа
anewn = sim(net,pnewn); % Моделирование сети
% Восстановление исходных единиц измерения
anew = poststd(anewn,meant,stdt);
Факторный анализ. Во многих случаях, когда векторы входа содержат большое число
элементов, они оказываются коррелированными, т. е. взаимосвязанными между собой,
и, следовательно, избыточными для процедур обучения. В этом случае полезно сократить
размеры векторов входа. Для этого применяется процедура статистической обработки, называемая факторным анализом. При применении этой процедуры решаются 3 задачи:
 выполняется ортогонализация векторов входа, что исключает их взаимную корреляцию;
 выполняется упорядочение векторов обучающего множества так, чтобы векторы,
охватывающие большой диапазон значений, были первыми (главные компоненты);
 удаляются векторы, диапазон значений которых незначителен.
Для реализации процедуры факторного анализа предназначена М-функция prepca:
[pn,meanp,stdp] = prestd(p);% Нормализация вектора входа
[ptrans,transMat] = prepca(pn, 0.02);
% Устранение векторов входа, вклад которых не превышает 2 проц.
В последовательности этих операторов сначала выполняется нормировка векторов
входа, затем проводится факторный анализ. Второй аргумент функции prepca равен 0.02,
что означает устранение тех главных компонентов, вклад которых составляет менее 2 %.
Массив ptrans содержит преобразованные векторы входа; матрица transMat является матрицей преобразования в главные компоненты. После обучения сети эта матрица должна
быть использована для предварительного преобразования векторов входа. Она становится
такой же неотъемлемой частью параметров сети, как ее веса и смещения. Если умножить
нормированные векторы входа pn на матрицу преобразования transMat, то получим вектор
ptrans с упорядоченными главными компонентами.
Если функция prepca использовалась для предварительной обработки множества
обучающих данных, то всякий раз, когда обученная сеть используется с новыми входами,
они должны быть соответствующим образом преобразованы. Это реализуется с помощью
М-функции trapca:
pnewn = trastd(pnew,meanp,stdp); % Нормировка векторов входа
pnewtrans = trapca(pnewn,transMat);
a = sim(net,pnewtrans); % Моделирование сети
Регрессионный анализ. В определенной степени качество обучения нейронной сети может
быть оценено ошибками обучения, контроля и тестирования, но этого может оказаться
недостаточно и требуется более детальный анализ. Один из возможных подходов – это
регрессионный анализ выходов сети и соответствующих целей. В составе ППП Neural
Network Toolbox для этих целей предназначена М-функция postreg.
Следующая последовательность операторов поясняет, как можно выполнить регрессионный анализ для сети, построенной на основе процедуры с прерыванием обучения:
3. Обучение нейронных сетей
99
p = [–1:0.05:1];
t = sin(2*pi*p)+ 0.1*randn(size(p));
v.P = [–0.975:.05:0.975];
v.T = sin(2*pi*v.P)+0.1*randn(size(v.P));
net = newff([–1 1],[20,1],{'tansig','purelin'},'traingdx');
net.trainParam.show = 25;
net.trainParam.epochs = 300;
net = init(net);
[net,tr]=train(net,p,t,[],[],v);
a = sim(net,p); % Моделирование сети
figure(2)
[m,b,r] = postreg(a,t)
m = 0.99278
b = 0.0064888
r = 0.99579
Выход сети и вектор целей передаются в качестве входных аргументов функции postreg,
а она возвращает параметры регрессии: первые два – m и b – определяют наклон и смещение
линии регрессии в координатах цель-выход, третий – r – коэффициент корреляции. Если выходы точно равняются целям, то наклон должен быть равен 1, а смещение 0. В рассматриваемом примере можно видеть, что эти параметры действительно весьма точно отражают линейную регрессию. Коэффициент корреляции близок к 1, что указывает на существенную
корреляцию между выходами и целями, т. е. малые изменения цели будут адекватно отражаться в выходах нейронной сети, что является характеристикой ее высокого качества.
а
б
Рис. 3.26
На рис. 3.26, а и б показаны соответственно результаты обучения и результаты
регрессионного анализа нейронной сети, предназначенной для аппроксимации функций.
Выходы сети обозначены кружками; наилучшая подгонка – пунктирной, а точная –
сплошной линией. В данном случае трудно отличить наилучшую подгонку от точной,
поскольку аппроксимация функции выполнена очень точно.
Пример процедуры обучения
В этой главе было рассмотрено большое число методов, алгоритмов, стратегий и подходов к обучению нейронных сетей. Поэтому представляется целесообразным показать,
как они используются для решения реальных практических задач.
100
Нейронные сети. MATLAB 6
Рассмотрим одно из типичных приложений нейронных сетей в медицинских исследованиях. Для этого примера используем данные из медицинского приложения [35]. Требуется разработать вычислительный инструмент, который может определять уровни липидных составляющих холестерина на основе измерений спектра крови. Имеется статистика
измерения 21 волны спектра крови для 264 пациентов. Кроме того, известны уровни hdl,
ldl и vldl липидных составляющих холестерина, основанных на сепарации сыворотки.
Необходимо определить состоятельность нового способа анализа крови, основанного
на измерении ее спектра.
Данные измерений спектра должны быть загружены из МАТ-файла choles_all и подвергнуты факторному анализу:
load choles_all
% Нормировка обучающего множества
[pn,meanp,stdp,tn,meant,stdt] = prestd(p,t);
[ptrans,transMat] = prepca(pn, 0.001);% Выделение главных компонентов
В этом случае сохраняются только те компоненты, которые объясняют 99.9 % изменений в наборе данных. Проверим, сколько же компонентов из первоначальных 21 являются
состоятельными:
[R,Q] = size(ptrans)
R = 4
Q = 264
Оказывается, что всего 4.
Теперь сформируем из исходной выборки обучающее, контрольное и тестовое множества. Для этого выделим половину выборки для обучающего множества ptr и по четверти для контрольного v и тестового t:
iitst = 2:4:Q;
iival = 4:4:Q;
iitr = [1:4:Q 3:4:Q];
v.P = ptrans(:,iival); v.T = tn(:,iival);
t.P = ptrans(:,iitst); t.V = tn(:,iitst);
ptr = ptrans(:,iitr); ttr = tn(:,iitr);
Теперь необходимо сформировать и обучить нейронную сеть. Будем использовать
сеть с двумя слоями, с функциями активации: в скрытом слое – гиперболический тангенс,
в выходном слое – линейная функция. Такая структура эффективна для решения задач
аппроксимации и регрессии. В качестве начального приближения установим 5 нейронов
в скрытом слое. Сеть должна иметь 3 выходных нейрона, поскольку определено 3 цели.
Для обучения применим алгоритм LM:
net = newff(minmax(ptr),[5 3],{'tansig' 'purelin'},'trainlm')
[net,tr]=train(net,ptr,ttr,[],[],v,t);
Обучение, остановлено после 15 итераций, потому что контрольная ошибка в 5 раз
превысила ошибку обучения. Построим графики всех ошибок:
plot(tr.epoch,tr.perf,’–‘,tr.epoch,tr.vperf,’—–‘,tr.epoch,tr.tperf,’:’)
На рис. 3.27 показаны результаты обучения. Погрешности проверки на тестовом и контрольном множествах ведут себя одинаково, и нет заметных тенденций к переобучению.
3. Обучение нейронных сетей
101
Рис. 3.27
На следующем шаге следует выполнить анализ реакции сети. Используем весь набор
данных (обучение, признание выборки представительной и тестовый) и выполним линейную регрессию между выходами сети и соответствующими целями. Сначала нужно перейти к ненормализованным выходам сети:
an = sim(net,ptrans); % Моделирование сети
a = poststd(an,meant,stdt); % Восстановление выходов
t = poststd(tn,meant,stdt); % Восстановление целей
for i=1:3
figure(i)
[m(i),b(i),r(i)] = postreg(a(i,:),t(i,:)); % Расчет регрессии
end % Рис. 3.28,а-в
а
б
Рис. 3.28
в
Первые 2 выхода сети (hdl- и ldl-составляющие) хорошо отслеживают целевое множество, значение близко к 0.9, и это означает, что эти липидные характеристики могут быть
определены по измерениям спектра крови. Третий выход (vldl-составляющая) восстанавливается плохо (коэффициент корреляции около 0.6), и это означает, что решение задачи
должно быть продолжено.
Можно использовать другую архитектуру сети, увеличить количество нейронов
в скрытом слое (больше скрытых слоев нейронов) или воспользоваться методом регуляризации. Хотя может оказаться, что восстановление составляющей vldl на основе измерения спектра крови вообще несостоятельно.
102
Нейронные сети. MATLAB 6
4. ПЕРСЕПТРОНЫ
C этой главы начинается систематический анализ конкретных нейронных сетей, и первой из
них является нейронная сеть, называемая персептроном. Большое количество моделей персептрона представлено в основополагающей работе Розенблатта [37]. Простейшая из таких моделей –
однослойный персептрон, веса и смещение которого могут быть настроены таким образом, чтобы решить задачу классификации входных векторов, что позволит в дальнейшем решать сложные проблемы анализа коммутационных соединений, распознавания образов и других задач
классификации с высоким быстродействием и гарантией правильного результата.
По команде help percept можно получить следующую информацию об М-функциях,
входящих в состав ППП Neural Network Toolbox и относящихся к построению нейронных
сетей на основе персептронов:
Perceptrons
New networks
newp
Using networks
sim
init
adapt
train
Weight functions
dotprod
Net input functions
netsum
Transfer functions
hardlim
hardlims
Initialization functions
initlay
initwb
initzero
Performance functions
mae
Learning functions
learnp
learnpn
Adapt functions
adaptwb
Training functions
trainwb
Demonstrations
demop1
102
Персептроны
Формирование нейронной сети
Создание персептрона
Работа с нейронной сетью
Моделирование сети
Инициализация сети
Адаптация сети
Обучение сети
Функции взвешивания
Скалярное произведение
Функции накопления
Сумма взвешенных входов
Функции активации
Ступенчатая функция с жесткими ограничениями
Симметричная ступенчатая функция с жесткими ограничениями
Функции инициализации
Инициализация слоев
Инициализация весов и смещений
Инициализация нулевых весов и смещений
Функции оценки качества сети
Средняя абсолютная погрешность
Функции настройки параметров персептрона
Абсолютная функция настройки
Нормированная функция настройки
Функции адаптации
Адаптация весов и смещений
Функции обучения
Правило обучения весов и смещений
Демонстрационные примеры
Классификация с использованием персептрона с двумя входами
Классификация с использованием персептрона
с тремя входами
Классификация с использованием персептрона
с двумя нейронами
Формирование входных векторов внешнего слоя
Обучение с использованием нормированной
функции настройки
Пример линейно неразделимых векторов
Классификация с использованием двухслойного персептрона
demop2
demop3
demop4
demop5
demop6
demop7
Следует обратить внимание, что в версии ППП Neural Network Toolbox Version 3.0.1 (R11)
представлены только демонстрационные примеры demop1, demop4, demop5, demop6.
4.1. Архитектура персептрона
Нейрон персептрона. Нейрон, используемый в модели персептрона, имеет ступенчатую
функцию активации hardlim с жесткими ограничениями (рис. 4.1).
Каждый элемент вектора входа персептрона взвешен с соответствующим весом w1j,
и их сумма является входом функции активации. Нейрон персептрона возвращает 1, если
вход функции активации n  0, и 0, если n < 0.
Рис. 4.1
Функция активации с жесткими ограничениями придает персептрону способность
классифицировать векторы входа, разделяя пространство входов на 2 области, как это
показано на рис. 4.2 для персептрона с двумя входами и смещением.
P2
L
w
Wp+b>0
a=1
Wp+b=0
a=1
1
-1
P1
Wp+b<0
a=0
w1,1 = -1; w1,2 = 1; b = 1
4. Персептроны
Рис. 4.2
103
Пространство входов делится на 2 области разделяющей линией L, которая для двумерного случая задается уравнением
(4.1)
w T p  b  0.
Эта линия перпендикулярна к вектору весов w и смещена на величину b. Векторы
входа выше линии L соответствуют положительному потенциалу нейрона, и, следовательно, выход персептрона для этих векторов будет равен 1; векторы входа ниже линии L
соответствуют выходу персептрона, равному 0. При изменении значений смещения и весов граница линии L изменяет свое положение. Персептрон без смещения всегда формирует разделяющую линию, проходящую через начало координат; добавление смещения
формирует линию, которая не проходит через начало координат, как это показано на
рис. 4.2. В случае, когда размерность вектора входа превышает 2, разделяющей границей
будет служить гиперплоскость.
Демонстрационная программа nnd4db наглядно иллюстрирует перемещение разделяющей линии при решении задачи классификации векторов входа.
Архитектура сети. Персептрон состоит из единственного слоя, включающего S нейронов, как это показано на рис. 4.3, а и б в виде соответственно развернутой и укрупненной
структурных схем; веса wij – это коэффициенты передачи от j-го входа к i-му нейрону.
Уравнение однослойного персептрона имеет вид:
a  f (Wp  b) .
(4.2)
а
б
Рис. 4.3
4.2. Модель персептрона
Для формирования модели однослойного персептрона предназначена функция newp
net = newp(PR, S)
со следующими входными аргументами: PR – массив минимальных и максимальных значений для R элементов входа размера R2; S – число нейронов в слое.
В качестве функции активации персептрона по умолчанию используется функция
hardlim.
104
Нейронные сети. MATLAB 6
Пример:
Функция
net = newp([0 2],1);
создает персептрон с одноэлементным входом и одним нейроном; диапазон значений
входа – [0 2].
Определим некоторые параметры персептрона, инициализируемые по умолчанию.
Веса входов:
inputweights = net.inputweights{1,1}
inputweights =
delays: 0
initFcn: 'initzero'
learn: 1
learnFcn: 'learnp'
learnParam: []
size: [1 1]
userdata: [1x1 struct]
weightFcn: 'dotprod'
Заметим, что функция настройки персептрона по умолчанию learnp; вход функции активации вычисляется с помощью функции скалярного произведения dotprod; функция
инициализации initzero используется для установки нулевых начальных весов.
Смещения:
biases = net.biases{1}
biases =
initFcn: 'initzero'
learn: 1
learnFcn: 'learnp'
learnParam: []
size: 1
userdata: [11 struct]
Нетрудно увидеть, что начальное смещение также установлено в 0.
Моделирование персептрона
Рассмотрим однослойный персептрон с одним двухэлементным вектором входа,
значения элементов которого изменяются в диапазоне от –2 до 2:
net = newp([–2 2;–2 2],1); % Создание персептрона net
По умолчанию веса и смещение равны 0, и для того, чтобы установить желаемые
значения, необходимо применить следующие операторы:
net.IW{1,1}= [–1 1];
net.b{1} = [1];
В этом случае разделяющая линия имеет вид:
L: –p1 +p2 +1 = 0.
Это соответствует рис. 4.1.
Структурная схема модели персептрона показана на рис. 4.4
4. Персептроны
105
Рис. 4.4
Теперь определим, как откликается сеть на входные векторы p1и p2, расположенные
по разные стороны от разделяющей линии:
p1
a1
a1
p2
a2
a2
=
=
=
=
=
=
[1; 1];
sim(net,p1) % Моделирование сети net с входным вектором p1
1
[1; –1];
sim(net,p2) % Моделирование сети net с входным вектором p2
0
Персептрон правильно классифицировал эти 2 вектора.
Заметим, что можно было бы ввести последовательность двух векторов в виде массива ячеек и получить результат также в виде массива ячеек:
% Последовательность двух векторов в виде массива ячеек
p3 = {[1; 1] [1; –1]};
a3 = sim(net,p3) % Моделирование сети net при входном сигнале p3
a3 = [1] [0]
Инициализация параметров
Для однослойного персептрона в качестве параметров нейронной сети в общем случае
выступают веса входов и смещения. Допустим, что создается персептрон с двухэлементным вектором входа и одним нейроном:
net = newp([–2 2;–2 2],1);
Запросим характеристики весов входа:
net.inputweights{1, 1}
ans =
delays: 0
initFcn: 'initzero'
learn: 1
learnFcn: 'learnp'
learnParam: [ ]
size: [1 2]
userdata: [11 struct]
weightFcn: 'dotprod'
Из этого перечня следует, что в качестве функции инициализации по умолчанию
используется функция initzero, которая присваивает весам входа нулевые значения.
В этом можно убедиться, если извлечь значения элементов матрицы весов и смещения:
wts = net.IW{1,1}
wts = 0 0
bias = net.b{1}
bias = 0
106
Нейронные сети. MATLAB 6
Теперь переустановим значения элементов матрицы весов и смещения:
net.IW{1,1} = [3, 4]
net.b{1} = 5
wts = 3 4
bias = 5
Для того, чтобы вернуться к первоначальным установкам параметров персептрона,
и предназначена функция init:
net = init(net);
wts
wts = 0 0
bias
bias = 0
Можно изменить способ, каким инициализируется персептрон с помощью функции init.
Для этого достаточно изменить тип функций инициализации, которые применяются для установки
первоначальных значений весов входов и смещений. Например, воспользуемся функцией инициализации rands, которая устанавливает случайные значения параметров персептрона.
% Задать функции инициализации весов и смещений
net.inputweights{1,1}.initFcn = 'rands';
net.biases{1}.initFcn = 'rands';
% Выполнить инициализацию ранее созданной сети с новыми функциями
net = init(net);
wts = net.IW{1,1}
wts = –0.96299
0.64281
bias = net.b{1}
bias = –0.087065
Видно, что веса и смещения выбраны случайным образом.
4.3. Процедуры настройки параметров
Определим процесс обучения персептрона как процедуру настройки весов и смещений с целью уменьшить разность между желаемым (целевым) и истинным сигналами
на его выходе, используя некоторое правило настройки (обучения). Процедуры обучения
делятся на 2 класса: обучение с учителем и обучение без учителя.
При обучении с учителем задается множество примеров требуемого поведения сети,
которое называется обучающим множеством
{p 1 , t 1}, {p 2 , t 2 }, ..., {p Q , t Q }.
(4.3)
Здесь p1, p2, …, pQ – входы персептрона, а t1, t2, …, tQ – требуемые (целевые) выходы.
При подаче входов выходы персептрона сравниваются с целями. Правило обучения
используется для настройки весов и смещений персептрона так, чтобы приблизить значение выхода к целевому значению. Алгоритмы, использующие такие правила обучения,
называются алгоритмами обучения с учителем. Для их успешной реализации необходимы эксперты, которые должны предварительно сформировать обучающие множества.
Разработка таких алгоритмов рассматривается как первый шаг в создании систем искусственного интеллекта.
4. Персептроны
107
В этой связи ученые не прекращают спора на тему, можно ли считать алгоритмы обучения с
учителем естественными и свойственными природе, или они созданы искусственны. Например,
обучение человеческого мозга на первый взгляд происходит без учителя: на зрительные, слуховые, тактильные и прочие рецепторы поступает информация извне и внутри мозга происходит
некая самоорганизация. Однако нельзя отрицать и того, что в жизни человека немало учителей –
и в буквальном, и в переносном смысле, – которые координируют реакции на внешние воздействия. Вместе с тем, как бы ни развивался спор приверженцев этих двух концепций обучения,
представляется, что обе они имеют право на существование. И рассматриваемое нами правило
обучения персептрона относится к правилу обучения с учителем.
При обучении без учителя веса и смещения изменяются только в связи с изменениями
входов сети. В этом случае целевые выходы в явном виде не задаются. Главная черта, делающая обучение без учителя привлекательным, – это его самоорганизация, обусловленная, как правило, использованием обратных связей. Что касается процесса настройки параметров сети, то он организуется с использованием одних и тех же процедур.
Большинство алгоритмов обучения без учителя применяется при решении задач кластеризации данных, когда необходимо разделить входы на конечное число классов.
Что касается персептронов, рассматриваемых в этой главе, то хотелось бы надеяться,
что в результате обучения может быть построена такая сеть, которая обеспечит правильное решение, когда на вход будет подан сигнал, который отличается от тех, которые
использовались в процессе обучения.
Правила настройки
Настройка параметров (обучение) персептрона осуществляется с использованием обучающего множества. Обозначим через p вектор входов персептрона, а через t – вектор соответствующих желаемых выходов. Цель обучения – уменьшить погрешность e = a – t, которая
равна разности между реакцией нейрона a и вектором цели t.
Правило настройки (обучения) персептрона должно зависеть от величины погрешности e. Вектор цели t может включать только значения 0 и 1, поскольку персептрон
с функцией активации hardlim может генерировать только такие значения.
При настройке параметров персептрона без смещения и с единственным нейроном
возможны только 3 ситуации:
1. Для данного вектора входа выход персептрона правильный (a = t и e = t – а = 0) и тогда вектор весов w не претерпевает изменений.
2. Выход персептрона равен 0, а должен быть равен 1 (a = 0, t = 1 и e = t – 0 = 1). В этом
случае вход функции активации wТp отрицательный и его необходимо скорректировать. Добавим к вектору весов w вектор входа p, и тогда произведение (wT + pT) p =
= wTp + pTp изменится на положительную величину, а после нескольких таких шагов
вход функции активации станет положительным и вектор входа будет классифицирован правильно. При этом изменятся настройки весов.
3. Выход нейрона равен 1, а должен быть равен 0 (а = 0, t = 1 и e = t – a= –1). В этом
случае вход функции активации wТp положительный и его необходимо скорректировать. Вычтем из вектора весов w вектор входа p, и тогда произведение (wT – pT) p =
= wTp – pTp изменится на отрицательную величину, а после нескольких шагов вход
функции активации станет отрицательным и вектор входа будет классифицирован
правильно. При этом изменятся настройки весов.
108
Нейронные сети. MATLAB 6
Теперь правило настройки (обучения) персептрона можно записать, связав изменение
вектора весов w с погрешностью e = t – a:
 0, если e  0;

w   p, если e  1;
 p, если e  1;

(4.4а)
Все 3 случая можно описать одним соотношением:
w  (t  a)p  ep .
(4.4б)
Можно получить аналогичное выражение для изменения смещения, учитывая, что
смещение можно рассматривать как вес для единичного входа:
b  (t  a) 1  e.
(4.5)
В случае нескольких нейронов эти соотношения обобщаются следующим образом:

W  (t  a)p T  ep T ;


b  (t  a)  e .
(4.6)
Тогда правило настройки (обучения) персептрона можно записать в следующей форме:
W new  W old  ep T ;
 new
b
 b old  e .
(4.7)
Описанные соотношения положены в основу алгоритма настройки параметров персептрона, который реализован в ППП Neural Network Toolbox в виде М-функции learnp. Каждый
раз при выполнении функции learnp будет происходить перенастройка параметров персептрона. Доказано, что если решение существует, то процесс обучения персептрона сходится за
конечное число итераций. Если смещение не используется, функция learnp ищет решение,
изменяя только вектор весов w. Это приводит к нахождению разделяющей линии, перпендикулярной вектору w и которая должным образом разделяет векторы входа.
Рассмотрим простой пример персептрона с единственным нейроном и двухэлементным вектором входа:
net = newp([–2 2;–2 2],1);
Определим смещение b равным 0, а вектор весов w равным [1 –0.8]:
net.b{1} = 0;
w = [1 –0.8];
net.IW{1,1} = w;
Обучающее множество зададим следующим образом:
p = [1; 2];
t = [1];
Моделируя персептрон, рассчитаем выход и ошибку на первом шаге настройки (обучения):
a = sim(net,p)
a = 0
4. Персептроны
109
e = t–a
e = 1
Наконец, используя М-функцию настройки параметров learnp, найдем требуемое
изменение весов:
dw = learnp(w,p,[ ],[ ],[ ],[ ],e,[ ],[ ],[ ])
dw = 1 2
Тогда новый вектор весов примет вид:
w = w + dw
w = 2.0000 1.2000
Заметим, что описанные выше правило и алгоритм настройки (обучения) персептрона
гарантируют сходимость за конечное число шагов для всех задач, которые могут быть
решены с использованием персептрона. Это в первую очередь задачи классификации векторов, которые относятся к классу линейно отделимых, когда все пространство входов
можно разделить на 2 области некоторой прямой линией, в многомерном случае – гиперплоскостью.
Демонстрационный пример nnd4pr позволяет выполнить многочисленные эксперименты по настройке (обучению) персептрона для решения задачи классификации входных
векторов.
Процедура адаптации
Многократно используя М-функции sim и learnp для изменения весов и смещения
персептрона, можно в конечном счете построить разделяющую линию, которая решит
задачу классификации, при условии, что персептрон может решать ее. Каждая реализация
процесса настройки с использованием всего обучающего множества называется проходом
или циклом. Такой цикл может быть выполнен с помощью специальной функции адаптации adapt. При каждом проходе функция adapt использует обучающее множество, вычисляет выход, погрешность и выполняет подстройку параметров персептрона.
Заметим, что процедура адаптации не гарантирует, что синтезированная сеть выполнит классификацию нового вектора входа. Возможно, потребуется новая настройка матрицы весов W и вектора смещений b с использованием функции adapt.
Чтобы пояснять процедуру адаптации, рассмотрим простой пример. Выберем персептрон с одним нейроном и двухэлементным вектором входа (рис. 4.5).
Рис. 4.5
Эта сеть и задача, которую мы собираемся рассматривать, достаточно просты, так что
можно все расчеты выполнить вручную.
110
Нейронные сети. MATLAB 6
Предположим, что требуется с помощью персептрона решить задачу классификации
векторов, если задано следующее обучающее множество:


 2
p1    , t1  0


 2

 
 

1
 2
 1
p 2    , t 2  1 p 3    , t3  0 p 4    , t 4  1 .

 
 

  2
2
1
(4.8)
Используем нулевые начальные веса и смещение. Для обозначения переменных на
каждом шаге используем индекс в круглых скобках. Таким образом, начальные значения
вектора весов wT(0) и смещения b(0) равны соответственно wT(0) = [0 0] и b(0) = 0.
Вычислим выход персептрона для первого вектора входа p1, используя начальные
веса и смещение:

2  
a  hardlim (w T (0) p1  b(0))  hardlim  [0 0]     0   hardlim (0)  1.

2  

(4.9)
Выход не совпадает с целевым значением t1, и необходимо применить правило настройки
(обучения) персептрона, чтобы вычислить требуемые изменения весов и смещений:
e  t1  a  0  1  1;
 T
T
w  ep1  (1)[ 2 2]  [2  2];
b  e  (1)  1.

(4.10)
Вычислим новые веса и смещение, используя введенные ранее правила обучения персептрона.
old
T new

 w T  w T  0 0   2  2   2  2  w T (1) ;
w
 new
old

b  b  b  0  (1)  1  b(1).
(4.11)
Обратимся к новому вектору входа p2, тогда

 1 
a  hardlim (w T (1) p 2  b(1))  hardlim ( [2  2]     (1))  hardlim (1)  1. (4.12)

 2 
В этом случае выход персептрона совпадает с целевым выходом, так что погрешность
равна 0 и не требуется изменений в весах или смещении. Таким образом,
w T (2)  w T (1)   2  2;

b(2)  b(1)  1.
(4.13)
Продолжим этот процесс и убедимся, что после третьего шага настройки не изменились:
w T (3)  w T (2)   2  2 ;

b(3)  b(2)  1,
(4.14)
а после четвертого приняли значение
w T (4)   3  1;

b(4)  0.
4. Персептроны
(4.15)
111
Чтобы определить, получено ли удовлетворительное решение, требуется сделать один
проход через все векторы входа, чтобы проверить, соответствуют ли решения обучающему
множеству. Вновь используем первый член обучающей последовательности и получаем:
w T (5)  w T (4)   3  1;

b(5)  b(4)  0.
(4.16)
Переходя ко второму члену, получим следующий результат:
w T (6)   2  3,

b(6)  1.
(4.17)
Этим заканчиваются ручные вычисления.
Теперь выполним аналогичные расчеты, используя М-функцию adapt. Вновь сформируем модель персептрона, изображенного на рис. 4.5:
net = newp([–2 2;–2 2],1);
Введем первый элемент обучающего множества
p = {[2; 2]};
t = {0};
Установим параметр passes (число проходов) равным 1 и выполним 1 шаг настройки:
net.adaptParam.passes = 1;
[net,a,e] = adapt(net,p,t);
a
a = [1]
e
e = [–1]
Скорректированные вектор весов и смещение равны
twts =
twts =
tbiase
tbiase
net.IW{1,1}
–2 –2
= net.b{1}
= –1
Это совпадает с результатами, полученными при ручном расчете. Теперь можно ввести второй элемент обучающего множества и т. д., т. е. повторить всю процедуру ручного
счета и получить те же результаты.
Но можно эту работу выполнить автоматически, задав сразу все обучающее множество
и выполнив 1 проход:
net = newp([–2 2;–2 2],1);
net.trainParam.passes = 1;
p = {[2;2] [1;–2] [–2;2] [–1;1]};
t = {0 1 0 1};
Теперь обучим сеть:
[net,a,e] = adapt(net,p,t);
Возвращаются выход и ошибка:
a
a = [1] [1] [0] [0]
e
e = [–1] [0] [0] [1]
112
Нейронные сети. MATLAB 6
Скорректированные вектор весов и смещение равны
twts =
twts =
tbiase
tbiase
net.IW{1,1}
–3
–1
= net.b{1}
= 0
Моделируя полученную сеть по каждому входу, получим:
a1 = sim(net,p)
a1 = [0] [0] [1] [1]
Можно убедиться, что не все выходы равны целевым значениям обучающего множества. Это означает, что следует продолжить настройку персептрона.
Выполним еще 1 цикл настройки:
[net,a,e] = adapt(net,p,t);
a
a = [0]
[0]
[0]
[1]
e
e = [0]
[1]
[0]
[0]
twts = net.IW{1,1}
twts = 2
–3
tbiase = net.b{1}
tbiase = 1
a1 = sim(net,p)
a1 = [0]
[1]
[0]
[1]
Теперь решение совпадает с целевыми выходами обучающего множества и все входы
классифицированы правильно.
Если бы рассчитанные выходы персептрона не совпали с целевыми значениями, то
необходимо было бы выполнить еще несколько циклов настройки, применяя М-функцию
adapt и проверяя правильность получаемых результатов.
Для усвоения изложенного материала можно обратиться к демонстрационным программам, в частности к программе demop1, которая решает задачу классификации с помощью простого персептрона.
Как следует из сказанного выше, для настройки (обучения) персептрона применяется
процедура адаптации, которая корректирует параметры персептрона по результатам обработки каждого входного вектора. Применение М-функции adapt гарантирует, что любая
задача классификации с линейно отделимыми векторами будет решена за конечное число
циклов настройки.
Для настройки (обучения) персептрона можно было бы воспользоваться также
М-функцией train. В этом случае используется все обучающее множество и настройка
параметров сети выполняется не после каждого прохода, а в результате всех проходов
обучающего множества. К сожалению, не существует доказательства того, что такой алгоритм обучения персептрона является сходящимся. Поэтому использование М-функции
train для обучения персептрона не рекомендуется.
Нейронные сети на основе персептрона имеют ряд ограничений. Во-первых, выход
персептрона может принимать только одно из двух значений (0 или 1); во-вторых, персептроны могут решать задачи классификации только для линейно отделимых наборов
векторов. Если с помощью прямой линии или гиперплоскости в многомерном случае
4. Персептроны
113
можно разделить пространство входов на 2 области, в которых будут расположены векторы входа, относящиеся к различным классам, то векторы входа считаются линейно отделимыми. Если векторы входа линейно отделимы, то доказано, что при использовании
процедуры адаптации задача классификации будет решена за конечное время. Если векторы входа линейно неотделимы, то процедура адаптации не в состоянии классифицировать все векторы должным образом. Демонстрационная программа demop6 иллюстрирует
тщетность попытки классифицировать векторы входа, которые линейно неотделимы.
Для решения более сложных задач можно использовать сети с несколькими персептронами. Например, для классификации четырех векторов на 4 группы можно построить
сеть с двумя персептронами, чтобы сформировать 2 разделяющие линии и таким образом
приписать каждому вектору свою область.
Отметим еще одну особенность процесса обучения персептрона. Если длина некоторого вектора входа намного больше или меньше длины других векторов, то для обучения
может потребоваться значительное время. Это обусловлено тем, что алгоритм настройки
связан с добавлением или вычитанием входного вектора из текущего вектора весов.
Таким образом, присутствие вектора входа с очень большими или малыми элементами
может привести к тому, что потребуется длительное время для настройки параметров.
Демонстрационная программа demop4 поясняет, как влияет выброс длины вектора
на продолжительность обучения.
Можно сделать время обучения нечувствительным к большим или малым выбросам
векторов входа, если несколько видоизменить исходное правило обучения персептрона:
w T  (t  a)p T  ep T .
(4.18)
Действительно, из этого соотношения следует, что чем больше компоненты вектора входа p,
тем большее воздействие он оказывает на изменение элементов вектора w. Можно уравновесить
влияние больших или малых компонент, если ввести масштабирование вектора входа.
Решение состоит в том, чтобы нормировать входные данные так, чтобы воздействие
любого вектора входа имело примерно равный вклад:
w T  (t  a)
pT
pT .
e
p
p
(4.19)
Нормированное правило обучения персептрона реализуется М-функцией learnpn.
Этот алгоритм требует несколько большего времени, но значительно сокращает количество циклов обучения, когда встречаются выбросы векторов входа. Демонстрационная
программа demop5 иллюстрирует это правило обучения.
В заключение следует отметить, что основное назначение персептронов – решать задачи
классификации. Они великолепно справляются с задачей классификации линейно отделимых
векторов; сходимость гарантируется за конечное число шагов. Длительность обучения чувствительна к выбросам длины отдельных векторов, но и в этом случае решение может быть построено. Однослойный персептрон может классифицировать только линейно отделимые векторы.
Возможные способы преодолеть эту трудность предполагают либо предварительную обработку
с целью сформировать линейно отделимое множество входных векторов, либо использование
многослойных персептронов. Можно также применить другие типы нейронных сетей, например
линейные сети или сети с обратным распространением, которые могут выполнять классификацию линейно неотделимых векторов входа.
114
Нейронные сети. MATLAB 6
5. ЛИНЕЙНЫЕ СЕТИ
Обсуждаемые в этой главе линейные нейронные сети по своей структуре аналогичны
персептрону и отличаются лишь функцией активации, которая является линейной. Выход
линейной сети может принимать любое значение, в то время как выход персептрона ограничен значениями 0 или 1. Линейные сети, как и персептроны, способны решать только
линейно отделимые задачи классификации, однако в них используется другое правило
обучения, основанное на методе наименьших квадратов, которое является более мощным,
чем правило обучения персептрона. Настройка параметров выполняется таким образом,
чтобы обеспечить минимум ошибки. Поверхность ошибки как функция входов имеет
единственный минимум, и определение этого минимума не вызывает трудностей. В отличие от персептрона настройка линейной сети может быть выполнена с помощью как процедуры адаптации, так и процедуры обучения; в последнем случае используется правило
обучения WH (Widrow – Hoff).
Кроме того, в главе рассматриваются адаптируемые линейные нейронные сети
ADALINE (ADAptive Linear Neuron networks), которые позволяют корректировать веса
и смещения при поступлении на вход каждого нового элемента обучающего множества.
Такие сети широко применяются при решении задач обработки сигналов и в системах
управления. Основополагающей работой в этой области является книга Уидроу и Хоффа
[45], в которой они и ввели сокращение ADALINE для адаптируемых линейных нейронов.
По команде help linnet можно получить следующую информацию об М-функциях, входящих в
состав ППП Neural Network Toolbox и относящихся к построению линейных нейронных сетей:
Linear networks
New networks
newlind
newlin
Using networks
sim
init
adapt
train
Weight functions
dotprod
Net input functions
netsum
Transfer functions
purelin
Initialization functions
initlay
initwb
initzero
Performance
mse
Линейные сети
Формирование нейронной сети
Формирование линейного слоя
Формирование адаптируемого линейного слоя
Работа с нейронной сетью
Моделирование сети
Инициализация сети
Процедура адаптации
Процедура обучения
Функции взвешивания
Скалярное произведение
Функции накопления
Сумма взвешенных входов
Функции активации
Линейная
Функции инициализации
Послойная инициализация
Инициализация весов и смещений
Инициализация нулевых весов и смещений
Функции оценки качества сети
Среднеквадратичная погрешность
115
Learning
learnwh
Adaption
adaptwb
Training
trainwb
Analysis functions
maxlinlr
Demonstrations and applications
demolin1
demolin2
demolin3
demolin4
demolin5
demolin6
demolin7
demolin8
applin1
applin2
applin3
applin4
Функции настройки параметров персептрона
Правило настройки WH
Функции адаптации
Функция адаптации весов и смещений
Функции обучения
Функция обучения весов и смещений
Функции анализа
Оценка максимального значения параметра настройки
Демонстрационные примеры
Пример функционирования линейной сети
Обучение линейного нейрона
Обучение линейного слоя
Задача линейной аппроксимации
Задача с неполными данными
Задача с линейно зависимыми данными
Оценка влияния параметра скорости настройки
Адаптируемый линейный слой
Задача предсказания
Задача адаптивного предсказания
Идентификация линейной системы
Адаптивная идентификация линейной системы
Следует обратить внимание, что в версии ППП Neural Network Version 3.0.1 (R11)
не представлен демонстрационный пример demolin3.
5.1. Архитектура линейной сети
Модель нейрона. На рис. 5.1 показан линейный нейрон с двумя входами. Он имеет
структуру, сходную со структурой персептрона; единственное отличие состоит в том, что
используется линейная функция активации purelin.
Рис. 5.1
Весовая матрица W в этом случае имеет только одну строку и выход сети определяется выражением
a  purelin (n)  purelin (Wp  b)  Wp  b  w11 p1  w12 p2  b .
116
Нейронные сети. MATLAB 6
Подобно персептрону, линейная сеть задает в пространстве входов разделяющую
линию, на которой функция активации n равна 0 (рис. 5.2).
Рис. 5.2
Векторы входа, расположенные выше этой линии, соответствуют положительным
значениям выхода, а расположенные ниже – отрицательным. Это означает, что линейная
сеть может быть применена для решения задач классификации. Однако такая классификация может быть выполнена только для класса линейно отделимых объектов. Таким образом, линейные сети имеют то же самое ограничение, что и персептрон.
Архитектура сети. Линейная сеть, показанная на рис. 5.3, а, включает S нейронов,
размещенных в одном слое и связанных с R входами через матрицу весов W.
Рис. 5.3
На рис. 5.3, б показана укрупненная структурная схема этой сети, вектор выхода a
которой имеет размер S1.
5.2. Создание модели линейной сети
Линейную сеть с одним нейроном, показанную на рис. 5.1, можно создать следующим
образом:
net = newlin([–1 1; –1 1],1);
Первый входной аргумент задает диапазон изменения элементов вектора входа; второй аргумент указывает, что сеть имеет единственный выход. Начальные веса и смещение
по умолчанию равны 0.
5. Линейные сети
117
Присвоим весам и смещению следующие значения:
net.IW{1,1} = [2 3];
net.b{1} =[–4];
Теперь можно промоделировать линейную сеть для следующего предъявленного
вектора входа:
p = [5;6];
a = sim(net,p)
a = 24
5.3. Обучение линейной сети
Для заданной линейной сети и соответствующего множества векторов входа и целей
можно вычислить вектор выхода сети и сформировать разность между вектором выхода
и целевым вектором, которая определит некоторую погрешность. В процессе обучения
сети требуется найти такие значения весов и смещений, чтобы сумма квадратов соответствующих погрешностей была минимальной. Эта задача разрешима, потому что для линейных систем функция квадратичной ошибки является унимодальной.
Как и для персептрона, применяется процедура обучения с учителем, которая использует обучающее множество вида:
(5.1)
{p1 t1}, {p 2 t 2 },... ,{p Q t Q },
где p1 , p 2 ,..., p Q – входы сети; t 1 , t 2 ,..., t Q – соответствующие целевые выходы.
Требуется минимизировать следующую функцию средней квадратичной ошибки:
mse 
1 Q
1 Q
 e(k ) 2   (t (k )  a(k )) 2 .
Q k 1
Q k 1
(5.2)
Процедура настройки
В отличие от многих других сетей настройка линейной сети для заданного обучающего множества может быть выполнена посредством прямого расчета с использованием
М-функции newlind.
Предположим, что заданы следующие векторы, принадлежащие обучающему множеству:
P = [1 –1.2];
T = [0.5 1];
Построим линейную сеть и промоделируем ее:
net = newlind(P,T);
Y = sim(net, P);
Y = 0.5 1
net.IW{1,1}
ans = –0.22727
net.b
ns =
[0.72727]
Выход сети соответствует целевому вектору.
Зададим следующий диапазон весов и смещений, рассчитаем критерий качества
обучения и построим его линии уровня (рис. 5.4):
118
Нейронные сети. MATLAB 6
w_range=–1:0.1: 0; b_range=0.5:0.1:1;
ES = errsurf(P,T, w_range, b_range, 'purelin');
contour(w_range, b_range,ES,20)
hold on
plot(–2.2727e–001,7.2727e–001, 'x') % Рис.5.4.
hold off
1
0.9
0.8
0.7
0.6
0.5
-1
-0.8
-0.6
-0.4
-0.2
0
Рис. 5.4
На графике знаком x отмечены оптимальные значения веса и смещения для данной сети.
Демонстрационный пример demolin1 поясняет структуру линейной сети, построение
поверхности ошибок и выбор оптимальных настроек.
Обучающее правило наименьших квадратов. Для линейной нейронной сети используется рекуррентное обучающее правило наименьших квадратов (LMS), которое является
намного более мощным, чем обучающее правило персептрона. Правило наименьших
квадратов, или правило обучения WH (Уидроу – Хоффа), минимизирует среднее значение
суммы квадратов ошибок обучения [18].
Процесс обучения нейронной сети состоит в следующем. Авторы алгоритма предположили, что можно оценивать полную среднюю квадратичную погрешность, используя
среднюю квадратичную погрешность на каждой итерации. Сформируем частную производную по весам и смещению от квадрата погрешности на k-й итерации:
 e 2 (k )
e(k )
 2e(k )
, j  1, ..., R ;

(5.3)

w
w1, j
 1, j
 2
e(k )
 e (k )
 b  2e(k ) b .
Подставляя выражение для ошибки в форме
 R

e(k )  t (k )    w1,i pi (k )  b  ,
 j 1

(5.4)
 e(k )
 w   p j (k ) ;
 1, j

 e(k )  1.
 b
(5.5)
получим
5. Линейные сети
119
Здесь pj(k) – j-й элемент вектора входа на k-й итерации. Эти соотношения лежат в основе
обучающего алгоритма WH

w(k  1)  w(k )  e(k )pT (k ) ;


b(k  1)  b(k )  e(k ) .
(5.6)
Результат может быть обобщен на случай многих нейронов и представлен в следующей матричной форме:

W(k  1)  W(k )  2 e(k )pT (k ) ;


b(k  1)  b(k )  2 e(k ) .
(5.7)
Здесь ошибка e и смещение b – векторы и  – параметр скорости обучения. При
больших значениях  обучение происходит быстро, однако при очень больших значениях
может приводить к неустойчивости. Чтобы гарантировать устойчивость процесса обучения, параметр скорости обучения не должен превышать величины 1/max(||), где  – собственное значение матрицы корреляций p*pT векторов входа. Используя правило обучения WH и метод наискорейшего спуска, всегда можно обучить сеть так, чтобы ее
погрешность была минимальной.
М-функция learnwh предназначена для настройки параметров линейной сети и реализует следующее обучающее правило:
dw  lr * e * p' ;
(5.8)

db  lr * e,
где lr – параметр скорости обучения. Максимальное значение параметра скорости обучения, которое гарантирует устойчивость процедуры настройки, вычисляется с помощью
М-функции maxlinlr.
С помощью демонстрационной программы demolin7 можно исследовать устойчивость
процедуры настройки в зависимости от параметра скорости обучения.
Процедура обучения
Для обучения линейной нейронной сети может быть применена типовая процедура
обучения с помощью М-функции train. Эта функция для каждого вектора входа выполняет настройку весов и смещений, используя М-функцию learnp. В результате сеть будет
настраиваться по сумме всех коррекций. Будем называть каждый пересчет для набора
входных векторов эпохой. Это и отличает процедуру обучения от процедуры адаптации
adapt, когда настройка параметров реализуется при представлении каждого отдельного
вектора входа. Затем процедура train моделирует настроенную сеть для имеющегося
набора векторов, сравнивает результаты с набором целевых векторов и вычисляет среднеквадратичную ошибку. Как только значение ошибки становится меньше заданного или
исчерпано предельное число эпох, обучение прекращается.
Обратимся к тому же примеру, который использовался при рассмотрении процедуры
адаптации, и выполним процедуру обучения.
P = [1 –1.2];% Вектор входов
T= [0.5, 1]; % Вектор целей
% Максимальное значение параметра обучения
maxlr = 0.40*maxlinlr(P,'bias');
120
Нейронные сети. MATLAB 6
% Создание линейной сети
net = newlin([–2,2],1,[0],maxlr);
% Расчет функции критерия качества
w_range=–1:0.2:1; b_range=–1:0.2:1; % Диапазоны значений веса и смещения
ES = errsurf(P,T, w_range, b_range, 'purelin');
% Построение поверхности функции критерия качества
surfc(w_range, b_range, ES) % Рис.5.5,а
На рис. 5.5, а построена поверхность функции критерия качества в пространстве параметров сети. В процессе обучения траектория обучения будет перемещаться из начальной точки в точку минимума критерия качества. Выполним расчет и построим траекторию обучения линейной сети для заданных начальных значений веса и смещения.
% Расчет траектории обучении
x = zeros(1,50); y = zeros(1,50);
net.IW{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; % Число эпох
% Цикл вычисления весов и смещения для одной эпохи
for i = 2:50,
[net, tr] = train(net,P,T);
x(i) = net.IW{1};
y(i) = net.b{1};
end
% Построение линий уровня и траектории обучении
clf, contour(w_range, b_range, ES, 20), hold on
plot(x, y,'–*'), hold off, % Рис.5.5,б
На рис. 5.5, б символом * отмечены значения веса и смещения на каждом шаге обучения; видно, что примерно за 10 шагов при заданной точности (пороговое значение критерия качества) 0.001 получим w = –0.22893, b = 0.70519. Это согласуется с решением, полученным с использованием процедуры адаптации.
а
б
Рис. 5.5
Если не строить траектории процесса обучения, то можно выполнить обучение, обратившись к М-функции train только 1 раз:
5. Линейные сети
121
net.IW{1}=1; net.b{1}= –1; % Начальные значения веса и смещения
net.trainParam.epochs = 50; % Число эпох обучения
net.trainParam.goal = 0.001; % Пороговое значение критерия качества
[net, tr] = train(net,P,T);
TRAINWB, Epoch 0/50, MSE 5.245/0.001.
TRAINWB, Epoch 11/50, MSE 0.000483544/0.001.
TRAINWB, Performance goal met.
net.IW, net.b
ans = [–0.22893]
ans = [0.70519]
На рис. 5.6 показано, как изменяется критерий качества на каждом цикле обучения.
Рис. 5.6
Если повысить точность обучения до значения 0.00001, то получим следующие
результаты:
net.trainParam.goal = 0.00001;
[net, tr] = train(net,P,T);
net.IW, net.b
TRAINWB, Epoch 0/50, MSE 0.000483544/1e–005.
TRAINWB, Epoch 6/50, MSE 5.55043e–006/1e–005.
TRAINWB, Performance goal met.
ans = [–0.22785]
ans = [ 0.72495]
Повышение точности на 2 порядка приводит к уточнению значений параметров
во втором знаке.
5.4. Применение линейных сетей
Задача классификации векторов
Покажем, как линейные сети могут быть применены для решения задач классификации. Если используется процедура обучения train, то параметры сети настраиваются
с учетом суммарного значения функции ошибки. Это отличается от процедуры адаптации
adapt, для работы которой характерна настройка параметров с учетом ошибки при представлении каждого вектора входа. Затем обучение применяется к скорректированной
122
Нейронные сети. MATLAB 6
сети, вычисляются выходы, сравниваются с соответствующими целями и вновь вычисляется ошибка обучения. Если достигнута допустимая погрешность или превышено максимальное число циклов (эпох) обучения, то процедура настройки прекращается. Алгоритм
обучения и настройки сходится, если задача классификации разрешима.
Проиллюстрируем решение задачи классификации, ранее решенной с помощью персептрона. Используем для этого простейшую линейную сеть, представленную на рис. 5.1.
Обучающее множество представлено следующими четырьмя парами векторов входов
и целей:


 2
p1    , t1  0


 2

 
 

1
 2
 1
p 2    , t 2  1  p3    , t3  0  p4    , t 4  1 .

 
 

  2
2
1
(5.9)
Определим линейную сеть с начальными значениями веса и смещения, используемыми
по умолчанию, т. е. нулевыми; зададим допустимую погрешность обучения, равную 0.1:
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);
TRAINWB, Epoch 0/100, MSE 0.5/0.1.
TRAINWB, Epoch 25/100, MSE 0.181122/0.1.
TRAINWB, Epoch 50/100, MSE 0.111233/0.1.
TRAINWB, Epoch 64/100, MSE 0.0999066/0.1.
TRAINWB, Performance goal met.
Пороговое значение функции качества достигается за 64 цикла обучения, а соответствующие параметры сети принимают значения
weights = net.iw{1,1}
bias = net.b(1)
weights = –0.061482 –0.21938
bias = [0.5899]
Выполним моделирование созданной сети с векторами входа из обучающего множества и вычислим ошибки сети:
A = sim(net, p)
err = t – sim(net,P)
A =
0.028173
err = –0.028173
0.96718
0.03282
0.2741
–0.2741
0.432
0.568
Заметим, что погрешности сети весьма значительны. Попытка задать большую точность в данном случае не приводит к цели, поскольку возможности линейной сети ограничены. Демонстрационный пример demolin4 иллюстрирует проблему линейной зависимости векторов, которая свойственна и этому случаю.
Обучение линейной нейронной сети иллюстрируется демонстрационной программой
demolin2, которая возвращает значения весов и погрешность в процессе обучения. В связи
с рассматриваемой проблемой классификации можно также обратиться к демонстрационной программе nnd10lc, в которой рассмотрена классическая задача классификации объектов при действии шумов.
5. Линейные сети
123
Фильтрация сигнала
На рис. 5.7 представлена структурная схема цифрового фильтра, отличительной
особенностью которого является то, что он включает динамический компонент – линию
задержки (ЛЗ) и 1 слой линейной нейронной сети.
Линейный
слой
ЛЗ
pd1
p(k)
w11
D
n(k)
pd2
p(k-1)

w12
p(k-N-1)
D
1
pdN
a(k)
b
w1N
N
a = purelin(Wp+b)
Рис. 5.7
Последовательность значений входного сигнала {p(k)} поступает на ЛЗ, состоящую
из N–1 блока запаздывания; выход ЛЗ – N-мерный вектор pd, составленный из значений
входа в моменты времени k, k–1, …, k–N–1.
Выход линейного нейронного слоя и фильтра в целом описывается следующим динамическим соотношением:
R
a(k )  purelin ( Wp  b)   w1i a (k  i  1)  b .
(5.10)
i 1
Рассмотрим конкретный пример цифрового фильтра, представленный на рис. 5.8.
Линейный цифровой фильтр
Вход
w11
p1(t) = p(t)
D
n(t)
a(t)

P2(t) = p(t-1)
w12
D
P3(t) = p(t-2)
b(t)
w13
1
a = purelin(Wp+b)
Рис. 5.8
Предположим, что входной сигнал принимает значения в диапазоне от 0 до 10, и сформируем линейную сеть с одним входом и одним выходом, используя М-функцию newlin:
net = newlin([0,10],1);
124
Нейронные сети. MATLAB 6
Введем ЛЗ с двумя тактами запаздывания:
net.inputWeights{1,1}.delays = [0 1 2];
определим следующие начальные значения весов и смещения:
net.IW{1,1} = [7 8 9];
net.b{1} = [0];
зададим начальные условия для динамических блоков линии задержки:
pi ={1 2}
Последовательность их задания слева направо соответствует блокам запаздывания,
расположенным на рисунке сверху вниз. Этим завершается формирование сети.
Теперь определим входной сигнал в виде следующей последовательности значений:
p = {3 4 5 6}
и промоделируем эту сеть:
[a,pf] = sim(net,p,pi);
a = [46] [70] [94] [118]
pf = [5] [6].
Для того чтобы получить желаемую последовательность сигналов на выходе, необходимо выполнить настройку сформированной сети. Предположим, что задана следующая
желаемая последовательность для выхода фильтра:
T = {10 20 30 40};
Выполним настройку параметров, используя процедуру адаптации adapt и 10 циклов
обучения:
net.adaptParam.passes = 10;
[net,y,E pf,af] = adapt(net,p,T,pi); % Процедура адаптации
Выведем полученные значения весов, смещения и выходного сигнала:
wts = net.IW{1,1}, bias = net.b{1}, y
wts = 0.5059 3.1053 5.7046
bias = 1.5993
y = [11.856] [20.774] [29.668] [39.004]
Если продолжить процедуру настройки, то можно еще точнее приблизить выходной
сигнал к желаемому:
net.adaptParam.passes = 500;
[net,y,E,pf,af] = adapt(net,p,T,pi);
y
y = [10.004]
[20.002]
[29.999]
[39.998]
Таким образом, линейные динамические нейронные сети могут быть адаптированы
для решения задач фильтрации временных сигналов. Для сетей такого класса часто
используется название ADALINE (ADaptive LInear NEtwork) – адаптируемые линейные
сети. Рассмотрим другие применения этих сетей.
Предсказание сигнала
Попробуем применить сеть ADALINE для предсказания значений детерминированного
процесса p(t). Обратимся к рис. 5.9.
5. Линейные сети
125
Рис. 5.9
Некоторый сигнал поступает на линию задержки так, что на ее выходе формируются
2 сигнала: p(t–1), p(t–2). Настройка сети реализуется с помощью М-функции adapt, которая изменяет параметры сети на каждом шаге с целью минимизировать погрешность
e(t) = a(t) – p(t). Если эта погрешность нулевая, то выход сети a(t) точно равен p(t) и сеть
выполняет предсказание должным образом.
Ниже приведен сценарий, который предназначен для решения задачи предсказания
сигнала на 1 шаг вперед. Входной детерминированный процесс получен в результате прохождения ступенчатого сигнала через колебательное звено.
Поскольку для формирования входа применено динамическое звено второго порядка,
то в сети ADALINE будет использована ЛЗ с двумя блоками. Запишем следующий сценарий для решения задачи предсказания сигнала:
clear
sys = ss(tf(1,[1 1 1])); % Формирование колебательного звена
% Получение реакции на ступенчатое входное воздействие
time = 0:0.2:10;
[y,time] = step(sys,0:0.2:10);
% Формирование обучающего множества
p = y(1:length(time)–2)';
t = y(3:length(time))';
time = time(1:length(time)–2);
% Формирование нейронной сети
net = newlin([–1 1],1,[1 2]);
P = num2cell(p);
T = num2cell(t);
% Настройка нейронной сети
pi = {0 0};
net.adaptParam.passes = 5;
[net,Y,E,Pf,Af] = adapt(net,P,T,pi);
Y1 = cat(1,Y{:}); % Преобразование массива ячеек в массив double
126
Нейронные сети. MATLAB 6
% Построение графиков
plot(time,Y1,'b:',time,p,'r–'), xlabel('Время, с'), ylabel('Процессы')
title('Обучение нейронной сети')
% Моделирование нейронной сети
x = sim(net,P);
x1 = cat(1,x{:});
plot(time,x1,'b')
Найденные значения весов и смещения равны
net.IW{1,1}, net.b
ans = 0.33427
0.31816
ans = [0.35853]
Результаты обучения и моделирования результирующей нейронной сети, решающей
задачу предсказания сигнала, представлены соответственно на рис. 5.10, а и б.
а
б
Рис. 5.10
Как видно из этих рисунков, приемлемое для данной постановки задачи количество
циклов обучения равно пяти; результаты моделирования показывают, что при длительности процесса 10 с диапазон успешного предсказания находится в пределах 1.8–10 с.
Подавление шумов
Задача подавления шумов возникает в следующей ситуации. Когда пилот говорит
в микрофон, шум двигателя в кабине добавляется к голосовому сигналу и пассажиры
слышат речь с искажениями. Требуется восстановить речь пилота, удалив из нее звуки
шумов двигателя. Для решения этой задачи построим адаптивный фильтр, полагая, что
в нашем распоряжении имеются записи шумов двигателя (рис. 5.11).
5. Линейные сети
127
Рис. 5.11
Используя адаптируемую нейронную сеть ADALINE, построим такой фильтр, который позволит удалить шум n из зашумленного сигнала m. Рассмотрим подробнее структурную схему, представленную на рис. 5.11. Голос пилота v смешан с помехой от шумов
двигателя, которая формируется фильтром шума по известным записям сигнала n.
Зашумленный сигнал m моделирует искаженную речь пилота. Задача состоит в том, чтобы с помощью адаптивного фильтра сформировать такую модель шума а, которая при
вычитании из зашумленного сигнала позволила бы выделить речь пилота.
Адаптивный фильтр, построенный на базе линейной нейронной сети ADALINE, должен быть настроен так, чтобы убирать шум двигателя. Заметим, что такая адаптивная
фильтрация предпочтительнее классического фильтра, в котором шум не вычитается,
а отфильтровывается от сигнала m.
Многомерные цифровые фильтры
Для проектирования многомерных фильтров следует применять сети ADALINE, в которых используется более одного нейрона. Это приведет к тому, что вместо вектора весов
входа будет использоваться матрица весов W, а вместо единственного смещения – вектор
смещений b. Структурная схема такого многомерного фильтра показана на рис. 5.12.
Линейные нейроны
ЛЗ
pd1
w11
p(k)
D
n1(k)

pd2
b1
p(k-1)
p(k-N-1)
pdN
a2(k)
n2(k)`

D
a1(k)
b2
aS(k)
nS(k)
wS, N

N
bS
a = purelin(Wp+b)
128
Рис. 5.12
Нейронные сети. MATLAB 6
Эта схема достаточно сложна для восприятия, и ее можно представить в укрупненном
виде (рис. 5.13, а).
Если в линии задержки (ЛЗ) требуется показать больше деталей, то можно использовать следующий вариант структурной схемы (рис. 5.13, б).
Линейный слой из 3 нейронов
Линейный слой из S нейронов
ЛЗ
Q1
n(k)
W
(QN)1
N
1
pd(k)
p(k)
pd(k)
p(k)
a(k)
ЛЗ
11
S1
S(QN)
b
0
2
32
31
1
S1
n(k)
W
31
31
b
1
a(k)
31
S1
2
б
a
Рис. 5.13
Здесь ЛЗ представлена в развернутом виде, указывая, что на вход весовой матрицы
подается текущее значение и значения с запаздыванием на 1 и 2 периода дискретности.
Можно использовать и большее число блоков задержки, но указывать их надо в порядке
возрастания сверху вниз.






В заключение отметим основные преимущества и ограничения линейных сетей:
Однослойные линейные сети могут решать задачи линейной аппроксимации функций
и распознавания образов.
Однослойные линейные сети могут быть либо рассчитаны непосредственно, либо
обучены с использованием правила обучения WH. Кроме того, для их настройки могут применяться процедуры адаптации.
Архитектура однослойной линейной сети полностью определяется задачей, которая
должна будет решена, причем число входов сети и число нейронов в слое определяется числом входов и выходов задачи.
Адаптируемые линейные сети ADALINE находят большое практическое применение
при построении цифровых фильтров для обработки сигналов.
Линейные нейронные сети могут быть успешно обучены только в том случае, когда
входы и выходы связаны линейно. Тем не менее даже в том случае, когда линейная
сеть не может найти точного решения, она в состоянии построить наиболее близкое
решение в смысле минимума среднеквадратичной ошибки при условии, что параметр
обучения достаточно мал. Такая сеть найдет наиболее точное решение в рамках линейной структуры сети. Это обусловлено тем, что поверхность ошибки обучения является многомерным параболоидом, имеющим единственный минимум, и алгоритм
градиентного спуска должен привести решение к этому минимуму.
При работе с моделями линейных сетей могут возникать ситуации, когда число
настраиваемых параметров недостаточно, чтобы выполнить все условия; в этом случае говорят, что сеть переопределена. Однако может иметь место и обратная ситуация, когда число настраиваемых параметров слишком велико, и в этом случае говорят, что сеть недоопределена. Тем не менее в обоих случаях метод наименьших
5. Линейные сети
129

130
квадратов осуществляет настройку, стремясь минимизировать ошибку сети. Эти ситуации поясняются демонстрационными примерами demolin4 и demolin5.
Разрешимость линейной задачи с помощью линейной нейронной сети может быть
установлена следующим образом. Если суммарное количество весов и смещений линейной сети S*R + S, где R – количество входов, S – количество слоев, равно количеству пар векторов входа и цели Q, то такая задача разрешима с помощью линейной
нейронной сети. Это справедливо за исключением того случая, когда векторы входа
являются линейно зависимыми и используется сеть без смещений. Демонстрационный пример demolin6 поясняет эту ситуацию.
Нейронные сети. MATLAB 6
6. РАДИАЛЬНЫЕ БАЗИСНЫЕ СЕТИ
Радиальные базисные нейронные сети состоят из большего количества нейронов, чем
стандартные сети с прямой передачей сигналов и обучением методом обратного распространения ошибки, но на их создание требуется значительно меньше времени. Эти сети
особенно эффективны, когда доступно большое количество обучающих векторов [7].
Ниже, кроме сетей общего вида, обсуждаются 2 специальных типа радиальных базисных сетей: сети GRNN (Generalized Regression Neural Networks) для решения задач обобщенной регрессии и сети PNN (Probabilistic Neural Networks) для решения вероятностных
задач [43].
Для создания радиальных сетей общего вида предназначены М-функции newrbe
и newrb, а обобщенных регрессионных и вероятностных – М-функции newgrnn и newpnn
соответственно.
По команде help radbasis можно получить следующую информацию об М-функциях,
входящих в состав ППП Neural Network Toolbox и относящихся к построению радиальных
базисных сетей:
Radial basis networks
New networks
newrb
newrbe
newgrnn
newpnn
Using networks
sim
Weight functions
dist
dotprod
normprod
Net input functions
netprod
netsum
Transfer functions
compet
purelin
radbas
Performance
mse
Signals
ind2vec
vec2ind
Радиальные базисные сети
Формирование сети
Создание радиальной базисной сети
Создание радиальной базисной сети с нулевой ошибкой
Создание обобщенной регрессионной сети
Создание вероятностной сети
Работа с сетью
Моделирование сети
Функции взвешивания
Евклидово расстояние
Скалярное произведение
Нормированное скалярное произведение
Функции накопления
Произведение взвешенных входов
Сумма взвешенных входов
Функции активации
Конкурирующая функция активации
Функция активации с жесткими ограничениями
Радиальная базисная функция активации
Функции оценки качества сети
Среднеквадратичная погрешность
Преобразование данных
Преобразование индексного вектора в матрицу связности
Преобразование матрицы связности в индексный вектор
131
Демонстрационные примеры
Радиальные базисные сети
Пример неперекрывающихся функций активации
Пример перекрывающихся функций активации
Сеть GRNN и аппроксимация функций
Сеть PNN и классификация векторов
Demonstrations
demorb1
demorb3
demorb4
demogrn1
demopnn1
Модель нейрона и архитектура сети
На рис. 6.1 показана радиальная базисная сеть с R входами. Функция активации
для радиального базисного нейрона имеет вид:
2
radbas(n)  e  n .
(6.1)
Вход функции активации определяется как модуль разности вектора весов w и вектора входа p, умноженный на смещение b.
Вход
p1
Радиальный базисный нейрон
w11
w1R
. . .
a
n
p2
|| dist ||
p3
.
.
.
.
pR
1
b
a = radbas ( ||p – w|| b )
Рис. 6.1
График функции активации представлен на рис. 6.2.
Рис. 6.2
Эта функция имеет максимум, равный 1, когда вход равен 0. Когда расстояние между
векторами w и p уменьшается, выход радиальной базисной функции увеличивается.
Таким образом, радиальный базисный нейрон действует как индикатор, который формирует значение 1, когда вход p идентичен вектору весов w. Смещение b позволяет корректировать чувствительность нейрона radbas. Например, если нейрон имел смещение 0.1,
то его выходом будет 0.5 для любого вектора входа p и вектора веса w при расстоянии
между векторами, равном 8.333, или 0.833/b.
132
Нейронные сети. MATLAB 6
Радиальная базисная сеть состоит из двух слоев: скрытого радиального базисного
слоя, имеющего S1 нейронов, и выходного линейного слоя, имеющего S2 нейронов
(рис. 6.3).
Рис. 6.3
Входами блока ||dist|| на этом рисунке являются вектор входа p и матрица весов IW1,1,
а выходом – вектор, состоящий из S1 элементов, которые определяются расстояниями
между i-м вектором входа p и i-й вектор-строкой iIW1,1 матрицы весов. Такую векторстроку будем называть вектором весов i-го нейрона. Выход блока ||dist|| умножается поэлементно на вектор смещения b1 и формирует вход функции активации. Тогда выход
первого слоя может быть записан в следующей форме:
a{1}=radbas(net.prod(dist(net.IW{1,1},p),net.b{1})))
Использовать столь сложную запись при применении ППП Neural Network Toolbox не
потребуется, поскольку все операции, связанные с созданием радиальной базисной сети,
оформлены в виде специальных М-функций newrbe и newrb.
Для того чтобы понять поведение сети, необходимо проследить прохождение вектора
входа p. При задании вектора входа каждый нейрон радиального базисного слоя выдаст
значение в соответствии с тем, как близок вектор входа к вектору весов каждого нейрона.
Таким образом, радиальные базисные нейроны с векторами весов, значительно отличающимися от вектора входа p, будут иметь выходы, близкие к 0, и их влияние на выходы
линейных нейронов будет незначительно. Напротив, радиальный базисный нейрон с вектором весов, близким к вектору входа p, выдаст значение, близкое к 1, и это значение будет передано на линейный нейрон с весом, соответствующим выходному слою. Таким
образом, если только 1 радиальный базисный нейрон имеет выход 1, а все другие имеют
выходы, равные или очень близкие к 0, то выход линейного слоя будет равен весу активного выходного нейрона. Однако это исключительный случай, обычно выход формируют
несколько нейронов с разными значениями весов.
Создание сети
Для построения радиальных базисных сетей предназначены М-функции newrbe
и newrb. Первая позволяет построить радиальную базисную сеть с нулевой ошибкой, вторая позволяет управлять количеством нейронов скрытого слоя.
6. Радиальные базисные сети
133
Радиальная базисная сеть с нулевой ошибкой
Для построения радиальных базисных сетей с нулевой ошибкой предназначена функция newrbe, которая вызывается следующим образом:
net = newrbe(P,T,SPREAD)
Входными аргументами функции newrbe являются массивы входных векторов P
и целей T, а также параметр влияния SPREAD. Она возвращает радиальную базисную
сеть с такими весами и смещениями, что ее выходы точно равны целям T. Функция
newrbe создает столько нейронов радиального базисного слоя, сколько имеется входных
векторов в массиве P и устанавливает веса первого слоя равными P'. При этом смещения
устанавливаются равными 0.8326/SPREAD. Это означает, что уровень перекрытия радиальных базисных функций равен 0.5 и все входы в диапазоне SPREAD считаются значимыми. Ясно, что чем больший диапазон входных значений должен быть принят во внимание, тем большее значение параметра влияния SPREAD должно быть установлено. Это
наиболее наглядно проявляется при решении задач аппроксимации функций, в чем можно
убедиться, обратившись к демонстрационной программе demorb1.
Веса второго слоя IW21 (IW{2,1} – в обозначениях системы MATLAB) и смещений b2
(b{2}) могут быть найдены путем моделирования выходов первого слоя a1 (A{1}) и последующего решения системы линейных алгебраических уравнений (СЛАУ):
[W{2,1} b{2}] * [A{1}; ones] = T
Поскольку известны входы второго слоя A{1} и цели T, а слой линеен, то для вычисления весов и смещений второго слоя достаточно воспользоваться решателем СЛАУ
Wb = T / [P; ones(1, size(P,2))]
Здесь матрица Wb содержит веса и смещения (смещения – в последнем столбце). Сумма
квадратов погрешностей сети будет всегда равна 0, так как имеем задачу с Q уравнениями
(пары вход/цель) и каждый нейрон имеет Q + 1 переменных (Q весов по числу радиальных базисных нейронов и одно смещение). СЛАУ с Q уравнениями и более чем Q переменными имеет свободные переменные и характеризуется бесконечным числом решений
с нулевой погрешностью.
Рассмотрим пример обучения и моделирования следующей радиальной базисной сети:
P = –1:.1:1;
T = [–.9602 –.5770 –.0729 .3771 .6405 .6600 .4609 .1336 ...
–.2013 –.4344 –.5000 –.3930 –.1647 .0988 .3072 .3960 ...
.3449 .1816 –.0312 –.2189 –.3201];
plot(P,T,'*r','MarkerSize',4,'LineWidth',2)
hold on
% Создание сети
net = newrbe(P,T); % Создание радиальной базисной сети
Warning: Rank deficient, rank = 13 tol =
2.2386e–014.
net.layers{1}.size % Число нейронов в скрытом слое
ans = 21
% Моделирование сети
V = sim(net,P); % Векторы входа из обучающего множества
plot(P,V,'ob','MarkerSize',5, 'LineWidth',2)
p = [–0.75 –0.25 0.25 0.75];
134
Нейронные сети. MATLAB 6
v = sim(net,p); % Новый вектор входа
plot(p,v,'+k','MarkerSize',10, 'LineWidth',2)
Результаты моделирования представлены на рис. 6.4.
Рис. 6.4
Здесь отмечены значения входов Р, целевых выходов Т, а также результаты обработки нового вектора р. Количество используемых нейронов в скрытом слое в данном случае
равно 21, что соответствует длине обучающего множества.
Таким образом, в результате обучения функция newrbe создает радиальную базисную
сеть с нулевой погрешностью на обучающем множестве. Единственное условие, которое
требуется выполнить, состоит в том, чтобы значение параметра SPREAD было достаточно
большим, чтобы активные области базисных функций перекрывались, чтобы покрыть
весь диапазон входных значений. Это позволяет обеспечить необходимую гладкость аппроксимирующих кривых и препятствует возникновению явления переобучения. Однако
значение SPREAD не должно быть настолько большим, чтобы радиальная базисная функция объявляла одинаково значимыми все значения входа.
Недостаток функции newrbe заключается в том, что она формирует сеть с числом
нейронов в скрытом слое, равным числу элементов обучающего множества. Поэтому
с помощью этой функции нельзя получить приемлемого решения в случае больших размеров обучающего множества, что характерно для реальных приложений.
Итерационная процедура формирования сети
Функция newrb создает радиальную базисную сеть, используя итеративную процедуру, которая добавляет по одному нейрону на каждом шаге. Нейроны добавляются к скрытому слою до тех пор, пока сумма квадратов ошибок не станет меньше заданного значения или не будет использовано максимальное количество нейронов. Эта функция
вызывается с помощью команды
net = newrb(P,T,GOAL,SPREAD)
Входами функции newrb являются массивы входных и целевых векторов P и T, а также параметры GOAL (допустимая среднеквадратичная ошибка сети), SPREAD (параметр
влияния), а выходом – описание радиальной базисной сети. Значение параметра SPREAD
должно быть достаточно большим, чтобы покрыть весь диапазон значений входов, но
не настолько, чтобы эти значения были одинаково значимыми.
6. Радиальные базисные сети
135
Применим функцию newrb для создания радиальной базисной сети из предыдущго
примера.
P = –1:.1:1;
T = [–.9602 –.5770 –.0729 .3771 .6405 .6600 .4609 .1336 ...
–.2013 –.4344 –.5000 –.3930 –.1647 .0988 .3072 .3960 ...
.3449 .1816 –.0312 –.2189 –.3201];
plot(P,T,'*r','MarkerSize',4,'LineWidth',2)
hold on
% Создание сети
GOAL = 0.01; % Допустимое значение функционала ошибки
net = newrb(P,T,GOAL); % Создание радиальной базисной сети
net.layers{1}.size % Число нейронов в скрытом слое
ans = 6
% Моделирование сети
V = sim(net,P); % Векторы входа из обучающего множества
plot(P,V,'ob','MarkerSize',5, 'LineWidth',2)
p = [–0.75 –0.25 0.25 0.75];
v = sim(net,p); % Новый вектор входа
plot(p,v,'+k','MarkerSize',10, 'LineWidth',2)
Соответствующий график представлен на рис. 6.5, а.
а
б
Рис. 6.5
Здесь отмечены значения входов Р, целевых выходов Т, а также результаты обработки нового вектора р. Количество используемых нейронов в скрытом слое в данном случае
равно шести, что соответствует значению функционала ошибки 0.01. На рис. 6.5, б показана зависимость количества требуемых нейронов скрытого слоя от точности обучения.
Из этого графика следует, что для значений функционала ошибки менее 1е–9 требуется
максимальное количество нейронов, совпадающее с числом нейронов радиальной базисной сети с нулевой погрешностью.
Если сравнивать сети с прямой передачей сигнала и радиальные базисные сети, то
следует заметить, что при решении одних и тех же задач они имеют определенные преимущества друг перед другом. Так, радиальные базисные сети с нулевой погрешностью
имеют значительно больше нейронов, чем сравнимая сеть с прямой передачей сигнала и
сигмоидальными функциями активации в скрытом слое. Это обусловлено тем, что сигмоидальные функции активации перекрывают большие диапазоны значений входа, чем ра136
Нейронные сети. MATLAB 6
диальные базисные функции. С другой стороны, проектирование радиальной базисной
сети требует значительно меньшего времени, а при ограниченной точности обучения
может потребовать и меньшего количества используемых нейронов.
Примеры радиальных базисных сетей
Демонстрационный пример demorb1 иллюстрирует применение радиальной базисной
сети для решения задачи аппроксимации функции от одной переменной.
Представим функцию f(x) следующим разложением:
N
f ( x)    i  i ( x) ,
(6.2)
i 1
где i(x) – радиальная базисная функция.
Тогда идея аппроксимации может быть представлена графически следующим образом. Рассмотрим взвешенную сумму трех радиальных базисных функций, заданных
на интервале [–3 3].
p = –3:.1:3;
a1 = radbas(p);
a2 = radbas(p–1.5);
a3 = radbas(p+2);
a = a1 + a2*1 + a3*0.5;
plot(p,a1,p,a2,p,a3*0.5,p,a) % Рис. 6.6
Рис. 6.6
Как следует из анализа рис. 6.6 разложение по радиальным базисным функциям обеспечивает необходимую гладкость. Поэтому их применение для аппроксимации произвольных нелинейных зависимостей вполне оправдано. Разложение вида (6.2) может быть
реализовано на двухслойной нейронной сети, первый слой которой состоит из радиальных базисных нейронов, а второй – из единственного нейрона с линейной характеристикой, на котором реализуется суммирование выходов нейронов первого слоя.
Приступим к формированию радиальной базисной сети. Сформируем обучающее
множество и зададим допустимое значение функционала ошибки, равное 0.01, параметр
6. Радиальные базисные сети
137
влияния определим равным 1 и будем использовать итерационную процедуру формирования радиальной базисной сети:
P = –1:.1:1;
T = [–.9602 –.5770 –.0729 .3771 .6405 .6600 .4609
–.2013 –.4344 –.5000 –.3930 –.1647 .0988 .3072
.3449 .1816 –.0312 –.2189 –.3201];
GOAL = 0.01; % Допустимое значение функционала ошибки
SPREAD = 1; % Параметр влияния
net = newrb(P,T,GOAL,SPREAD); % Создание сети
net.layers{1}.size % Число нейронов в скрытом слое
ans =
6
.1336 ...
.3960 ...
Для заданных параметров нейронная сеть состоит из шести нейронов и обеспечивает
следующие возможности аппроксимации нелинейных зависимостей после обучения.
Моделируя сформированную нейронную сеть, построим аппроксимационную кривую
на интервале [–1 1] с шагом 0.01 для нелинейной зависимости.
plot(P,T,'+k') % Точки обучающего множества
hold on;
X = –1:.01:1;
Y = sim(net,X); % Моделирование сети
plot(X,Y); % Рис. 6.7
Из анализа рис. 6.7 следует, что при небольшом количестве нейронов скрытого слоя
радиальная базисная сеть достаточно хорошо аппроксимирует нелинейную зависимость,
заданную обучающим множеством из 21 точки.
Рис. 6.7
В демонстрационных примерах demorb3 и demorb4 исследуется влияние параметра
SPREAD на структуру радиальной базисной сети и качество аппроксимации. В демонстрационном примере demorb3 параметр влияния SPREAD установлен равным 0.01. Это
означает, что диапазон перекрытия входных значений составляет лишь 0.01, а поскольку
обучающие входы заданы с интервалом 0.1, то входные значения функциями активации
не перекрываются.
GOAL = 0.01; % Допустимое значение функционала ошибки
SPREAD = 0.01; % Параметр влияния
138
Нейронные сети. MATLAB 6
net = newrb(P,T,GOAL,SPREAD); % Создание сети
net.layers{1}.size % Число нейронов в скрытом слое
ans = 19
Это приводит к тому, что, во-первых, увеличивается количество нейронов скрытого
слоя с 6 до 19, а во-вторых, не обеспечивается необходимой гладкости аппроксимируемой
функции:
plot(P,T,'+k') % Точки обучающего множества
hold on;
X = –1:.01:1;
Y = sim(net,X); % Моделирование сети
plot(X,Y); % Рис. 6.8
Рис. 6.8
Пример demorb4 иллюстрирует противоположный случай, когда параметр влияния
SPREAD выбирается достаточно большим (в данном примере – 12 или больше), то все
функции активации перекрываются и каждый базисный нейрон выдает значение, близкое
к 1, для всех значений входов. Это приводит к тому, что сеть не реагирует на входные
значения. Функция newrb будет пытаться строить сеть, но не сможет обеспечить необходимой точности из-за вычислительных проблем.
GOAL = 0.01; % Допустимое значение функционала ошибки
SPREAD = 12; % Параметр влияния
net = newrb(P,T,GOAL,SPREAD); % Создание сети
net.layers{1}.size % Число нейронов в скрытом слое
ans = 21
В процессе вычислений возникают трудности с обращением матриц, и об этом выдаются предупреждения; количество нейронов скрытого слоя устанавливается равным 21,
а точность аппроксимации оказывается недопустимо низкой:
plot(P,T,'+k') % Точки обучающего множества
hold on;
X = –1:.01:1;
Y = sim(net,X); % Моделирование сети
plot(X,Y); % Рис. 6.9
6. Радиальные базисные сети
139
Рис. 6.9
Вывод из выполненного исследования состоит в том, что параметр влияния SPREAD
следует выбирать большим, чем шаг разбиения интервала задания обучающей последовательности, но меньшим размера самого интервала. Для данной задачи это означает, что
параметр влияния SPREAD должен быть больше 0.1 и меньше 2.
6.1. Сети GRNN
Нейронные сети GRNN (Generalized Regression Neural Network) описаны в работе [43]
и предназначены для решения задач обобщенной регрессии, анализа временных рядов
и аппроксимации функций. Характерной особенностью этих сетей является очень высокая
скорость их обучения.
Архитектура сети
Архитектура сети GRNN показана на рис. 6.10. Она аналогична архитектуре радиальной базисной сети, но отличается структурой второго слоя, в котором используется блок
normprod для вычисления нормированного скалярного произведения строки массива весов LW21 и вектора входа a1 в соответствии со следующим соотношением:
n2 
LW 21a1
sum(a1 )
.
(6.3)
Рис. 6.10
140
Нейронные сети. MATLAB 6
Первый слой – это радиальный базисный слой с числом нейронов, равным числу элементов Q обучающего множества; в качестве начального приближения для матрицы весов
выбирается массив P'; смещение b1 устанавливается равным вектор-столбцу с элементами
0.8326/SPREAD. Функция dist вычисляет расстояние между вектором входа и вектором
веса нейрона; вход функции активации n1 равен поэлементному произведению взвешенного входа сети на вектор смещения; выход каждого нейрона первого слоя a1 является
результатом преобразования вектора n1 радиальной базисной функцией radbas. Если вектор веса нейрона равен транспонированному вектору входа, то взвешенный вход равен 0,
а выход функции активации – 1. Если расстояние между вектором входа и вектором веса
нейрона равно spread, то выход функции активации будет равен 0.5.
Второй слой – это линейный слой с числом нейронов, также равным числу элементов
Q обучающего множества, причем в качестве начального приближения для матрицы весов
LW{2,1} выбирается массив T. Предположим, что имеем вектор входа pi, близкий к одному из векторов входа p из обучающего множества. Этот вход pi генерирует значение
выхода слоя ai1, близкое к 1. Это приводит к тому, что выход слоя 2 будет близок к ti.
Если параметр влияния SPREAD мал, то радиальная базисная функция характеризуется резким спадом и диапазон входных значений, на который реагируют нейроны скрытого
слоя, оказывается весьма малым. С увеличением параметра SPREAD наклон радиальной
базисной функции становится более гладким, и в этом случае уже несколько нейронов
реагируют на значения вектора входа. Тогда на выходе сети формируется вектор, соответствующий среднему нескольких целевых векторов, соответствующих входным векторам
обучающего множества, близких к данному вектору входа. Чем больше значение параметра SPREAD, тем большее число нейронов участвует в формировании среднего значения, и в итоге функция, генерируемая сетью, становится более гладкой.
Синтез сети
Для создания нейронной сети GRNN предназначена М-функция newgrnn. Зададим
следующее обучающее множество векторов входа и целей и построим сеть GRNN:
P = [4 5 6];
T = [1.5 3.6 6.7];
net = newgrnn(P,T);
net.layers{1}.size % Число нейронов в скрытом слое
ans = 3
Эта сеть имеет 3 нейрона в скрытом слое. Промоделируем построенную сеть сначала
для одного входа, а затем для последовательности входов из интервала [4 7]:
p = 4.5;
v = sim(net,p);
p1 = 4:0.1:7;
v1 = sim(net,p1);
plot(P,T,'*k',p,v,'ok',p1,v1,'–k','MarkerSize',10,'LineWidth',2)
Результат показан на рис. 6.11.
6. Радиальные базисные сети
141
Рис. 6.11
Заметим, что для сети GRNN размер вводимого вектора может отличаться от размера
векторов, используемых в обучающей последовательности. Кроме того, в данном случае
аппроксимирующая функция может значительно отличаться от значений, соответствующих обучающей последовательности.
Демонстрационная программа demogrn1 иллюстрирует, как сети GRNN решают задачи аппроксимации. Определим обучающее множество в виде массивов Р и Т.
P = [1 2 3 4 5 6 7 8];
T = [0 1 2 3 2 1 2 1];
Для создания сети GRNN используется функция newgrnn. Примем значение параметра влияния SPREAD немного меньшим, чем шаг задания аргумента функции (в данном
случае 1), чтобы построить аппроксимирующую кривую, близкую к заданным точкам.
Как мы уже видели ранее, чем меньше значение параметра SPREAD, тем ближе точки
аппроксимирующей кривой к заданным, но тем менее гладкой является сама кривая:
spread = 0.7;
net = newgrnn(P,T,spread);
net.layers{1}.size % Число нейронов в скрытом слое
ans = 8
A = sim(net,P);
plot(P,T,'*k','markersize',10)
hold on,
plot(P,A,'ok','markersize',10);
Результат показан на рис. 6.12.
142
Нейронные сети. MATLAB 6
Рис. 6.12
Моделирование сети для диапазона значений аргумента позволяет увидеть всю
аппроксимирующую кривую, причем возможна экстраполяция этой кривой за пределы
области ее определения. Для этого зададим интервал аргумента в диапазоне [–1 10]:
P2 = –1:0.1:10;
A2 = sim(net,P2);
plot(P2,A2,'–k','linewidth',2)
hold on,
plot(P,T,'*k','markersize',10)
Результат показан на рис. 6.13.
Рис. 6.13
Сформированная сеть GRNN использует всего 8 нейронов в скрытом слое и весьма
успешно решает задачу аппроксимации и экстраполяции нелинейной зависимости, восстанавливаемой по экспериментальным точкам.
6. Радиальные базисные сети
143
6.2. Сети PNN
Нейронные сети PNN (Probabilistic Neural Networks) описаны в работе [43] и предназначены для решения вероятностных задач, и в частности задач классификации.
Архитектура сети
Архитектура сети PNN базируется на архитектуре радиальной базисной сети, но в качестве второго слоя использует так называемый конкурирующий слой, который подсчитывает вероятность принадлежности входного вектора к тому или иному классу и в конечном счете сопоставляет вектор с тем классом, вероятность принадлежности к которому
выше. Структура сети PNN представлена на рис. 6.14.
Рис. 6.14
Предполагается, что задано обучающее множество, состоящее из Q пар векторов
вход/цель. Каждый вектор цели имеет K элементов, указывающих класс принадлежности,
и, таким образом, каждый вектор входа ставится в соответствие одному из K классов.
В результате может быть образована матрица связности T размера KQ, состоящая
из нулей и единиц, строки которой соответствуют классам принадлежности, а столбцы –
векторам входа. Таким образом, если элемент T(i, j) матрицы связности равен 1, то это
означает, что j-й входной вектор принадлежит к классу i.
Весовая матрица первого слоя IW11 (net.IW{1,1}) формируется с использованием векторов входа из обучающего множества в виде матрицы P'. Когда подается новый вход,
блок ||dist|| вычисляет близость нового вектора к векторам обучающего множества; затем
вычисленные расстояния умножаются на смещения и подаются на вход функции активации radbas. Вектор обучающего множества, наиболее близкий к вектору входа, будет
представлен в векторе выхода a1 числом, близким к 1.
Весовая матрица второго слоя LW21 (net.LW{2,1}) соответствует матрице связности
T, построенной для данной обучающей последовательности. Эта операция может быть
выполнена с помощью М-функции ind2vec, которая преобразует вектор целей в матрицу
связности T. Произведение T*a1 определяет элементы вектора a1, соответствующие каждому из K классов. В результате конкурирующая функция активации второго слоя compet
формирует на выходе значение, равное 1, для самого большого по величине элемента вектора n2 и 0 в остальных случаях. Таким образом, сеть PNN выполняет классификацию
векторов входа по K классам.
144
Нейронные сети. MATLAB 6
Синтез сети
Для создания нейронной сети PNN предназначена М-функция newpnn. Определим
7 следующих векторов входа и соотнесем каждый из них с одним из трех классов:
P = [0 0;1 1;0 3;1 4;3 1;4 1;4 3]';
Tc = [1 1 2 2 3 3 3];
Вектор Тс назовем вектором индексов классов. Этому индексному вектору можно
поставить в соответствие матрицу связности T в виде разреженной матрицы вида
T = ind2vec(Tc)
T =
(1,1)
(1,2)
(2,3)
(2,4)
(3,5)
(3,6)
(3,7)
1
1
1
1
1
1
1
которая определяет принадлежность первых двух векторов к классу 1, двух последующих –
к классу 2 и трех последних – к классу 3. Полная матрица Т имеет вид:
Т = full(T)
Т =
1
1
0
0
0
0
0
1
0
0
1
0
0
0
1
0
0
1
0
0
1
Массивы Р и Т задают обучающее множество, что позволяет выполнить формирование сети, промоделировать ее, используя массив входов P, и удостовериться, что сеть
правильно решает задачу классификации на элементах обучающего множества. В результате моделирования сети формируется матрица связности, соответствующая массиву
векторов входа. Для того чтобы преобразовать ее в индексный вектор, предназначена
М-функция vec2ind:
net = newpnn(P,T);
net.layers{1}.size % Число нейронов в сети PNN
ans = 7
Y = sim(net,P);
Yc = vec2ind(Y)
Yc = 1 1 2 2 3 3 3
Результат подтверждает правильность решения задачи классификации.
Выполним классификацию некоторого набора произвольных векторов р, не принадлежащих обучающему множеству, используя ранее созданную сеть PNN:
p = [1 3; 0 1; 5 2]';
Выполняя моделирование сети для этого набора векторов, получаем
a = sim(net,p);
ac = vec2ind(a)
ac = 2 1 3
6. Радиальные базисные сети
145
Фрагмент демонстрационной программы demopnn1 позволяет проиллюстрировать
результаты классификации в графическом виде:
clf reset, drawnow
p1 = 0:.05:5;
p2 = p1;
[P1,P2]=meshgrid(p1,p2);
pp = [P1(:) P2(:)];
aa = sim(net,pp');
aa = full(aa);
m = mesh(P1,P2,reshape(aa(1,:),length(p1),length(p2)));
set(m,'facecolor',[0.75 0.75 0.75],'linestyle','none');
hold on
view(3)
m = mesh(P1,P2,reshape(aa(2,:),length(p1),length(p2)));
set(m,'facecolor',[0 1 0.5],'linestyle','none');,
m = mesh(P1,P2,reshape(aa(3,:),length(p1),length(p2)));
set(m,'facecolor',[0 1 1],'linestyle','none');
plot3(P(1,:),P(2,:),ones(size(P,2))+0.1,'.','markersize',30)
plot3(p(1,:),p(2,:),1.1*ones(size(p,2)),'*','markersize',20,...
'color',[1 0 0])
hold off
view(2)
Результаты классификации представлены на рис. 6.15 и показывают, что 3 представленных сети вектора, отмеченные звездочками, классифицируются сетью PNN, состоящей
из семи нейронов, абсолютно правильно.
Рис. 6.15
В заключение отметим, что сети PNN могут весьма эффективно применяться для решения задач классификации. Если задано достаточно большое обучающее множество, то
решения, генерируемые сетями, сходятся к решениям, соответствующим правилу Байеса.
Недостаток сетей GRNN и PNN заключается в том, что работают они относительно медленно, поскольку выполняют очень большие объемы вычислений по сравнению с другими типами нейронных сетей.
146
Нейронные сети. MATLAB 6
7. СЕТИ КЛАСТЕРИЗАЦИИ
И КЛАССИФИКАЦИИ ДАННЫХ
В процессе анализа больших информационных массивов данных неизменно возникают
задачи, связанные с исследованием топологической структуры данных, их объединением
в группы (кластеры), распределением по классам и т. п. Это могут быть экономические, финансовые, научно-технические, медицинские и другие приложения, где требуется решение
таких практических задач, как сжатие данных, их хранение и поиск, определение характеристик объекта по ограниченному набору признаков. Такие задачи могут быть успешно решены
с применением специального класса самоорганизующихся нейронных сетей.
7.1. Самоорганизующиеся нейронные сети
Свойство самоорганизации является одним из наиболее привлекательных свойств
нейронных сетей. Таким свойством обладают самоорганизующиеся нейронные сети, описанные финским ученым Т. Кохоненом [23]. Нейроны самоорганизующейся сети могут
быть обучены выявлению групп (кластеров) векторов входа, обладающих некоторыми
общими свойствами. При изучении самоорганизующихся нейронных сетей, или сетей
Кохонена, существенно различать сети с неупорядоченными нейронами, которые часто
называют слоями Кохонена, и сети с упорядочением нейронов, которые часто называют
картами Кохонена. Последние отражают структуру данных таким образом, что близким
кластерам данных на карте соответствуют близко расположенные нейроны.
Для создания самоорганизующихся нейронных сетей, являющихся слоем или картой
Кохонена, предназначены М-функции newc и newsom соответственно.
По команде help selforg можно получить следующую информацию об М-функциях,
входящих в состав ППП Neural Network Toolbox и относящихся к построению сетей
Кохонена:
Self-organizing networks
New networks
newc
newsom
Using networks
sim
init
adapt
train
Weight functions
negdist
Net input functions
netsum
Transfer functions
compet
Самоорганизующиеся сети
Формирование сети
Создание слоя Кохонена
Создание карты Кохонена
Работа с сетью
Моделирование
Инициализация
Адаптация
Обучение
Функции расстояния и взвешивания
Отрицательное евклидово расстояние
Функции накопления
Сумма взвешенных входов
Функции активации
Конкурирующая функция активации
147
Topology functions
Функции описания топологии сети
gridtop
hextop
randtop
Прямоугольная сетка
Гексагональная сетка
Сетка со случайно распределенными узлами
Функции расстояния
Евклидово расстояние
Расстояние максимального координатного смещения
Расстояние суммарного координатного смещения
Расстояние связи
Функции инициализации сети
Послойная инициализация
Инициализация весов и смещений
Инициализация смещений с учетом чувствительности нейронов
Инициализация весов по правилу средней точки
Функции настройки параметров
Правило настройки весов для слоя Кохонена
Правило настройки смещений для слоя Кохонена
Правило настройки весов карты Кохонена
Функции адаптации
Адаптация весов и смещений
Функции обучения
Повекторное обучение весов и смещений
Демонстрационные примеры
Настройка слоя Кохонена
Одномерная карта Кохонена
Двумерная карта Кохонена
Distance functions
dist
boxdist
mandist
linkdist
Initialization functions
initlay
initwb
initcon
midpoint
Learning functions
learnk
learncon
learnsom
Adapt functions
adaptwb
Training functions
trainwb1
Demonstrations
democ1
demosm1
demosm2
7.1.1. Слой Кохонена
Рассмотрим самоорганизующуюся нейронную сеть с единственным слоем, задача которой заключается в том, чтобы правильно сгруппировать (кластеризировать) поступающие на нее векторы входа.
Архитектура сети
Архитектура слоя Кохонена показана на рис. 7.1.
Конкурирующий слой
Вход
S1R
IW11
p
||ndist||
a1
n1
R1
C
1
R
1
b
S11
S11
S11
S1
Рис. 7.1
148
Нейронные сети. MATLAB 6
Нетрудно убедиться, что это слой конкурирующего типа, поскольку в нем применена
конкурирующая функция активации. Кроме того, архитектура этого слоя очень напоминает архитектуру скрытого слоя радиальной базисной сети. Здесь использован блок ndist для
вычисления отрицательного евклидова расстояния между вектором входа p и строками
матрицы весов IW11. Вход функции активации n1 – это результат суммирования вычисленного расстояния с вектором смещения b. Если все смещения нулевые, максимальное
значение n1 не может превышать 0. Нулевое значение n1 возможно только, когда вектор
входа p оказывается равным вектору веса одного из нейронов. Если смещения отличны
от 0, то возможны и положительные значения для элементов вектора n1.
Конкурирующая функция активации анализирует значения элементов вектора n1
и формирует выходы нейронов, равные 0 для всех нейронов, кроме одного нейрона – победителя, имеющего на входе максимальное значение. Таким образом, вектор выхода
слоя a1 имеет единственный элемент, равный 1, который соответствует нейронупобедителю, а остальные равны 0. Такая активационная характеристика может быть описана следующим образом:
1, i  i * , i*  arg(max n1i )
a1i  
(7.1)
0, i  i *
Заметим, что эта активационная характеристика устанавливается не на отдельный
нейрон, а на слой. Поэтому такая активационная характеристика и получила название
конкурирующей. Номер активного нейрона i* определяет ту группу (кластер), к которой
наиболее близок входной вектор.
Создание сети
Для формирования слоя Кохонена предназначена М-функция newc. Покажем, как она
работает, на простом примере. Предположим, что задан массив из четырех двухэлементных векторов, которые надо разделить на 2 класса:
p = [.1 .8 .1 .9; .2 .9 .1 .8]
p =
0.1000 0.8000 0.1000 0.9000
0.2000 0.9000 0.1000 0.8000
В этом примере нетрудно видеть, что 2 вектора расположены вблизи точки (0,0) и 2
вектора – вблизи точки (1, 1). Сформируем слой Кохонена с двумя нейронами для анализа
двухэлементных векторов входа с диапазоном значений от 0 до 1:
net = newc([0 1; 0 1],2);
Первый аргумент указывает диапазон входных значений, второй определяет количество нейронов в слое. Начальные значения элементов матрицы весов задаются как среднее максимального и минимального значений, т. е. в центре интервала входных значений;
это реализуется по умолчанию с помощью М-функции midpoint при создании сети.
Убедимся, что это действительно так:
wts = net.IW{1,1}
wts =
0.5000 0.5000
0.5000 0.5000
7. Сети кластеризации и классификации данных
149
Определим характеристики слоя Кохонена:
net.layers{1}
ans =
dimensions:
distanceFcn:
distances:
initFcn:
netInputFcn:
positions:
size:
topologyFcn:
transferFcn:
userdata:
2
'dist'
[22 double]
'initwb'
'netsum'
[0 1]
2
'hextop'
'compet'
[11 struct]
Из этого описания следует, что сеть использует функцию евклидова расстояния dist,
функцию инициализации initwb, функцию обработки входов netsum, функцию активации
compet и функцию описания топологии hextop.
Характеристики смещений следующие:
net.biases{1}
ans =
initFcn:
learn:
learnFcn:
learnParam:
size:
userdata:
'initcon'
1
'learncon'
[11 struct]
2
[11 struct]
Смещения задаются функцией initcon и для инициализированной сети равны
net.b{1}
ans =
5.4366
5.4366
Функцией настройки смещений является функция learncon, обеспечивающая настройку с учетом параметра активности нейронов.
Элементы структурной схемы слоя Кохонена показаны на рис. 7.2, а-б и могут быть
получены с помощью оператора
gensim(net)
Они наглядно поясняют архитектуру и функции, используемые при построении слоя
Кохонена.
а
150
Нейронные сети. MATLAB 6
б
Рис. 7.2
Теперь, когда сформирована самоорганизующаяся нейронная сеть, требуется обучить
ее решению задачи кластеризации данных. Напомним, что каждый нейрон блока compet
конкурирует за право ответить на вектор входа p. Если все смещения равны 0, то нейрон
с вектором веса, самым близким к вектору входа p, выигрывает конкуренцию и возвращает на выходе значение 1; все другие нейроны возвращают значение 0.
Правило обучения слоя Кохонена
Правило обучения слоя Кохонена, называемое также правилом Кохонена, заключается
в том, чтобы настроить нужным образом элементы матрицы весов. Предположим, что
нейрон i победил при подаче входа p(q) на шаге самообучения q, тогда строка i матрицы
весов корректируется в соответствии с правилом Кохонена следующим образом:
(7.2)
i IW11 (q)  i IW11 (q  1)  α p(q) - i IW11 (q  1) .
Правило Кохонена представляет собой рекуррентное соотношение, которое обеспечивает коррекцию строки i матрицы весов добавлением взвешенной разности вектора входа
и значения строки на предыдущем шаге. Таким образом, вектор веса, наиболее близкий
к вектору входа, модифицируется так, чтобы расстояние между ними стало еще меньше.
Результат такого обучения будет заключаться в том, что победивший нейрон, вероятно,
выиграет конкуренцию и в том случае, когда будет представлен новый входной вектор,
близкий к предыдущему, и его победа менее вероятна, когда будет представлен вектор,
существенно отличающийся от предыдущего. Когда на вход сети поступает все большее
и большее число векторов, нейрон, являющийся ближайшим, снова корректирует свой
весовой вектор. В конечном счете, если в слое имеется достаточное количество нейронов,
то каждая группа близких векторов окажется связанной с одним из нейронов слоя. В этом
и заключается свойство самоорганизации слоя Кохонена.
Настройка параметров сети по правилу Кохонена реализована в виде М-функции
learnk.
Правило настройки смещений
Одно из ограничений всякого конкурирующего слоя состоит в том, что некоторые
нейроны оказываются незадействованными. Это проявляется в том, что нейроны, имеющие начальные весовые векторы, значительно удаленные от векторов входа, никогда
не выигрывают конкуренции, независимо от того как долго продолжается обучение.
В результате оказывается, что такие векторы не используются при обучении и соответствующие нейроны никогда не оказываются победителями. Такие нейроны-неудачники
7. Сети кластеризации и классификации данных
151
называют "мертвыми" нейронами, поскольку они не выполняют никакой полезной функции. Чтобы исключить такую ситуацию и сделать нейроны чувствительными к поступающим на вход векторам, используются смещения, которые позволяют нейрону стать конкурентным с нейронами-победителями. Этому способствует положительное смещение,
которое добавляется к отрицательному расстоянию удаленного нейрона.
Соответствующее правило настройки, учитывающее нечувствительность мертвых
нейронов, реализовано в виде М-функции learncon и заключается в следующем. В начале
процедуры настройки всем нейронам конкурирующего слоя присваивается одинаковый
параметр активности
1
,
(7.3)
c0 
N
где N – количество нейронов конкурирующего слоя, равное числу кластеров. В процессе настройки М-функция learncon корректирует этот параметр таким образом, чтобы его значения для активных нейронов становились больше, а для неактивных нейронов меньше. Соответствующая формула для вектора приращений параметров активности выглядит следующим образом:
c  lr * (a1i  c) ,
(7.4)
где lr – параметр скорости настройки; a 1i * – вектор, элемент i* которого равен 1, а остальные – 0.
Нетрудно убедиться, что для всех нейронов, кроме нейрона-победителя, приращения
отрицательны. Поскольку параметры активности связаны со смещениями соотношением
(в обозначениях системы MATLAB)
(7.5)
b  exp(1) . / c ,
то из этого следует, что смещение для нейрона-победителя уменьшится, а смещения для
остальных нейронов немного увеличатся.
М-функция learncon использует следующую формулу для расчета приращений вектора смещений
(7.6)
b  exp(1  log(c))  b .
Параметр скорости настройки lr по умолчанию равен 0.001, и его величина обычно на
порядок меньше соответствующего значения для М-функции learnk. Увеличение смещений для неактивных нейронов позволяет расширить диапазон покрытия входных значений, и неактивный нейрон начинает формировать кластер. В конечном счете он может
начать притягивать новые входные векторы.
Это дает два преимущества. Если нейрон не выигрывает конкуренции, потому что его вектор весов существенно отличается от векторов, поступающих на вход сети, то его смещение по
мере обучения становится достаточно большим и он становится конкурентоспособным. Когда
это происходит, его вектор весов начинает приближаться к некоторой группе векторов входа.
Как только нейрон начинает побеждать, его смещение начинает уменьшаться. Таким образом,
задача активизации "мертвых" нейронов оказывается решенной. Второе преимущество, связанное с настройкой смещений, состоит в том, что они позволяют выравнять значения параметра
активности и обеспечить притяжение приблизительно одинакового количества векторов входа.
Таким образом, если один из кластеров притягивает большее число векторов входа, чем другой,
то более заполненная область притянет дополнительное количество нейронов и будет поделена
на меньшие по размерам кластеры.
152
Нейронные сети. MATLAB 6
Обучение сети
Реализуем 10 циклов обучения. Для этого можно использовать функции train или adapt:
net.trainParam.epochs = 10;
net = train(net,p);
net.adaptParam.passes = 10;
[net,y,e] = adapt(net,mat2cell(p));
Заметим, что для сетей с конкурирующим слоем по умолчанию используется обучающая
функция trainwb1, которая на каждом цикле обучения случайно выбирает входной вектор
и предъявляет его сети; после этого производится коррекция весов и смещений.
Выполним моделирование сети после обучения:
a = sim(net,p);
ac = vec2ind(a)
ac = 2 1 2 1
Видим, что сеть обучена классификации векторов входа на 2 кластера: первый расположен в окрестности вектора (0, 0), второй – в окрестности вектора (1, 1). Результирующие веса и смещения равны:
wts1 = net.IW{1,1}
b1 = net.b{1}
wts1 =
0.58383
0.58307
0.41712
0.42789
b1 = 5.4152
5.4581
Заметим, что первая строка весовой матрицы действительно близка к вектору (1, 1),
в то время как вторая строка близка к началу координат. Таким образом, сформированная
сеть обучена классификации входов. В процессе обучения каждый нейрон в слое, весовой
вектор которого близок к группе векторов входа, становится определяющим для этой
группы векторов. В конечном счете, если имеется достаточное число нейронов, каждая
группа векторов входа будет иметь нейрон, который выводит 1, когда представлен вектор
этой группы, и 0 в противном случае, или, иными словами, формируется кластер. Таким
образом, слой Кохонена действительно решает задачу кластеризации векторов входа.
Пример:
Функционирование слоя Кохонена можно пояснить более наглядно, используя графику системы MATLAB. Рассмотрим 48 случайных векторов на плоскости, формирующих 8
кластеров, группирующихся около своих центров. На графике, приведенном на рис. 7.3,
показано 48 двухэлементных векторов входа.
Сформируем координаты случайных точек и построим план их расположения
на плоскости:
c = 8; n = 6; % Число кластеров, векторов в кластере
d = 0.5; % Среднеквадратичное отклонение от центра кластера
x = [–10 10;–5 5]; % Диапазон входных значений
[r,q] = size(x); minv = min(x')'; maxv = max(x')';
v = rand(r,c).*((maxv – minv)*ones(1,c) + minv*ones(1,c));
t = c*n; % Число точек
7. Сети кластеризации и классификации данных
153
v = [v v v v v v]; v=v+randn(r,t)*d; % Координаты точек
P = v;
plot(P(1,:), P(2,:),'+k') % Рис.7.3
title(' Векторы входа'), xlabel('P(1,:)'), ylabel('P(2,:)')
Векторы входа, показанные на рис. 7.3, относятся к различным классам.
Рис. 7.3
Применим конкурирующую сеть из восьми нейронов для того, чтобы распределить их
по классам:
net = newc([–2 12;–1 6], 8 ,0.1);
w0 = net.IW{1}
b0 = net.b{1}
c0 = exp(1)./b0
Начальные значения весов, смещений и параметров активности нейронов представлены в следующей таблице:
w0 =
0.5
0.5
0.5
0.5
0.5
0.5
0.5
0.5
0.25
0.25
0.25
0.25
0.25
0.25
0.25
0.25
b0 =
21.746
21.746
21.746
21.746
21.746
21.746
21.746
21.746
c0 =
0.125
0.125
0.125
0.125
0.125
0.125
0.125
0.125
После обучения в течение 500 циклов получим:
net.trainParam.epochs = 500;
net = train(net,P);
w = net.IW{1}
bn = net.b{1}
cn = exp(1)./bn
154
Нейронные сети. MATLAB 6
w =
6.2184
1.3277
0.31139
3.543
3.4617
4.3171
6.7065
0.97817
2.4239
0.94701
0.40935
4.5845
2.8996
1.4278
0.43696
0.17242
bn =
22.137
21.718
21.192
21.472
21.957
21.185
23.006
21.42
cn =
0.123
0.125
0.128
0.127
0.124
0.128
0.118
0.127
Как следует из приведенных таблиц, центры кластеризации распределились по восьми
областям, показанным на рис. 7.4, а; смещения отклонились в обе стороны от исходного
значения 21.746 так же, как и параметры активности нейронов, показанные на рис. 7.4, б.
а
б
Рис. 7.4
Рассмотренная самонастраивающаяся сеть Кохонена является типичным примером
сети, которая реализует процедуру обучения без учителя.
Демонстрационный пример democ1 также поясняет процедуру обучения самоорганизующейся сети.
7.1.2. Карта Кохонена
Самоорганизующаяся сеть в виде карты Кохонена предназначена для решения задач
кластеризации входных векторов. В отличие от слоя Кохонена карта Кохонена поддерживает такое топологическое свойство, когда близким кластерам входных векторов соответствуют близко расположенные нейроны.
Первоначальная топология размещения нейронов в слое Кохонена задается М-функциями gridtop, hextop или randtop, что соответствует размещению нейронов в узлах либо
прямоугольной, либо гексагональной сетки, либо в узлах сетки со случайной топологией.
Расстояния между нейронами вычисляются с помощью специальных функций вычисления расстояний dist, boxdist, linkdist и mandist.
Карта Кохонена для определения нейрона-победителя использует ту же процедуру,
какая применяется и в слое Кохонена. Однако на карте Кохонена одновременно изменяются весовые коэффициенты соседних нейронов в соответствии со следующим соотношением, именуемым правилом Кохонена:
7. Сети кластеризации и классификации данных
155
i
w(q)  (1   ) i w(q  1)  αp(q) .
(7.7)
В этом случае окрестность нейрона-победителя включает все нейроны, которые находятся в пределах некоторого радиуса d:
(7.8)
N i (d )  { j, d ij  d }.
Чтобы пояснить понятие окрестности нейрона, обратимся к рис. 7.5.
Рис. 7.5
Левая часть рисунка соответствует окрестности радиуса 1 для нейрона-победителя
с номером 13; правая часть – окрестности радиуса 2 для того же нейрона. Описания этих
окрестностей выглядят следующим образом:
 N13 (1)  {8, 12, 13, 14, 18};
(7.9)

 N13 (2)  {3, 7, 8, 9, 11, 12, 13, 14, 15, 17 , 18, 19, 23}.
Заметим, что топология карты расположения нейронов не обязательно должна быть
двумерной. Это могут быть и одномерные и трехмерные карты, и даже карты больших
размерностей. В случае одномерной карты Кохонена, когда нейроны расположены вдоль
линии, каждый нейрон будет иметь только двух соседей в пределах радиуса 1 или единственного соседа, если нейрон расположен на конце линии. Расстояния между нейронами
можно определять различными способами, используя прямоугольные или гексагональные
сетки, однако это никак не влияет на характеристики сети, связанные с классификацией
входных векторов.
Топология карты
Как уже отмечалось выше, можно задать различные топологии для карты расположения нейронов, используя М-функции gridtop, hextop, randtop.
Рассмотрим простейшую прямоугольную сетку размера 23 для размещения шести
нейронов, которая может быть сформирована с помощью функции gridtop:
pos = gridtop(2,3)
pos =
0 1 0 1 0 1
0 0 1 1 2 2
plotsom(pos) % Рис.7.6
Соответствующая сетка показана на рис. 7.6. Метки position(1, i) и position(2, i) вдоль
координатных осей генерируются функцией plotsom и задают позиции расположения
нейронов по первой, второй и т. д. размерностям карты.
156
Нейронные сети. MATLAB 6
Рис. 7.6
Здесь нейрон 1 расположен в точке с координатами (0,0), нейрон 2 – в точке (1,0),
нейрон 3 – в точке (0,1) и т. д. Заметим, что, если применить команду gridtop, переставив
аргументы местами, получим иное размещение нейронов:
pos
pos
0 1
0 0
= gridtop(3,2)
=
2 0 1 2
0 1 1 1
Гексагональную сетку можно сформировать с помощью функции hextop:
pos = hextop(2,3)
pos =
0
1.0000
0
0
plotsom(pos) % Рис.7.7
0.5000
0.8660
1.5000
0.8660
0
1.7321
1.0000
1.7321
Рис. 7.7
Заметим, что М-функция hextop используется по умолчанию при создании карт Кохонена при применении функции newsom.
Сетка со случайным расположением узлов может быть создана с помощью функции
randtop:
7. Сети кластеризации и классификации данных
157
pos = randtop(2,3)
pos =
0.061787
0
0.64701
0.12233
0.40855
0.90438
0.94983
0.54745
0
1.4015
0.65113
1.5682
plotsom(pos) % Рис.7.8
Рис. 7.8
Функции для расчета расстояний
В ППП NNT используется 4 функции для расчета расстояний между узлами сетки.
Функция dist вычисляет евклидово расстояние между нейронами, размещенными
в узлах сетки, в соответствии с формулой
d  sqrt(sum((pos i  pos j ).^2)) ,
(7.10)
где posi, posj – векторы положения нейронов с номерами i и j.
Обратимся к прямоугольной сетке из шести нейронов (см. рис. 7.6) и вычислим соответствующий массив расстояний:
pos = gridtop(2,3);
d = dist(pos)
d =
0
1
1
1.4142
2
2.2361
1
0
1.4142
1
2.2361
2
1
1.4142
0
1
1
1.4142
1.4142
1
1
0
1.4142
1
2
2.2361
1
1.4142
0
1
2.2361
2
1.4142
1
1
0
Этот массив размера 66 описывает расстояния между нейронами и содержит на диагонали нули, поскольку они определяют расстояние нейрона до самого себя, а затем, двигаясь вдоль строки, – до второго, третьего и т. д.
На рис. 7.9 показано расположение нейронов в узлах прямоугольной сетки. Введем
понятие окрестности для прямоугольной сетки. В этом случае окрестность размера 1, или
просто окрестность 1, включает базовый нейрон и его непосредственных соседей; окрестность 2 включает нейроны из окрестности 1 и их соседей.
158
Нейронные сети. MATLAB 6
Столбцы
Базовый нейрон
Строки
Прямоугольный слой
Окрестность 1
Окрестность 2
Окрестность 3
Рис. 7.9
Размер, а соответственно и номер окрестности, определяется максимальным значением координаты смещения нейрона от базового. Вводимое таким способом расстояние
между нейронами называется расстоянием максимального координатного смещения
и может быть вычислено по формуле
(7.11)
d  max(abs( pos i  pos j )),
где posi, posj – векторы положения нейронов с номерами i и j.
Для вычисления этого расстояния в ППП NNT предназначениа М-функция boxdist.
Для конфигурации нейронов, показанной на рис. 7.6, эти расстояния равны:
pos = gridtop(2,3);
d = boxdist(pos)
d =
0
1
1
1
2
2
1
0
1
1
2
2
1
1
0
1
1
1
1
1
1
0
1
1
2
2
1
1
0
1
2
2
1
1
1
0
Расстояние максимального координатного смещения между базовым нейроном 1 и
нейронами 2, 3 и 4 равно 1, поскольку они находятся в окрестности 1, а расстояние между
базовым нейроном и нейронами 5 и 6 равно 2, и они находятся в окрестности 2. Расстояние
максимального координатного смещения от нейронов 3 и 4 до всех других нейронов равно 1.
Определим другое расстояние между нейронами, которое учитывает то количество
связей, которое необходимо установить, чтобы задать путь движения от базового нейрона.
Если задано S нейронов, положение которых определяется векторами pi, i = 1, …, S,
то расстояние связи между ними определяется соотношением
1, dist (pos i  pos j )  1;

2, k , d ik  d kj  1;
(7.12)

d ij  3, (k1 , k 2 ), d ik1  d k1k2  d k2 j  1;

 N , (k1 , k 2 ... k N ), d ik1  d k1k2  ...  d k N j  1;
S , в остальных случаях.

Если евклидово расстояние между нейронами меньше или равно 1, то расстояние связи принимается равным 1; если между нейронами с номерами i и j имеется единственный
промежуточный нейрон с номером k, то расстояние связи равно 2, и т. д.
7. Сети кластеризации и классификации данных
159
Для вычисления расстояния связи в ППП NNT предназначена функции linkdist.
Для конфигурации нейронов, показанной на рис. 7.6, эти расстояния равны:
pos = gridtop(2,3);
d = linkdist(pos)
d =
0
1
1
2
2
3
1
0
2
1
3
2
1
2
0
1
1
2
2
1
1
0
2
1
2
3
1
2
0
1
3
2
2
1
1
0
Расстояние связи между базовым нейроном 1 и нейронами 2, 3 равно 1, между базовым
нейроном и нейронами 4 и 5 равно 2, между базовым нейроном и нейроном 6 равно 3.
Наконец, определим расстояние максимального координатного смещения по формуле
(7.13)
d  sum(abs(pos i  pos j )) ,
где posi, posj – векторы расположения нейронов с номерами i и j.
Для вычисления расстояния максимального координатного смещения в ППП NNT
предназначена функции mandist. Вновь обратимся к конфигурации нейронов на рис. 7.6:
pos = gridtop(2,3);
d = mandist(pos)
d =
0
1
1
2
2
3
1
0
2
1
3
2
1
2
0
1
1
2
2
1
1
0
2
1
2
3
1
2
0
1
3
2
2
1
1
0
В случае прямоугольной сетки оно совпадает с расстоянием связи.
Архитектура сети
Архитектура самоорганизующейся карты Кохонена показана на рис. 7.10.
Рис. 7.10
Эта архитектура аналогична структуре слоя Кохонена за исключением того, что здесь
не используются смещения. Конкурирующая функция активации возвращает 1 для элемента
выхода a1, соответствующего победившему нейрону; все другие элементы вектора a1 равны 0.
160
Нейронные сети. MATLAB 6
Однако в сети Кохонена выполняется перераспределение нейронов, соседствующих
с победившим нейроном. При этом можно выбирать различные топологии размещения
нейронов и различные меры для вычисления расстояний между нейронами.
Создание сети
Для создания самоорганизующейся карты Кохонена в составе ППП NNT предусмотрена М-функция newsom. Допустим, что требуется создать сеть для обработки двухэлементных векторов входа с диапазоном изменения элементов от 0 до 2 и от 0 до 1 соответственно. Предполагается использовать гексагональную сетку размера 23. Тогда для
формирования такой нейронной сети достаточно воспользоваться оператором
net = newsom([0 2; 0 1], [2 3]);
net.layers{1}
ans =
dimensions: [2 3]
distanceFcn: 'linkdist'
distances: [66 double]
initFcn: 'initwb'
netInputFcn: 'netsum'
positions: [26 double]
size: 6
topologyFcn: 'hextop'
transferFcn: 'compet'
userdata: [11 struct]
Из анализа характеристик этой сети следует, что она использует по умолчанию гексагональную топологию hextop и функцию расстояния linkdist.
Для обучения сети зададим следующие 12 двухэлементных векторов входа:
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];
Построим на топографической карте начальное расположение нейронов карты Кохонена и вершины векторов входа (рис. 7.11):
plotsom(net.iw{1,1},net.layers{1}.distances)
hold on
plot(P(1,:),P(2,:),'*k','markersize',10)
Рис. 7.11
7. Сети кластеризации и классификации данных
161
Векторы входа помечены символом * и расположены по периметру рисунка,
а начальное расположение нейронов соответствует точке с координатами (1, 0.5).
Обучение сети
Обучение самоорганизующейся карты Кохонена реализуется повекторно независимо
от того, выполняется обучение сети с помощью функции trainwb1 или адаптация с помощью функции adaptwb. В любом случае функция learnsom выполняет настройку элементов весовых векторов нейронов.
Прежде всего определяется нейрон-победитель и корректируются его вектор весов
и векторы весов соседних нейронов согласно соотношению
dW  lr * A2 * (p' w) ,
(7.14)
где lr – параметр скорости обучения; А2 – массив параметров соседства для нейронов, расположенных в окрестности нейрона-победителя i, который вычисляется по соотношению
1, a(i, q)  1;

A2(i, q)  0.5, a( j, q)  1 & D(i, j )  nd ;
0, в остальных случаях,

(7.15)
где a(i, q) – элемент выхода нейронной сети; D(i, j) – расстояние между нейронами i и j; nd –
размер окрестности нейрона-победителя.
В соответствии с соотношениями (6.14) и (6.15) весовые векторы нейрона-победителя
и соседних нейронов изменяются в зависимости от значения параметра соседства. Веса
нейрона-победителя изменяются пропорционально параметру скорости обучения, а веса
соседних нейронов – пропорционально половинному значению этого параметра.
Процесс обучения карты Кохонена включает 2 этапа: этап упорядочения векторов весовых коэффициентов в пространстве признаков и этап подстройки. При этом используются следующие параметры обучения сети:
Значение по
умолчанию
Параметры обучения и настройки карты Кохонена
Количество циклов обучения
Количество циклов
на этапе упорядочения
Параметр скорости обучения на этапе упорядочения
Параметр скорости обучения на этапе подстройки
Размер окрестности на
этапе подстройки
net.trainParam.epochs
N
1000
net.inputWeights{1,1}.learnParam.order_steps
S
1000
net.inputWeights{1,1}.learnParam.order_lr
order_lr
0.9
net.inputWeights{1,1}.learnParam.tune_lr
tune_lr
0.02
net.inputWeights{1,1}.learnParam.tune_nd
tune_nd
1
В процессе построения карты Кохонена изменяются 2 параметра: размер окрестности
и параметр скорости обучения.
Этап упорядочения. На этом этапе используется фиксированное количество шагов.
Начальный размер окрестности назначается равным максимальному расстоянию между
162
Нейронные сети. MATLAB 6
нейронами для выбранной топологии и затем уменьшается до величины, используемой
на этапе подстройки в соответствии со следующим правилом:
s
(7.16)
nd  1.00001  (max( d )  1)(1  ) ,
S
где max(d) – максимальное расстояние между нейронами; s – номер текущего шага.
Параметр скорости обучения изменяется по правилу
s
lr  tune _ lr  (order _ lr  tune _ lr )(1  ) .
S
Таким образом, он уменьшается от значения order_lr до значения tune_lr.
(7.17)
Этап подстройки. Этот этап продолжается в течение оставшейся части процедуры обучения. Размер окрестности на этом этапе остается постоянным и равным
(7.18)
nd  tune _ nd  0.00001 .
Параметр скорости обучения изменяется по следующему правилу:
S
.
(7.19)
s
Параметр скорости обучения продолжает уменьшаться, но очень медленно, и именно
поэтому этот этап именуется подстройкой. Малое значение окрестности и медленное
уменьшение параметра скорости обучения хорошо настраивают сеть при сохранении размещения, найденного на предыдущем этапе. Число шагов на этапе подстройки должно
значительно превышать число шагов на этапе размещения. На этом этапе происходит
тонкая настройка весов нейронов по отношению к набору векторов входа.
Как и в случае слоя Кохонена, нейроны карты Кохонена будут упорядочиваться так,
чтобы при равномерной плотности векторов входа нейроны карты Кохонена также были
распределены равномерно. Если векторы входа распределены неравномерно, то и нейроны на карте Кохонена будут иметь тенденцию распределяться в соответствии с плотностью размещения векторов входа.
Таким образом, при обучении карты Кохонена решается не только задача кластеризации входных векторов, но и выполняется частичная классификация.
Выполним обучение карты Кохонена размера 23 с гексагональной сеткой и с мерой,
определяемой расстоянием связи
lr  tune _ lr
net = newsom([0 2; 0 1], [2 3]);
Для обучения сети зададим 12 двухэлементных векторов входа
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];
Зададим количество циклов обучения равным 2000:
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)
7. Сети кластеризации и классификации данных
163
Результат обучения представлен на рис. 7.12.
Рис. 7.12
Положение нейронов и их нумерация определяются массивом весовых векторов,
который для данного примера имеет вид:
net.IW{1}
ans =
1.2163
0.73242
1.0645
0.4551
1.5359
1.0888
0.20902
0.46577
0.99109
1.3893
1.8079
1.8433
Если промоделировать карту Кохонена на массиве обучающих векторов входа, то будет получен следующий выход сети:
a = sim(net,P)
a =
(2,1)
(2,2)
(1,3)
(1,4)
(1,5)
(1,6)
(4,7)
(4,8)
(6,9)
(6,10)
(5,11)
(5,12)
1
1
1
1
1
1
1
1
1
1
1
1
Это означает, что векторы входов 1 и 2 отнесены к кластеру с номером 2, векторы 3–6 –
к кластеру 1, векторы 7–8 – к кластеру 4, векторы 9–10 – к кластеру 6, а векторы 11–12 –
к кластеру 5. Номер кластера на рисунке соответствует номеру соответствующего нейрона на карте Кохонена.
Если сформировать произвольный вектор входа, то карта Кохонена должна указать
его принадлежность к тому или иному кластеру:
164
Нейронные сети. MATLAB 6
a = sim(net,[1.5; 1])
a =
(3,1)
1
В данном случае представленный вектор входа отнесен к кластеру с номером 3. Обратите внимание, что векторов такого сорта в обучающей последовательности не было.
Рассмотрим еще 2 примера одномерной и двумерной карт Кохонена.
Одномерная карта Кохонена
Рассмотрим 100 двухэлементных входных векторов единичной длины, распределенных равномерно в пределах от 0 до 90°:
angles = 0:0.5*pi/99:0.5*pi;
P = [sin(angles); cos(angles)];
plot(P(1,1:10:end), P(2,1:10:end),'*b'), hold on
График входных векторов приведен на рис. 7.13, а, и на нем символом * отмечено
положение каждого 10-го вектора.
а
б
Рис. 7.13
Сформируем самоорганизующуюся карту Кохонена в виде одномерного слоя из 10 нейронов и выполним обучение в течение 2000 циклов:
net = newsom([0 1;0 1], [10]);
net.trainParam.epochs = 2000;
net.trainParam.show = 100;
[net, tr] = train(net,P);
plotsom(net.IW{1,1},net.layers{1}.distances) % Рис.7.13,а
figure(2)
a = sim(net,P);
bar(sum(a')) % Рис.7.13,б
Весовые коэффициенты нейронов, определяющих центры кластеров, отмечены
на рис. 7.13, а цифрами. На рис. 7.13, б показано распределение обучающих векторов
по кластерам. Как и ожидалось, они распределены практически равномерно с разбросом
от 8 до 12 векторов в кластере.
Таким образом, сеть подготовлена к кластеризации входных векторов. Определим,
к какому кластеру будет отнесен вектор [1; 0]:
7. Сети кластеризации и классификации данных
165
a = sim(net,[1;0])
a = (10,1)
1
Как и следовало ожидать, он отнесен к кластеру с номером 10.
Двумерная карта Кохонена
Этот пример демонстрирует обучение двумерной карты Кохонена. Сначала создадим
обучающий набор случайных двумерных векторов, элементы которых распределены
по равномерному закону в интервале [–1 1]:
P = rands(2,1000);
plot(P(1,:),P(2,:),'+') % Рис.7.14
Рис. 7.14
Для кластеризации векторов входа создадим самоорганизующуюся карту Кохонена
размера 56 с 30 нейронами, размещенными на гексагональной сетке:
net = newsom([–1 1; –1 1],[5,6]);
net.trainParam.epochs = 1000;
net.trainParam.show = 100;
net = train(net,P);
plotsom(net.IW{1,1},net.layers{1}.distances)
Результирующая карта после этапа размещения показана на рис. 7.15, а. Продолжим
обучение и зафиксируем карту после 1000 шагов этапа подстройки (рис. 7.15, б), а затем
после 4000 шагов (рис. 7.15, в). Нетрудно убедиться, что нейроны карты весьма равномерно покрывают область векторов входа.
а
166
б
Рис. 7.15
в
Нейронные сети. MATLAB 6
Определим принадлежность нового вектора к одному из кластеров карты Кохонена
и построим соответствующую вершину вектора на рис. 7.15, в:
a = sim(net,[0.5;0.3])
a = (19,1)
1
hold on, plot(0.5,0.3,'*k') % Рис.7.15,в
Нетрудно убедиться, что вектор отнесен к 19-му кластеру.
Промоделируем обученную карту Кохонена, используя массив векторов входа:
a = sim(net,P);
bar(sum(a')) % Рис.7.16
Из анализа рис. 7.16 следует, что количество векторов входной последовательности,
отнесенных к определенному кластеру, колеблется от 13 до 50.
Рис. 7.16
Таким образом, в процессе обучения двумерная самоорганизующаяся карта Кохонена
выполнила кластеризацию массива векторов входа. Следует отметить, что на этапе размещения было выполнено лишь 20 % от общего числа шагов обучения, т. е. 80 % общего
времени обучения связано с тонкой подстройкой весовых векторов. Фактически на этом
этапе выполняется в определенной степени классификация входных векторов.
Слой нейронов карты Кохонена можно представлять в виде гибкой сетки, которая
натянута на пространство входных векторов. В процессе обучения карты, в отличие от
обучения слоя Кохонена, участвуют соседи нейрона-победителя, и, таким образом, топологическая карта выглядит более упорядоченной, чем области кластеризации слоя Кохонена.
Читатель может продолжить изучение самоорганизующихся сетей, обратившись
к демонстрационным программам demosm1 и demosm2.
7.2. LVQ-сети
Ниже рассматриваются сети для классификации входных векторов, или LVQ (Learning
Vector Quantization)-сети. Как правило, они выполняют и кластеризацию и классификацию
векторов входа. Эти сети являются развитием самоорганизующихся сетей Кохонена [23].
7. Сети кластеризации и классификации данных
167
По команде help lvq можно получить следующую информацию об М-функциях, входящих в состав ППП Neural Network Toolbox и относящихся к построению LVQ-сетей:
Learning Vector Quantization
Сети для классификации векторов
New networks
newlvq
Using networks
sim
init
adapt
train
Weight functions
negdist
dotprod
Net input functions
netsum
Transfer functions
compet
purelin
Performance functions
mse
Initialization functions
initlay
initwb
midpoint
Learning functions
learnlv1
learnlv2
Adapt functions
adapt
Training functions
trainr
Demonstrations
demolvq1
Формирование сети
Создание сети для классификации входных векторов
Работа с сетью
Моделирование
Инициализация
Адаптация
Обучение
Операции с весовой функцией
Функция отрицательного расстояния
Скалярное произведение
Операции над входами
Суммирование
Функции активации
Конкурирующая
Линейная
Функции погрешности обучения
Среднеквадратичная ошибка обучения
Функции инициализации сети
Послойная инициализация
Инициализация весов и смещений
Инициализация весов по правилу средней точки
Функции настройки параметров
Функция настройки lv1
Функция настройки lv2
Функции адаптации
Адаптация весов и смещений
Функции обучения
Повекторное обучение весов и смещений
Демонстрационные примеры
Пример классификации векторов
Архитектура сети
Архитектура LVQ-сети, предназначенной для классификации входных векторов,
показана на рис. 7.17.
168
Нейронные сети. MATLAB 6
Рис. 7.17
LVQ-cеть имеет 2 слоя: конкурирующий и линейный. Конкурирующий слой выполняет кластеризацию векторов, а линейный слой соотносит кластеры с целевыми классами,
заданными пользователем.
Как в конкурирующем, так и в линейном слое приходится 1 нейрон на кластер или целевой
класс. Таким образом, конкурирующий слой способен поддержать до S1 кластеров; эти кластеры, в свою очередь, могут быть соотнесены с S2 целевыми классами, причем S2 не превышает S1.
Например, предположим, что нейроны 1–3 конкурирующего слоя определяют 3 кластера, которые принадлежат к одному целевому классу #2 линейного слоя. Тогда выходы конкурирующих
нейронов 1–3 будут передаваться в линейный слой на нейрон n2 с весами, равными 1, а на
остальные нейроны с весами, равными 0. Таким образом, нейрон n2 возвращает 1, если любой
из трех нейронов 1–3 конкурирующего слоя выигрывает конкуренцию.
Короче говоря, единичный элемент в i-й строке вектора a1 (остальные элементы a1
нулевые) однозначно выберет i-й столбец матрицы весов LW21 в качестве выхода сети.
При этом каждый столбец, в свою очередь, содержит единственный элемент, равный 1, который
указывает принадлежность к классу. Таким образом, кластер с номером 1 из слоя 1 может оказаться отнесенным к различным классам в зависимости от значения произведения LW21a1.
Поскольку заранее известно, как кластеры первого слоя соотносятся с целевыми
классами второго слоя, то это позволяет заранее задать элементы матрицы весов LW21.
Однако чтобы найти правильный кластер для каждого вектора обучающего множества,
необходимо выполнить процедуру обучения сети.
Создание сети
В ППП NNT для создания LVQ-сетей предусмотрена М-функция newlvq, обращение
к которой имеет следующий вид:
net = newlvq(PR,S1,PC,LR,LF)
где PR – массив размера R2 минимальных и максимальных значений для R элементов вектора
входа; S1 – количество нейронов конкурирующего слоя; PC – вектор с S2 элементами, определяющими процентную долю принадлежности входных векторов к определенному классу; LR –
параметр скорости настройки (по умолчанию 0.01); LF – имя функции настройки (по умолчанию для версии MATLAB 5 – 'learnlv2', для версии MATLAB 6 – 'learnlv1').
Предположим, что задано 10 векторов входа и необходимо создать сеть, которая,
во-первых, группирует эти векторы в 4 кластера, а во-вторых, соотносит эти кластеры
с одним из двух выходных классов. Для этого следует использовать LVQ-сеть, первый
7. Сети кластеризации и классификации данных
169
конкурирующий слой которой имеет 4 нейрона по числу кластеров, а второй линейный
слой – 2 нейрона по числу классов.
Зададим обучающую последовательность в следующем виде:
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];
Из структуры обучающей последовательности следует, что 3 первых и 3 последних ее
вектора относятся к классу 1, а 4 промежуточных – к классу 2. На рис. 7.18 показано расположение векторов входа.
I1 = find(Tc==1); I2 = find(Tc==2);
axis([–4,4,–3,3]), hold on
plot(P(1,I1),P(2,I1),’+k’)
plot(P(1,I2),P(2,I2),’xb’) % Рис.7.18
Рис. 7.18
Векторы, относящиеся к разным классам, отмечены разными символами. Как следует
из расположения векторов, классы не являются линейно отделимыми, и задача не может
быть решена с использованием, например, персептрона.
Преобразуем вектор индексов Tc в массив целевых векторов:
T = full(ind2vec(Tc))
T =
1 1 1 0 0 0 0 1 1 1
0 0 0 1 1 1 1 0 0 0
Процентные доли входных векторов в каждом классе равны 0.6 и 0.4 соответственно.
Теперь подготовлены все данные, необходимые для вызова функции newlvq. Вызов может
быть реализован c использованием следующего оператора
net = newlvq(minmax(P),4,[.6 .4],0.1);
net.layers{1}
ans =
dimensions:
distanceFcn:
distances:
initFcn:
netInputFcn:
170
4
'dist'
[44 double]
'initwb'
'netsum'
net.layers{2}
ans =
dimensions: 2
distanceFcn: 'dist'
distances: [22 double]
initFcn: 'initwb'
netInputFcn: 'netsum'
Нейронные сети. MATLAB 6
positions:
size:
topologyFcn:
transferFcn:
userdata:
[0 1 2 3]
4
'hextop'
'compet'
[11 struct]
positions: [0 1]
size: 2
topologyFcn: 'hextop'
transferFcn: 'purelin'
userdata: [11 struct]
Обучение сети
Правила настройки параметров
Правило LVQ1. LVQ-сеть обучается на основе множества пар вход/выход, составленных
из элементов обучающей последовательности {P, T}:
p1 , t1 , p 2 , t 2 ,..., p Q , t Q  .
(7.20)
Каждый целевой вектор имеет единственный элемент, равный 1, а остальные равны 0.
Для обучения сети необходимо задать вектор входа p, и тогда в конкурирующем слое будет выполнена настройка элементов матрицы весов IW11. Предположим, что весовые коэффициенты нейрона i* наиболее близки к вектору входа p и нейрон i* выигрывает конкуренцию. Тогда конкурирующая функция активации возвращает 1 в качестве элемента i* вектора
a1, причем все другие элементы a1 равны 0. Во втором, линейном слое произведение LW21a1
выделяет некоторый столбец матрицы LW21 и связанный с ним класс k*. Таким образом, сеть
связывает вектор входа p с классом k*. Это назначение может оказаться либо правильным,
либо ошибочным. Поэтому в процессе обучения необходимо откорректировать строку i* матрицы IW11 таким образом, чтобы приблизить ее к вектору p, если назначение правильное, и
удалить от вектора p, если назначение неправильное. Основываясь на этих рассуждениях,
можно сформулировать правило LVQ1 для настройки параметров сети:
 * IW 11 (q) 
i

11

 i* IW (q) 
i*
i*

(q  1)  lr p(q) 

(q  1)  ,
IW 11 (q  1)  lr p(q)  i* IW 11 (q  1) , a k2*  t k *  1;
IW
11
i*
IW
11
(a k2*  1)  (t k *  0).
(7.21)
Это правило гарантирует, что при правильной классификации нейрон-победитель
приближается к векторам входа, а при неправильной классификации удаляется от них.
Правило LVQ2. Это правило предназначено для того, чтобы улучшить настройку параметров сети после применения стандартной процедуры LVQ1. Вариант, реализованный в
версии MATLAB 6, известен в литературе [23] как LVQ2.1, и именно он положен в основу
алгоритма learnlv2. Правило LVQ2 во многом схоже с правилом LVQ1, за исключением
лишь того, что в соответствии с правилом LVQ2 корректируется 2 весовых вектора, ближайших к входному; причем один из них должен быть классифицирован как правильный,
а второй – нет. Введем следующие понятия, чтобы дать количественную оценку свойства
близости векторов. Пусть величины di и dj обозначают евклидовы расстояния вектора p
от соответствующих строк i* и j* весовой матрицы IW11, причем строка j* принадлежит
к области в пространстве признаков, соответствующей требуемому классу, а строка i*
не принадлежит. Если выполняется условие
 d dj 
min  i ,   0.5  0.7,
d d 
 j i
7. Сети кластеризации и классификации данных
(7.22)
171
то корректировка производится и правило настройки соответствующих весовых векторов
выглядит следующим образом:


 * IW 11 (q)  * IW 11 (q  1)  lr p(q)  * IW 11 (q  1) ;
i
i
i

11
11
IW
(
q
)

IW
(
q

1
)

lr
p
(
q
)

IW 11 (q  1) .
*
*

j
j*
j


(7.23)
Процедура обучения
Для удобства работы с текстом повторим операторы задания обучающей последовательности и формирования 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));
Выполним синтез LVQ-сети:
net = newlvq(minmax(P),4,[.6 .4]);
net.inputWeights{1}
ans =
delays: 0
initFcn: 'midpoint'
learn: 1
learnFcn: 'learnlv2'
learnParam: [11 struct]
size: [4 2]
userdata: [11 struct]
weightFcn: 'negdist'
Для обучения сети применим М-функцию train, задав количество циклов обучения
равным 2000, и значение параметра скорости обучения 0.05:
net.trainParam.epochs = 2000;
net.trainParam.show = 100;
net.trainParam.lr = 0.05;
net = train(net,P,T);
В результате обучения получим следующие весовые коэффициенты нейронов конкурирующего слоя, которые определяют положения центров кластеризации:
V = net.IW{1,1}
V =
–2.3639
2.3461
0
0
0.0074775
0.033489
–1.4619
1.4731
Построим картину распределения входных векторов по кластерам (рис. 7.19):
I1 = find(Tc==1); I2 = find(Tc==2);
axis([–4,4,–3,3]), hold on
P1 = P(:,I1); P2 = P(:,I2);
plot(P1(1,:),P1(2,:),'+k')
plot(P2(1,:),P2(2,:),'xb')
172
Нейронные сети. MATLAB 6
plot(V(:,1),V(:,2),'or') % Рис.7.19
Рис. 7.19
В свою очередь, массив весов линейного слоя указывает, как центры кластеризации
распределяются по классам:
net.LW{2}
ans =
1
0
1
0
0
1
0
1
Нетрудно видеть, что обучение сети выполнено правильно. Чтобы проверить функционирование сети, подадим на ее вход массив обучающих векторов P:
Y = sim(net,P)
Yc = vec2ind(Y)
Yc = 1 1 1 2 2 2 2 1 1 1
Результат подтверждает, что классификация выполнена правильно.
Теперь построим границу, разделяющую области точек, принадлежащих к двум классам. Для этого покроем сеткой прямоугольную область и определим принадлежность
каждой точки к тому или иному классу. Текст соответствующего сценария и вспомогательной М-функции приведен ниже
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,I1),'+k'), hold on
plot(P(1,I2),P(2,I2),'*b') % Рис.7.20
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]);
Результат работы этого сценария представлен на рис. 7.20. Здесь же отмечены вычисленные ранее центры кластеризации для синтезированной LVQ-сети. Анализ рисунка
подтверждает, что граница между областями не является прямой линией.
7. Сети кластеризации и классификации данных
173
Рис. 7.20
Наряду с процедурой обучения можно применить и процедуру адаптации в течение 200 циклов для 10 векторов, что равносильно 2000 циклам обучения с использованием функции train:
net.adaptparam.passes = 200;
Обучающая последовательность при использовании функции adapt должна быть
представлена в виде массивов ячеек:
Pseq = con2seq(P);
Tseq = con2seq(T);
net = adapt(net,Pseq,Tseq);
net.IW{1,1}
ans =
–2.3244
2.3311
–0.0003663
–0.0003663
–0.0033588
–0.0033019
1.4704
–1.4754
Промоделируем сеть, используя массив входных векторов обучающей последовательности:
Y = sim(net,P);
Yc = vec2ind(Y)
Yc = 1 1 1 2 2 2 2 1 1 1
Результаты настройки параметров сети в процессе адаптации практически совпадают
с результатами обучения.
Единственное, что можно было бы напомнить при этом, что при обучении векторы
входа выбираются в случайном порядке и поэтому в некоторых случаях обучение может
давать лучшие результаты, чем адаптация.
Можно было бы и процедуру адаптации реализовать с использованием случайной последовательности входов, например следующим образом: сформируем 2000 случайных
векторов и выполним лишь 1 цикл адаптации:
TS = 2000;
ind = floor(rand(1,TS)*size(P,2))+1;
Pseq = con2seq(P(:,ind));
Tseq = con2seq(T(:,ind));
net.adaptparam.passes = 1;
net = adapt(net,Pseq,Tseq);
net.IW{1,1}
174
Нейронные сети. MATLAB 6
ans =
2.354
–2.362
0
0
–0.061991
–0.093345
–1.4834
1.4539
Y = sim(net,P);
Yc = vec2ind(Y)
Yc =
1
1
1
2
2
2
2
1
1
1
В результате получаем LVQ-сеть, подобную тем, которые были получены ранее с помощью процедур обучения и адаптации.
Читатель может продолжить изучение LVQ-сетей, обратившись к демонстрационной
программе demolvq1.
7. Сети кластеризации и классификации данных
175
8. РЕКУРРЕНТНЫЕ СЕТИ
В этой главе рассматриваются 2 типа рекуррентных нейронных сетей, представляющих наибольший интерес для пользователей, – это класс сетей Элмана (Elman) и класс
сетей Хопфилда (Hopfield). Характерной особенностью архитектуры рекуррентной сети
является наличие блоков динамической задержки и обратных связей. Это позволяет таким
сетям обрабатывать динамические модели. Обратимся к описанию конкретных типов
рекуррентных нейронных сетей.
8.1. Сети Элмана
Сеть Элмана – это сеть, состоящая из двух слоев, в которой скрытый слой охвачен
динамической обратной связью. Это позволяет учесть предысторию наблюдаемых процессов и накопить информацию для выработки правильной стратегии управления. Сети
Элмана применяются в системах управления движущимися объектами, при построении
систем технического зрения и в других приложениях. В качестве первоисточника следует
рекомендовать статью Элмана [10].
По команде help elman можно получить следующую информацию об М-функциях, входящих в состав ППП Neural Network Toolbox и относящихся к построению сетей Элмана:
Elman recurrent networks
New networks
newelm
Using networks
sim
init
adapt
train
Weight functions
dotprod
ddotprod
Net input functions
netsum
dnetsum
Transfer functions
purelin
tansig
logsig
dpurelin
dtansig
dlogsig
Performance functions
mse
msereg
dmse
Рекуррентные сети Элмана
Формирование сети
Создание сети Элмана
Работа с сетью
Моделирование
Инициализация
Адаптация
Обучение
Функции взвешивания
Скалярное произведение
Производная скалярного произведения
Функции накопления
Сумма взвешенных входов
Производная суммы взвешенных входов
Функции активации
Линейная
Гиперболический тангенс
Логистическая
Производная линейной функции
Производная гиперболического тангенса
Производная логистической функции
Функции оценки качества сети
Среднеквадратичная ошибка обучения
Среднеквадратичная ошибка обучения
при применении регуляризации
Производная среднеквадратичной ошибки обучения
175
dmsereg
Initialization functions
initlay
initnw
Learning functions
learngd
learngdm
Adapt functions
adapt
Training functions
traingd
traingdm
traingda
Demonstrations
appelm1
Производная среднеквадратичной ошибки обучения
при применении регуляризации
Функции инициализации сети
Послойная инициализация
Функция NW (Nguyen – Widrow)
Функции настройки параметров
Функция настройки методом градиентного спуска
Функция настройки методом градиентного спуска
с возмущением
Функции адаптации
Адаптация весов и смещений
Функции обучения
Градиентный спуск по правилу обратного
распространения ошибки
Градиентный спуск с возмущением
Градиентный спуск с адаптацией параметра
скорости настройки
Демонстрационные примеры
Пример рекуррентной сети Элмана
Архитектура
Сеть Элмана – это, как правило, двухслойная сеть с обратной связью от выхода
ко входу первого слоя (рис. 8.1).
Рис. 8.1
В качестве функций активации в сети Элмана часто используются: в скрытом, рекуррентном слое – функция гиперболического тангенса tansig, в линейном слое – функция
purelin. Такое сочетание функций активации позволяет максимально точно аппроксимировать функции с конечным числом точек разрыва. Единственное требование, предъявляемое к сети, состоит в том, чтобы скрытый слой имел достаточно большое число нейронов, что необходимо для успешной аппроксимации сложных функций.
176
Нейронные сети. MATLAB 6
В соответствии со структурной схемой сети Элмана сформируем динамическое описание ее рекуррентного слоя в виде уравнений состояния
1
11 1
11
1
1
1

n (k )  LW a (k  1)  IW p  b , a (0)  a 0 ;
 1
1

a (k )  tansig(n (k )).
(8.1)
Эта рекуррентная матричная форма уравнений состояния лишний раз подчеркивает
название изучаемых нейронных сетей.
Второй, линейный слой является безынерционным и описывается соотношениями
n 2 (k )  LW 21a1 (k )  b 2 ;
 2
a (k )  purelin( n 2 (k )).
(8.2)
Ниже сеть Элмана исследуется на примере такой задачи детектирования амплитуды
гармонического сигнала. Пусть известно, что на вход нейронной сети поступают выборки
из некоторого набора синусоид. Требуется выделить значения амплитуд этих синусоид.
Далее рассматриваются выборки из набора двух синусоид с амплитудами 1.0 и 2.0:
p1 = sin(1:20);
p2 = sin(1:20)*2;
Целевыми выходами такой сети являются векторы
t1 = ones(1,20);
t2 = ones(1,20)*2;
Сформируем набор векторов входа и целевых выходов:
p = [p1 p2 p1 p2];
t = [t1 t2 t1 t2];
Сформируем обучающую последовательность в виде массивов ячеек:
Pseq = con2seq(p);
Tseq = con2seq(t);
Создание сети
В ППП NNT для создания сети Элмана предусмотрена М-функция newelm. Решаемая
задача требует, чтобы сеть Элмана на каждом шаге наблюдения значений выборки могла
выявить единственный ее параметр – амплитуду синусоиды. Это означает, что сеть должна иметь 1 вход и 1 выход:
R = 1; % Число элементов входа
S2 = 1;% Число нейронов выходного слоя
Рекуррентный слой может иметь любое число нейронов, и чем сложнее задача, тем большее количество нейронов требуется. Остановимся на 10 нейронах рекуррентного слоя:
S1 = 10; % Число нейронов рекуррентного слоя
Элементы входа для данной задачи изменяются в диапазоне от –2 до 2. Для обучения
используется метод градиентного спуска с возмущением и адаптацией параметра скорости настройки, реализованный в виде М-функции traingdx:
net = newelm([–2 2],[S1 S2],{'tansig','purelin'},'traingdx');
8. Рекуррентные сети
177
Сеть использует следующие функции адаптации, инициализации, обучения и оценки
качества:
adaptFcn: 'adaptwb'
initFcn: 'initlay'
performFcn: 'mse'
trainFcn: 'traingdx'
Слои сети Элмана имеют следующие характеристики:
net.layers{1}
ans =
dimensions: 10
distanceFcn:
distances:
initFcn:
netInputFcn:
positions:
size:
topologyFcn:
transferFcn:
userdata:
'dist'
[1010 double]
'initnw'
'netsum'
[0 1 2 3 4 5 6 7 8 9]
10
'hextop'
'tansig'
[11 struct]
net.layers{2}
ans =
dimensions: 1
distanceFcn: 'dist'
distances: 0
initFcn: 'initnw'
netInputFcn: 'netsum'
positions: 0
size: 1
topologyFcn: 'hextop'
transferFcn: 'purelin'
userdata: [11 struct]
Скрытый слой использует функцию активации tansig, которая для сети Элмана принимается по умолчанию; инициализация весов и смещений реализуется методом NW
(Nguen – Widrow) с помощью М-функции initnw. Второй слой использует линейную
функцию активации purelin.
По умолчанию для настройки весов и смещений используется функция learngdm,
а для оценки качества обучения – функция mse.
Обучение сети
Для обучения сети Элмана могут быть использованы как процедура адаптации, так
и процедура обучения, реализуемые с помощью функций adapt и train соответственно.






178
В процессе процедуры адаптации на каждом шаге выполняются следующие действия:
моделирование сети при подаче полного набора векторов входа и вычисление ошибки
сети;
вычисление приближенного градиента функционала ошибки относительно весов
и смещений методом обратного распространения ошибки;
настройка весов с использованием функции настройки, выбираемой пользователем;
рекомендуется функция learngdm.
В процессе процедуры обучения на каждом цикле выполняются следующие действия:
моделирование сети при подаче последовательности входных сигналов, сравнение
с целевыми выходами и вычисление ошибки;
вычисление приближенного градиента функционала ошибки относительно весов
и смещений методом обратного распространения ошибки;
настройка весов с использованием функции настройки, выбираемой пользователем;
рекомендуется функция traingdx.
Нейронные сети. MATLAB 6
Сети Элмана не обеспечивают высокой точности решения, поскольку присутствие обратной связи в рекуррентном слое не позволяет вычислить точно градиент функционала.
В дальнейшем для обучения сети Элмана используется М-функция train. Ее входными аргументами являются обучающие последовательности Pseq и Tseq, в качестве метода обучения
используется метод обратного распространения ошибки с возмущением и адаптацией параметра скорости настройки. Количество циклов обучения принимается равным 1000, периодичность вывода результатов – 20 циклов, конечная погрешность обучения – 0.01:
net.trainParam.epochs = 1000;
net.trainParam.show = 25;
net.trainParam.goal = 0.01;
[net,tr] = train(net,Pseq,Tseq);
После 500 циклов обучения получим следующий график ошибки (рис. 8.2).
Рис. 8.2
Требуемая точность обучения обеспечивается за 728 циклов. Теперь можно проверить
работу сформированной сети.
Проверка сети
Будем использовать для проверки сети входы обучающей последовательности:
figure(2)
a = sim(net,Pseq);
time = 1:length(p);
plot(time, t, '––', time, cat(2,a{:}))
axis([1 80 0.8 2.2]) % Рис.8.3
На рис. 8.3 приведены графики входного и выходного сигналов.
8. Рекуррентные сети
179
Рис. 8.3
Как следует из анализа рисунка, сеть справляется с решением задачи детектирования
амплитуды на наборах обучающего множества. Однако неясно, как она будет вести себя
на других наборах входа. Обладает ли построенная сеть Элмана свойством обобщения?
Попробуем проверить это, выполнив следующие исследования.
Подадим на сеть набор сигналов, составленный из двух синусоид с амплитудами 1.6
и 1.2 соответственно:
p3 = sin(1:20)*1.6;
t3 = ones(1,20)*1.6;
p4 = sin(1:20)*1.2;
t4 = ones(1,20)*1.2;
pg = [p3 p4 p3 p4];
tg = [t3 t4 t3 t4];
pgseq = con2seq(pg);
figure(3)
a = sim(net,pgseq);
ime = 1:length(pg);
plot(time, tg, '––', time, cat(2,a{:}))
axis([1 80 0.8 2.2])
Результат представлен на рис. 8.4.
Рис. 8.4
На этот раз сеть хуже справляется с задачей. Сеть стремится детектировать значение
амплитуды, но делает это не очень точно. Улучшенное обобщение могло быть получено,
обучая сеть на большее количество амплитуд, чем только на значения 1.0 и 2.0. Использование трех или четырех гармонических сигналов с различными амплитудами может привести к намного лучшему датчику амплитуд.
180
Нейронные сети. MATLAB 6
Читатель может продолжить изучение сетей Элмана, используя программу appelm1.
Сделав копию этой программы, можно продолжить эксперименты, увеличивая количество
нейронов в рекуррентном слое или длительность, а также количество входных наборов.
8.2. Сети Хопфилда
Всякий целевой вектор можно рассматривать как набор характерных признаков некоторого объекта. Если создать рекуррентную сеть, положение равновесия которой совпадало бы с этим целевым вектором, то такую сеть можно было бы рассматривать как ассоциативную память. Поступление на вход такой сети некоторого набора признаков в виде
начальных условий приводило бы ее в то или иное положение равновесия, что позволяло
бы ассоциировать вход с некоторым объектом. Именно такими ассоциативными возможностями и обладают сети Хопфилда. Они относятся к классу рекуррентных нейронных
сетей, обладающих тем свойством, что за конечное число тактов времени они из произвольного начального состояния приходят в состояние устойчивого равновесия, называемое аттрактором. Количество таких аттракторов определяет объем ассоциативной памяти сети Хопфилда. Описание сетей Хопфилда читатель может найти в книге [18].
Спроектировать сеть Хопфилда – это значит создать рекуррентную сеть со множеством точек равновесия, таких, что при задании начальных условий сеть в конечном счете
приходит в состояние покоя в одной из этих точек. Свойство рекурсии проявляется в том,
что выход сети подается обратно на вход. Можно надеяться, что выход сети установится в
одной из точек равновесия. Предлагаемый ниже метод синтеза сети Хопфилда не является
абсолютно совершенным в том смысле, что синтезируемая сеть в дополнение к желаемым
может иметь паразитные точки равновесия. Однако число таких паразитных точек должно быть сведено к минимуму за счет конструирования метода синтеза. Более того, область
притяжения точек равновесия должна быть максимально большой.
Метод синтеза сети Хопфилда основан на построении системы линейных дифференциальных уравнений первого порядка, которая задана в некотором замкнутом гиперкубе
пространства состояний и имеет решения в вершинах этого гиперкуба. Такая сеть
несколько отличается от классической модели Хопфилда, но она проще для понимания и
проектирования, и мы будем ссылаться на нее как на модифицированную сеть Хопфилда.
Основополагающей работой, связанной с анализом и синтезом модифицированных
сетей Хопфилда, является статья [25].
По команде help hopfield можно получить следующую информацию об М-функциях,
входящих в состав ППП Neural Network Toolbox и относящихся к построению модифицированных сетей Хопфилда:
Hopfield recurrent networks
New networks
newhop
Weight functions
dotprod
Net input functions
netsum
8. Рекуррентные сети
Рекуррентная модифицированная сеть Хопфилда
Формирование сети
Создание модифицированной сети Хопфилда
Операции с весовой функцией
Скалярное произведение
Операции над входами
Суммирование
181
Transfer functions
satlins
Demonstrations
demohop1
demohop2
demohop3
demohop4
Функции активации
Симметричная линейная функция с ограничениями
Демонстрационные примеры
Пример двумерной модифицированной сети Хопфилда
Пример неустойчивой точки равновесия
Пример трехмерной модифицированной сети Хопфилда
Пример устойчивых паразитных точек равновесия
Архитектура сети
Архитектура модифицированной сети Хопфилда представлена на рис. 8.5.
Рис. 8.5
Вход p устанавливает значения начальных условий. В сети используется линейная
функция активации с насыщением satlins, которая описывается следующим образом:
n  1;
 1,

a  satlins (n)   n,  1  n  1;
 1,
n  1.

(8.3)
Эта сеть может быть промоделирована с одним или большим количеством векторов
входа, которые задаются как начальные условия. После того как начальные условия заданы, сеть генерирует выход, который по обратной связи подается на вход. Этот процесс
повторяется много раз, пока выход не установится в положение равновесия. Можно надеяться, что каждый вектор выхода в конечном счете сойдется к одной из точек равновесия,
наиболее близкой к входному сигналу.
Рассмотрим следующий пример. Предположим, что требуется разработать сеть с двумя устойчивыми точками в вершинах трехмерного куба:
T = [–1 –1 1; 1 –1 1]'
T =
–1 1
–1 –1
1 1
182
Нейронные сети. MATLAB 6
Выполним синтез сети:
net = newhop(T);
gensim(net)
Структура сети представлена на рис. 8.6.
б
a
в
Рис. 8.6
Читателю следует обратить внимание, что на схеме рис. 8.6, а вход и выход слоя совпадают; на рис. 8.6, б показаны используемые в рекуррентном слое элементы. Обратимся
к информации о структуре слоя:
net.layers{1}
ans =
dimensions:
distanceFcn:
distances:
initFcn:
netInputFcn:
positions:
size:
topologyFcn:
transferFcn:
userdata:
3
'dist'
[33 double]
'initwb'
'netsum'
[0 1 2]
3
'hextop'
'satlins'
[11 struct]
Из этого списка следует, что в слое используется функция инициализации initwb,
функция суммирования входов netsum и функция активации satlins.
На рис. 8.6, в показан блок, описывающий матрицу весов, которая определяет переходную матрицу динамической модели рекуррентного слоя.
Динамическая модель рекуррентного слоя модифицированной сети Хопфилда описывается следующим образом:
a1 (k )  satlins(LW11a1 (k  1)  b1 ), a1 (0)  p .
(8.4)
При внимательном анализе приведенного соотношения можно действительно убедиться, что матрица весов LW11 равносильна переходной матрице динамической системы,
8. Рекуррентные сети
183
а вектор смещений b1 – вектору передачи единичного входа. Необходимо сформировать
эти элементы, если заданы точки равновесия системы t в вершинах гиперкуба.
Синтез сети
Метод проектирования модифицированных сетей Хопфилда описан в работе [25],
на основе этого метода разработан алгоритм синтеза, который реализован в ППП NT
в виде подфункции solvehop2(t) М-функции newhop.
Если задано множество целевых точек равновесия, представленных матрицей T, то
функция newhop возвращает матрицу весов и вектор смещений для рекуррентного слоя
сети Хопфилда. При этом гарантируется, что точки устойчивого равновесия будут соответствовать целевым векторам, но могут появиться и так называемые паразитные точки.
В процессе синтеза сети число таких нежелательных точек сводится к минимуму.
Пусть задано Q целевых векторов, образующих матрицу T размера SQ:
(8.5)
T  [t 1 , t 2 , ..., t Q 1 , t Q ].
Образуем новую матрицу Y размера SQ–1 следующего вида:
Y  [t 1  t Q , t 2  t Q , ..., t Q 1  t Q ]
(8.6)
Вычислим разложение матрицы Y по сингулярным числам:
S
Y    i u i v iT .
(8.7)
i 1
Далее образуем матрицы
K
TP   u i u iT , TM 
i 1
S
u u
i  K 1
i
T
i
,
(8.8)
где K – ранг матрицы Y.
Построим динамическую систему
x  Tτ x  (E  Tτ )t Q ,
(8.9)
где T – матрица вида ТР – ТМ;  – динамический параметр (в алгоритме принят равным 10);
E – единичная матрица.
Вычислим дискретную модель для системы (8.9):
x k  Φx k 1  Ft Q ,
(8.10)
где Ф – переходная матрица вида e Tτ h ; F – матрица передачи входа вида
F  (c1TP  c2 TM )(  T ), с1 = eh –1, c2 = (1–e–h)/; h – такт дискретности (в алгоритме принят равным 0.15 c).
Соответствующая матрица весов рекуррентного слоя и вектор смещения вычисляются
следующим образом:
W  Φ;

b  Ft Q.
184
(8.11)
Нейронные сети. MATLAB 6
Когда сеть спроектирована, она может быть проверена с одним или большим числом
векторов входа. Весьма вероятно, что векторы входа, близкие к целевым точкам, равновесия найдут свои цели. Способность модифицированной сети Хопфилда быстро обрабатывать наборы векторов входа позволяет проверить сеть за относительно короткое время.
Сначала можно проверить, что точки равновесия целевых векторов действительно принадлежат вершинам гиперкуба, а затем можно определить области притяжения этих точек
и обнаружить паразитные точки равновесия, если они имеются.
Рассмотрим следующий пример. Предположим, что требуется создать модифицированную сеть Хопфилда с двумя точками равновесия, заданными в трехмерном пространстве:
T = [–1 –1 1; 1 –1 1]'
T =
–1
1
–1
–1
1
1
Выполним синтез сети, используя М-функцию newhop:
net = newhop(T);
Удостоверимся, что разработанная сеть имеет устойчивые состояния в этих двух точках.
Выполним моделирование сети Хопфилда, приняв во внимание, что эта сеть не имеет входов
и содержит рекуррентный слой; в этом случае целевые векторы определяют начальное состояние слоя Ai, а второй аргумент функции sim определяется числом целевых векторов:
Ai = T;
[Y,Pf,Af] = sim(net,2,[],Ai);
Y
Y =
–1 1
–1 –1
1 1
Действительно, устойчивые положения равновесия сети находятся в назначенных
точках.
Зададим другое начальное условие в виде массива ячеек:
Ai = {[–0.9; –0.8; 0.7]};
Ai{1,1}
ans =
–0.9000
–0.8000
0.7000
Эта точка расположена вблизи первого положения равновесия, так что можно ожидать, что
сеть будет сходиться именно к этой точке. При таком способе вызова функции sim в качестве
второго параметра указываются такт дискретности и количество шагов моделирования:
[Y,Pf,Af] = sim(net,{1 5},{},Ai);
Y{1}
Y =
–1
–1
1
8. Рекуррентные сети
185
Действительно, из заданного начального состояния сеть вернулась в устойчивое положение равновесия. Желательно, чтобы сеть вела себя аналогичным образом при задании любой начальной точки в пределах куба, вершины которого составлены изо всех
комбинаций чисел 1 и –1 в трехмерном пространстве. К сожалению, этого нельзя гарантировать, и достаточно часто сети Хопфилда включают нежелательные паразитные точки
равновесия.
Пример:
Рассмотрим сеть Хопфилда с четырьмя нейронами и определим 4 точки равновесия
в виде следующего массива целевых векторов:
T = [1 –1; –1 1; 1 1; –1 –1]'
T =
1
–1
1
–1
–1
1
1
–1
На рис. 8.7 показаны эти 4 точки равновесия на плоскости состояний сети Хопфилда.
plot(T(1,:), T(2,:),'*r') % Рис.8.7
axis([–1.1 1.1 –1.1 1.1])
title('Точки равновесия сети Хопфилда')
xlabel('a(1)'), ylabel('a(2)')
Рис. 8.7
Рассчитаем веса и смещения модифицированной сети Хопфилда, использую М-функцию newhop:
net = newhop(T);
W= net.LW{1,1}
b = net.b{1,1}
W =
1.1618
0
b =
3.5934e–017
3.5934e–017
186
0
1.1618
Нейронные сети. MATLAB 6
Проверим, принадлежат ли вершины квадрата к сети Хопфилда:
Ai = T;
[Y,Pf,Af] = sim(net,4,[],Ai)
Y =
1
–1
Pf =
Af =
1
–1
–1
1
1
1
–1
–1
1
1
–1
–1
[]
–1
1
Как и следовало ожидать, выходы сети равны целевым векторам.
Теперь проверим поведение сети при случайных начальных условиях:
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
Результат представлен на рис. 8.8.
Рис. 8.8
Читатель может продолжить изучение модифицированных сетей Хопфилда, обратившись к демонстрационным примерам. Пример двумерной сети можно найти в демонстрации demohop1, пример неустойчивой точки равновесия – в демонстрации demohop2.
Демонстрация demohop3 дает пример трехмерной модифицированной сети Хопфилда.
Демонстрация demohop4 иллюстрирует появление устойчивых паразитных точек равновесия.
8. Рекуррентные сети
187
9. ПРИМЕНЕНИЕ НЕЙРОННЫХ СЕТЕЙ
В настоящее время многие задачи, имеющие важное практическое значение и которые
не имели приемлемого решения в прошлом, могут быть решены с использованием
нейронных сетей. Ниже рассматривается решение таких задач, связанных с аппроксимацией и фильтрацией сигналов, моделированием динамических систем, распознаванием
образов и проектированием систем управления.
9.1. Аппроксимация и фильтрация сигналов
9.1.1. Предсказание стационарного сигнала
Постановка задачи
Задан гармонический сигнал с круговой частотой 4 1/с (2 Гц) и длительностью 5 с.
Дискретный сигнал T получен в результате квантования исходного сигнала по времени
с частотой 40 Гц (такт дискретности 0.025 с):
time = 0:0.025:5;
T = sin(time*4*pi);
stairs(time,T);
axis([0 5 –1 1]), xlabel(‘time, с’), ylabel(‘T’)
На рис. 9.1 показан график дискретного сигнала Т.
1
T
0.5
0
-0.5
-1
0
1
2
3
time, с
4
5
Рис. 9.1
Требуется предсказать значение сигнала yk на выходе сети в момент времени tk,
используя 5 последних значений сигнала Т в качестве входа, т. е.
 pk i  Tk i , i  1,..., 5;

5

 y k   wi pk i ,
i 1

(9.1)
где yk = sin(4tk ) = sin(4kh), tk = t0 : h: tf = 0 : 0.025 : 5.
В математическом смысле это задача экстраполяции сигнала на 1 шаг вперед.
С позиции теории нейронных сетей это задача настройки параметров и обучения сети.
Сформируем обучающее множество следующим образом. Входная последовательность Р1
определена на интервале от 0 до 1 c и имеет длину Q1, а каждый вектор входа состоит из
188
пяти компонент, соответствующих запаздывающим значениям сигнала T; целевой вектор
Т1 сформирован из значений сигнала Т, начиная с шестого; контрольное подмножество
T2 формируется из значений сигнала Т на интервале от 3 до 5 с:
Q = length(T);
h = 0.025;
Q1 = 1/h;
P1 = zeros(5,Q1);
P1(1,1:Q1) = T(1,1:Q1);
P1(2,2:Q1) = T(1,1:(Q1–1));
P1(3,3:Q1) = T(1,1:(Q1–2));
P1(4,4:Q1) = T(1,1:(Q1–3));
P1(5,5:Q1) = T(1,1:(Q1–4));
T1 = T(1,6:(Q1+5));
T2 = T(1,3/h:Q);
Синтез сети
Поскольку сигнал стационарный и соотношения между прошлыми и будущими значениями остаются неизменными, можно воспользоваться линейной моделью нейронной
сети, рассчитывая веса на основе прямого решения системы линейных уравнений. Такой
подход реализует М-функция newlind. Она вычисляет веса и смещение, которые минимизируют среднеквадратичную ошибку предсказания, которые зависят от длины обучающей
последовательности Q1. Сеть для решения этой задачи должна состоять из одного нейрона с пятью входами (рис. 9.2).
net = newlind(P1,T1);
Рис. 9.2
Графики зависимостей значений весовых коэффициентов wi и смещения b показаны
на рис. 9.3, а и б соответственно.
а
б
Рис. 9.3
9. Применение нейронных сетей
189
Значения этих величин стабилизируются после 0.5 с, когда исчерпывается 1 период
синусоиды.
На рис. 9.4 представлена зависимость среднеквадратичной ошибки, которая характеризует
погрешность экстраполяции в зависимости от длины обучающей последовательности.
Рис. 9.4
Проверка сети
Выполним проверку сети, используя входную последовательность обучающего подмножества и сравнивая выход сети с фактическим значением сигнала T (рис. 9.5):
Q1 = 40;
a = sim(net,P1(:,1:Q1));
t1 = 6:Q1+5;
plot(time(t1),a,'*r', time(1:Q1+5),T(1,1:Q1+5))
xlabel('Time, c');
1.5
1
0.5
0
-0.5
-1
0
0.2
0.4
0.6
time, c
0.8
1
1.2
Рис. 9.5
Как следует из анализа этого рисунка, нейронная сеть достаточно точно отслеживает
входной сигнал.
Теперь проверим работу сети, используя контрольное множество T2. Определим длину
входной последовательности N1, равную 20, и построим график реакции сети (рис. 9.6):
N1 = 20;
Tt = T2(1,1:N1);
P2(1,:) = Tt(1,:);
P2(2,2:end) = Tt(1,1:end–1);
190
Нейронные сети. MATLAB 6
P2(3,3:end) = Tt(1,1:end–2);
P2(4,4:end) = Tt(1,1:end–3);
P2(5,5:end) = Tt(1,1:end–4);
a = sim(net,P2);
figure(3), clf
h1 = plot(time(1:size(P2, 2)–5), a(1:end–5), '*'); hold on
h2 = plot(time(1:size(P2, 2)–5), Tt(6:end), 'r');
1
0.5
0
-0.5
-1
0
0.1
0.2
0.3
0.4
0.5
0.6
Рис. 9.6
Вычислим погрешность сети, используя информацию из описания графических
объектов Line с дескрипторами h1 и h2:
y1 = get(h1,'YData'); y2 = get(h2,'YData');
minlength = min(length(y1), length(y2));
e = y1(1:minlength) – y2(1:minlength);
nre = sqrt(mse(e));
График погрешности экстраполяции в функции от длины обучающего сигнала и в зависимости от количества точек экстраполяции в качестве параметра показан на рис. 9.7.
Рис. 9.7
Из анализа этого графика следует, что при малом числе экстраполируемых точек 6, 8
и длительности обучающей последовательности более 0.1 с погрешности малы. С ростом числа экстраполируемых точек 10, 20, 30 требуется большая длина обучающей последовательности, и при длине, превышающей 20 тактов (0.5 с), погрешность не зависит от числа точек экстраполяции и монотонно убывает с увеличением длины обучающего множества.
9. Применение нейронных сетей
191
Читатель может обратиться к демонстрационному примеру applin1, где исследуется
подобная задача.
9.1.2. Слежение за нестационарным сигналом
Рассмотрим задачу отслеживания нестационарного гармонического сигнала, что может представлять реальный интерес на практике.
Задана дискретная выборка T из гармонического сигнала длительностью 6 с, частота
которого удваивается по истечении 4 с. Частота квантования для интервала времени от 0
до 4 с составляет 20 Гц, а для интервала от 4.05 до 6 с – 40 Гц.
time1 = 0:0.05:4;
time2 = 4.05:0.025:6;
time = [time1 time2];
T = [sin(time1*4*pi) sin(time2*8*pi)];
Поскольку при синтезе сети будут использоваться адаптивные алгоритмы настройки,
сформируем обучающую последовательность {P, T} в виде массива ячеек, при этом последовательность входов Р должна совпадать с последовательностью целевых выходов Т,
поскольку рассматривается задача слежения:
T = con2seq(T);
P = T;
plot(time, cat(2,T{:}))
График гармонического сигнала показан на рис. 9.8.
1
0.5
0
-0.5
-1
0
2
4
t, c
6
Рис. 9.8
Для решения поставленной задачи используется однослойная линейная сеть, которая
предсказывает текущее значение сигнала по пяти предшествующим значениям.
Инициализация сети
Сеть состоит только из одного нейрона, так как требуется только одно значение
выходного сигнала T, которое генерируется на каждом шаге (рис. 9.9).
Рис. 9.9
192
Нейронные сети. MATLAB 6
Для создания такой сети предназначена М-функция newlin; параметр скорости
настройки выберем равным 0.1:
lr = 0.1;
delays = [1 2 3 4 5];
net = newlin(minmax(cat(2,P{:})),1,delays,lr);
[net,a,e] = adapt(net,P,T);
Сформированная нейронная сеть имеет следующие весовые коэффициенты и смещение:
net.IW{1}
net.b
ans = 0.39421 0.10682
ans = –4.5457e–006
–0.15592
–0.31476
–0.34523
Проверка сети
Построим график выходного сигнала и сравним его с целевым сигналом (рис. 9.10):
y = sim(net,P);
plot(time,cat(2,y{:}), time,cat(2,T{:}),'.') % Рис.9.10
axis([0 6 –1.5 1.5])
Рис. 9.10
Построим также график сигнала ошибки (рис. 9.11):
plot(time,cat(2,e{:}))
Рис. 9.11
9. Применение нейронных сетей
193
Как следует из этого графика, для настройки на слежение нейронной сети требуется
около 30 тактов (1.5 с) и далее до 4-й секунды сигнал отслеживается с высокой точностью. Затем целевой сигнал мгновенно изменяет частоту и нейронная сеть настраивается
на новый сигнал за те же 30 тактов, но теперь это составляет 0.75 с. Это обусловлено тем,
что частота съема увеличилась вдвое.
Таким образом, линейная нейронная сеть успешно справляется с задачей слежения за
гармоническим сигналом, если частота квантования синхронизирована с частотой наблюдаемых сигналов. Для настройки на новую частоту требуется всего 30 измерений; для типичных сигналов, возникающих в приложениях, обработка сообщений может производиться с частотой 20 кГц, при такой частоте 30 тактов настройки занимают 1.5 мс.
Читатель может обратиться к демонстрационному примеру applin2, где исследуется
подобная задача.
9.1.3. Моделирование стационарного фильтра
Одно из полезных применений нейронных сетей – это создание моделей динамических систем по наблюдаемым входным и выходным сигналам и их применение для последующего моделирования таких систем. Первая часть этой задачи, связанная с построением модели, известна
также как задача идентификации. Если реальная система линейная или близка к линейной,
то линейная нейронная сеть может моделировать ее с очень малой погрешностью.
Постановка задачи
Допустим, что на вход фильтра подается входной сигнал вида r(t) = sin(10*sin(t)*t),
заданный массивом значений R с тактом квантования 0.025 с на интервале 5 с:
time = 0:0.025:5;
R = sin(sin(time).*time*10);
plot(time,R)
axis([0 5 –1 1]);
График этого сигнала показан на рис. 9.12.
Рис. 9.12
Рассматривается линейный стационарный фильтр, описываемый следующим рекуррентным соотношением:
(9.2)
y (n)  0.5 y (n  1)  1.5 y (n  2)  r (n).
Это фильтр второго порядка, функционирование которого в системе MATLAB описывается следующей М-функцией:
Y = filter([1 0.5 –1.5],1,R);
194
Нейронные сети. MATLAB 6
plot(time,T)
axis([0 5 –2 2]);
График сигнала выхода этого фильтра показан на рис. 9.13.
Рис. 9.13
Задача нейронной сети – сформировать такую линейную модель, которая в процессе
обучения определяет параметры фильтра, а затем использует их для моделирования при
произвольных значениях входа.
Определим следующую обучающую последовательность: в качестве целевого выхода
T примем массив Y, а входную последовательность P зададим на основе текущего и двух
предшествующих значений входа R:
T = Y;
Q = size(R,2);
P = zeros(3,Q);
P(1,1:Q) = R(1,1:Q);
P(2,2:Q) = R(1,1:(Q–1));
P(3,3:Q) = R(1,1:(Q–2));
Синтез сети
Нейронная сеть должна иметь только 1 нейрон, потому что динамическая система
имеет только 1 выход. Нейрон должен иметь 3 входа, чтобы получить текущий и 2 запаздывающих значения входного сигнала. М-функция newlind позволяет выполнить синтез
такой нейронной сети:
net = newlind(P,T);
net.IW{1}, net.b
ans =
1.0000
0.5000
ans = –7.4394e–017
–1.5000
Нетрудно убедиться, что сеть точно определяет параметры фильтра.
Проверка сети
Для проверки функционирования сети подадим входную последовательность Р
и сравним с целевой последовательностью T (рис. 9.14):
a = sim(net,P);
plot(time,T, 'Color', [0 0.8 0.8], 'LineWidth',3),hold on
plot(time,a, 'k'), grid on
axis([0 5 –2 2]); % Рис.9.14
9. Применение нейронных сетей
195
Рис. 9.14
Сеть выполняет поставленную задачу. Погрешность моделирования показана на рис. 9.15
и находится в пределах точности компьютера при вычислениях с плавающей точкой:
e = T–a; plot(time, e)
Рис. 9.15
Построенная линейная нейронная сеть может быть использована для идентификации
и моделирования динамических систем, причем для линейных систем погрешности близки к 0.
Для нелинейных систем такой подход при достаточно малых амплитудах входного
сигнала обеспечивает линеаризацию с минимальной среднеквадратичной ошибкой. Если
нелинейная система переместится в другую рабочую точку, то изменятся и параметры
нейронной сети. Для того чтобы получить линеаризованную модель за короткое время,
частота замеров должна быть достаточно высокой, а на вход нелинейной системы необходимо подать пробный сигнал в виде случайного процесса небольшой амплитуды. Это
ускорит адаптацию сети, поскольку большее количество измерений, характеризующих
динамику системы, будет представлено на коротком интервале времени. Учет в случае
нелинейных систем большего числа запаздывающих входов позволяет минимизировать
ошибку при моделировании нелинейной системы. Если система характеризуется существенной нелинейностью, то более подходящими будут сети с обучением методом обратного распространения ошибки или радиальные базисные сети.
Читатель может обратиться к демонстрационному примеру applin3, где рассмотрена
подобная задача.
196
Нейронные сети. MATLAB 6
9.1.4. Моделирование нестационарного фильтра
В отличие от описанного выше стационарного фильтра рассмотрим задачу идентификации и моделирования нестационарной системы.
Постановка задачи
Допустим, что на вход фильтра подается входной сигнал вида r(t) = sin(8sin(4t)*t),
заданный массивом значений R с тактом квантования 0.005 с на интервале 6 с:
time1 = 0:0.005:4;
time2 = 4.005:0.005:6;
time = [time1 time2];
R = sin(sin(time*4).*time*8);
plot(time,R)
axis([0 6 –1.1 1.1]);
График этого сигнала показан на рис. 9.16.
Рис. 9.16
Нестационарный линейный фильтр описывается следующими рекуррентными
соотношениями:
 y(n)  0.5 y(n  1)  r (n), 0  n  800;

0.9 y(n)  0.6 y (n  1)  r (n), 801  n  1200.
(9.3)
Этот фильтр может быть представлен в системе MATLAB следующим образом:
steps1 = length(time1);
[Y1,state] = filter([1 –0.5],1,R(1:steps1));
steps2 = length(time2);
Y2 = filter([0.9 –0.6],1,R((1:steps2) + steps1),state);
Y = [Y1 Y2];
plot(time,Y)
График сигнала на выходе этого фильтра показан на рис. 9.17.
9. Применение нейронных сетей
197
Рис. 9.17
Определим такую обучающую последовательность: в качестве целевого выхода T
примем массив Y, а входную последовательность P зададим на основе текущего и предшествующего значений входа R. Для использования алгоритмов адаптации представим
обучающие последовательности в виде массивов ячеек:
T = con2seq(Y);
P = con2seq(R);
Инициализация сети
Сеть создается с помощью функции newlin, которая генерирует веса и смещение
для линейного нейрона с двумя входами. На входе сети используется линия задержки
на 1 такт; параметр скорости настройки принят равным 0.5.
lr = 0.5;
delays = [0 1];
net = newlin(minmax(cat(2,P{:})),1,delays,lr);
[net,a,e] = adapt(net,P,T);
Сформированная нейронная сеть имеет следующие весовые коэффициенты и смещение:
net.IW{1}, net.b
ans =
0.9
–0.6
ans = –3.14e–013
Нетрудно убедиться, что они соответствуют коэффициентам второго фильтра.
Проверка сети
Построим график погрешности сети (рис. 9.18):
plot(time, cat(2,e{:}))
198
Нейронные сети. MATLAB 6
Рис. 9.18
Из анализа этого графика следует, что сети требуется 2.5 с для настройки на реакцию
первого фильтра и немногим более 0.2 с для настройки на реакцию второго фильтра. Это
объясняется тем, что фактические настройки параметров сети стационарны и соответствуют значениям параметров второго фильтра.
Читатель может обратиться к демонстрационному примеру applin4, где исследуется
подобная задача.
9.2. Распознавание образов
Часто полезно иметь устройство, которое выполняет распознавание образов. В частности, очень эффективны и выгодны машины, которые могут читать символы. Машина,
которая читает банковские чеки, может выполнять за то же самое время намного больше
проверок, чем человек. Этот вид приложений сохраняет время и деньги, а также устраняет
условия, при которых человек выполняет монотонную, периодически повторяющуюся
работу. Демонстрационная программа сценарий appcr1 иллюстрирует, как распознавание
символов может быть выполнено в сети с обратным распространением.
Постановка задачи
Требуется создать нейронную сеть для распознавания 26 символов латинского алфавита. В качестве датчика предполагается использовать систему распознавания, которая
выполняет оцифровку каждого символа, находящегося в поле зрения. В результате каждый символ будет представлен шаблоном размера 57. Например, символ A может быть
представлен, как это показано на рис. 9.19, а и б.
0
0
0
1
1
1
1
0
1
1
0
1
0
0
1
0
0
0
1
0
0
0
1
1
0
1
0
0
0
0
0
1
1
1
1
б
а
Рис. 9.19
9. Применение нейронных сетей
199
Однако система считывания символов обычно работает неидеально и отдельные элементы символов могут оказаться искаженными (рис. 9.20).
Рис. 9.20
Проектируемая нейронная сеть должна точно распознавать идеальные векторы входа
и с максимальной точностью воспроизводить зашумленные векторы. М-функция prprob
определяет 26 векторов входа, каждый из которых содержит 35 элементов, этот массив
называется алфавитом. М-функция формирует выходные переменные alphabet и targets,
которые определяют массивы алфавита и целевых векторов. Массив targets определяется
как eye(26). Для того чтобы восстановить шаблон для i-й буквы алфавита, надо выполнить
следующие операторы:
[alphabet, targets] = prprob;
ti = alphabet(:, i);
letter{i} = reshape(ti, 5, 7)';
letter{i}
Пример:
Определим шаблон для символа A, который является первым элементом алфавита:
[alphabet, targets] = prprob;
i = 2;
ti = alphabet(:, i);
letter{i} = reshape(ti, 5, 7)';
letter{i}
ans =
0
0
0
1
1
1
1
0
1
1
0
1
0
0
1
0
0
0
1
0
0
0
1
1
0
1
0
0
0
0
0
1
1
1
1
Нейронная сеть
На вход сети поступает вектор входа с 35 элементами; вектор выхода содержит 26
элементов, только один из которых равен 1, а остальные – 0. Правильно функционирующая сеть должна ответить вектором со значением 1 для элемента, соответствующего номеру символа в алфавите. Кроме того, сеть должна быть способной распознавать символы
в условиях действия шума. Предполагается, что шум – это случайная величина со средним значением 0 и стандартным отклонением, меньшим или равным 0.2.
200
Нейронные сети. MATLAB 6
Архитектура сети
Для работы нейронной сети требуется 35 входов и 26 нейронов в выходном слое. Для
решения задачи выберем двухслойную нейронную сеть с логарифмическими сигмоидальными функциями активации в каждом слое. Такая функция активации выбрана потому,
что диапазон выходных сигналов для этой функции определен от 0 до 1, и этого достаточно, чтобы сформировать значения выходного вектора. Структурная схема такой
нейронной сети показана на рис. 9.21.
Рис. 9.21
Скрытый слой имеет 10 нейронов. Такое число нейронов выбрано на основе опыта
и разумных предположений. Если при обучении сети возникнут затруднения, то можно
увеличить количество нейронов этого уровня. Сеть обучается так, чтобы сформировать
единицу в единственном элементе вектора выхода, позиция которого соответствует номеру символа, и заполнить остальную часть вектора нулями. Однако наличие шумов может
приводить к тому, что сеть не будет формировать вектора выхода, состоящего точно из
единиц и нулей. Поэтому по завершении этапа обучения выходной сигнал обрабатывается
М-функцией compet, которая присваивает значение 1 единственному элементу вектора
выхода, а всем остальным – значение 0.
Инициализация сети
Вызовем М-файл prprob, который формирует массив векторов входа alphabet размера
3526 с шаблонами символов алфавита и массив целевых векторов targets:
[alphabet,targets] = prprob;
[R,Q] = size(alphabet);
[S2,Q] = size(targets);
Двухслойная нейронная сеть создается с помощью команды newff:
S1 = 10;
net = newff(minmax(alphabet),[S1 S2],{'logsig' 'logsig'},'traingdx');
net.LW{2,1} = net.LW{2,1}*0.01;
net.b{2} = net.b{2}*0.01;
Структура нейронной сети представлена на рис. 9.22.
gensim(net)
9. Применение нейронных сетей
201
Рис. 9.22
Обучение
Чтобы создать нейронную сеть, которая может обрабатывать зашумленные векторы
входа, следует выполнить обучение сети как на идеальных, так и на зашумленных векторах. Сначала сеть обучается на идеальных векторах, пока не будет обеспечена минимальная сумма квадратов погрешностей. Затем сеть обучается на 10 наборах идеальных и зашумленных векторов. Две копии свободного от шума алфавита используются для того,
чтобы сохранить способность сети классифицировать идеальные векторы входа. К сожалению, после того, как описанная выше сеть обучилась классифицировать сильно зашумленные векторы, она потеряла способность правильно классифицировать некоторые
векторы, свободные от шума. Следовательно, сеть снова надо обучить на идеальных векторах. Это гарантирует, что сеть будет работать правильно, когда на ее вход будет передан идеальный символ. Обучение выполняется с помощью функции trainbpx, которая реализует метод обратного распространения ошибки с возмущением и адаптацией параметра
скорости настройки.
Обучение в отсутствие шума
Сеть первоначально обучается в отсутствие шума с максимальным числом циклов
обучения 5000 либо до достижения допустимой средней квадратичной погрешности,
равной 0.1 (рис. 9.23):
P = alphabet;
T = targets;
net.performFcn = 'sse';
net.trainParam.goal = 0.1;
net.trainParam.show = 20;
net.trainParam.epochs = 5000;
net.trainParam.mc = 0.95;
[net,tr] = train(net,P,T); % Рис.9.23
202
Нейронные сети. MATLAB 6
Рис. 9.23
Обучение в присутствии шума
Чтобы спроектировать нейронную сеть, не чувствительную к воздействию шума, обучим ее с применением двух идеальных и двух зашумленных копий векторов алфавита.
Целевые векторы состоят из четырех копий векторов. Зашумленные векторы имеют шум
со средним значением 0.1 и 0.2. Это обучает нейрон правильно распознавать зашумленные символы и в то же время хорошо распознавать идеальные векторы.
При обучении с шумом максимальное число циклов обучения сократим до 300, а допустимую погрешность увеличим до 0.6 (рис. 9.24):
netn = net;
netn.trainParam.goal = 0.6;
netn.trainParam.epochs = 300;
T = [targets targets targets targets];
for pass = 1:10
P = [alphabet, alphabet, ...
(alphabet + randn(R,Q)*0.1), ...
(alphabet + randn(R,Q)*0.2)];
[netn,tr] = train(netn,P,T);
end % Рис.9.24
Рис. 9.24
9. Применение нейронных сетей
203
Повторное обучение в отсутствие шума
Поскольку нейронная сеть обучалась в присутствии шума, то имеет смысл повторить
ее обучение без шума, чтобы гарантировать, что идеальные векторы входа классифицируются правильно.
netn.trainParam.goal = 0.1; % Предельная среднеквадратичная погрешность
netn.trainParam.epochs = 500; % Максимальное количество циклов обучения
net.trainParam.show = 5; % Частота вывода результатов на экран
[netn, tr] = train(netn, P, T);
Эффективность функционирования системы
Эффективность нейронной сети будем оценивать следующим образом. Рассмотрим
2 структуры нейронной сети: сеть 1, обученную на идеальных последовательностях,
и сеть 2, обученную на зашумленных последовательностях. Проверка функционирования
производится на 100 векторах входа при различных уровнях шума.
Приведем фрагмент сценария appcr1, который выполняет эти операции:
noise_range = 0:.05:.5;
max_test = 100;
network1 = [];
network2 = [];
T = targets;
% Выполнить тест
for noiselevel = noise_range
errors1 = 0;
errors2 = 0;
for i=1:max_test
P = alphabet + randn(35,26)*noiselevel;
% Тест для сети 1
A = sim(net,P);
AA = compet(A);
errors1 = errors1 + sum(sum(abs(AA–T)))/2;
% Тест для сети 2
An = sim(netn,P);
AAn = compet(An);
errors2 = errors2 + sum(sum(abs(AAn–T)))/2;
echo off
end
% Средние значения ошибок (100 последовательностей из 26 векторов целей
network1 = [network1 errors1/26/100];
network2 = [network2 errors2/26/100];
end
Тестирование реализуется следующим образом. Шум со средним значением 0 и стандартным отклонением от 0 до 0.5 с шагом 0.05 добавляется к векторам входа. Для каждого
уровня шума формируется 100 зашумленных последовательностей для каждого символа
204
Нейронные сети. MATLAB 6
и вычисляется выход сети. Выходной сигнал обрабатывается М-функцией compet с той
целью, чтобы выбрать только один из 26 элементов вектора выхода. После этого оценивается количество ошибочных классификаций и вычисляется процент ошибки.
Соответствующий график погрешности сети от уровня входного шума показан на рис. 9.25.
plot(noise_range,network1*100,'––',noise_range,network2*100);
Рис. 9.25
Сеть 1 обучена на идеальных векторах входа, а сеть 2 – на зашумленных. Обучение
сети на зашумленных векторах входа значительно снижает погрешность распознавания
реальных векторов входа. Сети имеют очень малые погрешности, если среднеквадратичное значение шума находится в пределах от 0.00 до 0.05. Когда к векторам был добавлен
шум со среднеквадратичным значением 0.2, в обеих сетях начали возникать заметные
ошибки. При этом погрешности нейронной сети, обученной на зашумленных векторах, на
3–4 % ниже, чем для сети, обученной на идеальных входных последовательностях.
Если необходима более высокая точность распознавания, сеть может быть обучена
либо в течение более длительного времени, либо с использованием большего количества
нейронов в скрытом слое. Можно также увеличить размер векторов, чтобы пользоваться
шаблоном с более мелкой сеткой, например 1014 точек вместо 57.
Проверим работу нейронной сети для распознавания символов. Сформируем зашумленный вектор входа для символа J (рис. 9.26):
noisyJ = alphabet(:,10) + randn(35,1)*0.2;
plotchar(noisyJ); % Зашумленный символ J (рис.9.26)
Рис. 9.26
9. Применение нейронных сетей
205
A2 = sim(net,noisyJ);
A2 = compet(A2);
answer = find(compet(A2) == 1)
answer =
10
plotchar(alphabet(:,answer)); % Распознанный символ J
Нейронная сеть выделила 10 правильных элементов и восстановила символ J
без ошибок (рис. 9.27).
Рис. 9.27
Эта задача демонстрирует, как может быть разработана простая система распознавания изображений. Заметим, что процесс обучения не состоял из единственного обращения
к обучающей функции. Сеть была обучена несколько раз при различных векторах входа.
Обучение сети на различных наборах зашумленных векторов позволило обучить сеть работать с изображениями, искаженными шумами, что характерно для реальной практики.
9.3. Нейронные сети и системы управления
В настоящее время нейронные сети нашли успешное применение для проектирования
систем управления динамическими процессами. Универсальные возможности аппроксимации с помощью многослойного персептрона делают их полезным инструментом для
решения задач идентификации, проектирования и моделирования нелинейных регуляторов [15].
Ниже описаны 3 архитектуры нейронных сетей, которые реализованы в ППП Neural
Network Toolbox в виде следующих контроллеров:



контроллера c предсказанием (NN Predictive Controller);
контроллера на основе модели авторегрессии со скользящим средним (NARMA-L2
Controller);
контроллера на основе эталонной модели (Model Reference Controller).
Ниже представлено краткое описание каждой из этих архитектур и способы их применения на практике. Применение нейронных сетей для решения задач управления позволяет выделить 2 этапа проектирования:
 этап идентификации управляемого процесса;
 этап синтеза закона управления.
На этапе идентификации разрабатывается модель управляемого процесса в виде
нейронной сети, которая на этапе синтеза используется для синтеза регулятора. Для каж206
Нейронные сети. MATLAB 6
дой из трех архитектур используется одна и та же процедура идентификации, однако этапы синтеза существенно различаются.
При управлении с предсказанием модель управляемого процесса используется для того, чтобы предсказать его будущее поведение, а алгоритм оптимизации применяется для
расчета такого управления, которое минимизирует разность между желаемыми и действительными изменениями выхода модели.
При управлении на основе модели авторегрессии со скользящим средним регулятор
представляет собой достаточно простую реконструкцию модели управляемого процесса.
При управлении на основе эталонной модели регулятор – это нейронная сеть, которая
обучена управлять процессом так, чтобы он отслеживал поведение эталонного процесса.
При этом модель управляемого процесса активно используется при настройке параметров
самого регулятора.
В последующих разделах обсуждаются все 3 структуры систем управления и архитектуры соответствующих нейросетевых контроллеров. Каждый раздел включает краткое
изложение принципа управления динамическим процессом и сопровождается описанием
сценария функционирования проектируемой системы, который реализован в виде комбинации GUI-интерфейса и динамической модели регулятора в системе Simulink.
Динамические модели систем управления с нейросетевыми регуляторами размещены
в специальном разделе Control Systems набора блоков Neural Network Blocksets (рис. 9.28)
и включают 3 упомянутые выше модели регуляторов, а также блок построения графиков.
Рис. 9.28
Поскольку ни один конкретный регулятор не является универсальным, то описаны
функциональные возможности всех трех типов регуляторов, каждый из которых имеет
свои преимущества и недостатки.
Регулятор с предсказанием. Этот регулятор использует модель управляемого процесса в
виде нейронной сети, для того чтобы предсказать будущие реакции процесса на случайные сигналы управления. Алгоритм оптимизации вычисляет управляющие сигналы, которые минимизируют разность между желаемыми и действительными изменениями сигнала
9. Применение нейронных сетей
207
на выходе модели и таким образом оптимизируют управляемый процесс. Построение модели управляемого процесса выполняется автономно с использованием нейронной сети,
которая обучается в групповом режиме с использованием одного из алгоритмов обучения.
Контроллер, реализующий такой регулятор, требует значительного объема вычислений,
поскольку для расчета оптимального закона управления оптимизация выполняется на
каждом такте управления.
Регулятор NARMA-L2. Изо всех архитектур этот регулятор требует наименьшего объема
вычислений. Данный регулятор – это просто некоторая реконструкция нейросетевой модели управляемого процесса, полученной на этапе автономной идентификации. Вычисления в реальном времени связаны только с реализацией нейронной сети. Недостаток метода состоит в том, что модель процесса должна быть задана в канонической форме
пространства состояния, которой соответствует сопровождающая матрица, что может
приводить к вычислительным погрешностям.
Регулятор на основе эталонной модели. Требуемый объем вычислений для этого
регулятора сравним с предыдущим. Однако архитектура регулятора с эталонной моделью
требует обучения нейронной сети управляемого процесса и нейронной сети регулятора.
При этом обучение регулятора оказывается достаточно сложным, поскольку обучение
основано на динамическом варианте метода обратного распространения ошибки [16]. Достоинством регуляторов на основе эталонной модели является то, что они применимы к
различным классам управляемых процессов.
9.3.1. Регулятор с предсказанием
Регулятор с предсказанием, реализованный в ППП Neural Network Toolbox, использует модель нелинейного управляемого процесса в виде нейронной сети для того, чтобы
предсказывать его будущее поведение. Кроме того, регулятор вычисляет сигнал управления, который оптимизирует поведение объекта на заданном интервале времени.
Идентификация управляемого процесса. Схема подсистемы идентификации показана
на рис. 9.29. Она включает модель управляемого процесса в виде нейронной сети, которая
должна быть обучена в автономном режиме так, чтобы минимизировать ошибку между
реакциями процесса и модели e = yp – ym на последовательность пробных сигналов u.
Рис. 9.29
Нейронная сеть регулятора управляемого процесса представлена на рис. 9.30; она имеет 2 слоя нейронов и использует линии задержки (ЛЗ), чтобы запомнить предшествующие
значения входов и выходов процесса с целью предсказать будущие значения выхода.
208
Нейронные сети. MATLAB 6
Рис. 9.30
Настройка параметров этой сети выполняется автономно методом группового обучения, используя данные, полученные при испытаниях реального объекта. Для обучения
сети может быть использован любой из обучающих алгоритмов для нейронных сетей.
Принцип управления с предсказанием. Управление с предсказанием использует принцип
удаляющегося горизонта [40], когда нейросетевая модель управляемого процесса предсказывает реакцию объекта управления на определенном интервале времени в будущем. Предсказания используются программой численной оптимизации для того, чтобы вычислить управляющий сигнал, который минимизирует следующий критерий качества управления:
N2
Nu
j  N1
j 1
J   ( y r (t  j )  ym (t  j )) 2    (u' (t  j  1)  u'(t  j  2)) 2 ,
(9.4)
где константы N1, N2 и Nu задают пределы, внутри которых вычисляются ошибка слежения и мощность управляющего сигнала. Переменная u' описывает пробный управляющий
сигнал, yr – желаемая, а ym – истинная реакция модели управляемого процесса. Величина
 определяет вклад, который вносит мощность управления в критерий качества.
Структурная схема на рис. 9.31 иллюстрирует процесс управления с предсказанием.
Регулятор состоит из нейросетевой модели управляемого процесса и блока оптимизации.
Блок оптимизации определяет значения u', которые минимизируют критерий качества
управления, а соответствующий управляющий сигнал управляет процессом.
Регулятор
yr
ym
u'
Модель объекта
(нейронная сеть)
Оптимизация
u
Управляемый
процесс
yp
Рис. 9.31
Реализация регулятора с предсказанием. В качестве примера исследуется процесс
управления каталитическим реактором с непрерывным перемешиванием (Continous
Stirred Tank Reactor – CSTR), схема которого показана на рис. 9.32.
9. Применение нейронных сетей
209
Рис. 9.32
Динамическая модель управляемого процесса описывается следующими обыкновенными нелинейными дифференциальными уравнениями:
 dh
 dt  w1 (t )  w2 (t )  0.2 h ;

(9.5)
 dC
k1Cb
w (t )
w (t )
 b  (Cb1  Cb ) 1  (Cb 2  Cb ) 2 
,
h
h
 dt
(1  k 2Cb ) 2
где h – уровень жидкости в резервуаре; w1(t) – скорость потока продукта с концентрацией
Cb1; w2(t) – скорость потока разбавленного продукта с концентрацией Cb2; Cb – концентрация продукта на выходе объекта.
Исходные концентрации приняты равными Cb1 = 29.4 и Cb2 = 0.1. Константы скорости
расхода равны k1 = k2 = 1.
Цель регулирования состоит в поддержании концентрации продукта путем регулирования скорости потока w2(t). Для простоты принято w1(t) = 0.1. В этом примере уровень
раствора в резервуаре не регулируется.
Нелинейная динамическая модель каталитического реактора, соответствующая уравнениям (9.5), показана на рис. 9.33
Рис. 9.33
Чтобы разобрать этот достаточно сложный демонстрационный пример, следует
сделать ряд предварительных замечаний.
Описываемые ниже приложения нейронных сетей реализованы только в рамках
системы MATLAB 6. Демонстрационный пример NN Predictive Controller использует
следующие файлы, размещенные в каталоге toolbox\nnet\nncontrol.
210
Нейронные сети. MATLAB 6
MAT-файлы данных:
cstr1, cstr2, cstr3 – данные для обучения нейросетевой модели каталитического реактора.
Функции одномерной оптимизации:
csrchbac – поиск с обратной прогонкой;
csrchbre – метод Брента (Brent), объединяющий методы золотого сечения и квадратичной интерполяции;
csrchcha – метод кубической интерполяции Чараламбуса;
csrchgol – метод золотого сечения;
csrchhyb – гибридный метод бисекции и кубической интерполяции.
Функции для синтеза управления с предсказанием:
calcjjdjj – вычисление функционала качества и его градиента;
predopt – оптимизация регулятора с предсказанием;
dyduvar – вычисление частных производных выхода по входу.
Модели Simulink:
cstr – модель каталитического реактора;
predcstr – GUI-приложение для контроллера с предсказанием;
ptest3sim2 – нейросетевая модель управляемого процесса, используемая М-функцией
predopt для предсказания процесса в будущем.
Вспомогательные функции:
sfunxy2 – S-функция для вывода графиков;
nncontrolutil – поддержка, обеспечивающая возможность обращения к частным
функциям из системы Simulink.


Выполнить запуск демонстрационного примера можно несколькими способами:
в окне запуска приложений Launch Pad выбрать опцию Demos для ППП Neural Network Toolbox;
ввести команду predcstr, используя командное окно системы MATLAB.
В любом случае открывается окно системы Simulink со следующей структурой системы управления (рис. 9.34).
Рис. 9.34
9. Применение нейронных сетей
211
Эта структура включает блок управляемого процесса Plant и блок контроллера NN
Predictive Controller, а также блоки генерации эталонного ступенчатого сигнала со случайной амплитудой Random Reference, отсчета времени Clock, построения графиков
Graph. Особенность этой структуры заключается в том, что она выполняет не только
функции блок-схемы системы Simulink, но и функции графического интерфейса пользователя GUI [53].
Для того чтобы начать работу, необходимо активизировать блок NN Predictive Controller двойным щелчком левой кнопки мыши. Появится окно, показанное на рис. 9.35.
Рис. 9.35
Оно выполняет функции графического интерфейса пользователя. Обратите внимание
на информацию, которая руководит вашими действиями и указана в области фрейма
в виде сообщения Прежде чем установить параметры контроллера, постройте модель
управляемого процесса. Это означает, что прежде всего необходимо выполнить идентификацию управляемого процесса, т. е. построить его нейросетевую модель, воспользовавшись специальной процедурой Plant Identification.
Вид окна Plant Identification приведен на рис. 9.36. Это окно универсально и может
быть использовано для построения нейросетевых моделей для любого динамического
объекта, который описан моделью Simulink. В рассматриваемом случае такой моделью
является нелинейная динамическая модель каталитического реактора CSTR.
Процедура идентификации позволяет построить нейронную сеть, которая будет моделировать динамику управляемого процесса. Если модель должна использоваться при
настройке контроллера, то ее следует создать прежде, чем начнется расчет контроллера.
Кроме того, вам может потребоваться создание новой модели объекта, если спроектированный контроллер будет функционировать неудовлетворительно.
212
Нейронные сети. MATLAB 6
Рис. 9.36


Процедура идентификации требует задания следующих параметров:
параметры архитектуры:
Size of the Hidden Layer. Размер скрытого слоя определяется количеством используемых нейронов;
Sampling Interval. Такт дискретности в секундах определяет интервал между двумя
последовательными моментами съема данных;
No. Delayed Plant Inputs. Количество элементов запаздывания на входе модели;
No. Delayed Plant Outputs. Количество элементов запаздывания на выходе модели;
Normalize Training Data. Окно контроля нормирования обучающих данных к диапазону [0 1];
параметры обучающей последовательности:
Training samples. Длина обучающей выборки (количество точек съема информации);
Maximum Plant Input. Максимальное значение входного сигнала;
Minimum Plant Input. Минимальное значение входного сигнала;
Maximum Interval Value (sec). Максимальный интервал идентификации в секундах;
Minimum Interval Value (sec). Минимальный интервал идентификации в секундах;
Limit Output Data. Окно контроля, позволяющее ограничить объем выходных данных; только при включенном окне контроля будут доступны 2 следующих окна редактирования текста;
Maximum Plant Output. Максимальное значение выходного сигнала;
Minimum Plant Input. Минимальное значение выходного сигнала;
Simulink Plant Model. Задание модели Simulink с указанием входных и выходных
портов, используемых при построении нейросетевой модели управляемого процесса.
9. Применение нейронных сетей
213

С помощью кнопки Browse вы можете выбрать любую модель из числа доступных;
в рассматриваемом случае это модель каталитического реактора CSTR (рис. 9.33);
Generate Training Data. Кнопка запуска процесса генерации обучающей последовательности;
Import Data. Импорт обучающей последовательности из рабочей области или файла данных.
Для рассматриваемого примера эти данные накоплены в MAT-файлах cstr1, cstr2, cstr3;
Export Data. Экспорт сгенерированных данных в рабочую область или MAT-файл;
параметры обучения:
Training Epochs. Количество циклов обучения;
Training function. Задание обучающей функции;
Use Current Weights. Окно контроля, позволяющее подтвердить использование
текущих весов нейронной сети;
Use Validation/Testing for Training. Выбор этих окон контроля будет означать, что по
25 % данных из обучающей последовательности будет использовано для формирования контрольного и тестового подмножеств соответственно.
Итак, выбор процедуры Generate Training Data приведет к тому, что будет запущена
программа генерации обучающей последовательности на интервале 1600 с для модели каталитического реактора cstr.mdl. Программа генерирует обучающие данные путем воздействия
ряда случайных ступенчатых сигналов на модель Simulink управляемого процесса. Графики
входного и выходного сигналов объекта управления выводятся на экран (рис. 9.37).
Рис. 9.37
По завершении генерации обучающей последовательности пользователю предлагается либо принять сгенерированные данные (Accept Data), либо отказаться от них
(Reject Data).
Если вы принимаете данные, приложение возвращает вас к несколько измененному
окну Plant Identification (рис. 9.38). Здесь часть окон недоступны, а кнопка Generate
Training Data заменена на кнопку Erase Generated Data, что позволяет удалить сгенерированные данные.
214
Нейронные сети. MATLAB 6
Рис. 9.38
В окне фрейма содержится сообщение Обучающая последовательность состоит из
8000 замеров. Можно начинать обучение нейронной сети.
Для этого следует воспользоваться кнопкой Train Network (Обучить сеть). Начнется
обучение нейросетевой модели. После завершения обучения его результаты отображаются на графиках, как это показано на рис. 9.39, а и б, где построены соответственно результаты обучения и тестирования на контрольном множестве.
а
б
Рис. 9.39
9. Применение нейронных сетей
215
Текущее состояние отмечено в окне Plant Identification (рис. 9.40) сообщением Обучение завершено. Вы можете сгенерировать или импортировать новые данные, продолжить обучение или сохранить полученные результаты, выбрав кнопки OK или Apply.
В результате параметры нейросетевой модели управляемого процесса будут введены
в блок NN Predictive Controller системы Simulink.
Рис. 9.40
После этого мы вновь возвращаемся к окну Neural Network Predictive Control
(рис. 9.35) и можем установить параметры оптимизации:
Cost Horizon (N2). Верхний предел суммирования в показателе качества N2 = 7, нижний предел N1 фиксирован и равен 1;
Control Horizon (Nu). Верхний предел суммирования при оценке мощности управления Nu = 2;
Control Weighting Factor (). Коэффициент веса для составляющей мощности управления  = 0.05;
Search parameter (). Параметр одномерного поиска, задающий порог уменьшения
показателя качества,  = 0.001;
Minimization Routine. Выбор процедуры одномерного поиска; выбрана процедура
csrchbac;
Iterations Per Sample Time. Число итераций на 1 такт дискретности равно 2.
Как только параметры оптимизации установлены, следует подтвердить это нажатием
кнопок OK или Apply. В результате параметры регулятора будут введены в блок NN Predictive Controller системы Simulink.
216
Нейронные сети. MATLAB 6
Возвращаемся к модели Simulink (рис. 9.34) и начинаем моделирование, выбрав
опцию Start из меню Simulation. В процессе моделирования выводятся графики входа
и выхода управляемого процесса (рис. 9.41).
Рис. 9.41
Из анализа полученных данных следует, что реакция системы на ступенчатые воздействия со случайной амплитудой вполне удовлетворительна, имеет колебательный характер с достаточно быстрым затуханием; на интервале 20 с все воздействия эффективно отрабатываются. Таким образом, регулятор с предсказанием, реализованный в виде
нейронной сети, можно использовать для управления каталитическим реактором с непрерывным перемешиванием.
9.3.2. Регулятор NARMA-L2
Нейросетевой регулятор, описанный в этом разделе, использует в качестве модели
управляемого процесса модель нелинейной авторегрессии со скользящим средним (Nonlinear Autoregressive-Moving Average – NARMA-L2). Схема демонстрационного примера
управления магнитной подушкой показана на рис. 9.42.
Рис. 9.42
Окно Model Browser в левой части рисунка содержит перечень всех блоков, входящих в состав системы управления, представленной в виде модели системы Simulink.
9. Применение нейронных сетей
217
Управляемым объектом является магнит, который движется только в вертикальном
направлении в электромагнитном поле, как это схематично показано на рис. 9.43.
Рис. 9.43
Уравнение движения этой системы имеет вид:
d 2 y (t )
 i 2 (t )  dy (t )
(9.6)


g


,
M y (t ) M dt
dt 2
где y(t) – расстояние движущегося магнита от электромагнита; g – ускорение силы тяжести;  – постоянная магнитного поля, зависящая от числа витков обмотки и намагниченности электромагнита; i(t) – управляющий ток электромагнита; M – масса магнита;
 – коэффициент вязкого трения.
Соответствующая динамическая модель, реализованная в системе Simulink, показана
на рис. 9.44. Точно такую же модель, но с конкретными числовыми данными вы сможете
увидеть на экране терминала, если активизируете блок Plant (Magnet Levitation) в окне
Model Browser.
Рис. 9.44
Заметим, что рассматриваемая динамическая система является нелинейной, и мы будем строить ее дискретную нелинейную модель как авторегрессионную модель со скользящим средним, или NARMA-модель, в форме
(9.7)
y (k  d )  N [ y (k ), y (k  1), ..., y (k  n  1), u (k ), u (k  1), ..., u (k  n  1)] ,
где y(k) – выход модели; d – число тактов предсказания; u(k) – вход модели.
На этапе идентификации необходимо построить нейронную сеть для NARMA-модели
вида (9.7). Эта процедура аналогична описанной выше процедуре идентификации для регулятора с предсказанием.
Если требуется спроектировать следящую систему, которая обеспечивает движение
по заданной траектории
y(k+d) = yr(k+d),
(9.8)
218
Нейронные сети. MATLAB 6
то это означает, что необходимо сформировать нелинейный регулятор следующего
общего вида:
(9.9)
u(k )  G[ y(k ), y(k  1), , y(k  n  1), yr (k  d ), u(k  1), , u(k  m  1)] .
Хотя такой регулятор с помощью нейронной сети и может быть сформирован, однако
в процессе минимизации среднеквадратичной ошибки он требует чрезмерных вычислений,
поскольку использует динамический вариант метода обратного распространения ошибки [16].
Для практического решения задачи слежения Нарендра (Narendra) и Макхопадхаи (Mukhopadhyay) [31] предложили приближенную NARMA-модель с выделенной составляющей
управления. Такая модель регулятора, именуемая моделью NARMA-L2, имеет вид:
y (k  d )  f [ y (k ), y (k  1), ..., y (k  n  1), u (k  1), ..., u (k  m  1)] 
(9.10)
 g[ y (k ), y (k  1), ..., y (k  n  1), u (k  1), ..., u (k  m  1)] u (k ).
Преимущество этой формы состоит в том, что теперь текущее управление можно
непосредственно вычислить, если известна желаемая траектория yr, предыстория управления {u(k – 1), …, u(k – m + 1)}, а также предшествующие и текущее значения выхода
{y(k), …, y(k – n + 1)}:
u (k ) 
y r (k  d )  f [ y (k ), y (k  1), ... , y (k  n  1), u (k  1), , u (k  m  1)] .
g[ y (k ), y (k  1), ..., y (k  n  1), u (k  1), , u (k  m  1)]
(9.11)
Непосредственное применение этого соотношения для реализации регулятора затруднительно, поскольку управление u(k) зависит от текущего значения выхода y(k). Поэтому
управление (9.11) модифицируется следующим образом:
u(k  1) 
y r (k  d )  f [ y(k ), y(k  1), ... , y(k  n  1), u(k  1), , u(k  m  1)] ,
g[ y(k ), y(k  1), ... , y(k  n  1), u (k  1), , u(k  m  1)]
(9.12)
но при этом параметр предсказания должен удовлетворять условию d  2.
На рис. 9.45 показана структура соответствующего регулятора в виде нейронной сети.
Рис. 9.45
9. Применение нейронных сетей
219
Здесь следует обратить внимание на участки сети, которые выполняют аппроксимацию нелинейных операторов g и f в виде выходов gˆ  a 2 (t ) и fˆ  a 4 (t ) . Входами регулятора являются сигналы y(t+1) и u(t+1), последний реализован в виде обратной связи,
а также эталонный сигнал yr(t+2). Блоки задержки осуществляют запоминание соответствующих последовательностей входа и выхода, а затем используются двухслойные
нейронные сети, которые формируют оценки нелинейных операторов и вычисляют сигнал
управления в форме (9.12).
Общая структурная схема системы с регулятором NARMA-L2 показана на рис. 9.46. 
r
yr
Эталонная
модель
er
+
Регулятор
u
-
+
/
f
g
y
-
Объект
Л
Л
З
Л
Л
З
Рис. 9.46
На схеме явным образом выделена эталонная модель, которая задает желаемую траекторию для выхода управляемого процесса.
Демонстрационный пример NARMA-L2 Controller использует следующие файлы,
размещенные в каталоге toolbox\nnet\nncontrol.
MAT-файлы данных:
ball1– данные для обучения нейросетевой модели магнитной подушки.
Функции активации, используемые в нейронной сети контроллера NARMA-L2:
netinv – функция активации (1/n);
dnetinv – производная функции активации (1/n).
Модели Simulink:
ballrepel0 – модель магнитной подушки;
narmamaglev – GUI-приложение для контроллера NARMA-L2.
Вспомогательные функции:
sfunxy2 – S-функция для вывода графиков;
nncontrolutil – утилита, обеспечивающая возможность обращения к частным функциям из системы Simulink.


220
Выполнить запуск демонстрационного примера можно несколькими способами:
в окне запуска приложений Launch Pad выбрать опцию Demos для ППП Neural Network Toolbox;
ввести команду narmamaglev в командном окне системы MATLAB.
Нейронные сети. MATLAB 6
Для того чтобы начать работу, необходимо активизировать блок NARMA-L2 Controller двойным щелчком левой кнопки мыши. Появится окно, показанное на рис. 9.47.
Рис. 9.47
Обратите внимание, что это окно дает возможность обучить модель NARMA-L2.
Отдельного окна для обучения регулятора нет, так как регулятор NARMA-L2, в отличие
от регулятора с предсказанием, определяется непосредственно по модели.
Это окно работает так же, как и другие окна идентификации объекта управления, поэтому повторно подробно процесс обучения рассматривать не будем.
После окончания обучения нажать на клавишу OK для ввода данных регулятора в модель Simulink. Возвращаемся к модели Simulink (см. рис. 9.34) и начинаем моделирование, выбрав опцию Start из меню Simulation. Графики задающего сигнала и выхода
системы приведены на рис. 9.48.
Рис. 9.48
Из анализа полученных данных следует, что реакция системы на ступенчатые воздействия со случайной амплитудой вполне удовлетворительна, имеет колебательный характер с достаточно быстрым затуханием; на интервале 5 с все уставки эффективно отрабатываются. Таким образом, регулятор NARMA-L2, реализованный в виде нейронной сети,
можно использовать для управления магнитной подушкой.
9. Применение нейронных сетей
221
9.3.3. Регулятор на основе эталонной модели
В этом разделе описана система управления с эталонной моделью, при реализации которой используются 2 нейронные сети: для регулятора и для модели объекта управления.
Схема демонстрационного примера управления звеном робота показана на рис. 9.49.
Рис. 9.49
Окно Model Browser в левой части рисунка содержит перечень всех блоков, входящих в состав системы управления, представленной в виде модели системы Simulink.
В этом демонстрационном примере цель состоит в управлении движением одного
звена робота, как это показано на рис. 9.50.
Рис. 9.50
Уравнения движения звена:
d 2
d
 10 sin   2
u ,
dt
dt 2
(9.13)
где  – угол поворота звена; u – момент, развиваемый двигателем постоянного тока.
Цель обучения регулятора состоит в том, чтобы движение звена отслеживало выход
эталонной модели:
d 2 yr
dy
 9 y r  6 r  9r ,
dt
dt 2
(9.14)
где yr – выход эталонной модели; r – задающий сигнал на входе модели.
222
Нейронные сети. MATLAB 6
Соответствующая динамическая модель, реализованная в системе Simulink, показана
на рис. 9.51.
Рис. 9.51
Структурная схема, поясняющая принцип построения системы управления с эталонной моделью, показана на рис. 9.52.
Ошибка
управления
Эталонная
модель
Нейронная сеть
модели
объекта
Командный вход
Нейронная
сеть
регулятора
Ошибка
модели
Объект
управления
Управляющий
вход
Выход
объекта
Рис. 9.52
В ней следует выделить эталонную модель, которая задает желаемую траекторию
движения звена робота, удовлетворяющую дифференциальному уравнению (9.14), а также нейронные сети, реализующие регулятор и модель объекта управления.
Архитектуру нейронной сети регулятора можно описать профилем 5–13–1 (5 входов,
13 нейронов скрытого слоя и 1 выход). Она показана на рис. 9.53 и имеет 2 слоя. Здесь же
показана и нейронная сеть модели объекта, которая также состоит из двух слоев. Линии
задержки, используемые для формирования входов нейронных сетей, имеют такт дискретности, равный 0.05 с.
9. Применение нейронных сетей
223
Рис. 9.53
Демонстрационный пример Model Reference Control использует следующие файлы,
размещенные в каталоге toolbox\nnet\nncontrol.
MAT-файлы данных:
robot1, robot2 – данные для обучения нейросетевой модели звена робота;
robot1norm, robot2norm, robot3norm – нормированные данные для обучения нейросетевой модели звена робота;
robot1ref – данные для обучения нейросетевой модели контроллера.
Обучающие функции нейронных сетей:
srchbacxc – процедура одномерного поиска на основе перебора с возвратом;
trainbfgc – модифицированная процедура алгоритма BFGS для расчета системы
управления с эталонной моделью.
Модели Simulink:
mrefrobotarm – модель системы управления звеном робота;
mrefrobotarm2 – модель системы управления звеном робота с нормированными
данными;
robotarm – динамическая модель звена робота;
robotref – эталонная модель.
Вспомогательные функции:
sfunxy2 – S-функция для вывода графиков;
nncontrolutil – утилита, обеспечивающая возможность обращения к частным функциям из системы Simulink.
224
Нейронные сети. MATLAB 6


Выполнить запуск демонстрационного примера можно несколькими способами:
в окне запуска приложений Launch Pad выбрать опцию Demos для ППП Neural Network Toolbox;
ввести команды mrefrobotarm или mrefrobotarm2 в командном окне системы MATLAB
в зависимости от того, используется ли модель с ненормированными или нормированными данными.
Для того чтобы начать работу, необходимо активизировать блок Model Reference
Controller двойным щелчком левой кнопки мыши. Появится окно, показанное на рис. 9.54.
Рис. 9.54
Особенность рассматриваемой системы управления заключается в том, что следует
построить 2 нейронные сети: модели объекта управления и самого регулятора. Разумно
начать с построения модели объекта управления и в окне, показанном на рис. 9.54, выбрать кнопку Plant Identification. При этом откроется окно Plant Identification, которое
показано на рис. 9.55.
9. Применение нейронных сетей
225
Рис. 9.55
Для построения нейросетевой модели объекта управления следует выбрать кнопку
Generate Training Data и далее следовать рассмотренной ранее процедуре идентификации. Параметру Training Epochs целесообразно установить значение, равное 50, чтобы
сократить время вычислений. Если результаты идентификации вас удовлетворяют, то
следует подтвердить это нажатием кнопки Accept Data в окне Plant Input-Output Data,
в противном случае выбрать кнопку Reject Data и затем сформировать новые данные.
После этого вы вновь возвращаетесь в окно Model Reference Control (рис. 9.54).
Теперь для обучения регулятора следует выбрать кнопку Generate Training Data, чтобы
сгенерировать обучающие данные. Эти данные в виде графиков появятся в окне Input-Output
Data for NN Model Reference Control, и вам вновь необходимо подтвердить или отвергнуть
эти данные. Если данные приемлемы, то в окне Model Reference Control следует выбрать
кнопку Train Controller (Обучить регулятор). После того как обучение окончено, графики
выходов эталонной модели и объекта управления выводятся на экран (рис. 9.56). Обучение
регулятора занимает весьма значительное время, поскольку обучение использует динамический вариант метода обратного распространения ошибки [16].
226
Нейронные сети. MATLAB 6
Рис. 9.56
Если точность слежения за эталонной моделью неудовлетворительна, то можно продолжить обучение регулятора с тем же набором данных, снова воспользовавшись кнопкой
Train Controller. Если для продолжения обучения необходимо использовать новый набор
данных, следует воспользоваться кнопками Generate Data или Import Data, причем, если
вы хотите продолжить обучение с выбранными весами, следует сделать отметку в окне
контроля Use Current Weights.
По окончании обучения регулятора нажать на клавишу OK, вернуться к модели
Simulink (см. рис. 9.49) и начать моделирование, выбрав опцию Start из меню Simulation.
Графики эталонного сигнала и выхода объекта управления показаны на рис. 9.57.
Рис. 9.57
Из анализа полученных данных следует, что реакция системы на ступенчатые воздействия со случайной амплитудой носит монотонный характер и отрабатывается в пределах
3 с. Это свидетельствует о хорошем качестве регулятора Model Reference Controller для
управления звеном робота-манипулятора.
9. Применение нейронных сетей
227
Часть 2. ОПЕРАТОРЫ, ФУНКЦИИ И КОМАНДЫ
10. ВЫЧИСЛИТЕЛЬНАЯ МОДЕЛЬ НЕЙРОННОЙ
СЕТИ
ППП Neural Network Toolbox использует специальный класс объектов network object.
Эти объекты представлены в ППП в виде массивов записей, поля которых определяют их
свойства, характеристики и параметры. Массивы записей позволяют задать вычислительную модель нейронной сети, для которой используется стандартное имя net, являющееся
также и именем массива записей.
10.1. Описание сети
Описание архитектуры
Архитектура нейронной сети характеризуется количеством входов, слоев, выходов,
целей, смещений, а также топологией их соединения. Перечисленные ниже поля массива
записей net определяют свойства нейронной сети, связанные с ее архитектурой.
net
Тип
Размер
Значение по
умолчанию
Имя поля
 .numInputs
Integer >= 0
11
0
Количество входов сети
 .numLayers
Integer >= 0
11
0
Количество слоев
 .biasConnect
Boolean array
NumLayers1
[]
 .inputConnect
Boolean array
NumLayers 
NumInputs
[]
 .layerConnect
Boolean array
NumLayers 
NumLayers
[]
 .outputConnect
Boolean array
1NumLayers
[]
 .targetConnect
Boolean array
1NumLayers
[]
Матрица связности
для смещений
Матрица связности
для входов
Матрица связности
для слоев
Матрица связности
для выходов
Матрица связности для целей
 .numOutputs
Integer >= 0
11
(только для чтения)
0
Количество выходов сети
 .numTargets
Integer >= 0
11
(только для чтения)
0
Количество целей сети
 .numInputDelays
Integer >= 0
11
(только для чтения)
0
Максимальное значение
задержки для входов сети
 .numLayerDelays Integer >= 0
11
(только для чтения)
0
Максимальное значение
задержки для слоев сети
228
numInputs
число входов
Количество векторов входа сети. Количество векторов входа следует отличать от количества элементов вектора входа. Число входов задается целым положительным числом и
указывает, как много векторов входа подано на сеть; по умолчанию 0. В свою очередь,
количество элементов каждого входного вектора задается свойством inputs{i}.size. Любое
изменение свойства numInputs будет влиять на размеры матрицы связности inputConnect
и массивов ячеек inputs{i}.
numLayers
число слоев
Количество слоев. Число слоев задается целым положительным числом; по умолчанию 0.
Любое изменение этого свойства будет влиять на размер матриц связности biasConnect,
inputConnect, layerConnect, outputConnect, targetConnect, а также размеры массивов весов
и смещений IW, LW, b.
biasConnect
матрица связности
Матрица связности для смещений. Это одномерная булева матрица размера Nl1, где Nl –
количество слоев, определяемых свойством numLayers. Наличие или отсутствие смещения в слое i отмечается в элементе вектора biasConnect(i) как 1 или 0 соответственно.
Наличие смещения означает, что в массивах ячеек biases{i} и b{i} будут созданы структуры, задающие все характеристики смещения.
inputConnect
матрица связности
Матрица связности для входов. Это булева матрица размера NlNi, где Nl – количество
слоев, определяемых свойством numLayers, и Ni – количество входов, определяемых
свойством numInputs. Наличие или отсутствие веса при связывании слоя i со слоем j отмечается в элементе матрицы inputConnect(i, j) как 1 или 0 соответственно. Наличие веса
означает, что в массивах ячеек inputWeights{i} и IW{i} будут созданы структуры, задающие характеристики весов входа.
layerConnect
матрица связности
Матрица связности для слоев. Это булева матрица размера NlNl, где Nl – количество
слоев, определяемых свойством numLayers. Наличие или отсутствие веса в слое i по входу
j отмечается в элементе матрицы layerConnect(i, j) как 1 или 0 соответственно. Наличие
веса означает, что в массивах ячеек layerWeights{i} и LW{i} будут созданы структуры,
задающие характеристики весов слоя.
outputConnect
матрица связности
Матрица связности для выходов. Это одномерная булева матрица размера 1Nl, где Nl –
количество слоев, определяемых свойством numLayers. Наличие или отсутствие выхода в
слое i отмечается в элементе вектора outputConnect(i) как 1 или 0 соответственно. Наличие
выхода изменяет значение свойства numOutputs и означает, что в массиве ячеек outputs{i}
будет сформирована структура, задающая характеристики выхода.
targetConnect
матрица связности
Матрица связности для целей. Это одномерная булева матрица размера 1Nl, где Nl – количество слоев, определяемых свойством numLayers. Наличие или отсутствие целевого
выхода в слое i отмечается в элементе вектора targetConnect(i) как 1 или 0 соответственно.
10. Вычислительная модель нейронной сети
229
Наличие цели изменяет значение свойства numTargets и означает, что в массиве ячеек
targets{i} будет сформирована структура, задающая характеристики целевого выхода.
numOutputs
число выходов (только для чтения)
Количество выходов. Число выходов определяется количеством единиц в матрице связности для выходов; по умолчанию 0. Оно может быть вычислено следующим образом:
numOutputs = sum(outputConnect)
numTargets
число целей (только для чтения)
Количество целевых выходов. Число целей определяется количеством единиц в матрице
связности для целей; по умолчанию 0. Оно может быть вычислено следующим образом
numOutputs = sum(targetConnect)
numInputDelays
максимальное значение задержки (только для чтения)
Максимальное значение задержки для входов. Это свойство определяет максимальное
значение задержки для входных последовательностей, по умолчанию 0. Оно может быть
вычислено следующим образом:
numInputDelays = 0;
for i=1:net.numLayers
for j=1:net.numInputs
if net.inputConnect(i,j)
numInputDelays = max( ...
[numInputDelays net.inputWeights{i,j}.delays]);
end
end
end
numLayerDelays
максимальное значение задержки (только для чтения)
Максимальное значение задержки для слоев. Это свойство определяет максимальное
значение задержки для всех слоев сети, по умолчанию 0. Оно может быть вычислено
следующим образом:
numLayerDelays = 0;
for i=1:net.numLayers
for j=1:net.numLayers
if net.layerConnect(i,j)
numLayerDelays = max( ...
[numLayerDelays net.layerWeights{i,j}.delays]);
end
end
end
Функции инициализации, адаптации и обучения
Перечисленные ниже свойства объекта net включают перечень функций, которые
используются для инициализации, адаптации и обучения нейронной сети.
230
Нейронные сети. MATLAB 6
Тип
net
 .initFcn
Char
Размер,
состав
initcon | initlay | initnw | initnwb|
initzero
 .initParam
 .adaptFcn
Char
adaptwb | trains
 .adaptParam
 .trainFcn
Char
trainb | trainbfg
trainbr | trainc
traincgb | traincgf
traincgp | traingd
traingda | traingdm
traingdx | trainlm
trainoss | trainr
trainrp | trains
trainscg |
Char
mae | mse |
msereg | sse
 .performParam
initFcn
Имя поля
''
Функции инициализации
[]
Параметры функции
инициализации
Функции адаптации
''
[]
 .trainParam
 .performFcn
Значение
по умолчанию
| ''
|
|
|
|
|
|
|
Параметры функции
адаптации
Функции обучения
[]
Параметры функции обучения
''
Функции оценки качества
обучения
Параметры функции
оценки качества обучения
[]
initcon | initlay | initnw | initnwb | initzero
Функции инициализации. Это свойство определяет, какая функция инициализации initFcn
будет использована для задания начальных матриц весов и векторов смещений при вызове метода init для всей сети. При изменении этого свойства параметры функции инициализации initParam будут использовать значения, соответствующие новой функции.
Пользователь может расширить список применяемых функций инициализации.
initParam
параметры функции инициализации
Параметры функции инициализации. Это свойство определяет набор параметров для используемой функции инициализации. Узнать набор таких параметров можно, применив
оператор help в следующей функциональной форме:
help(net.initFcn).
adaptFcn
adaptwb | trains
Функции адаптации. Это свойство определяет, какая функция адаптации adaptFcn будет
использована при вызове метода adapt. При изменении этого свойства параметры функции адаптации adaptParam будут использовать значения, соответствующие новой функции. Пользователь может расширить список применяемых функций адаптации.
adaptParam
параметры функции адаптации
Параметры функции адаптации. Это свойство определяет набор параметров для используемой функции адаптации. Узнать набор таких параметров можно, применяя оператор
help в следующей функциональной форме:
help(net.adaptFcn).
10. Вычислительная модель нейронной сети
231
trainFcn
trainb | trainbfg | traingbr |trainc | traincgb | traincgf | traincgp |traingd
|traingda | traingdm | traingdx | trainlm | trainoss | trainr | trainrp | trainscg
Функции обучения. Это свойство определяет, какая функция обучения trainFcn будет использована при вызове метода train. При изменении этого свойства параметры функции
обучения trainParam будут использовать значения, соответствующие новой функции.
Пользователь может расширить список используемых функций обучения.
trainParam
параметры функции обучения
Параметры функции обучения. Это свойство определяет набор параметров для используемой функции обучения. Узнать набор таких параметров можно, применяя оператор help
в следующей функциональной форме:
help(net.trainFcn).
performFcn
mae | mse | msereg | sse
Функции оценки качества обучения. Это свойство определяет, какая функция оценки качества обучения performFcn будет использована при вызове метода train. При изменении
этого свойства параметры функции оценки качества обучения performParam будут использовать значения, соответствующие новой функции. Пользователь может расширить
список применяемых функций оценки качества обучения.
trainParam
параметры функции оценки качества обучения
Параметры функции оценки качества обучения. Это свойство определяет набор параметров для используемой функции оценки качества обучения. Узнать набор таких параметров можно, применив оператор help в следующей функциональной форме:
help(net.performFcn).
10.2. Описание элементов сети
Эти свойства задаются с помощью массивов ячеек, которые включают структуры
для описания входов, слоев, выходов, целей, смещений и весов.
Описание входов
Ниже приведено описание полей структуры, которая используется для описания
каждого входа сети net.inputs{i}.
net
.inputs{i}
Тип
Cell array
Размер
numInputs1
Значение
по умолчанию
Имя поля
{01}
Описатель i-го входа сети
.range
Double array size2
[]
Допустимый диапазон значений
.size
Integer >= 0 11
0
.userdata
Struct
11
11
Количество элементов вектора
входа
Информация пользователя
.note
Char
1var
'Put your custom input Текст
information here.'
массив ячеек
Описатель входов сети. Массив ячеек размера Ni1, где Ni – число входов сети, равное
numInputs, состоящий из ячеек inputs{i}, каждая из которых является массивом записей
для описания i-го входа сети.
range
массив значений
Допустимый диапазон значений для элементов векторов входа. Это свойство определяет
границы допустимых значений для элементов каждого вектора входа сети и является чисinputs
232
Нейронные сети. MATLAB 6
ловым массивом размера Ri2, где Ri – число элементов i-го вектора входа равное значению поля inputs{i}.size. Это свойство используется некоторыми функциями инициализации сети, чтобы вычислить начальные значения для матриц весов входа. При изменении
числа строк массива range будут автоматически изменяться параметры inputs{i}.size,
inputWeights{:, i}.size, а также размер матриц весов входа IW{:, i}.
size
количество элементов
Количество элементов вектора входа. Это свойство определяет количество элементов
для каждого вектора входа inputs{i} и может принимать только неотрицательные значения
(по умолчанию 0). При изменении значения этого свойства будут автоматически изменяться
параметр inputWeights{:, i}.size, а также размеры матриц inputs{i}.range и IW{:, i}.
userdata
массив записей
Поле для записи информации пользователя. Это свойство обеспечивает место для записи
информации, относящейся к входу i сети. Предусмотрено только одно поле
inputs{i}.userdata.note для записи текста. По умолчанию оно содержит строку 'Put your
custom input information here.' – "Информацию разместите здесь".
Описание слоев
Ниже приведено описание полей структуры, которая используется для описания
каждого слоя нейронной сети net.layers{i}.
Тип
net
.layers{i}
Размер,
состав
Значение
по умолчанию
Имя поля
Cell array
numLayers1
{01}
Описатель i-го слоя сети
.dimensions
Double array
1numdim
[]
.distanceFcn
Char
boxdist | dist|
linkdist|mandist
‘‘
.distances
[]
.initFcn
Double array(только для чтения)
Char
initnw | initwb
‘‘
Распределение нейронов
по размерностям слоя
Функции вычисления расстояния между нейронами
Расстояния между
нейронами
Функции инициализации
.netInputFcn
Char
‘‘
Функции накопления
.positions
Положения нейронов
.size
Array (только
для чтения)
Integer >= 0
[]
11
0
Количество нейронов
.topologyFcn
Char
‘‘
Функции топологии
.transferFcn
Char
‘‘
Функции активации
.userdata
Struct
gridtop | hextop |
randtop
compet | hardlim |
hardlims | logsig |
poslin | purelin |
radbas | satlin |
satlins | softmax |
tansig | tribas
11
11
Информация пользователя
.note
Char
1var
'Put your cus- Текст
tom input information here.'
netprod | netsum
10. Вычислительная модель нейронной сети
233
layers
массив ячеек
Описатель слоев нейронной сети. Массив ячеек размера Nl1, где Nl – число слоев сети,
равное numLayers, состоящий из ячеек layers{i}, каждая из которых является массивом
записей для описания i-го слоя сети.
dimensions
вектор распределения по размерностям
Распределение нейронов по размерностям слоя. Это свойство позволяет описывать
многомерные слои нейронов реальных геометрических размерностей: 1-, 2-, 3-мерные.
Многомерный слой размерности numdim может быть задан вектор-строкой, элементы
которой указывают число нейронов по каждой размерности, тогда их произведение будет
определять общее количество нейронов в многомерном слое layers{i}.size. Знание этого
свойства необходимо для определения положений нейронов layers{i}.positions, если известна функция топологии слоя layers{i}.topologyFcn. При изменении значения этого
свойства будут автоматически изменяться параметр layers{i}.size, а также положения
нейронов layers{i}.positions и расстояния между ними layers{i}.distances.
distanceFcn
boxdist | dist | linkdist | mandist
Функция оценки расстояния между нейронами. Свойство layers{i}.distanceFcn задает
функцию, которая используется для вычисления расстояния между нейронами в слое i.
При замене функции будут автоматически пересчитаны значения расстояний между
нейронами слоя layers{i}.distances. Пользователь может расширить список применяемых
функций оценки расстояния.
distances
значение расстояний (только для чтения)
Расстояния между нейронами. Cвойство layers{i}.distances определяет расстояния между
нейронами в i-м слое. Их значения зависят от используемой функции оценки расстояния
layers{i}.distanceFcn.
initFcn
initnw | initwb
Функция инициализации слоя. Это свойство определяет, какая функция инициализации
layers{i}.initFcn применяется для слоя i. Если свойство net.initFcn имеет значение initlay,
то будет применяться указанная функция инициализации слоя при вызове функции net =
= init(net). Пользователь может расширить список применяемых функций инициализации.
netInputFcn
netprod | netsum
Функция накопления. Это свойство определяет, какая функция накопления
layers{i}.netInputFcn применяется для слоя i. Пользователь может расширить список применяемых функций накопления.
positions
положения нейронов (только для чтения)
Размещение нейронов в слое. Это свойство определяет положения нейронов layers{i}.positions
в i-м слое. Их значения зависят от используемой функции топологии многомерного слоя
layers{i}.topologyFcn и его размера layers{i}.dimensions. Для построения графика расположения
нейронов в многомерном слое рекомендуется использовать М-функцию plotsom.
234
Нейронные сети. MATLAB 6
Пример:
Если первый двумерный слой нейронной сети net имеет вектор распределения по размерностям net.layers{1}.dimensions, равный [4 5], а функция топологии слоя net.layers{1}.topologyFcn –
hextop, то нейроны этого слоя будут расположены, как показано на рис. 10.1.
plotsom(net.layers{1}.positions)
Рис. 10.1
size
количество элементов
Количество нейронов в слое. Это свойство определяет количество нейронов в слое
layers{i}.size и может принимать только неотрицательные значения (по умолчанию 0).
При изменении значения этого свойства будут автоматически изменяться параметры
inputWeights{i, :}.size, layerWeights{i, :}.size, biases{i}.size, а также размеры матриц весов
IW{i, :}, LW{i, :}, LW{:, i} и смещений b{i}. Кроме того, изменяются параметры
outputs{i}.size и targets{i}.size, если для нейронной сети заданы выходы и цели. Наконец,
при изменении этого свойства изменяется параметр размера нейронного слоя
layers{i}.dimensions, которому присваивается значение свойства layers{i}.size. Это приводит к тому, что слой i преобразуется в одномерный; если необходимо сохранить многомерную структуру слоя, то следует изменить значения элементов вектора
layers{i}.dimensions.
topologyFcn
gridtop | hextop | randtop
Функция задания топологии слоя. Это свойство определяет функцию, которая используется для вычисления положений нейронов layers{i}.positions в слое i. При замене функции
эти положения будут пересчитаны автоматически. Пользователь может расширить список
применяемых функций задания топологии.
Пример:
Если первый двумерный слой нейронной сети net имеет вектор распределения по размерностям net.layers{1}.dimensions, равный [8 10], а функция топологии слоя
net.layers{1}.topologyFcn – randtop, то расположение нейронов этого слоя будет таким, как
показано на рис. 10.2
plotsom(net.layers{1}.positions)
10. Вычислительная модель нейронной сети
235
Рис. 10.2
transferFcn
compet | hardlim | hardlims | logsig | poslin | purelin | radbas | satlin | satlins |
softmax | tansig | tribas
Функция активации слоя. Это свойство определяет функцию активации layers{i}.transferFcn,
которая используется для задания нейрона в слое i. Пользователь может расширить список применяемых функций активации.
userdata
массив записей
Поле для записи информации пользователя. Это свойство обеспечивает место для записи
информации, относящейся к слою i нейронной сети. Предусмотрено только одно поле
inputs{i}.userdata.note для записи текста. По умолчанию оно содержит строку 'Put your
custom input information here.' – "Информацию разместите здесь".
Описание выходов
Перечисленные ниже свойства объекта net включают перечень функций, которые
используются для описания выходов нейронной сети.
Тип
net
 .outputs{i}
.size
.userdata
.note
Cell array
Размер
Значение
по умолчанию
numLayers1 {01}
Имя поля
Описатель составляющей
выхода от слоя i
Количество элементов
вектора выхода
Информация пользователя
Integer >= 0
11
(только для чтения)
Struct
11
0
Char
'Put your custom Текст
input information
here.'
1var
11
массив ячеек
Описатель выходов сети. Массив ячеек размера Nl1, где Nl – число слоев сети
numLayers, состоящий из ячеек outputs{i}, каждая из которых является массивом записей
для описания выходов, которые заданы вектором связности outputConnect(i).
size
количество элементов (только для чтения)
Количество элементов вектора выхода. Это свойство определяет количество элементов для каждого вектора выхода outputs{i} и может принимать только неотрицательные значения (по умолчанию 0). Его значение всегда совпадает со значением параметра layers{i}.size.
outputs
236
Нейронные сети. MATLAB 6
массив записей
userdata
Поле для записи информации пользователя. Это свойство обеспечивает место для записи
информации, относящейся к выходу слоя i сети. Предусмотрено только одно поле
outputs{i}.userdata.note для записи текста. По умолчанию оно содержит строку 'Put your
custom input information here.' – "Информацию разместите здесь".
Описание целей
Перечисленные ниже свойства объекта net включают перечень функций, которые
используются для инициализации, адаптации и обучения нейронной сети.
Тип
net
Размер
Значение
по умолчанию
.targets{i}
Cell array
{11}
{10}
.size
Integer >= 0
(только для чтения)
11
0
.userdata
Struct
11
Char
1var
.note
targets
11
Имя поля
Описатель составляющей
целевого выхода от слоя i
Количество элементов
целевого выхода
Информация пользователя
'Put your custom in- Текст
put information here.'
массив ячеек
Описатель целевых выходов сети. Массив ячеек размера Nl1, где Nl – число слоев сети
numLayers, состоящий из ячеек targets {i}, каждая из которых является массивом записей
для описания целевых выходов, которые определяются вектором связности
targetConnect(i).
size
количество элементов (только для чтения)
Количество элементов вектора целей. Это свойство определяет количество элементов
для каждого целевого вектора целей targets{i} и может принимать только неотрицательные значения (по умолчанию 0). Его значение всегда совпадает со значением параметра
layers{i}.size.
userdata
массив записей
Поле для записи информации пользователя. Это свойство обеспечивает место для записи
информации, относящейся к целевому выходу слоя i сети. Предусмотрено только одно
поле targets{i}.userdata.note для записи текста. По умолчанию оно содержит строку
'Put your custom input information here.' – "Информацию разместите здесь".
Описание смещений
Перечисленные ниже свойства объекта net включают перечень функций, которые
используются для описания смещений в нейронной сети.
10. Вычислительная модель нейронной сети
237
Тип
net
.biases{i}
Размер, состав
Значение
по умолчанию
Имя поля
Cell array
numLayers1
{01}
.initFcn
Char
‘‘
.learn
Boolean
initcon | initzero |
rands
0|1
0
Описатель вектора
смещений для слоя i
Функции
инициализации
Индикатор настройки
.learnFcn
Char
learncon | learngd |
learngdm | learnp |
learnpn | learnwh
‘‘
Функции настройки
.learnParam
Параметры функции
настройки
0
Количество
элементов
11
Информация
пользователя
'Put your custom input Текст
information here.'
[]
.size
Integer >= 0
.userdata
Struct
11
.note
Char
1var
(только для чтения)
11
массив ячеек
Описатель векторов смещений. Массив ячеек размера Nl1, где Nl – число слоев сети
numLayers, состоящий из ячеек biases{i}, каждая из которых является массивом записей
для описания вектора смещений для слоя i. Наличие или отсутствие такого вектора для
слоя i определяется вектором связности biasConnect(i).
biases
initFcn
initcon | initzero | rands
Функция инициализации вектора смещений. Это свойство определяет, какая функция инициализации biases{i}.initFcn применяется при вызове функции init для вычисления
начального вектора смещения слоя i при условии, что свойство net.initFcn имеет значение
initlay, а функция инициализации слоя layers{i}.initFcn имеет значение initwb. Пользователь может расширить список применяемых функций инициализации.
learn
признак настройки
Признак настройки вектора смещений. Свойство biases{i}.learn указывает, будет ли вектор
смещений для слоя i настраиваться с использованием методов adapt или train соответственно.
Значение этого свойства 0 или 1, по умолчанию 0, что соответствует методу адаптации.
learnFcn
learncon | learngd | learngdm | learnp | learnpn | learnwh
Функция настройки вектора смещений. Это свойство определяет, какая функция
biases{i}.learnFcn применяется при настройке вектора смещений для слоя i при адаптации
или обучении с использованием функций adaptwb и trainwb или trainwb1 соответственно.
Пользователь может расширить список применяемых функций настройки. При таких
изменениях параметры функции настройки biases{i}.learnParam будут использовать значения, соответствующие новой функции.
learnParam
параметры функции настройки
Параметры функции настройки. Свойство biases{i}.learnParam определяет набор параметров для используемой функции настройки biases{i}.learnFcn. Узнать набор таких
параметров можно, применяя оператор help в следующей функциональной форме:
help(net.biases{i}.learnFcn).
238
Нейронные сети. MATLAB 6
количество элементов (только для чтения)
size
Количество элементов вектора смещений. Это свойство определяет количество элементов для каждого вектора смещений biases{i} и может принимать только неотрицательные
значения (по умолчанию 0). Его значение всегда совпадает со значением параметра
layers{i}.size.
userdata
массив записей
Поле для записи информации пользователя. Это свойство обеспечивает место для записи
информации, относящейся к вектору смещений слоя i сети. Предусмотрено только одно
поле biases{i}.userdata.note для записи текста. По умолчанию оно содержит строку 'Put
your custom input information here.' – "Информацию разместите здесь".
Описание весов входа
Перечисленные ниже свойства объекта net включают перечень функций, которые используются для описания весов входа.
net
.inputWeights{i,j}
Тип
Cell array
Размер
numLayersnumInputs
Значение
по умолчанию
{01}
.delays
Double array 1var
[]
.initFcn
Char
initzero | midpoint | randnc |
randnr | rands
‘‘
.learn
Boolean
0|1
0
.learnFcn
Char
learngd | learngdm | learnh | ‘ ‘
learnhd | learnis | learnk |
learnlv1 | learnlv2 | learnos |
learnp | learnpn | learnsom |
learnwh
[]
.learnParam
.weightFcn
Char
dist | dotprod | mandist |
negdist | normprod
‘‘
.size
Integer >= 0
(только для
11
0
Struct
11
11
Char
1var
чтения)
.userdata
.note
10. Вычислительная модель нейронной сети
Имя поля
Описатель массива весов от
входа j к слою i
Индикатор линий задержки
Функции
инициализации
Индикатор
настройки
Функции
настройки
Параметры
функции
настройки
Функции формирования взвешенных входов
Количество
элементов
Информация
пользователя
'Put your custom Текст
input information
here.'
239
inputWeights
массив ячеек
Описатель весов входа. Массив размера NlNi, где Nl – число слоев numLayers и Ni – число входов numInputs объекта net, состоящий из ячеек inputWeights{i, j}. Каждая ячейка
является массивом записей и служит для описания свойств весов, которые формируют
матрицу весов. Последняя определяет веса связей слоя i с входом j сети и согласуется
с матрицей связности inputConnect(i, j).
delays
индикатор линий задержки
Описание линий задержки. Свойство inputWeights{i, j}.delays определяет наличие линий
задержки между входом j и слоем i. Это вектор-строка, элемент которого либо равен 0,
либо значению задержки (положительное целое число), причем эти значения могут только
возрастать. Длина этого вектора определяет количество задержанных векторов входа.
При изменении значения этого свойства автоматически изменяется параметр
inputWeights{i, j}.size и размер матрицы весов IW{i, j}.
initFcn
initzero | midpoint | randnc | randnr | rands
Функция инициализации матрицы весов. Это свойство определяет, какая функция инициализации inputWeights{i, j}.initFcn применяется при вызове метода init для вычисления
матрицы весов от входа j к слою i при условии, что свойство net.initFcn имеет значение
initlay, а функция инициализации слоя layers{i}.initFcn имеет значение initwb. Пользователь может расширить список применяемых функций инициализации.
learn
индикатор настройки
Индикатор настройки матрицы весов. Свойство inputWeights{i, j}.learn указывает, будет
ли матрица весов для слоя i настраиваться в процессе адаптации или обучения при использовании методов adapt или train соответственно. Значение этого свойства 0 или 1, по
умолчанию 0.
learnFcn
learngd | learngdm | learnh | learnhd | learnis | learnk | learnlv1 | learnlv2| learnos |
learnp | learnpn | learnsom | learnwh
Функции настройки матриц весов. Это свойство определяет, какая функция
inputWeights{i,j}.learnFcn применяется при настройке матрицы весов для слоя i при адаптации или обучении с использованием функций adaptwb и trainwb или trainwb1 соответственно. Пользователь может расширить список применяемых функций настройки.
learnParam
параметры функции настройки
Параметры функции настройки. Свойство biases{i}.learnParam определяет набор параметров для используемой функции настройки inputWeights{i,j}.learnParam. Узнать набор
таких параметров можно, применяя оператор help в следующей функциональной форме:
help(net.inputWeights{i,j}.learnFcn).
weightFcn
dist | dotprod | mandist | negdist | normprod
Функции для применения матриц весов. Это свойство определяет, какая функция
inputWeights{i,j}.weightFcn применяется для вычисления взвешенных входов для слоя.
Пользователь может расширить список таких функций.
size
размер матрицы весов (только для чтения)
Размер матрицы весов. Свойство inputWeights{i, j}.size определяет размер матрицы
весов, связывающей слой i со входом j. Это вектор-строка, в которой указано число строк
240
Нейронные сети. MATLAB 6
и столбцов матрицы весов IW; первый параметр совпадает с размером слоя layers{i}.size,
второй соответствует величине
length(net.inputWeights{i, j}.delays) * net.inputs{j}.size.
userdata
массив записей
Поле для записи информации пользователя. Это свойство обеспечивает место для записи
информации, относящейся к матрице весов слоя i сети. Предусмотрено только одно поле
inputWeights{i,j}.userdata.note для записи текста. По умолчанию оно содержит строку
'Put your custom input information here.' – "Информацию разместите здесь".
Описание весов слоя
Перечисленные ниже свойства объекта net включают перечень функций, которые
используются для описания весов слоя нейронной сети.
Тип
net
 .layerWeights{i,j}
Размер,
состав
Значение
по умолчанию
Cell array
{11}
{01}
.delays
Double array
1var
[]
.initFcn
Char
‘‘
.learn
Boolean
initzero | midpoint |
randnc | randnr | rands
0|1
.learnFcn
Char
learngd | learngdm |
learnh | learnhd |
learnis | learnk |
learnlv1 | learnlv2 |
learnos | learnp |
learnpn | learnsom |
learnwh
‘‘
.learnParam
[]
.weightFcn
Char
.size
Integer >= 0
(только
для чтения)
Struct
.userdata
.note
layerWeights
0
Char
dist | dotprod | mandist | negdist |
normprod
11
‘‘
11
11
1var
0
Имя поля
Описатель весов
от слоя j к слою i
Индикатор линий
задержки
Функции
инициализации
Индикатор
настройки
Функции
настройки
Параметры функции настройки
Функции
взвешивания
Количество
элементов
Информация
пользователя
'Put your custom input Текст
information here.'
массив ячеек
Описатель весов слоя. Массив размера Nl Nl, где Nl – число слоев numLayers объекта net,
состоящий из ячеек layerWeights{i, j}. Каждая ячейка является массивом записей и служит
для описания свойств весов, которые формируют матрицу весов. Последняя определяет
веса связей слоя i со слоем j сети и согласуется с матрицей связности layerConnect(i, j).
10. Вычислительная модель нейронной сети
241
индикатор линий задержки
delays
Описание линий задержки. Свойство layerWeights{i, j}.delays определяет наличие линий
задержки между слоем j и слоем i. Это вектор-строка, элемент которого либо равен 0, либо значению задержки (положительное целое число), причем эти значения могут только
возрастать. Длина этого вектора определяет количество задержанных векторов, поступающих на слой i.
initFcn
initzero | midpoint | randnc | randnr | rands
Функция инициализации матрицы весов. Это свойство определяет, какая функция инициализации layerWeights{i, j}.initFcn применяется при вызове метода init для вычисления
матрицы весов LW, связывающей слой i со слоем j при условии, что свойство net.initFcn
имеет значение initlay, а функция инициализации слоя layers{i}.initFcn имеет значение
initwb. Пользователь может расширить список применяемых функций инициализации.
индикатор настройки
learn
Индикатор настройки матрицы весов. Свойство layerWeights{i, j}.learn указывает, будет
ли матрица весов для слоя i настраиваться в процессе адаптации или обучения при использовании методов adapt или train соответственно. Значение этого свойства 0 или 1, по
умолчанию 0.
learnFcn
learngd | learngdm | learnh | learnhd | learnis | learnk | learnlv1 | learnlv2| learnos |
learnp | learnpn | learnsom | learnwh
Функции настройки матриц весов. Это свойство определяет, какая функция
inputWeights{i,j}.learnFcn применяется при настройке матрицы весов, связывающей слой i
со слоем j, при адаптации или обучении с использованием функций adaptwb и trainwb или
trainwb1 соответственно. Пользователь может расширить список применяемых функций
настройки.
learnParam
параметры функции настройки
Параметры функции настройки. Свойство biases{i}.learnParam определяет набор параметров для используемой функции настройки layerWeights{i, j}.learnParam. Узнать набор
таких параметров можно, применяя оператор help в следующей функциональной форме:
help(net.layerWeights{i,j}.learnFcn).
weightFcn
dist | dotprod | mandist | negdist | normprod
Функции для применения матриц весов. Это свойство определяет, какая функция
layerWeights{i, j}.weightFcn применяется при работе с матрицей весов, связывающей слой
i со слоем j, в частности при моделировании нейронной сети с использованием метода
sim. Пользователь может расширить список таких функций.
size
размер матрицы весов (только для чтения)
Размер матрицы весов. Свойство inputWeights{i, j}.size определяет размер матрицы весов, связывающей слой i со слоем j. Это вектор-строка, в которой указано число строк и
столбцов матрицы весов LW; первый параметр совпадает с размером слоя layers{i}.size,
второй соответствует величине
length(net.layerWeights{i, j}.delays) * net.layers{j}.size.
242
Нейронные сети. MATLAB 6
массив записей
userdata
Поле для записи информации пользователя. Это свойство обеспечивает место для записи
информации, относящейся к матрице весов слоя i сети. Предусмотрено только одно поле
layerWeights{i,j}.userdata.note для записи текста. По умолчанию оно содержит строку
'Put your custom input information here.' – "Информацию разместите здесь".
Матрицы весов и векторы смещений
Перечисленные ниже свойства объекта net включают перечень функций, которые
используются для описания матриц весов и векторов смещений.
Тип
Размер
 .IW
Cell array
NumLayers  NumInputs
{00}
Массив ячеек для матриц весов входа
 .LW
Cell array
NumLayers  NumLayers
{00}
Массив ячеек для матриц весов слоя
 .b
Cell array
NumLayers  1
{01}
Массив ячеек для векторов смещений
net
Значение по
умолчанию
Имя поля
массив ячеек
Матрицы весов входа. Массив ячеек IW размера NlNi, где Nl – число слоев numLayers и
Ni – число входов numInputs сети net, каждый элемент которого является матрицей весов,
связывающей слой i со входом j сети; структура этого массива согласована с матрицей
связности inputConnect(i, j). Каждая матрица весов должна иметь число строк, равное параметру layers{i}.size, а число столбцов должно удовлетворять соотношению
IW
net.inputs{j}.size * length(net.inputWeights{i,j}.delays)
и соответствовать параметру inputWeights{i, j}.size.
LW
массив ячеек
Матрицы весов слоя. Массив ячеек LW размера Nl Nl, где Nl – число слоев numLayers
сети net, каждый элемент которого является матрицей весов, связывающей слой i со слоем
j сети; структура этого массива согласована с матрицей связности layerConnect(i, j).
Каждая матрица весов должна иметь число строк, равное параметру layers{i}.size, а число
столбцов должно удовлетворять соотношению
net.layers{j}.size * length(net.layerWeights{i,j}.delays)
и соответствовать параметру layerWeights{i, j}.size.
b
массив ячеек
Векторы смещений. Вектор ячеек b размера Nl1, где Nl – число слоев numLayers объекта
net, каждый элемент которого является вектором смещений для слоя i сети; структура
этого вектора согласована с вектором связности biasConnect(i). Длина вектора смещений
для слоя i должна соответствовать параметру biases{i}.size.
10. Вычислительная модель нейронной сети
243
Информационные поля
В структуре объекта net имеются поля, предназначенные для записи информации.
net
Тип
Размер
Значение
по умолчанию
.hint
Struct
1var
11
.userdata
Struct
11
11
Char
1var
'Put your custom input
information here.'
.note
hint
Имя поля
Информация о текущих значениях
полей объекта network
Информация пользователя
Текст
массив записей
Значения полей объекта network. Это свойство обеспечивает информацию о текущих
значениях полей массива записей net. Эта информация появляется в поле hint только после инициализации нейронной сети.
userdata
массив записей
Поле для записи информации пользователя. Это свойство обеспечивает место для записи
информации, относящейся к нейронной сети. Предусмотрено только одно поле
userdata.note для записи текста. По умолчанию оно содержит строку 'Put your custom input
information here.' – "Информацию разместите здесь".
В заключение следует отметить, что для получения полной информации о структуре
полей инициированного объекта network следует применять М-функцию
fieldnames(<имя_сети>), которая будет отражать текущее состояние нейронной сети.
244
Нейронные сети. MATLAB 6
11. ФОРМИРОВАНИЕ МОДЕЛЕЙ НЕЙРОННЫХ
СЕТЕЙ
11.1. Модели сетей
NETWORK
Создание шаблона нейронной сети
Блок SIMULINK:
Синтаксис:
net = network
net = network(numInputs, numLayers, biasConnect, inputConnect,
layerConnect, outputConnect, targetConnect)
Описание:
Функция network – это конструктор класса объектов network object, используемых
в ППП NNT.
Функция net = network создает шаблон нейронной сети net, значения полей которого
обнулены.
Функция net = network(numInputs, numLayers, biasConnect, inputConnect, layerConnect,
outputConnect, targetConnect) применяется как конструктор класса для написания моделей
нейронных сетей.
Выходной аргумент net – имя нейронной сети.
Пример:
Создадим шаблон нейронной сети с двумя входами (numInputs = 2), тремя слоями
(numLayers = 3) и следующими матрицами связности:
BiasConnect = [1; 0; 0] размера numLayers1;
inputConnect = [1 1; 0 0; 0 0] размера numLayersnumInputs;
layerConnect = [0 0 0; 1 0 0; 0 1 0] размера numLayersnumLayers;
outputConnect = [0 0 1] размера 1 numLayers;
targetConnect = [0 0 1] размера 1 numLayers.
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], [0 0 1]);
gensim(net) % Рис.11.1
Получим структуру, представленную на рис. 11.1.
245
Рис. 11.1
Если раскрыть блок Neural Network, то можно выявить структуру сети, обусловленную матрицами связности inputConnect и layerConnect (рис. 11.2).
Рис. 11.2
Из анализа рис. 11.2 следует, что оба входа p{1} и p{2} действуют только на слой 1,
а слои 1, 2 и 3 соединены последовательно. Выходом слоя 1 является описатель a{1}; выходом слоя 2 – описатель a{2}; выходом слоя 3 – описатель a{3}; выход сети – описатель
y{1} – совпадает с выходом слоя 3.
Раскроем слои 1, 2 и 3 (рис. 11.3, а–в).
а
б
в
Рис. 11.3
На рис. 11.3, а показана схема слоя 1 со следующими обозначениями:
p{1} – описатель входа 1 на слое 1;
p{2} – описатель входа 2 на слое 1;
Delays 1 – линия задержки для входа 1;
Delays 2 – линия задержки для входа 2;
246
Нейронные сети. MATLAB 6
IW{1,1} – описатель матрицы весов для входа 1 на слое 1;
IW{1,2} – описатель матрицы весов для входа 2 на слое 1;
b{1} – описатель вектора смещений на слое 1;
netsum – функция накопления для слоя 1;
purelin – функция активации для слоя 1;
a{1} – описатель выхода на слое 1.
На рис. 11.3, б показана схема слоя 2 со следующими обозначениями:
a{1} – описатель входа на слое 2;
Delays 1 – линия задержки;
LW{2,1} – описатель матрицы весов связей слоев 1 и 2;
netsum – функция накопления для слоя 2;
purelin – функция активации для слоя 2;
a{2} – описатель выхода на слое 2.
На рис. 11.3, в показана схема слоя 3 со следующими обозначениями:
a{2} – описатель входа на слое 3;
Delays 1 – линия задержки;
LW{3,2} – описатель матрицы весов связей слоев 2 и 3;
netsum – функция накопления для слоя 3;
purelin – функция активации для слоя 3;
a{3} – описатель выхода на слое 3.
Введем линии задержки для входов 1 и 2, а также для слоя 3 (рис. 11.4):
net.inputWeights{1,1}.delays = [0 1];
net.inputWeights{1,2}.delays = [1 2];
net.layerWeights{3,2}.delays = [0 1 2];
Слой 1
Слой 2
Слой 3
Рис. 11.4
На рис. 11.4 показаны развернутые блоки задержек для всех слоев сети. На схемах
выходы этих блоков обозначаются следующим образом:
pd{1,1} – входная последовательность [p1(t), p1(t–1)] для входа 1 на слое 1;
pd{1,2} – входная последовательность [p2(t–1), p2(t–2)] для входа 2 на слое 1;
11. Формирование моделей нейронных сетей
247
pd{2,1} – последовательность сигналов, поступающая со слоя 1 на слой 2;
pd{3,2} – последовательность сигналов, поступающая со слоя 2 на слой 3.
Рассмотрим описатель матрицы весов на примере весов входа для слоя 1 (рис. 11.5).
Рис. 11.5
Эта схема использует следующие обозначения:
pd{1,1} – вектор входной последовательности;
IW{1,1}(1,:) – строка матрицы весов;
dotprod1 – скалярное произведение z = w*p;
iz{1,1} – массив взвешенных входов.
Установим параметры нейронной сети и векторов входа:
net.inputs{1}.range
net.inputs{2}.range
net.b{1}=–1/4;
net.IW{1,1} = [ 0.5
net.LW{2,1} = [ 0.5
net.LW{3,2} = [ 0.5
P = [0.5 1; 1 0.5];
= [0 1];
= [0 1];
0.5 ]; net.IW{1,2} = [ 0.5 0.25];
];
0.25 1];
После этого модель нейронной сети может быть промоделирована либо используя
переопределяемый метод network\sim, либо с помощью системы SIMULINK.
Построенная модель будет использована при описании методов sim и gensim.
Справка:
help network/network
Сопутствующие функции: GENSIM.
11.1.1. Однослойные сети
Персептрон
NEWP
Создание персептрона
Синтаксис:
net = newp(PR,s,tf,lf)
Описание:
Персептроны предназначены для решения задач классификации входных векторов,
относящихся к классу линейно отделимых.
Функция net = newp(PR, s, tf, lf) формирует нейронную сеть персептрона.
Входные аргументы:
PR – массив размера R2 минимальных и максимальных значений для R векторов входа;
s – число нейронов;
tf – функция активации из списка {hardlim, hardlims}, по умолчанию hardlim;
lf – обучающая функция из списка {learnp, learnpn}, по умолчанию learnp.
248
Нейронные сети. MATLAB 6
Выходные аргументы:
net – объект класса network object.
Свойства:
Персептрон – это однослойная нейронная сеть с функциями взвешивания dotprod,
накопления потенциала netsum и выбранной функцией активации. Слой характеризуется
матрицей весов и вектором смещений, которые инициализируются М-функцией initzero.
Адаптация и обучение выполняются М-функциями adaptwb и trainwb, которые модифицируют значения весов и смещений до тех пор, пока не будет достигнуто требуемое
значение критерия качества обучения в виде средней абсолютной ошибки, вычисляемой
М-функцией mae.
Пример:
Создать персептрон с одним нейроном, входной вектор которого имеет 2 элемента,
значения которых не выходят за пределы диапазона (рис. 11.6):
net = newp([0 1; 0 1],1);
gensim(net) % Рис.11.6
Рис. 11.6
Определим следующую последовательность двухэлементных векторов входа P,
составленных из 0 и 1:
P = {[0; 0] [0; 1] [1; 0] [1; 1]};
Обучим персептрон выполнять операцию ЛОГИЧЕСКОЕ И. С этой целью для полного
набора входных векторов сформируем последовательность целей:
P1 = cat(2, P{:});
T1 = num2cell(P1(1, :) & P1(2, :))
T1 = [0]
[0]
[0]
[1]
Применим процедуру адаптации, установив число проходов равным 10:
net.adaptParam.passes = 10;
net = adapt(net,P,T1);
Вектор весов и смещение можно определить следующим образом:
net.IW{1}, net.b{1}
ans =
2
1
ans =
–3
Таким образом, разделяющая линия имеет вид:
L: 2p1 + p2 – 3 = 0.
11. Формирование моделей нейронных сетей
249
Промоделируем спроектированную нейронную сеть, подав входную обучающую
последовательность:
Y = sim(net,P)
Y = [0]
[0]
[0]
[1]
Настройка параметров сети выполнена правильно.
Обучим персептрон выполнять операцию НЕИСКЛЮЧАЮЩЕЕ ИЛИ. С этой целью
для полного набора входных векторов Р сформируем последовательность целей:
P1 = cat(2, P{:});
T2 = num2cell(P1(1, :) | P1(2, :))
T2 =
[0]
[1]
[1]
[1]
Применим процедуру обучения, установив число циклов равным 20:
net.trainParam.epochs = 20;
net = train(net,P,T2);
Вектор весов и смещение можно определить следующим образом:
net.IW{1}, net.b{1}
net.IW{1}, net.b{1}
ans = 2
2
ans = –2
Таким образом, разделяющая линия имеет вид:
L: 2p1 + 2p2 – 2 = 0.
Промоделируем спроектированную нейронную сеть, подав входную обучающую
последовательность:
Y = sim(net,P)
Y =
[0]
[1]
[1]
[1]
Обучение и настройка сети выполнены правильно.
Замечание:
Персептроны решают задачу классификации линейно отделимых входных векторов за
конечное время. В случае больших по длине входных векторов функция обучения learnpn
может быть по времени выполнения предпочтительнее функции обучения learnp.
Сопутствующие функции: SIM, INIT, ADAPT, TRAIN, HARDLIM, HARDLIMS, LEARNP, LEARNPN.
Линейные сети
NEWLIN
Линейный слой LIN
Синтаксис:
net = newlin(PR,s,id,lr)
net = newlin(PR,s,0,P)
Описание:
Линейные слои находят применение при решении задач аппроксимации, фильтрации
и предсказания сигналов, построении моделей динамических систем в задачах управления.
Функция net = newlin(PR, s, id, lr) формирует нейронную сеть в виде линейного слоя.
250
Нейронные сети. MATLAB 6
Входные аргументы:
PR – массив размера R2 минимальных и максимальных значений для R векторов входа;
s – число нейронов;
id – описание линии задержки на входе сети, по умолчанию [0];
lr – параметр скорости настройки, по умолчанию 0.01.
Выходные аргументы:
net – объект класса network object с архитектурой линейного слоя.
Функция net = newlin(PR, s, 0, P), где P – матрица векторов входа, формирует линейный слой с параметром скорости настройки, гарантирующим максимальную степень
устойчивости слоя для данного входа P.
Пример:
Сформировать линейный слой, который для заданного входа воспроизводит заданный
отклик системы.
Архитектура линейного слоя: линия задержки типа [0 1 2], 1 нейрон, вектор входа
с элементами из диапазона [–1 1], параметр скорости настройки 0.01.
net = newlin([–1 1], 1, [0 1 2], 0.01);
gensim(net) % Рис.11.7
Элементы линейного слоя показаны на рис. 11.7. Характерная особенность этого слоя –
наличие линии задержки, что свидетельствует о том, что такая нейронная сеть является
динамической.
Рис. 11.7
Сформируем следующие обучающие последовательности векторов входа и цели:
P1
T1
P2
T2
=
=
=
=
{0
{0
{1
{2
–1 1
–1 0
0 –1
1 –1
1 0 –1
2 1 –1
–1 1 1
–2 0 2
1
0
1
2
0 0 1};
1 0 1};
0 –1};
1 0};
Выполним обучение, используя только обучающие последовательности P1 и T1:
net = train(net,P1,T1);
11. Формирование моделей нейронных сетей
251
Характеристика процедуры обучения показана на рис. 11.8. Из ее анализа следует, что
требуемая точность обучения достигается на 73-м цикле. Соответствующие значения весов и смещения следующие:
net.IW{1}, net.b{1}
ans =
0.8751
0.8875
ans =
0.0619
–0.1336
Рис. 11.8
Выполним моделирование сети для всех значений входа, объединяющих векторы Р1 и Р2:
Y1 = sim(net,[P1 P2]);
Результаты моделирования показаны на рис. 11.10 в виде зависимости Y1; последовательность целей, объединяющая векторы T1 и T2, соответствует зависимости Т3.
Теперь выполним обучение сети на всем объеме обучающих данных, соответствующем объединению векторов входа {[P1 P2]} и векторов целей {[T1 T2]}:
net = init(net);
P3 = [P1 P2];
T3 = [T1 T2];
net.trainParam.epochs = 200;
net.trainParam.goal = 0.01;
net = train(net,P3,T3);
Рис. 11.9
В этом случае процедура обучения не достигает предельной точности в течение 200
циклов обучения и, судя по виду кривой, имеет статическую ошибку.
252
Нейронные сети. MATLAB 6
Значения весов и смещений несколько изменяются:
net.IW{1}, net.b{1}
ans =
0.9242
0.9869
ans =
0.0602
0.0339
Соответствующая дискретная модель динамического линейного слоя имеет вид:
yk = 0.9242rk + 0.9869rk –1 + 0.0339rk –2 + 0.0602.
Результаты моделирования показаны на рис. 11.10 в виде зависимости Y3.
Y3 = sim(net,[P1 P2])
Рис. 11.10
Из сравнения кривых Y3 и Y1 следует, что точность воспроизведения целевой последовательности на интервале тактов времени с 11-й по 19-й стала выше и несколько
уменьшилась на 5-м и 9-м тактах. В целом сформированный динамический линейный
слой достаточно точно отслеживает кривую цели на последовательностях входов, не
участвовавших в обучении.
Алгоритм:
Линейный слой использует функцию взвешивания dotprod, функцию накопления
потенциала netsum и функцию активации purelin. Слой характеризуется матрицей весов
и вектором смещений, которые инициализируются М-функцией initzero.
Адаптация и обучение выполняются М-функциями adaptwb и trainwb, которые модифицируют веса и смещения, используя М-функцию learnwh, до тех пор пока не будет достигнуто требуемое значение критерия качества обучения в виде средней квадратичной
ошибки, вычисляемой М-функцией mse.
Сопутствующие функции: NEWLIND, SIM, INIT, ADAPT, TRAIN.
NEWLIND
Линейный слой LIND
Синтаксис:
net = newlind(P, T)
11. Формирование моделей нейронных сетей
253
Описание:
Линейный слой LIND использует для расчета весов и смещений процедуру решения систем
линейных алгебраических уравнений на основе метода наименьших квадратов, и поэтому в
наибольшей степени он приспособлен для решения задач аппроксимации, когда требуется подобрать коэффициенты аппроксимирующей функции. В задачах управления такой линейный
слой можно применять для идентификации параметров динамических систем.
Функция net = newlind(P, T) формирует нейронную сеть, используя только обучающие
последовательности входа P размера RQ и цели T размера SQ. Выходом является объект класса network object с архитектурой линейного слоя.
Пример:
Требуется сформировать линейный слой, который обеспечивает для заданного входа P
выход, близкий к цели T, если заданы следующие обучающие последовательности:
P = 0:3;
T = [0.0 2.0 4.1 5.9];
Анализ данных подсказывает, что требуется найти аппроксимирующую кривую, которая близка к зависимости t = 2p. Применение линейного слоя LIND в данном случае
вполне оправдано.
net = newlind(P,T);
gensim(net) % Рис.11.11
Рис. 11.11
Значения весов и смещений равны:
net.IW{1}, net.b{1}
ans =
1.9800
ans =
0.3000
Соответствующая аппроксимирующая кривая описывается соотношением
yk = 1.9800rk + 0.3000.
Выполним моделирование сформированного линейного слоя:
Y = sim(net,P)
Y = 0.0300
2.0100
3.9900
5.9700
Читатель может самостоятельно убедиться, построив соответствующие графики
зависимостей, что аппроксимирующая кривая в полной мере соответствует правилу
наименьших квадратов.
254
Нейронные сети. MATLAB 6
Алгоритм:
Функция newlind вычисляет значения веса W и смещения B для линейного уровня
с входом P и целью T, решая линейное уравнение в смысле метода наименьших квадратов:
[W b] * [P; ones] = T.
Сопутствующие функции: SIM, NEWLIN.
11.1.2. Многослойные сети
NEWFF
Сеть прямой передачи FF
Синтаксис:
net = newff(PR,[S1 S2...SNl],{TF1 TF2...TFNl},btf,blf,pf)
Описание:
Функция newff предназначена для создания многослойных нейронных сетей прямой
передачи сигнала с заданными функциями обучения и настройки, которые используют
метод обратного распространения ошибки.
Функция net = newff(PR, [S1 S2 ... SNl], {TF1 TF2 ... TFNl}, btf, blf, pf) формирует
многослойную нейронную сеть.
Входные аргументы:
PR – массив размера R2 минимальных и максимальных значений для R векторов входа;
Si – количество нейронов в слое i;
TFi – функция активации слоя i, по умолчанию tansig;
btf – обучающая функция, реализующая метод обратного распространения, по умолчанию trainlm;
blf – функция настройки, реализующая метод обратного распространения, по умолчанию learngdm;
pf – критерий качества обучения, по умолчанию mse.
Выходные аргументы:
net – объект класса network object многослойной нейронной сети.
Свойства сети:
Функциями активации могут быть любые дифференцируемые функции, например
tansig, logsig или purelin.
Обучающими функциями могут быть любые функции, реализующие метод обратного
распространения: trainlm, trainbfg, trainrp, traingd и др.
Функция trainlm является обучающей функцией по умолчанию, поскольку обеспечивает максимальное быстродействие, но требует значительных ресурсов памяти. Если ресурсы памяти недостаточны, воспользуйтесь следующими рекомендациями:
 установите значение свойства net.trainParam.mem_reduc равным 2 или более, что снизит требования к памяти, но замедлит обучение;
 воспользуйтесь обучающей функцией trainbfg, которая работает медленнее, но требует
меньшей памяти, чем М-функция trainlm;
11. Формирование моделей нейронных сетей
255

перейдите к обучающей функции trainrp, которая работает медленнее, но требует
меньшей памяти, чем М-функция trainbfg.
Функциями настройки могут быть функции, реализующие метод обратного распространения: learngd, learngdm.
Критерием качества обучения может быть любая дифференцируемая функция: mse, msereg.
Пример:
Создать нейронную сеть, чтобы обеспечить следующее отображение последовательности входа P в последовательность целей T:
P = [0 1 2 3 4 5 6 7 8 9 10];
T = [0 1 2 3 4 3 2 1 2 3 4];
Архитектура нейронной сети: двухслойная сеть с прямой передачей сигнала; первый
слой – 5 нейронов с функцией активации tansig; второй слой – 1 нейрон с функцией активации purelin; диапазон изменения входа [0 10].
net = newff([0 10],[5 1],{'tansig' 'purelin'});
gensim(net) % Рис.11.12
Рис. 11.12
Выполним моделирование сети и построим графики сигналов выхода и цели
(рис. 11.13):
Y = sim(net,P);
plot(P, T, P, Y, 'o') % Рис.11.13
256
Нейронные сети. MATLAB 6
4
3
2
1
0
-1
0
2
4
6
8
10
Рис. 11.13
Обучим сеть в течение 50 циклов:
net.trainParam.epochs = 50;
net = train(net,P,T);
Характеристика точности обучения показана на рис. 11.14; установившаяся среднеквадратичная ошибка составляет приблизительно 0.02.
Рис. 11.14
Выполним моделирование сформированной двухслойной сети, используя обучающую
последовательность входа:
Y = sim(net,P);
plot(P,T,P,Y,'o') % Рис.11.15
Результаты моделирования показаны на рис. 11.15 и свидетельствуют о хорошем
отображении входной последовательности в выходную последовательность.
6
4
2
0
-2
0
2
4
6
8
11. Формирование моделей нейронных сетей
10
Рис. 11.15
257
Алгоритм:
Многослойная сеть прямой передачи сигнала включает Nl слоев с функциями взвешивания dotprod, накопления netsum и заданными пользователем функциями активации.
Первый слой характеризуется матрицей весов входа, другие слои – матрицами весов выхода
предшествующего слоя; все слои имеют смещения. Выход последнего слоя является выходом
сети. Веса и смещения каждого слоя инициализируются с помощью М-функции initnw.
Режим адаптации реализуется М-функцией adaptwb. Для режима обучения выбирается
обучающая функция, реализующая метод обратного распространения ошибки.
Оценка качества обучения основана на функциях оценки качества, выбираемых
из списка {mae | mse | msereg | sse}.
Сопутствующие функции: NEWCF, NEWELM, SIM, INIT, ADAPT, TRAIN.
NEWFFTD
Динамическая нейронная сеть FFTD
Сеть прямой передачи с запаздыванием
Синтаксис:
net = newfftd(PR, ID, [S1 S2 ... SNl], {TF1 TF2 ... TFNl}, btf, blf, pf)
Описание:
Функция newfftd предназначена для создания многослойных нейронных сетей прямой
передачи сигнала с линиями задержки и заданными функциями обучения и настройки,
использующими метод обратного распространения ошибки.
Функция net = newfftd(PR, ID, [S1 S2 ... SNl], {TF1 TF2 ... TFNl}, btf, blf, pf) формирует
динамическую многослойную нейронную сеть.
Входные аргументы:
PR – массив размера R2 минимальных и максимальных значений для R векторов входа;
ID – вектор параметров линии задержки на входе сети;
Si – количество нейронов в слое i;
TFi – функция активации слоя i, по умолчанию tansig;
btf – обучающая функция, реализующая метод обратного распространения, по умолчанию trainlm;
blf – функция настройки, реализующая метод обратного распространения, по умолчанию learngdm;
pf – критерий качества обучения, по умолчанию mse.
Выходные аргументы:
net – объект класса network object динамической многослойной нейронной сети.
Свойства сети:
Функциями активации могут быть любые дифференцируемые функции, например
tansig, logsig или purelin.
Обучающими функциями могут быть любые функции, реализующие метод обратного
распространения: trainlm, trainbfg, trainrp, traingd и др.
258
Нейронные сети. MATLAB 6
Функция trainlm является обучающей функцией по умолчанию, поскольку обеспечивает максимальное быстродействие, но требует значительных ресурсов памяти. Если ресурсы памяти недостаточны, воспользуйтесь следующими рекомендациями:
 установите значение свойства net.trainParam.mem_reduc равным 2 или более, что снизит требования к памяти, но замедлит обучение;
 воспользуйтесь обучающей функцией trainbfg, которая работает медленнее, но требует
меньшей памяти, чем М-функция trainlm;
 перейдите к обучающей функции trainrp, которая работает медленнее, но требует
меньшей памяти, чем М-функция trainbfg.
Функциями настройки могут быть функции, реализующие метод обратного распространения: learngd, learngdm.
Критерием качества обучения может быть любая дифференцируемая функция: mse, msereg.
Пример:
Создать нейронную сеть, чтобы обеспечить следующее отображение последовательности входа P в последовательность целей T:
P = {1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1};
T = {1 –1 0 1 0 –1 1 –1 0 0 0 1 0 –1 0 1};
Архитектура нейронной сети: двухслойная сеть с прямой передачей сигнала и линией
задержки [0 1]; первый слой – 5 нейронов с функцией активации tansig; второй слой –
1 нейрон с функцией активации purelin; диапазон изменения входа [0 10].
net = newfftd([0 1],[0 1],[5 1],{'tansig' 'purelin'}); % Рис.11.16
Рис. 11.16
11. Формирование моделей нейронных сетей
259
Обучим сеть в течение 50 циклов и промоделируем, используя в качестве теста
обучающую последовательность входа:
net.trainParam.epochs = 50;
net = train(net,P,T);
Y = sim(net,P)
Y = [1] [–1] [0] [1] [0]
[0] [–1] [0] [1]
[–1]
[1]
[–1]
[0]
[0]
[0]
[1]
Выход сети точно совпадает с целевой последовательностью.
Алгоритм:
Многослойная динамическая сеть прямой передачи включает Nl слоев с функциями
взвешивания dotprod, функциями накопления netsum и заданными пользователем функциями активации.
Первый слой характеризуется матрицей весов входа, другие слои – матрицами весов
выхода предшествующего слоя; все слои имеют смещения. Выход последнего слоя является выходом сети. Веса и смещения каждого слоя инициализируются с помощью
М-функции initnw.
Режим адаптации реализуется М-функцией adaptwb. Для режима обучения выбирается обучающая функция, использующая метод обратного распространения ошибки.
Оценка качества обучения основана на функциях оценки качества, выбираемых
из списка {mae | mse | msereg | sse}.
Сопутствующие функции: NEWCF, NEWELM, SIM, INIT, ADAPT, TRAIN.
NEWCF
Каскадная сеть прямой передачи CF
Синтаксис:
net = newcf(PR,[S1 S2...SNl],{TF1 TF2...TFNl},btf,blf,pf)
Описание:
Функция newcf предназначена для создания каскадных нейронных сетей прямой передачи сигнала с заданными функциями обучения и настройки, использующими метод
обратного распространения ошибки.
Функция net = newcf(PR, [S1 S2 ... SNl], {TF1 TF2 ... TFNl}, btf, blf, pf) формирует
каскадную нейронную сеть.
Входные аргументы:
PR – массив размера R2 минимальных и максимальных значений для R векторов входа;
Si – количество нейронов в слое i;
TFi – функция активации слоя i, по умолчанию tansig;
btf – обучающая функция, реализующая метод обратного распространения, по умолчанию trainlm;
blf – функция настройки, реализующая метод обратного распространения, по умолчанию learngdm;
pf – критерий качества обучения, по умолчанию mse.
260
Нейронные сети. MATLAB 6
Выходные аргументы:
net – объект класса network object каскадной нейронной сети с прямой передачей
и обучением методом обратного распространения.
Свойства сети:
Функциями активации могут быть любые дифференцируемые функции, например
tansig, logsig или purelin.
Обучающими функциями могут быть любые функции, реализующие метод обратного
распространения: trainlm, trainbfg, trainrp, traingd и др.
Функция trainlm является обучающей функцией по умолчанию, поскольку обеспечивает максимальное быстродействие, но требует значительных ресурсов памяти. Если ресурсы памяти недостаточны, воспользуйтесь следующими рекомендациями:



установите значение свойства net.trainParam.mem_reduc равным 2 или более, что снизит требования к памяти, но замедлит обучение;
воспользуйтесь обучающей функцией trainbfg, которая работает медленнее, но требует меньшей памяти, чем М-функция trainlm;
перейдите к обучающей функции trainrp, которая работает медленнее, но требует
меньшей памяти, чем М-функция trainbfg.
Функциями настройки могут быть функции, реализующие метод обратного распространения: learngd, learngdm
Критерием качества обучения может быть любая дифференцируемая функция: mse,
msereg.
Пример:
Создать каскадную нейронную сеть, чтобы обеспечить следующее отображение
последовательности входа P в последовательность целей T:
P = [0 1 2 3 4 5 6 7 8 9 10];
T = [0 1 2 3 4 3 2 1 2 3 4];
Архитектура нейронной сети: каскадная двухслойная сеть с прямой передачей сигнала; первый слой – 5 нейронов с функцией активации tansig; второй слой – 1 нейрон
с функцией активации purelin; диапазон изменения входа [0 10].
net = newcf([0 10],[5 1],{'tansig' 'purelin'});
gensim(net) % Рис.11.17
Результат представлен на рис. 11.17.
11. Формирование моделей нейронных сетей
261
Рис. 11.17
Обучим сеть в течение 50 циклов:
net.trainParam.epochs = 50;
net = train(net,P,T);
Характеристика точности обучения показана на рис. 11.18; установившаяся среднеквадратичная ошибка составляет приблизительно 0.002, что на порядок выше, чем для
сети FF ( см. рис. 11.14).
Рис. 11.18
Выполним моделирование каскадной двухслойной сети, используя обучающую
последовательность входа:
Y = sim(net,P);
plot(P,T,P,Y,'o')
262
Нейронные сети. MATLAB 6
Результат моделирования представлен на рис. 11.19.
Рис. 11.19
Алгоритм:
Каскадная сеть прямой передачи использует функции взвешивания dotprod, накопления netsum и заданные пользователем функции активации.
Первый каскад характеризуется матрицей весов входа, другие каскады – матрицами
весов выхода предшествующего каскада; все каскады имеют смещения. Выход последнего каскада является выходом сети. Веса и смещения инициализируются с помощью
М-функции initnw.
Режим адаптации реализуется М-функцией adaptwb. Для режима обучения выбирается обучающая функция, реализующая метод обратного распространения ошибки.
Оценка качества обучения основана на функциях оценки качества, выбираемых
из списка {mae | mse | msereg | sse}.
Сопутствующие функции: NEWFF, NEWELM, SIM, INIT, ADAPT, TRAIN.
Радиальные базисные сети
NEWRB
Радиальная базисная сеть RB
Синтаксис:
net = newrb(P,T,goal,spread)
Описание:
Радиальные базисные сети предназначены для аппроксимации функций. Функция
newrb добавляет нейроны к скрытому слою радиальной базисной сети, пока не будет достигнута допустимая средняя квадратичная ошибка обучения.
Функция net = newrb(P, T, goal, spread) формирует радиальную базисную сеть и имеет
следующие входные и выходные аргументы.
Входные аргументы:
P – массив размера RQ из Q входных векторов, R – число элементов вектора входа;
T – массив размера SQ из Q векторов цели;
11. Формирование моделей нейронных сетей
263
goal – средняя квадратичная ошибка, по умолчанию 0.0;
spread – параметр влияния, по умолчанию 1.0.
Выходные аргументы:
net – объект класса network object радиальной базисной сети.
Свойства сети:
Параметр влияния spread существенно влияет на качество аппроксимации функции:
чем его значение больше, тем более гладкой будет аппроксимация. Слишком большое
значение параметра spread приведет к тому, что для получения гладкой аппроксимации
быстро изменяющейся функции потребуется большое количество нейронов; слишком
малое значение параметра spread потребует большого количества нейронов для аппроксимации гладкой функции.
Пример:
Создадим радиальную базисную сеть для следующей обучающей последовательности
при средней квадратичной ошибке 0.1 (рис. 11.20):
P = 0:3;
T = [0.0 2.0 4.1 5.9];
net = newrb(P,T,0.1);
net.layers{1}.size
ans =
3
gensim(net) % Рис.11.20
Рис. 11.20
Сформированная радиальная базисная сеть имеет 3 нейрона с функцией активации radbas.
Выполним моделирование сети для нового входа (рис. 11.21):
plot(P,T,'*r','MarkerSize',2,'LineWidth',2)
hold on
V = sim(net,P); % Векторы входа из обучающего множества
264
Нейронные сети. MATLAB 6
plot(P,V,'ob','MarkerSize',8, 'LineWidth',2)
P1 = 0.5:2.5;
Y = sim(net,P1)
plot(P1,Y,'+k','MarkerSize',10, 'LineWidth',2) % Рис.11.21
Рис. 11.21
Алгоритм:
Функция newrb создает радиальную базисную сеть с двумя слоями. Первый слой
включает нейроны с функцией активации radbas и использует функции взвешивания dist
и накопления netprod. Второй, линейный слой включает нейроны с функцией активации
purelin и использует функции взвешивания dotprod и накопления netsum.
Сеть формируется следующим образом. Изначально первый слой не имеет нейронов.
Сеть моделируется и определяется вектор входа с самой большой погрешностью, добавляется нейрон с функцией активации radbas и весами, равными вектору входа, затем вычисляются весовые коэффициенты линейного слоя, чтобы не превысить допустимой
средней квадратичной погрешности.
Сопутствующие функции: SIM, NEWRBE, NEWGRNN, NEWPNN.
NEWRBE
Радиальная базисная сеть с нулевой ошибкой RBE
Синтаксис:
net = newrbe(P,T,spread)
Описание:
Функция net = newrb(P, T, spread) формирует радиальную базисную сеть с нулевой
ошибкой и имеет следующие входные и выходные аргументы.
Входные аргументы:
P – массив размера RQ из Q входных векторов, R – число элементов вектора входа;
T – массив размера SQ из Q векторов цели;
spread – параметр влияния, по умолчанию 1.0.
11. Формирование моделей нейронных сетей
265
Выходные аргументы:
net – объект класса network object радиальной базисной сети с нулевой ошибкой.
Чем больше значение параметра spread, тем более гладкой будет аппроксимация.
Слишком большое значение spread может привести к вычислительным проблемам.
Пример:
Создадим радиальную базисную сеть с нулевой ошибкой для следующей обучающей
последовательности:
P = 0:3;
T = [0.0 2.0 4.1 5.9];
net = newrbe(P,T);
net.layers{1}.size
ans =
4
Сформированная радиальная базисная сеть с нулевой ошибкой имеет 4 нейрона в первом слое. Сравните с предыдущим случаем, когда число нейронов было равно трем.
Выполним моделирование сети для нового входа (рис. 11.22):
plot(P,T,'*r','MarkerSize',2,'LineWidth',2)
hold on
V = sim(net,P); % Векторы входа из обучающего множества
plot(P,V,'ob','MarkerSize',8, 'LineWidth',2)
P1 = 0.5:2.5;
Y = sim(net,P1)
plot(P1,Y,'+k','MarkerSize',10, 'LineWidth',2) % Рис.11.22
Рис. 11.22
Алгоритм:
Функция newrbe создает радиальную базисную сеть с двумя слоями. Первый слой
включает нейроны с функцией активации radbas и использует функции взвешивания dist
и накопления netprod. Второй, линейный слой включает нейроны с функцией активации
purelin и использует функции взвешивания dotprod и накопления netsum.
266
Нейронные сети. MATLAB 6
Функция newrbe устанавливает веса первого слоя равными P', а смещения – равными
0.8326/spread, в результате радиальная базисная функция пересекает значение 0.5 при значениях взвешенных входов spread. Веса второго слоя IW{2,1} и смещения b{2} определяются путем моделирования выходов первого слоя A{1} и последующего решения системы линейных уравнений:
[W{2,1} b{2}] * [A{1}; ones] = T
Сопутствующие функции: SIM, NEWRB, NEWGRNN, NEWPNN.
NEWGRNN
Обобщенная регрессионная сеть GRNN
Синтаксис:
net = newgrnn(P,T,spread)
Описание:
Обобщенные регрессионные сети являются разновидностью радиальных базисных сетей и используются для анализа временных рядов, решения задач обобщенной регрессии
и аппроксимации функций. Характерной особенностью этих сетей является высокая скорость их обучения.
Функция net = newgrnn(P, T, spread) формирует обобщенную регрессионную сеть
и имеет следующие входные и выходные аргументы.
Входные аргументы:
P – массив размера RQ из Q входных векторов, R – число элементов вектора входа;
T – массив размера SQ из Q векторов цели;
spread – параметр влияния, по умолчанию 1.0.
Выходные аргументы:
net – объект класса network object обобщенной регрессионной сети.
Чем больше число используемых радиальных базисных функций, тем более гладкой
будет аппроксимация функции. Чтобы выполнить точную аппроксимацию, следует использовать значение параметра spread меньшее, чем расстояние между векторами входа.
Чтобы получить гладкую аппроксимацию, следует увеличить значение параметра spread.
Свойства:
Функция newgrnn создает двухслойную нейронную сеть, архитектура которой совпадает с архитектурой радиальной базисной сети. Первый слой включает нейроны с функцией активации radbas и использует функции взвешивания dist и накопления netprod.
Второй, линейный слой включает нейроны с функцией активации purelin и использует
функции взвешивания normprod и накопления netsum. Смещения используются только
в первом слое.
Функция newgrnn устанавливает веса первого слоя равными P', а смещения – равными
0.8326/spread, что приводит к радиальным базисным функциям, которые пересекают величину 0.5 при значениях взвешенных входов spread. Веса второго слоя W2 устанавливаются равными T.
11. Формирование моделей нейронных сетей
267
Примеры:
Создадим обобщенную регрессионную сеть с входами P и целями T:
P = 0:3;
T = [0.0 2.0 4.1 5.9];
net = newgrnn(P,T);
gensim(net) % Рис.11.24
Рис. 11.23
На рис. 11.23 мы обращаем внимание на блок функции взвешивания normprod, который отличает обобщенную регрессионную сеть от радиальной базисной. Структура сети
может быть проанализирована по дереву в левой части рисунка.
Выполним моделирование сети для нового входа и построим график (рис. 11.24):
plot(P,T,'*r','MarkerSize',2,'LineWidth',2)
hold on
V = sim(net,P); % Векторы входа из обучающего множества
plot(P,V,'ob','MarkerSize',8, 'LineWidth',2)
P1 = 0.5:2.5;
Y = sim(net,P1);
plot(P1,Y,'+k','MarkerSize',10, 'LineWidth',2) % Рис.11.24
Y = sim(net, 0:0.5:3)
Y = 0.8104
1.3759
2.1424
3.0300
3.9030
4.6345
5.1615
268
Нейронные сети. MATLAB 6
Рис. 11.24
Из анализа результатов моделирования следует, что на границах интервала расхождения существенны.
Если уменьшить значение параметра влияния до 0.1, то мы получим аппроксимацию
высокой точности:
net = newgrnn(P,T,0.1);
Y = sim(net, 0:0.5:3)
Y =
0.0000
1.0000
2.0000
3.0500
4.1000
5.0000
5.9000
Сопутствующие функции: SIM, NEWRB, NEWRBE, NEWPNN.
NEWPNN
Вероятностная нейронная сеть PNN
Синтаксис:
net = newpnn(P,T,spread)
Описание:
Вероятностные нейронные сети (PNN) – разновидность радиальных базисных сетей,
применяемая для решения задач классификации.
Функция net = newgrnn(P, T, spread) формирует обобщенную регрессионную сеть
и имеет следующие входные и выходные аргументы.
Входные аргументы:
P – массив размера RQ из Q входных векторов, R – число элементов вектора входа;
T – массив размера SQ из Q векторов цели;
spread – параметр влияния, по умолчанию 1.0.
Выходные аргументы:
net – объект класса network object вероятностной нейронной сети.
Если параметр spread близок к нулю, то сеть будет действовать как классификатор
ближайших соседей. Когда параметр spread возрастает, то вероятностная сеть будет учитывать влияние близлежащих векторов.
11. Формирование моделей нейронных сетей
269
Пример:
Задача классификации определена множествами входа P и индексов класса Tc:
P = [1 2 3 4 5 6 7];
Tc = [1 2 3 2 2 3 1];
Индексы класса преобразуем в вектор целей и сформируем вероятностную нейронную сеть (рис. 11.25):
T = ind2vec(Tc)
net = newpnn(P,T);
gensim(net) % Рис.11.25
Рис. 11.25
Обращаем внимание читателя, что в качестве второго слоя сети PNN применяется
конкурирующий слой с функцией активации compet.
Выполним моделирование сети, используя обучающее множество входов:
Y = sim(net,P)
Yc = vec2ind(Y)
Yc =
1
2
3
2
2
3
1
Результат, как и следовало ожидать, совпадает с множеством целей.
Алгоритм:
Функция newpnn создает двухслойную нейронную сеть, архитектура которой совпадает с архитектурой радиальной базисной сети. Первый слой включает нейроны с функцией активации radbas и использует функции взвешивания dist и накопления netprod.
Второй, линейный слой включает нейроны с функцией активации compet и использует
функции взвешивания dotprod и накопления netsum. Смещения используются только
в первом слое.
Функция newpnn устанавливает веса первого слоя равными P', а смещения слоя – равными 0.8326/spread, в результате чего радиальные базисные функции достигают уровня
0.5 при значениях взвешенных входов spread. Веса второго слоя W2 устанавливаются
равными T.
Сопутствующие функции:
270
SIM, IND2VEC, VEC2IND, NEWRB, NEWRBE, NEWGRNN.
Нейронные сети. MATLAB 6
Самоорганизующиеся сети
NEWC
Слой Кохонена WC
Синтаксис:
net = newc(PR,s,klr,clr)
Описание:
Конкурирующий слой Кохонена относится к классу самоорганизующихся нейронных
сетей, которые предназначены для решения задач кластеризации и классификации.
Функция net = newc(PR, s, klr, clr) формирует слой Кохонена и имеет следующие
входные и выходные аргументы.
Входные аргументы:
PR – массив размера R2 из Q минимальных и максимальных значений вектора входа;
s – число нейронов;
klr – параметр настройки функции learnk, по умолчанию 0.01;
clr – параметр настройки функции learncon, по умолчанию 0.001.
Выходные аргументы:
net – объект класса network object, определяющий слой Кохонена.
Свойства:
Конкурирующий слой Кохонена использует функции взвешивания negdist, накопления netsum и активации compet. Веса и смещения слоя инициализируются с помощью
М-функций midpoint и initcon. Адаптация и обучение выполняются функциями adaptwb
и trainwb1, которые модифицируют значения веса и смещения, применяя функции
настройки learnk и learncon.
Примеры:
Зададим массив входа P в виде четырех двухэлементных векторов:
P = [.1 .8 .1 .9;
.2 .9 .1 .8];
Необходимо определить центры группирования (кластеризации) близких векторов.
В этой задаче интуитивно ясно, что существует 2 таких центра. Поэтому сформируем
слой Кохонена с двумя нейронами и определим диапазон расположения входных векторов в интервале [0 1]:
net = newc([0 1; 0 1],2);
gensim(net) % Рис.11.26
На рис. 11.26 показана структура конкурирующего слоя Кохонена.
11. Формирование моделей нейронных сетей
271
Рис. 11.26
Выполним настройку параметров слоя, чтобы решить задачу для заданного входа:
net = train(net,P);
Центры кластеризации расположены в точках
w = net.IW{1}
w =
0.8031
0.8031
0.1536
0.1969
Построим на плоскости входных векторов точки кластеризации и сами входные векторы:
plot(P(1,:), P(2,:),'+k') % Рис.11.27
title(' Векторы входа'), xlabel('P(1,:)'), ylabel('P(2,:)')
hold on
plot(w, 'or')
Рис. 11.27
272
Нейронные сети. MATLAB 6
На рис. 11.27 явно выделены 2 центра кластеризации, отмеченные цифрами 1 и 2.
Моделирование сети с определением близости проверяемых точек к центрам кластеризации можно реализовать следующим образом:
P1 = [0.2:0.1:0.7;
0.2:0.1:0.7]
Y = sim(net,P1);
Yc = vec2ind(Y)
P1 =
0.2000
0.3000
0.2000
0.3000
Yc =
2
2
0.4000
0.4000
2
0.5000
0.5000
1
0.6000
0.6000
1
0.7000
0.7000
1
Сопутствующие функции: SIM, INIT, ADAPT, TRAIN, ADAPTWB, TRAINWB1.
NEWSOM
Карта Кохонена SOM
Синтаксис:
net = newsom(PR,[d1,d2,...],tfcn,dfcn,olr,osteps,tlr,tnd)
Описание:
Карта Кохонена относится к классу самоорганизующихся многослойных нейронных
сетей, которые предназначены для решения задач кластеризации и классификации.
Функция net = newsom(PR, [d1, d2, ...], tfcn, dfcn, olr, osteps, tlr, tnd) формирует многомерную карту Кохонена и имеет следующие входные и выходные аргументы.
Входные аргументы:
PR – массив размера R2 из Q минимальных и максимальных значений вектора входа;
di – число нейронов по i-размерности карты, по умолчанию двумерная карта с числом
нейронов [5 8];
tfcn – функция топологии карты, по умолчанию hextop;
dfcn – функция расстояния, по умолчанию linkdist;
olr – параметр скорости обучения на этапе размещения, по умолчанию 0.9;
osteps – число циклов обучения на этапе размещения, по умолчанию 1000;
tlr – параметр скорости обучения на этапе подстройки, по умолчанию 0.02;
tnd – размер окрестности на этапе подстройки, по умолчанию 1.
Выходные аргументы:
net – объект класса network object, определяющий многомерную самоорганизующуюся карту Кохонена.
Свойства сети:
Самоорганизующаяся карта Кохонена имеет единственный слой с функциями взвешивания negdist, накопления netsum и активации compet. Слой характеризуется весовой
матрицей входа, но не имеет смещений. Инициализация слоя реализуется с помощью
функции midpoint. Адаптация и обучение выполняются функциями adaptwb и trainwb1,
которые используют функцию настройки learnsom. Топология карты задается функциями
hextop, gridtop и randtop. Функциями расстояния могут быть выбраны из списка {linkdist |
dist | mandist}.
11. Формирование моделей нейронных сетей
273
Пример:
Задан случайный вектор входа, элементы которого расположены в диапазонах [0 2]
и [0 1]. Построить двумерную самоорганизующуюся карту Кохонена с числом нейронов
[3 5] для классификации входных векторов:
P = [rand(1,400)*2; rand(1,400)];
net = newsom([0 2; 0 1],[3 5]);
gensim(net) % Рис. 11.28
Структура карты Кохонена показана на рис. 11.28 и включает 15 функций взвешивания negdist, функции накопления netsum и активации compet.
Рис. 11.28
Построим топологию двумерной карты Кохонена (рис. 11.29):
plotsom(net.layers{1}.positions) % Рис.11.29
Рис. 11.29
274
Нейронные сети. MATLAB 6
Затем реализуется процедура обучения. Следует отметить, что процедура обучения
длится достаточно долго; компьютер с частотой 500 MГц просчитывает 25 циклов приблизительно за 90 с, и строятся входные векторы с их отображениями (рис.10.30), которые
формируются весами SOM:
net.trainparam.epochs = 2000;
net = train(net,P);
plot(P(1,: ),P(2,: ),’.g’,’markersize’,10)
hold on
plotsom(net.iw{1,1},net.layers{1}.distances)
Рис. 11.30
Промоделируем обученную карту Кохонена на массиве векторов входа (рис. 11.31):
a = sim(net,P);
bar(sum(a')) % Рис.11.31
Рис. 11.31
Из анализа рис. 11.31 следует, что количество входных векторов, отнесенных к определенному кластеру, колеблется от 12 до 35. Таким образом, в процессе обучения двумерная
самоорганизующаяся карта Кохонена выполнила кластеризацию массива векторов входа.
Сопутствующие функции: SIM, INIT, ADAPT, TRAIN, ADAPTWB, TRAINWB1.
11. Формирование моделей нейронных сетей
275
Сети – классификаторы входных векторов
NEWLVQ
Нейронная сеть LVQ
Синтаксис:
net = newlvq(PR,S1,PC,LR,LF)
Описание:
Нейронные сети-классификаторы входных векторов, или сети LVQ, в отличие от самоорганизующихся сетей выполняют не только кластеризацию, но и классификацию
входных векторов.
Функция net = newlvq(PR, s1, PC, lr, lf) формирует сеть LVQ и имеет следующие
входные и выходные аргументы.
Входные аргументы:
PR – массив размера R2 из Q минимальных и максимальных значений вектора входа;
s1 – число нейронов скрытого слоя;
PC – вектор размера 1S2, указывающий распределение по долям векторов каждого класса;
lr – параметр скорости настройки, по умолчанию 0.01;
lf – функция настройки, по умолчанию learnlv2.
Выходные аргументы:
net – объект класса network object, определяющий сеть-классификатор LVQ.
Свойства сети:
Сеть LVQ – это двухслойная сеть. Первый слой использует функции взвешивания
negdist, накопления netsum и активации compet. Второй слой использует функции взвешивания dotprodt, накопления netsum и активации purelin. Слои не имеют смещений. Веса
первого слоя инициализируются с помощью функции midpoint; веса второго слоя устанавливаются так, чтобы каждому нейрону на выходе соответствовал единственный
нейрон скрытого слоя. Адаптация и обучение выполняются с помощью функций adaptwb
и trainwb1, которые модифицируют веса первого слоя, используя заданные функции обучения. Функциями настройки могут быть М-функции learnlv1 и learnlv2.
Пример:
Векторы входа P и выходные классы Tc, представленные ниже, определяют задачу
классификации, которая будет решена 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];
Целевые классы Tc преобразуем в целевые векторы T, создадим сеть LVQ со входами P,
четырьмя нейронами и долями распределения по классам [0.6 0.4]:
T = ind2vec(Tc);
net = newlvq(minmax(P),4,[.6 .4]);
gensim(net) % Рис.11.32
276
Нейронные сети. MATLAB 6
Структура нейронной сети LVQ показана на рис. 11.32. Выполним обучение сети:
Рис. 11.32
net = train(net,P,T);
Промоделируем сеть на векторе входа:
Y = sim(net,P);
Yc = vec2ind(Y)
Yc = 1 1 1 2
2
2
2
1
1
1
Классификация входного вектора выполнена без ошибок.
Сопутствующие функции:
SIM, INIT, ADAPT, TRAIN, ADAPTWB, TRAINWB1, LEARNLV1, LEARNLV2.
Рекуррентные сети
NEWELM
Нейронная сеть ELM
Сеть Элмана
Синтаксис:
net = newelm(PR, [S1 S2 ... SNl], {TF1 TF2 ... TFNl}, btf, blf, pf)
Описание:
Функция newelm предназначена для создания динамических сетей Элмана, которые
применяются для построения моделей динамических систем.
Функция net = newelm(PR, [S1 S2 ... SNl], {TF1 TF2 ... TFNl}, btf, blf, pf) формирует
сеть Элмана и имеет следующие входные и выходные аргументы.
Входные аргументы:
PR – массив размера R2 минимальных и максимальных значений для R векторов входа;
Si – количество нейронов в слое i;
11. Формирование моделей нейронных сетей
277
TFi – функция активации слоя i, по умолчанию tansig;
btf – обучающая функция, реализующая метод обратного распространения, по умолчанию traingdx;
blf – функция настройки, реализующая метод обратного распространения, по умолчанию learngdm;
pf – критерий качества обучения, по умолчанию mse.
Выходные аргументы:
net – объект класса network object динамической сети Элмана.
Свойства сети:
Обучающими функциями могут быть любые функции, реализующие метод обратного
распространения: trainlm, trainbfg, trainrp, traingd и др.
Функциями настройки могут быть функции, реализующие метод обратного распространения: learngd, learngdm.
Критерием качества обучения может быть любая дифференцируемая функция: mse,
msereg.
При реализации сети Элмана не рекомендуется применять такие алгоритмы обучения,
как trainlm или trainrp, которые работают с большим размером шага.
Пример:
Зададим вход P в виде случайной булевой последовательности из нулей и единиц; выходом сети должна быть такая булева последовательность T, элементы которой принимают значение 1 только в том случае, когда в последовательности P встретились 2 единицы
подряд:
P
T
P
T
=
=
=
=
round(rand(1,20))
[0 (P(1:end–1)+P(2:end)==2)]
1 0 1 0 1 1 0 0 1 0
0 0 0 0 0 1 0 0 0 0
1
0
1
1
1
1
1
1
0
0
0
0
1
0
1
1
0
0
1
0
Требуется построить сеть, которая распознает во входном сигнале 2 единицы, следующие подряд. Сначала эти последовательности представим в виде массивов ячеек:
Pseq = con2seq(P); Tseq = con2seq(T);
Создадим сеть Элмана с диапазоном входного сигнала от 0 до 1 с 10 скрытыми и одним выходным нейронами (рис. 11.33):
net = newelm([0 1],[10 1],{'tansig','logsig'});
gensim(net) % Рис.11.33
278
Нейронные сети. MATLAB 6
Рис. 11.33
Затем обучим сеть с допустимой средней квадратичной ошибкой 0.001 и смоделируем ее:
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})
E = 0 0 0 0 0 0 0 0 0
0
0
0
0
0
0
0
0
0
0
0
Результат свидетельствует о том, что сеть справилась с поставленной задачей.
Алгоритм:
Сеть Элмана состоит из Nl слоев, использующих функции взвешивания dotprod,
накопления netsum и заданные пользователем функции активации. Все слои имеют смещения. Выход последнего слоя является выходом сети. Веса и смещения инициализируются
с помощью функции initnw. Адаптация реализуется с помощью функции adaptwb, которая
настраивает веса с помощью заданной функции настройки.
Сопутствующие функции: NEWFF, NEWCF, SIM, INIT, ADAPT, TRAIN.
11. Формирование моделей нейронных сетей
279
Сеть Хопфилда HOP
NEWHOP
Синтаксис:
net = newhop(T)
Описание:
Сети Хопфилда применяются для решения задач распознавания образов.
Функция net = newhop(T) имеет 1 входной аргумент – массив T размера RQ, объединяющий Q целевых векторов (со значениями +1 или –1), R – число элементов вектора входа.
Функция возвращает рекуррентную сеть Хопфилда в виде объекта класса network
object.
Свойства:
Сеть Хопфилда имеет 1 нейронный слой с функциями взвешивания dotprod, накопления netsum и активации satlins. Слой охвачен динамической обратной связью и имеет
смещения.
Пример:
Создадим сеть Хопфилда с двумя устойчивыми точками в трехмерном пространстве:
T = [–1 –1 1; 1 –1 1]';
net = newhop(T);
gensim(net) % Рис.11.34
Рис. 11.34
Проверим, что сеть устойчива в этих точках, и используем их как начальные условия для
линии задержки. Если сеть устойчива, можно ожидать, что выходы Y будут те же самые.
Ai = T;
[Y,Pf,Af] = sim(net,2,[],Ai);
280
Нейронные сети. MATLAB 6
Y =
–1
–1
1
1
–1
1
Таким образом, вершины гиперкуба являются устойчивыми точками равновесия сети
Хопфилда.
Проверим сходимость сети при произвольном входном векторе Ai:
Ai = {[–0.9; –0.8; 0.7]};
[Y,Pf,Af] = sim(net,{1 5},{},Ai);
Y{1}
ans =
–1
–1
1
Сеть Хопфилда обеспечила переход к устойчивому положению равновесия, ближайшему к заданному входу.
Алгоритм:
Сети Хопфилда разработаны для того, чтобы приводить случайные входные векторы
к точкам равновесия, которые соответствуют определенным, заданным пользователем,
целям. Алгоритм минимизирует число устойчивых паразитных точек равновесия [25].
Сопутствующие функции: SIM, SATLINS.
11.2. Функции активации
Функция активации, или передаточная функция нейрона, преобразует каждый элемент ni вектора входа нейрона в элемент ai вектора выхода:
ai  f (ni ) .
Если рассматривать слой нейронов, то выражение функции активации через параметры слоя может быть записано в следующей векторной форме:
a m  f (W ma m1  b m )  f m (n m ) ,
где a m – вектор выхода нейронов размера S m1 для слоя m; Wm – матрица весовых коэффициентов размера S m S m –1 для слоя m; bm – вектор смещений размера S m1 для слоя m;
f m – функция активации нейронов слоя m; nm – вектор входа нейронов для слоя m; Sm –
число нейронов слоя m; a0 = p – вектор входа сети размера S0 1, причем S0 = R и R – число элементов вектора входа сети.
Все М-функции ППП NNToolbox, описывающие функции активации, имеют одинаковый формат
A = <имя_функции>(N),
где A – матрица векторов выхода; N – матрица векторов входа.
Производные функций активации имеют следующий формат
dA_dN = d<имя_функции>(N,A).
11. Формирование моделей нейронных сетей
281
Кроме того, для функций активации определена информационная функция вида
info = <имя_функции>(code),
где аргумент code может принимать следующие значения:
'name' – полное название функции активации;
'deriv' – имя производной функции активации;
'active' – активный диапазон входа функции активации;
'output' – диапазон выхода функции активации.
Персептрон
HARDLIM, DHARDLIM
Функция активации с жесткими ограничениями
Блок Simulink:
Синтаксис:
A = hardlim(N)
info = hardlim(code)
dA_dN = dhardlim(N,A)
Описание:
Функция A = hardlim(N) реализует функцию активации с жесткими ограничениями,
которая возвращает выход нейрона равным 1, если вход достигает порогового значения,
в иных случаях выход равен 0.
Функция info = hardlim(code) сообщает информацию о функции hardlim.
Функция dA_dN = dhardlim(N, A) вычисляет производную функции hardlim.
Пример:
Информация о функции активации hardlim:
name = hardlim('name')
dname = hardlim('deriv')
inrange = hardlim('active')
outrange = hardlim('output')
name = Hard Limit
dname = dhardlim
inrange =
0
0
outrange =
0
1
Зададим следующий вектор входа функции активации с жесткими ограничениями для
слоя из трех нейронов и рассчитаем вектор выхода A и производную dA_dN:
N = [0.1; 0.8; –0.7];
A = hardlim(N)
A =
1
1
0
282
dA_dN = dhardlim(N,A)
dA_dN =
0
0
0
Нейронные сети. MATLAB 6
Применение функции:
Функция активации hardlim используется при формировании нейронной сети персептрона с помощью М-функции newp. Для задания функции активации hardlim следует
установить значение свойства net.layers{i}.transferFcn равным 'hardlim'.
Алгоритм:
Функция активации hardlim и ее производная dhardlim определяются следующими
соотношениями:
0, n  0 ;
hardlim(n)  
1, n  0 .
0, n  0 ;
dhardlim(n)  
0, n  0 .
Сопутствующие функции: SIM, HARDLIMS.
HARDLIMS,
DHARDLMS
Симметричная функция с жесткими ограничениями
Блок Simulink:
Синтаксис:
A = hardlims(N)
info = hardlims(code)
dA_dN = dhardlms(N, A)
Описание:
Функция A = hardlims(N) реализует симметричную функцию активации с жесткими
ограничениями, которая возвращает выход нейрона равным 1 при положительном и –1
при отрицательном пороговом значении.
Функция info = hardlims(code) сообщает информацию о функции hardlims.
Функция dA_dN = dhardlms(N, A) вычисляет производную функции hardlims.
Пример:
Информация о функции активации hardlims:
name = hardlims('name')
dname = hardlims('deriv')
inrange = hardlims('active')
outrange = hardlims('output')
name = Symmetric Hard Limit
dname = dhardlms
inrange =
0
0
outrange =
–1
1
11. Формирование моделей нейронных сетей
283
Зададим следующий вектор входа симметричной функции активации с жесткими ограничениями для слоя из трех нейронов и рассчитаем вектор выхода A и производную dA_dN:
N = [0.1; 0.8; –0.7];
A = hardlims(N)
A =
1
1
–1
dA_dN = dhardlms(N,A)
dA_dN =
0
0
0
Применение функции:
Функция активации hardlims используется при формировании нейронной сети персептрона с помощью М-функции newp. Для задания функции активации hardlims следует
установить значение свойства net.layers{i}.transferFcn равным 'hardlims'.
Алгоритм:
Функция активации hardlims и ее производная dhardlms определяются следующими
соотношениями:
 1, n  0 ;
hardlims(n)  
 1, n  0 .
0, n  0 ;
dhardlms(n)  
0, n  0 .
Сопутствующие функции: SIM, HARDLIM.
Линейные сети
PURELIN, DPURELIN
Линейная функция активации
Блок Simulink:
Синтаксис:
A = purelin(N)
info = purelin(code)
dA_dN = dpurelin(N,A)
Описание:
Функция A = purelin(N) реализует линейную функцию активации во всем диапазоне
изменения входного аргумента.
Функция info = purelin(code) сообщает информацию о функции purelin.
Функция dA_dN = dpurelin(N, A) вычисляет производную функции purelin.
284
Нейронные сети. MATLAB 6
Пример:
Информация о функции активации purelin:
name = purelin('name')
dname = purelin('deriv')
inrange = purelin('active')
outrange = purelin('output')
name = Linear
dname = dpurelin
inrange = –Inf
Inf
outrange = –Inf
Inf
Зададим следующий вектор входа линейной функции активации для слоя из трех
нейронов и рассчитаем вектор выхода A и производную dA_dN:
N = [0.1; 0.8; –0.7];
A = purelin(N)
A =
0.1000
0.8000
–0.7000
dA_dN = dpurelin(N,A)
dA_dN =
1
1
1
Применение функции:
Функция активации purelin используется при формировании нейронных сетей
с помощью М-функций newlin и newlind. Для задания функции активации purelin следует
установить значение свойства net.layers{i}.transferFcn равным 'purelin'.
Алгоритм:
Функция активации purelin и ее производная dpurelin определяются следующими
соотношениями:
purelin(n)  n ;
dpurelin(n)  1 .
Сопутствующие функции: SIM, SATLIN, SATLINS.
POSLIN, DPOSLIN
Положительная линейная функция активации
Блок Simulink:
Синтаксис:
A = poslin(N)
info = poslin(code)
dA_dN = dposlin(N,A)
Описание:
Функция A = poslin(N) реализует положительную линейную функцию активации.
Функция info = poslin(code) сообщает информацию о функции poslin.
Функция dA_dN = dposlin(N, A) вычисляет производную функции poslin.
11. Формирование моделей нейронных сетей
285
Пример:
Информация о функции активации poslin:
name = poslin('name')
dname = poslin('deriv')
inrange = poslin('active')
outrange = poslin('output')
name = Positive Linear
dname = dposlin
inrange =
0
Inf
outrange =
0
Inf
Зададим следующий вектор входа положительной линейной функции активации
для слоя из трех нейронов и рассчитаем вектор выхода A и производную dA_dN:
N = [0.1; 0.8; –0.7];
A = poslin(N)
dA_dN = dposlin(N,A)
A =
dA_dN =
0.1000
1
0.8000
1
0
0
Применение функции:
Для задания функции активации poslin следует установить значение свойства
net.layers{i}.transferFcn равным 'poslin'.
Алгоритм:
Функция активации poslin и ее производная dposlin определяются следующими
соотношениями:
0, n  0;
poslin (n)  
n, n  0;
0, n  0;
dposlin (n)  
1, n  0.
Сопутствующие функции: SIM, PURELIN, SATLIN, SATLINS.
SATLIN, DSATLIN
Линейная функция с ограничениями
Блок Simulink:
Синтаксис:
A = satlin(N)
info = satlin(code)
286
dA_dN = dsatlin(N,A)
Нейронные сети. MATLAB 6
Описание:
Функция A = satlin(N) реализует линейную функцию активации с ограничениями.
Функция info = satlin(code) сообщает информацию о функции satlin.
Функция dA_dN = dsatlin(N, A) вычисляет производную функции satlin.
Пример:
Информация о функции активации satlin:
name = satlin('name')
dname = satlin('deriv')
inrange = satlin('active')
outrange = satlin('output')
name = Saturating Linear
dname = dsatlin
inrange = 0
1
outrange = 0
1
Зададим следующий вектор входа линейной функции активации с ограничениями
для слоя из трех нейронов и рассчитаем вектор выхода A и производную dA_dN:
N = [0.1; 0.8; –0.7];
A = satlin(N)
A =
0.1000
0.8000
0
dA_dN = dsatlin(N,A)
dA_dN =
1
1
0
Применение функции:
Для задания функции активации satlin следует установить значение свойства
net.layers{i}.transferFcn равным 'satlin'.
Алгоритм:
Функция активации satlin и ее производная dsatlin определяются следующими
соотношениями:
0, n  0 ;

satlin(n)  n, 0  n  1;
0, n  1.

0, n  0 ;

dsatlin(n)  1, 0  n  1;
0, n  1.

Сопутствующие функции: SIM, POSLIN, SATLINS, PURELINS.
11. Формирование моделей нейронных сетей
287
SATLINS, DSATLINS
Симметричная линейная функция с ограничениями
Блок Simulink:
Синтаксис:
A = satlins(N)
info = satlins(code)
dA_dN = dsatlins(N, A)
Описание:
Функция A = satlins(N) реализует симметричную линейную функцию активации
с ограничениями.
Функция info = satlins(code) сообщает информацию о функции satlins.
Функция dA_dN = dsatlins(N, A) вычисляет производную функции satlins.
Пример:
Информация о функции активации satlins:
name = satlins('name')
dname = satlins('deriv')
inrange = satlins('active')
outrange = satlins('output')
name = Symmetric Saturating Linear
dname = dsatlins
inrange =
–1
1
outrange =
–1
1
Зададим следующий вектор входа симметричной линейной функции активации
с ограничениями для слоя из трех нейронов и рассчитаем вектор выхода A и производную
dA_dN:
N = [0.1; 0.8; –0.7];
A = satlins(N)
A =
0.1000
0.8000
–0.7000
dA_dN = dsatlins(N,A)
dA_dN =
1
1
1
Применение функции:
Для задания функции активации satlins следует установить значение свойства
net.layers{i}.transferFcn равным 'satlins'.
Алгоритм:
Функция активации satlins и ее производная dsatlins определяются следующими
соотношениями:
288
Нейронные сети. MATLAB 6
 1, n  1 ;

satlins(n)  n,  1  n  1;
 1, n  1.

0, n  1 ;

dsatlins(n)  1,  1  n  1;
0, n  1.

Сопутствующие функции: SIM, POSLIN, SATLIN, PURELINS.
Радиальные базисные сети
Радиальная базисная функция
RADBAS, DRADBAS
Блок Simulink:
Синтаксис:
A = radbas(N)
info = radbas(code)
dA_dN = dradbas(N,A)
Описание:
Функция A = radbas(N) реализует радиальную базисную функцию активации.
Функция info = radbas(code) сообщает информацию о функции radbas.
Функция dA_dN = dradbas(N, A) вычисляет производную функции radbas.
Пример:
Информация о функции активации radbas:
name = radbas('name')
dname = radbas('deriv')
inrange = radbas('active')
outrange = radbas('output')
name = Radial Basis
dname = dradbas
inrange =
–2
2
outrange =
0
1
Следующая последовательность команд создает график функции активации radbas:
n = –3:0.1:3;
a = radbas(n);
plot(n,a) % Рис.11.35
11. Формирование моделей нейронных сетей
289
Рис. 11.35
Зададим следующий вектор входа радиальной базисной функции активации для слоя
из трех нейронов и рассчитаем вектор выхода A и производную dA_dN:
N = [0.1; 0.8; –0.7];
A = radbas(N)
A =
0.9900
0.5273
0.6126
dA_dN = dradbas(N,A)
dA_dN =
–0.1980
–0.8437
0.8577
Применение функции:
Функция активации radbas используется при формировании вероятностных и обобщенных регрессионных сетей с помощью М-функций newpnn и newgrnn. Для задания
функции активации radbas следует установить значение свойства net.layers{i}.transferFcn
равным 'radbas'.
Алгоритм:
Функция активации radbas и ее производная dradbas определяются следующими
соотношениями:
radbas (n)  e 2n ;
dradbas (n)  2ne 2 n .
Сопутствующие функции: SIM, TRIBAS, DRADBAS.
TRIBAS, DTRIBAS
Треугольная функция активации
Блок Simulink:
Синтаксис:
A = tribas(N)
info = tribas(code)
290
dA_dN = dtribas(N,A)
Нейронные сети. MATLAB 6
Описание:
Функция A = tribas(N) реализует треугольную функцию активации.
Функция info = tribas(code) сообщает информацию о функции tribas.
Функция dA_dN = dtribas(N, A) вычисляет производную функции tribas.
Пример:
Информация о функции активации tribas:
name = tribas('name')
dname = tribas('deriv')
inrange = tribas('active')
outrange = tribas('output')
name
= Triangle Basis
dname = dtribas
inrange =
–1
1
outrange =
0
1
Построим график функции активации tribas (рис. 11.36):
n = –2:0.1:2;
a = tribas(n);
plot(n,a) % Рис.11.36
Рис. 11.36
Зададим следующий вектор входа треугольной функции активации для слоя из трех
нейронов и рассчитаем вектор выхода A и производную dA_dN:
N = [0.1; 0.8; –0.7];
A = tribas(N)
A =
0.9000
0.2000
0.3000
dA_dN = dtribas(N,A)
dA_dN =
–1
–1
–1
Применение функции:
Для задания функции активации tribas следует установить значение свойства
net.layers{i}.transferFcn равным 'tribas'.
11. Формирование моделей нейронных сетей
291
Алгоритм:
Функция активации tribas и ее
соотношениями:
 0,

tribas(n)  1  abs(n),
 0,

производная dtribas определяются следующими
n  1 ;
 1  n  1;
n  1.
 0, n  1 ;
 1,  1  n  0;

dtribas(n)  
;
0  n  1;
 1,
 0, n  1.
Сопутствующие функции: SIM, RADBAS.
Самоорганизующиеся сети
COMPET
Конкурирующая функция активации
Блок Simulink:
С
Синтаксис:
A = compet(N)
info = compet(code)
Описание:
Функция A = compet(N) реализует конкурирующую функцию активации.
Функция info = compet(code) сообщает информацию о функции compet.
Функция compet не имеет производной.
Конкурирующая функция преобразует вектор входа слоя нейронов так, чтобы нейрон
с самым большим входом имел выход, равный 1, а всего другие нейроны имели выходы,
равные 0.
Пример:
Информация о функции активации compet:
name = compet('name')
dname = compet('deriv')
inrange = compet('active')
outrange = compet('output')
name = Competitive
dname =
''
inrange = –Inf
Inf
outrange =
0
1
292
Нейронные сети. MATLAB 6
Зададим следующий вектор входа конкурирующей функции активации, вычислим
выход и представим входы и выходы в виде столбцовых диаграмм (рис. 11.37):
n = [0; 1; –0.5; 0.5];
a = compet(n);
subplot(2,1,1), bar(n), ylabel('n')
subplot(2,1,2), bar(a), ylabel('a') % Рис.11.37
Рис. 11.37
Применение функции:
Функция активации compet используется при формировании вероятностных и самоорганизующихся нейронных сетей с помощью М-функций newc и newpnn. Для задания
функции активации compet следует установить значение свойства net.layers{i}.transferFcn
равным 'compet'.
Сопутствующие функции: SIM, SOFTMAX.
SOFTMAX
Конкурирующая функция активации
с мягким максимумом
Блок Simulink:
S
Синтаксис:
A = softmax(N)
info = softmax(code)
Описание:
Функция A = softmax(N) реализует конкурирующую функцию активации с мягким
максимумом.
Функция info = softmax(code) сообщает информацию о функции softmax.
Функция softmax не имеет производной.
11. Формирование моделей нейронных сетей
293
Пример:
Информация о функции активации softmax:
name = softmax('name')
dname = softmax('deriv')
inrange = softmax('active')
outrange = softmax('output')
name = Soft Max
dname =
''
inrange
= –Inf
Inf
outrange =
0
1
Зададим следующий вектор входа конкурирующей функции активации с мягким максимумом, вычислим выход и представим входы и выходы в виде столбцовых диаграмм:
n = [0; 1; –0.5; 0.5];
a = softmax(n);
subplot(2,1,1), bar(n), ylabel('n')
subplot(2,1,2), bar(a), ylabel('a') % Рис.11.38
Рис. 11.38
Применение функции:
Функция активации softmax используется при формировании вероятностных и самоорганизующихся нейронных сетей с помощью М-функций newc и newpnn. Для задания
функции активации softmax следует установить значение свойства net.layers{i}.transferFcn
равным 'softmax'.
Сопутствующие функции: SIM, COMPET.
Рекуррентные сети
Логистическая функция
LOGSIG, DLOGSIG
Блок Simulink:
Синтаксис:
A = logsig(N)
info = logsig(code)
294
dA_dN = dlogsig(N,A)
Нейронные сети. MATLAB 6
Описание:
Функция A = logsig(N) реализует логистическую сигмоидальную функцию активации.
Функция info = logsig(code) сообщает информацию о функции logsig.
Функция dA_dN = logsig(N, A) вычисляет производную функции logsig.
Пример:
Информация о функции активации logsig:
name = logsig('name')
dname = logsig('deriv')
inrange = logsig('active')
outrange = logsig('output')
name = Log Sigmoid
dname = dlogsig
inrange =
–4
4
outrange =
0
1
Построим график функции активации logsig(рис. 11.39):
n = –5:0.1:5;
a = logsig(n);
plot(n,a) % Рис.11.39
Рис. 11.39
Зададим следующий вектор входа логистической функции активации для слоя из трех
нейронов и рассчитаем вектор выхода A и производную dA_dN:
N = [0.1; 0.8; –0.7];
A = logsig(N)
A =
0.5250
0.6900
0.3318
dA_dN = dlogsig(N,A)
dA_dN =
0.2494
0.2139
0.2217
Применение функции:
Функция активации logsig используется при формировании нейронных сетей прямой
передачи с помощью М-функций newff и newcf. Для задания функции активации logsig
следует установить значение свойства net.layers{i}.transferFcn равным 'logsig'.
11. Формирование моделей нейронных сетей
295
Алгоритм:
Функция активации logsig и ее производная dlogsig определяются следующими
соотношениями:
logsig (n) 
1
;
1  e n
logsig (n) 
e n
.
(1  e n ) 2
Сопутствующие функции: SIM, DLOGSIG, DTANSIG.
Гиперболическая тангенциальная функция
TANSIG, DTANSIG
Блок Simulink:
Синтаксис:
A = tansig(N)
info = tansig(code)
dA_dN = dtansig(N,A)
Описание:
Функция A = tansig(N) реализует гиперболическую тангенциальную функцию активации.
Функция info = tansig(code) сообщает информацию о функции tansig.
Функция dA_dN = tansig(N, A) вычисляет производную функции tansig.
Пример:
Информация о функции активации tansig:
name = tansig('name')
dname = tansig('deriv')
inrange = tansig('active')
outrange = tansig('output')
name = Tan Sigmoid
dname = dtansig
inrange =
–2
2
outrange =
–1
1
Следующая последовательность команд строит график функции активации tansig:
n = –3:0.1:3;
a = tansig(n);
plot(n,a) % Рис.11.40
296
Нейронные сети. MATLAB 6
Рис. 11.40
Зададим следующий вектор входа гиперболической тангенциальной функции активации для слоя из трех нейронов и рассчитаем вектор выхода A и производную dA_dN:
N = [0.1; 0.8; –0.7];
A = tansig(N)
A =
0.0997
0.6640
–0.6044
dA_dN = dtansig(N,A)
dA_dN =
0.9901
0.5591
0.6347
Применение функции:
Функция активации tansig используется при формировании нейронных сетей прямой
передачи с помощью М-функций newff и newcf. Для задания функции активации tansig
следует установить значение свойства net.layers{i}.transferFcn равным 'tansig'.
Алгоритм:
Функция активации tansig и ее производная dtansig определяются следующими
соотношениями:
2
tansig (n) 
1;
1  e 2 n
dtansig (n)  1  tansig 2 (n) .
Приведенное выражение для функции tansig(n) математически эквивалентно функции
tanh(N), но отличается тем, что выполняется быстрее, чем реализация функции tanh в системе MATLAB. Для нейронных сетей, где быстродействие играет важную роль, это
весьма существенно [42].
Сопутствующие функции: SIM, DTANSIG, LOGSIG.
11. Формирование моделей нейронных сетей
297
11.3. Синаптические функции
Функции этой группы выполняют следующие операции над векторами входов
нейронной сети: взвешивание, вычисление расстояний в сетях с топологией, накопление
для вычисления потенциала нейрона. При описании синаптических функций описывается
не только сама функция, но и ее производные по входным аргументам, если они определены.
Функции взвешивания и расстояний
Скалярное произведение
DOTPROD, DDOTPROD
Блок SIMULINK:
Синтаксис:
Z = dotprod(W, P)
df = dotprod(‘deriv’)
dZ_dP = ddotprod('p',W,P,Z)
dZ_dW = ddotprod(‘w’,W,P,Z)
Описание:
Функция Z = dotprod(W, P) вычисляет матрицу взвешенных входов в виде произведения W*P массива входов P размера RQ и матрицы весов W размера SR. Результатом
является матрица Z размера SQ.
Функция df = dotprod('deriv') возвращает имя М-функции, которая вычисляет производную скалярного произведения по одному из сомножителей.
Функции dZ_dP = ddotprod('p', W, P, Z) и dZ_dW = ddotprod('w', W, P, Z) имеют следующие входные и выходные аргументы:
W – матрица весов размера SR;
P – массив входов размера RQ;
Z – матрица размера SQ, где S – число нейронов в слое, Q – число векторов входа,
R – число элементов каждого вектора входа;
dZ_dP – матрица производной dZ/dP размера SR;
dZ_dW – матрица производной dZ/dW размера RQ.
Примеры:
Вычислим вектор взвешенных входов Z, если заданы случайные матрица весов W
и вектор входа P:
W
P
Z
W
298
= rand(4,3)
= rand(3,1); P'
= dotprod(W,P); Z'
=
0.6068
0.4565
0.4860
0.0185
0.8913
0.8214
0.7621
0.4447
0.6154
0.7919
0.9218
0.7382
Нейронные сети. MATLAB 6
ans =
ans =
0.1763
0.8679
0.4057
0.8340
0.9355
1.3527
1.0053
Определим имя М-функции, которая вычисляет производную взвешенной функции
в виде скалярного произведения:
df = dotprod('deriv')
df = ddotprod
Вычислим производные скалярного произведения по каждому аргументу:
dZ_dP = ddotprod('p',W,P,Z)
dZ_dW = ddotprod('w',W,P,Z)
dZ_dP =
0.6068
0.4565
0.6154
0.4860
0.0185
0.7919
0.8913
0.8214
0.9218
0.7621
0.4447
0.7382
dZ_dW =
0.1763
0.4057
0.9355
Нетрудно убедиться, что производная произведения матрицы весов на вектор входа
z = W*P по аргументу P совпадает с матрицей весов W, а производная по аргументу W –
с входным вектором p.
Применение функции:
Функция взвешивания dotprod используется по умолчанию при формировании
нейронных сетей персептрона newp и линейных слоев newlin. Чтобы применить эту функцию для формирования других типов сетей необходимо установить значения свойств
net.inputWeight{i, j}.weightFcn и net.layerWeight{i, j}.weightFcn равными 'dotprod'.
Алгоритм:
Производная скалярного произведения двух матриц Z = W*P по одной из них равна
второй матрице, т. е. dZ/dP = W, dZ/dW = P.
Сопутствующие функции: SIM, DIST, NEGDIST, NORMPROD.
NORMPROD
Нормированное скалярное произведение
Синтаксис:
Z = normprod(W,P)
df = normprod('deriv')
Описание:
Функция взвешивания normprod отличается от функции dotprod тем, что она является
нормированной функцией и не имеет производной.
Функция Z = normprod(W,P) вычисляет массив взвешенных входов в виде нормированного скалярного произведения W*P/sum(P,1), где W – матрица весов размера SR,
11. Формирование моделей нейронных сетей
299
P – массив входов размера RQ. Результатом является массив значений взвешенных входов Z размера SQ.
Функция df = normprod('deriv') возвращает пустую строку ' ', так как производная
для функции normprod не определена.
Пример:
Определим случайную весовую матрицу W и вектор входа P и рассчитаем соответствующий взвешенный вход Z:
W
P
Z
W
= rand(4,3)
= rand(3,1); P'
= normprod(W,P); Z'
=
0.0153
0.4660
0.2026
0.7468
0.4186
0.6721
0.4451
0.8462
0.8381
0.9318
0.5252
0.0196
ans =
0.6813
0.3795
0.8318
ans =
0.1880
0.6482
0.6983
0.4494
Применение функции:
Функция взвешивания normprod применяется в архитектуре обобщенных регрессионных сетей, формируемых с помощью М-функции newgrnn.
Чтобы применить функцию взвешивания normprod, следует установить значения
для свойств net.inputWeights{i, j}.weightFcn и net.layerWeights{i, j}.weightFcn равными
'normprod'.
Алгоритм:
Функция normprod возвращает скалярные произведения весовой матрицы на каждый вектор входа, деленные на сумму элементов каждого вектора, в виде следующей матрицы Z:
Z = W*P./sum(P, 1).
Сопутствующие функции: SIM, DOTPROD, NEGDIST, DIST.
Функции расстояний могут использоваться как функции взвешивания, но их основное
назначение характеризовать топологию вероятностных и самоорганизующихся сетей путем вычисления расстояний между нейронами в слое.
Евклидово расстояние
DIST
Блок SIMULINK:
Синтаксис:
Z = dist(W,P)
df = dist('deriv')
300
D = dist(pos)
Нейронные сети. MATLAB 6
Описание:
Функция взвешивания Z = dist(W, P) вычисляет евклидово расстояние между каждой
строкой wi матрицы весов W и каждым столбцом pj матрицы входов P в соответствии
со следующим соотношением:
zij = norm(wi – pj').
(11.1)
Функция Z = dist(W, P) вычисляет матрицу взвешенных входов для матрицы входов P
размера RQ и матрицы весов W размера SR. Результатом является матрица Z размера SQ.
Функция df = dist('deriv') возвращает пустую строку, поскольку производная не определена.
Функция dist может быть использована как функция для вычисления расстояний
между нейронами в слое.
Функция расстояния D = dist(pos) вычисляет расстояние между нейронами для сетей
с топологией. Входной аргумент pos – это матрица координат расположения нейронов
в N-мерном пространстве размера NS; выходной аргумент D – это матрица расстояний
размера SS.
Примеры:
Вычислим вектор взвешенных входов Z, если заданы случайные матрица весов W
размера 43 и вектор входа P размера 31:
W
P
Z
Z
= rand(4,3);
= rand(3,1);
= dist(W,P)
=
0.6791
0.3994
0.3234
0.5746
Результатом является вектор размера 41, вычисленный в соответствии с соотношением (11.1).
Рассмотрим сеть с топологией, для которой задана случайная матрица координат
для 10 нейронов в трехмерном пространстве и требуется рассчитать матрицу евклидовых
расстояний между ними.
pos = rand(3,10);
D = dist(pos)
D =
Columns 1 through
0
0.5304
0.5304
0
0.9195
0.7033
0.9366
0.4450
0.5776
0.7648
1.0651
1.1121
0.9003
0.8339
1.1471
0.9753
0.3750
0.2967
1.0744
0.9119
7
0.9195
0.7033
0
0.5551
0.6438
0.7713
0.3219
0.4052
0.6520
0.4235
0.9366
0.4450
0.5551
0
0.9521
1.1444
0.7971
0.8125
0.6215
0.7844
11. Формирование моделей нейронных сетей
0.5776
0.7648
0.6438
0.9521
0
0.9396
0.6349
0.9155
0.6276
0.8969
1.0651
1.1121
0.7713
1.1444
0.9396
0
0.4624
0.5243
0.8666
0.4576
0.9003
0.8339
0.3219
0.7971
0.6349
0.4624
0
0.2948
0.6631
0.2754
301
Columns
1.1471
0.9753
0.4052
0.8125
0.9155
0.5243
0.2948
0
0.8512
0.1166
8 through
0.3750
0.2967
0.6520
0.6215
0.6276
0.8666
0.6631
0.8512
0
0.7709
10
1.0744
0.9119
0.4235
0.7844
0.8969
0.4576
0.2754
0.1166
0.7709
0
В результате получаем симметричную матрицу взаимных расстояний между нейронами.
Применение функции:
Функция взвешивания dist используется при формировании вероятностных сетей
newpnn и обобщенных регрессионных сетей newgrnn. Чтобы применить эту функцию
взвешивания для формирования других типов сетей необходимо установить значения
свойств net.inputWeight{i, j}.weightFcn и net.layerWeight{i, j}.weightFcn равными 'dist'.
Чтобы применить функцию расстояния dist для сетей с топологией, необходимо установить значение свойства net.layers{i}.distanceFcn равным 'dist'.
Алгоритм:
Евклидово расстояние d между векторами x и y вычисляется в системе MATLAB
следующим образом:
d = sqrt((x–y).^2).
Сопутствующие функции: SIM, DOTPROD, NEGDIST, NORMPROD, MANDIST, LINKDIST.
Отрицательное евклидово расстояние
NEGDIST
Синтаксис:
Z = negdist(W, P)
df = negdist('deriv')
Описание:
Функция negdist применяется в самоорганизующихся сетях как функция взвешивания.
Функция взвешивания Z = negdist(W, P) вычисляет отрицательное евклидово расстояние между каждой строкой wi матрицы весов W и каждым столбцом pj матрицы входов P
в соответствии со следующим соотношением:
zij = norm(wi – pj').
(11.2)
Функция Z = dist(W, P) вычисляет матрицу взвешенных входов для матрицы входов P
размера RQ и матрицы весов W размера SR. Результатом является матрица Z размера
SQ.
Функция df = dist('deriv') возвращает пустую строку, поскольку производная не определена.
302
Нейронные сети. MATLAB 6
Пример:
Вычислим вектор взвешенных входов Z, если заданы случайные матрица весов W
размера 43 и вектор входа P размера 31:
W
P
Z
Z
= rand(4,3);
= rand(3,1);
= negdist(W,P)
=
–0.7558
–0.8090
–0.4755
–0.8113
Применение функции:
Функция взвешивания negdist используется при формировании самоорганизующихся сетей
newc и newsom. Чтобы применить эту функцию взвешивания для других сетей, необходимо
установить значения свойств net.inputWeight{i, j}.weightFcn и net.layerWeight{i, j}.weightFcn равными 'negdist'.
Алгоритм:
Функция negdist вычисляет взвешенный вход для векторов x и y в системе MATLAB
следующим образом:
z = –sqrt(sum(x – y).^2).
Сопутствующие функции: SIM, DOTPROD, DIST.
Расстояние суммарного координатного смещения
MANDIST
Синтаксис:
Z = mandist(W, P)
df = mandist('deriv')
D = mandist(pos)
Описание:
Функция взвешивания Z = mandist(W, P) вычисляет расстояние в виде суммарного
координатного смещения между каждой строкой wi матрицы весов W и столбцом pj матрицы входов P в соответствии со следующим соотношением:
zij = sum(abs(wi – pj')).
(11.3)
Функция Z = mandist(W, P) вычисляет матрицу взвешенных входов для матрицы входов P
размера RQ и матрицы весов W размера SR. Результатом является матрица Z размера SQ.
Функция df = dist('deriv') возвращает пустую строку, поскольку производная не определена.
Функция mandist может быть использована как функция для вычисления расстояний
между нейронами в слое.
Функция расстояния D = mandist(pos) вычисляет расстояние между нейронами для сетей с топологией. Входной аргумент pos – это матрица координат расположения нейронов
в N-мерном пространстве размера NS; выходной аргумент D – это матрица расстояний
размера SS.
11. Формирование моделей нейронных сетей
303
Пример:
Вычислим вектор взвешенных входов Z, если заданы случайные матрица весов W
размера 43 и вектор входа P размера 31:
W
P
Z
Z
= rand(4,3);
= rand(3,1);
= mandist(W,P)
=
0.8265
0.9830
1.0359
1.7712
Результатом является вектор размера 41, вычисленный в соответствии с соотношением (11.2).
Рассмотрим сеть с топологией, для которой задана случайная матрица координат
для 10 нейронов в трехмерном пространстве и требуется рассчитать матрицу евклидовых
расстояний между ними.
pos = rand(3,10);
D = mandist(pos)
D =
Columns 1 through
0
0.8589
0.8589
0
0.6427
0.6227
1.2565
0.9084
0.8813
1.2433
0.5815
1.4404
0.7340
0.7770
0.8268
0.8910
1.0852
0.9757
0.7504
1.1124
Columns 8 through
0.8268
1.0852
0.8910
0.9757
0.9289
0.4425
1.7622
1.0977
1.7081
1.9665
1.3523
1.6107
1.1911
1.5981
0
0.8238
0.8238
0
1.5772
1.8356
7
0.6427
0.6227
0
0.8333
1.5239
1.1681
1.2451
0.9289
0.4425
1.3930
10
0.7504
1.1124
1.3930
1.2194
0.7122
0.9397
0.4031
1.5772
1.8356
0
1.2565
0.9084
0.8333
0
0.9730
1.0287
1.5443
1.7622
1.0977
1.2194
0.8813
1.2433
1.5239
0.9730
0
0.7039
1.1153
1.7081
1.9665
0.7122
0.5815
1.4404
1.1681
1.0287
0.7039
0
1.2512
1.3523
1.6107
0.9397
0.7340
0.7770
1.2451
1.5443
1.1153
1.2512
0
1.1911
1.5981
0.4031
Применение функции:
Функция суммарного координатного смещения используется в сетях с топологией, например
в картах Кохонена newsom. Чтобы применить эту функцию для других сетей с топологией, необходимо установить значение свойства net.layerWeight{i,j}.distanceFcn равным 'mandist'.
Чтобы применить функцию взвешивания mandist, следует установить свойство
net.inputWeight{i, j}.weightFcn равным 'mandist'.
304
Нейронные сети. MATLAB 6
Алгоритм:
Сумммарное координатное смещение d между векторами x и y вычисляется в системе
MATLAB следующим образом:
d = sum(abs(x–y)).
Сопутствующие функции: SIM, DIST, LINKDIST.
Максимальное координатное смещение
BOXDIST
Синтаксис:
d = boxdist(pos)
Описание:
Функция d = boxdist(pos) вычисляет расстояния максимального координатного смещения между нейронами слоя, если задан массив координат нейронов pos размера NS,
где N – размерность пространства расположения нейронов. Выходом является массив
расстояний размера SS.
Функция boxdist обычно используется в сетях с функцией топологии gridtop.
Пример:
Пусть задан массив случайных координат трехмерного пространства, в которых размещены 10 нейронов. Требуется вычислить массив максимальных координатных смещений между этими нейронами.
pos = rand(3,10);
d = boxdist(pos)
d =
0
0.1614
0.1614
0
0.6100
0.5282
0.5123
0.3509
0.4512
0.2898
0.3767
0.2714
0.2785
0.1967
0.4603
0.3119
0.5502
0.4720
0.2442
0.3926
0.2785
0.1967
0.4536
0.4855
0.4244
0.3499
0
0.2623
0.5234
0.4422
0.4603
0.3119
0.6149
0.5709
0.5097
0.4353
0.2623
0
0.7839
0.7045
0.6100
0.5282
0
0.4374
0.4965
0.3608
0.4536
0.6149
0.6900
0.5860
0.5123
0.3509
0.4374
0
0.3044
0.1805
0.4855
0.5709
0.3611
0.4280
0.5502
0.4720
0.6900
0.3611
0.6655
0.5298
0.5234
0.7839
0
0.4659
0.2442
0.3926
0.5860
0.4280
0.5862
0.4504
0.4422
0.7045
0.4659
0
11. Формирование моделей нейронных сетей
0.4512
0.2898
0.4965
0.3044
0
0.1358
0.4244
0.5097
0.6655
0.5862
0.3767
0.2714
0.3608
0.1805
0.1358
0
0.3499
0.4353
0.5298
0.4504
305
Применение функции:
Функция максимального координатного смещения используется в сетях с топологией,
например в картах Кохонена newsom. Чтобы применить эту функцию для других сетей с
топологией, необходимо установить значение свойства net.layerWeight{i,j}.distanceFcn
равным 'boxdist'.
Алгоритм:
Максимальное координатное смещение d между векторами x и y вычисляется в системе MATLAB следующим образом:
d = max(abs(x–y)).
Сопутствующие функции: SIM, DIST, MANDIST, LINKDIST.
LINKDIST
Расстояния связи между нейронами слоя
Синтаксис:
d = linkdist(pos)
Описание:
Функция d = linkdist(pos) вычисляет расстояния связи между нейронами слоя, если задан массив координат нейронов pos размера NS, где N – размерность пространства расположения нейронов. Выходом является массив расстояний размера SS.
Пример:
Пусть задан массив случайных координат трехмерного пространства, в которых размещены 10 нейронов. Требуется вычислить массив расстояний связи между этими нейронами (рис. 11.41):
pos = rand(3,10);
Рис. 11.41
306
Нейронные сети. MATLAB 6
d = linkdist(pos)
d =
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
2
1
2
1
1
1
1
1
1
2
0
1
1
1
2
2
1
1
1
1
1
0
1
1
1
1
1
1
1
2
1
1
0
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
2
1
1
1
0
1
1
1
1
1
2
1
1
1
1
0
Применение функции:
Функция расстояния связи linkdist используется для оценки топологии при формировании слоя Кохонена newc и карты Кохонена newsom.
Чтобы применить функцию расстояния связи linkdist, следует установить значение
свойства net.layers{i}.distanceFcn равным 'linkdist'.
Алгоритм:
Расстояние связи dij между двумя позициями векторов posi и posj из множества S векторов определяется соотношением
1,

2,

d ij  3,

N ,
S ,

dist (pos i  pos j )  1;
k , d ik  d kj  1;
(k1 , k 2 ), d ik1  d k1k2  d k2 j  1;
(k1 ,..., k N ), d ik1  d k1k2  ...  d k N j  1;
в остальных случаях.
Сопутствующие функции: SIM, DIST, MANDIST.
Функции накопления
Функции, задающие правила формирования входа нейрона, называются функциями
накопления. Как правило, это либо сумма взвешенных входов, либо их поэлементное произведение.
Сумма взвешенных входов
NETSUM, DNETSUM
Блок Simulink:
Синтаксис:
N = netsum(Z1,Z2,...)
df = netsum('deriv')
dN_dZi = dnetsum(Zi,N)
11. Формирование моделей нейронных сетей
307
Описание:
Функция N = netprod(Z1, Z2, ...) вычисляет функцию накопления потенциала нейрона
в виде суммы элементов взвешенных входов Zi размера SQ, где S – число нейронов
в слое, Q – число элементов вектора входа. Для описания операции, выполняемой этим
блоком, можно ввести следующую нотацию:
(11.4)
N  Z i  Z1  Z 2  ...  Z n ,

.
где символ
.
обозначает поэлементное сложение.
Функция df = netsum('deriv') возвращает имя М-функции, которая вычисляет производную суммы массивов взвешенных входов.
Функция dN_dZi = dnetprod(Zi, N) вычисляет производную от суммы взвешенных
входов N по одному из входов. Здесь N, Zi и dN_dZi – массивы одинакового размера SQ.
Пример:
Вычислить функцию накопления потенциала для следующих взвешенных входов:
Z1 = [ 1 2 4; 3 4 1];
Z2 = [–1 2 2; –5 –6 1];
N = netsum(Z1,Z2)
N =
0
4
6
–2
–2
2
Вычислить функцию накопления с учетом вектора смещения b. Поскольку массивы
Z1 и Z2 составлены из трех векторов, то с помощью функции concur должен быть создан
массив из трех копий вектора смещения b для того, чтобы все размерности совпадали:
b = [0; –1];
N = netsum(Z1,Z2,concur(b,size(Z1,2)))
N =
0
4
6
–3
–3
1
Определим 2 весовые матрицы входа для слоя с тремя нейронами:
Z1 = [0; 1; –1];
Z2 = [1; 0.5; 1.2];
Вычислить вход нейрона N с помощью функции netsum и затем найти производные
по каждому из взвешенных входов:
N = netsum(Z1,Z2)
dN_dZ1 = dnetsum(Z1,N)
dN_dZ2 = dnetsum(Z2,N)
N =
0
4
6
–2
–2
2
dN_dZ1 =
1
1
1
1
1
1
dN_dZ2 =
1
1
1
1
1
1
308
Нейронные сети. MATLAB 6
Применение функции:
Функция вычисления потенциала netsum применяется в архитектуре персептрона
и линейных нейронных, формируемых с помощью М-функций newp и newlin.
Чтобы применить функцию вычисления потенциала netsum, следует установить
значение свойства net.layers{i}.netInputFcn равным 'netsum'.
Алгоритм:
Производная суммы по любому элементу этой суммы всегда является массивом
единиц, имеющим те же размеры, что и сумма.
Сопутствующие функции: SIM, NETPROD, CONCUR.
NETPROD, DNETPROD
Поэлементное произведение взвешенных входов
Блок Simulink:
Синтаксис:
N = netprod(Z1,Z2,...)
df = netprod('deriv')
dN_dZi = dnetprod(Zi,N)
Описание:
Функция N = netprod(Z1, Z2, ...) вычисляет функцию накопления потенциала нейрона
в виде поэлементного произведения массивов взвешенных входов Zi размера SQ, где
S – число нейронов в слое, Q – число элементов вектора входа. Для описания операции,
выполняемой этим блоком, можно ввести следующую нотацию:
(11.5)
N   Z i  Z1 . * Z 2 . * ... . * Z n ,
.
где символ
.
обозначает поэлементное произведение.
Функция df = netprod('deriv') возвращает имя М-функции, которая вычисляет производную от поэлементного произведения массивов.
Функция dN_dZi = dnetprod(Zi, N) вычисляет производную от поэлементного произведения взвешенных входов N по одному из входов. Здесь N, Zi и dN_dZi – массивы одинакового размера SQ.
Пример:
Вычислить функцию накопления для следующих взвешенных входов:
Z1 = [ 1 2 4; 3 4 1];
Z2 = [–1 2 2; –5 –6 1];
N = netprod(Z1,Z2)
N =
–1
4
8
–15
–24
1
11. Формирование моделей нейронных сетей
309
Вычислить функцию накопления с учетом вектора смещения b. Поскольку массивы
Z1 и Z2 составлены из трех векторов, то с помощью функции concur должен быть создан
массив из трех копий вектора смещения b для того, чтобы все размерности совпадали:
b = [0; –1];
N = netprod(Z1,Z2,concur(b,size(Z1,2)))
N =
0
0
0
15
24
–1
Определим 2 взвешенных входа для слоя с тремя нейронами:
Z1 = [0; 1; –1];
Z2 = [1; 0.5; 1.2];
Вычислить вход нейрона N с помощью функции netprod и затем найти производные
по каждому из взвешенных входов:
N = netprod(Z1,Z2); N'
dN_dZ1 = dnetprod(Z1,N); dN_dZ1'
dN_dZ2 = dnetprod(Z2,N); dN_dZ2'
ans =
0
0.5000
–1.2000
ans = NaN
0.5000
1.2000
ans =
0
1
–1
Применение функции:
Функция поэлементного произведения netprod применяется в архитектуре обобщенных регрессионных и вероятностных сетей, формируемых с помощью М-функций
newgrnn и newpnn.
Чтобы применить функцию вычисления потенциала netprod, следует установить
значение свойства net.layers{i}.netInputFcn равным 'netprod'.
Алгоритм:
Производная поэлементного произведения взвешенных входов по каждому из них
равна поэлементному произведению остальных взвешенных входов, за исключением особого случая, когда взвешенный вход содержит нулевой элемент.
Сопутствующие функции: SIM, NETSUM, CONCUR.
11.4. Функции инициализации
Функции инициализации выполняют подготовку нейронной сети к инициализации
и выполняют саму инициализацию, присваивая начальные значения матрицам весов
и векторам смещений.
Инициализация нейронной сети
INIT
Синтаксис:
net = init(net)
Описание:
Функция net = init(net) выполняет инициализацию нейронной сети, используя
функцию инициализации, определяемую свойством net.initFcn, и значения параметров,
определяемые свойством net.initParam.
310
Нейронные сети. MATLAB 6
Пример:
Сформировать персептрон с одним нейроном, вход которого имеет 2 элемента со значениями в диапазонах [0 1] и [ –2 2].
net = newp([0 1; –2 2], 1);
net.initFcn
net.layers{1}.initFcn
net.inputWeights{1}.initFcn
net.biases{1}.initFcn
ans = initlay
ans = initwb
ans = initzero
ans = initzero
В результате создания персептрона мы видим, что сеть допускает возможность задавать любые функции инициализации весов и смещений, поскольку в качестве функций
готовности выбраны: для сети – функция initlay, для слоя – initwb. В качестве функций
инициализации для весов и смещений персептрона используется функция initzero.
Выведем значения установленных весов и смещений:
net.IW{1,1}
net.b{1}
ans = 0
0
ans =
0
Обучим персептрон на следующих обучающих множествах P = [0 1 0 1; 0 0 1 1]:
T = [0 0 0 1];
net = train(net,P,T);
net.IW{1,1}
net.b{1}
ans =
1
2
ans =
–3
Это приводит к установлению новых значений весов и смещений.
Для того чтобы возвратиться к начальным значениям весов и смещений, характерных
для данной сети, и предназначена функция init:
net = init(net);
net.IW{1,1}
net.b{1}
ans = 0
0
ans =
0
Веса и смещения возвращаются к нулевым значениям, что соответствует свойствам
нейронной сети персептрона.
Алгоритм:
Функция init проверяет свойство net.initFcn, чтобы инициализировать нужным образом веса и смещения. Обычно свойство net.initFcn устанавливается равным 'initlay', что
позволяет устанавливать функции инициализации для каждого слоя, используя свойство
net.layers{i}.initFcn.
11. Формирование моделей нейронных сетей
311
В сетях с обратным распространением ошибки свойство net.layers{i}.initFcn устанавливается равным 'initnw', что соответствует алгоритму инициализации Nguyen – Widrow.
Для других сетей значение свойства net.layers{i}.initFcn устанавливается равным
'initwb', что позволяет устанавливать произвольные функции инициализации для каждого
слоя. Наиболее общий тип функции инициализации – это функция rands, которая генерирует случайные значения весов и смещений в диапазоне [–1 1].
Сопутствующие функции: SIM, ADAPT, TRAIN, INITLAY, INITNW, INITWB, RANDS.
INITLAY
Функция готовности сети к инициализации
Синтаксис:
net = initlay(net)
info = initlay(code)
Описание:
Функция net = initlay(net) устанавливает, что в сети net для инициализации ее слоев
могут быть использованы собственные функции инициализации, определяемые свойством
net.layers{i}.initFcn.
Функция info = initlay(code) возвращает информацию о параметрах инициализации,
соответствующую следующим значениям аргумента code:
'pnames' – имена параметров инициализации;
'pdefaults' – значения параметров инициализации по умолчанию.
Initlay не имеет параметров инициализации.
Применение функции:
Функция инициализации initlay используется при создании сетей с помощью методов
newp, newlin, newff, newcf, а также при формировании сетей с атрибутами, определяемыми пользователем.
Для того чтобы подготовить сеть к заданию произвольных функций инициализации
слоев, необходимо:
 установить свойство сети net.initFcn равным 'initlay'. Это автоматически установит
свойство net.initParam равным пустой матрице [ ], так как функция initlay не имеет параметров инициализации;
 установить значения свойств net.layers{i}.initFcn, соответствующие выбранным функциям инициализации для слоя, например initwb или initnw.
Для того чтобы фактически инициализировать сеть, т. е. присвоить значения матрицам весов и векторам смещений, необходимо применить функцию init.
Алгоритм:
Веса и смещения в каждом слое i сети net инициализируются функцией, заданной
значением свойства net.layers{i}.initFcn.
Сопутствующие функции: INITWB, INITNW, INIT.
312
Нейронные сети. MATLAB 6
INITWB
Функция готовности слоя к инициализации
Синтаксис:
net = initwb(net,I)
Описание:
Функция net = initwb(net, I) устанавливает, что в сети net для инициализации слоя I будет
использована функция инициализации, определяемая свойством net.layers{i}.initFcn.
Применение функции:
Функция инициализации initwb используется при создании сетей с помощью методов
newp, newlin, newff, а также при формировании сетей с атрибутами, определяемыми пользователем.
Для того чтобы подготовить сеть к заданию произвольных функций инициализации
слоев, необходимо:
 установить свойство сети net.initFcn равным 'initlay'. Это автоматически установит
свойство net.initParam равным пустой матрице [ ], так как функция initlay не имеет параметров инициализации;
 установить значение свойства net.layers{i}.initFcn равным 'initwb';
 установить значения свойств net.inputWeights{i, j}.initFcn, net.layerWeights{i, j}.initFcn,
net.biases{i}.initFcn, соответствующие выбранным функциям инициализации, например
rands или midpoint.
Для того чтобы фактически инициализировать сеть, т. е. присвоить значения матрицам весов и векторам смещений, необходимо применить функцию init.
Сопутствующие функции: INITNW, INITLAY, INIT.
INITNW
Функция инициализации слоя по алгоритму NW
Синтаксис:
net = initnw(net,I)
Описание:
Функция net = initnw(net, I) инициализирует веса и смещения слоя I сети net, используя алгоритм инициализации Nguyen – Widrow.
Применение функции:
Функция инициализации initnw используется при создании сетей с помощью методов
newff, newcf, а также при формировании сетей с атрибутами, определяемыми пользователем.


Для того чтобы подготовить сеть к заданию функции инициализации initnw, необходимо:
установить свойство сети net.initFcn равным 'initlay'. Это автоматически установит
свойство net.initParam равным пустой матрице [ ], так как функция initlay не имеет параметров инициализации;
установить значение свойства net.layers{i}.initFcn равным 'initnw'.
11. Формирование моделей нейронных сетей
313
Для того чтобы фактически инициализировать сеть, т. е. присвоить значения матрицам весов и векторам смещений, необходимо применить функцию init.
Алгоритм:
Метод Nguyen – Widrow генерирует значения начальных весов и смещений так, чтобы
активные области слоя нейронов были бы распределены приблизительно равномерно
в пространстве входа.
Его преимуществами по сравнению с методом инициализации случайных весов
и смещений являются следующие:
 оптимальное количество используемых нейронов;
 ускорение процедуры обучения, поскольку активные зоны нейронов соответствуют
пространству входа.
Ограничения метода инициализации Nguyen – Widrow связаны с тем, что его можно
применять только к слоям, имеющим смещения, с функцией взвешивания dotprod и функцией накопления netsum.
Если эти условия не выполняются, то следует использовать метод инициализации
rands.
Сопутствующие функции: INITWB, INITLAY, INIT.
INITZERO
Инициализация нулевых значений весов и смещений
IСинтаксис:
W = initzero(S,PR)
b = initzero(S,[1 1])
Описание:
Функция W = initzero(S, PR) присваивает матрице весов слоя нулевые значения
и имеет следующие входные и выходные аргументы.
Входные аргументы:
S – число нейронов в слое;
PR – матрица размера R2, задающая диапазоны изменения элементов входного вектора.
Выходной аргумент:
W – нулевая матрица весов размера SR.
Функция b = initzero(S, [1 1]) присваивает вектору смещений слоя нулевые значения
и имеет следующие входные и выходные аргументы.
Входной аргумент:
S – число нейронов в слое.
Выходной аргумент:
b – нулевой вектор смещений размера S1.
314
Нейронные сети. MATLAB 6
Пример:
Присвоить нулевые значения матрице весов и вектору смещения для слоя с пятью
нейронами и вектором входа, элементы которого принимают значения в диапазонах [0 1],
[–2 2].
W = initzero(5, [0 1; –2 2])
b = initzero(5, [1 1])
W =
0
0
0
0
0
b =
0
0
0
0
0
0
0
0
0
0
Применение функции:
Функция инициализации initzero используется при создании сетей с помощью методов
newp, newlin, а также при формировании сетей с атрибутами, определяемыми пользователем.
Для того чтобы подготовить сеть к заданию функции инициализации initzero, необходимо:



установить свойство сети net.initFcn равным 'initlay'. Это автоматически установит
свойство net.initParam равным пустой матрице [ ], так как функция initlay не имеет параметров инициализации;
установить значение свойства net.layers{i}.initFcn равным 'initwb';
установить значения свойств net.inputWeights{i, j}.initFcn, net.layerWeights{i, j}.initFcn,
net.biases{i}.initFcn равными initzero.
Для того чтобы фактически инициализировать сеть, т. е. присвоить нулевые значения
матрицам весов и векторам смещений, необходимо применить функцию init.
Сопутствующие функции: INITWB, INITLAY, INIT.
MIDPOINT
Инициализация матрицы средних значений
Синтаксис:
W = midpoint(S,PR)
Описание:
Функция W = midpoint (S, PR) присваивает элементам матрицы весов слоя средние
значения элементов вектора входа и имеет следующие входные и выходные аргументы.
Входные аргументы:
S – число нейронов в слое;
PR – матрица размера R2, задающая диапазоны изменения элементов входного вектора [Pmin Pmax].
Выходной аргумент:
W – матрица весов размера SR с элементами столбцов, равными (Pmin+Pmax)/2.
11. Формирование моделей нейронных сетей
315
Пример:
Присвоить нулевые значения матрице весов и вектору смещения для слоя с пятью нейронами и вектором входа, элементы которого принимают значения в диапазонах [0 1], [–2 2].
W = midpoint(5,[0 1; –2 2])
W =
5.0000e–001
0
5.0000e–001
0
5.0000e–001
0
5.0000e–001
0
5.0000e–001
0
Применение функции:
Функция инициализации midpoint используется при создании сетей с помощью метода newp, а также при формировании сетей с атрибутами, определяемыми пользователем.
Для того чтобы подготовить сеть к заданию функции инициализации midpoint, необходимо:
установить свойство сети net.initFcn равным 'initlay'. Это автоматически установит
свойство net.initParam равным пустой матрице [ ], так как функция initlay не имеет параметров инициализации;
установить значение свойства net.layers{i}.initFcn равным 'initwb';
установить значения свойств net.inputWeights{i, j}.initFcn, net.layerWeights{i, j}.initFcn
равными midpoint.



Для того чтобы фактически инициализировать сеть, т. е. присвоить нулевые значения
матрицам весов и векторам смещений, необходимо применить функцию init.
Сопутствующие функции: INITWB, INITLAY, INIT.
RANDS
Инициализация случайных весов/смещений
Синтаксис:
W = rands(S,PR)
M = rands(S,R)
v = rands(S)
Описание:
Функции семейства rands предназначены для инициализации случайных массивов весов и смещений.
Функция W = rands(S, PR) имеет 2 входных аргумента:
S – число нейронов;
PR – массив минимальных и максимальных значений вектора входа размера R2.
Выходом является случайная матрица весов размера SR с элементами из диапазона [–1 1].
Функция M = rands(S, R) использует в качестве второго аргумента параметр R, соответствующий числу элементов вектора входа. Выходом также является случайная матрица весов размера SR с элементами из диапазона [–1 1].
316
Нейронные сети. MATLAB 6
Функция v = rands(S) возвращает случайный вектор размера S1 с элементами из диапазона [–1 1].
Пример:
Сформируем с помощью функции rands различные массивы случайных величин:
W
M
v
W
= rands(4,[0 1; –2 2])
= rands(2,3)
= rands(4)
=
0.9003
0.7826
–0.5377
0.5242
0.2137
–0.0871
–0.0280
–0.9630
M =
0.6428
0.2309
0.8436
–0.1106
0.5839
0.4764
v =
–0.6475
–0.1886
0.8709
0.8338
Применение функции:



Для того чтобы подготовить сеть к заданию функции инициализации rands, необходимо:
установить свойство сети net.initFcn равным 'initlay'. Это автоматически установит
свойство net.initParam равным пустой матрице [ ], так как функция initlay не имеет параметров инициализации;
установить значение свойства net.layers{i}.initFcn равным 'initwb';
установить значения свойств net.inputWeights{i, j}.initFcn, net.layerWeights{i, j}.initFcn
равными rands.
Для того чтобы фактически инициализировать сеть, т. е. присвоить случайные значения матрицам весов и векторам смещений, необходимо применить функцию init.
Сопутствующие функции: RANDNR, RANDNC, INITWB, INITLAY, INIT.
RANDNC
Инициализация случайной матрицы
с нормированными столбцами
Синтаксис:
W = randnc(S,PR)
W = randnc(S,R)
Описание:
Функции семейства randnc аналогичны функциям rands, но предназначены только для
инициализации весов. К ним возможны 2 формы обращения, которые возвращают случайную матрицу весов размера SR с нормированными столбцами.
11. Формирование моделей нейронных сетей
317
Пример:
Сформируем случайный массив из четырех нормированных трехэлементных столбцов:
M = randnc(3,4)
M =
–0.6007 –0.4715 –0.2724 0.5596
–0.7628 –0.6967 –0.9172 0.7819
–0.2395 0.5406 –0.2907 0.2747
Сопутствующие функции: RANDNR, RANDS.
Инициализация случайной матрицы
с нормированными строками
RANDNR
Синтаксис:
W = randnr(S,PR)
W = randnr(S,R)
Описание:
Функции семейства randnr аналогичны функциям rands, но предназначены только
для инициализации весов. К ним возможны 2 формы обращения, которые возвращают
случайную матрицу весов размера SR с нормированными строками.
Пример:
Создадим случайную матрицу из трех нормированных четырехэлементных строк:
W = randnr(3,4)
W =
0.9713 0.0800 –0.1838 –0.1282
0.8228 0.0338 0.1797 0.5381
–0.3042 –0.5725 0.5436 0.5331
Сопутствующие функции: RANDNC, RANDS.
INITCON
Функция инициализации равных смещений
Синтаксис:
b = initcon(S,PR)
Описание:
Функция initcon является функцией инициализации смещений, которая инициализирует смещения для сети с функцией настройки learncon.
Функция b = initcon(S, PR) присваивает значения вектору смещения и имеет следующие входные и выходные аргументы.
Входные аргументы:
S – число нейронов в слое;
PR – матрица размера R2, задающая диапазоны изменения элементов входного
вектора, по умолчанию [1 1]'.
318
Нейронные сети. MATLAB 6
Выходной аргумент:
b – вектор смещений размера S1.
Функция initcon может также быть использована для инициализации весов, но применение ее для этой цели не рекомендуется.
Пример:
Начальные значения смещений рассчитаем для слоя с пятью нейронами:
b = initcon(5)
b’ =
1.3591e+001 1.3591e+001
1.3591e+001
1.3591e+001
1.3591e+001
Применение функции:
Функция инициализации initcon используется при создании сетей с помощью метода
newc, а также при формировании сетей с атрибутами, определяемыми пользователем.
Для того чтобы подготовить сеть к заданию функции инициализации midpoint,
необходимо:
 установить свойство сети net.initFcn равным 'initlay'. Это автоматически установит
свойство net.initParam равным пустой матрице [ ], так как функция initlay не имеет параметров инициализации;
 установить значение свойства net.layers{i}.initFcn равным 'initwb';
 установить свойство net.biases{i}.initFcn на 'initcon'.
Для того чтобы фактически инициализировать сеть, необходимо применить функцию init.
Алгоритм:
Функция learncon модифицирует смещения так, чтобы значение каждого смещения
b(i) являлось функцией среднего значения выхода для нейрона с номером i. Начальные
значения смещений устанавливаются равными
b(i) = exp(1)S.
Сопутствующие функции: INITWB, INITLAY, INIT, LEARNCON.
REVERT
Возвращение к ранее установленным значениям
весов и смещений
Синтаксис:
net = revert(net)
Описание:
Функция net = revert(net) возвращает веса и смещения к значениям, соответствующим
последней процедуре инициализации. Если же изменениям подвергались связи между
нейронами или изменялось их количество, то функция revert не может восстановить
прежних значений и присваивает весам и смещениям нулевые значения.
Сопутствующие функции: INIT, SIM, ADAPT, TRAIN.
11. Формирование моделей нейронных сетей
319
11.5. Функции адаптации и обучения
Функции адаптации
Метод адаптации. В качестве метода адаптации сетей в ППП NNT применяется функция
adapt, которая позволяет установить функции адаптации сети и настройки ее параметров,
присваивая свойствам net.adaptFcn и net.adaptParam требуемые значения.
ADAPT
Адаптация параметров сети
Синтаксис:
[net,Y,E,Pf,Af] = adapt(net,P,T,Pi,Ai)
Описание:
Функция [net, Y, E, Pf, Af] = adapt(net, P, T, Pi, Ai) является методом для объектов
класса network object, который реализует режим адаптации нейронной сети. Эта функция
характеризуется следующими входными и выходными аргументами.
Входные аргументы:
net – имя нейронной сети;
P – массив входов;
T – вектор целей, по умолчанию нулевой вектор;
Pi – начальные условия на линиях задержки входов, по умолчанию нулевой вектор;
Ai – начальные условия на линиях задержки слоев, по умолчанию нулевой вектор.
Выходные аргументы:
net – структура объекта network object после адаптации;
Y – массив выходов;
E – массив ошибок;
Pf – начальные условия на линиях задержки входов после адаптации;
Af – начальные условия на линиях задержки слоев после адаптации.
Заметим, что входной аргумент T используется только при наличии целевых выходов.
Аргументы Pi и Pf используются только в случае динамических сетей, имеющих линии
задержки на входах или в слоях.
Входные аргументы P и T могут иметь 2 формата: формат cell array и double array.
Формат cell array наиболее прост для понимания и соответствует последовательному
представлению данных.
Последовательное представление данных. Каждую строку массива ячеек можно рассматривать как временную последовательность, и тогда описание многомерной сети может
быть выполнено следующим образом:
P – массив ячеек размера NiTS, каждый элемент которого P{i, ts} – числовой массив
размера RiQ;
T – массив ячеек размера NtTS, каждый элемент которого P{i, ts} – числовой массив
размера ViQ;
Pi –массив ячеек размера NiID, каждый элемент которого Pi{i, k} – числовой массив
размера RiQ;
320
Нейронные сети. MATLAB 6
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
Y – массив ячеек размера NoTS, каждый элемент которого Y{i, ts} – числовой массив размера UiQ;
Pf – массив ячеек размера NiID, каждый элемент которого Pf{i, k} – числовой массив
размера RiQ;
Af – массив ячеек размера NlLD, каждый элемент которого Af{i, k} – числовой массив размера SiQ.
Параметры описания массивов ячеек и их связь с параметрами сети показаны в следующей таблице.
Параметр
описания
Параметр сети
Ni
net.numInputs
Nl
net.numLayers
No
net.numOutputs
Nt
net.numTargets
ID
net.numInputDelays
TS
Q
LD
net.numLayerDelays
Ri
net.inputs{i}.size
Si
net.layers{i}.size
Vi
net.targets{i}.size
Ui
net.outputs{i}.size
Назначение
Количество векторов входа
Количество слоев
Количество выходов
Количество целевых выходов
Максимальное значение задержки на входе
Число шагов по времени
Количество реализаций для фиксированного
момента времени
Максимальные значения задержек для слоев
Количество элементов i-го вектора входа
Количество нейронов i-го слоя
Количество элементов i-го вектора цели
Количество элементов i-го вектора выхода
Столбцы массивов начальных условий Pi, Pf, Ai, Af упорядочены следующим образом:
Pi{i, k} – значение начального условия для линии задержки i-го входа в момент времени ts = k – ID;
Pf{i, k} – значение начального условия для линии задержки i-го входа в момент времени ts = TS + k – ID;
Ai{i, k} – значение начального условия для линии задержки i-го слоя в момент времени ts = k – LD;
Af{i, k} – значение начального условия для линии задержки i-го слоя в момент времени ts = TS + k – LD.
Групповое представление данных можно использовать только при адаптации статических
сетей (TS = 1). При этом следует помнить, что при переходе от формата последовательного представления данных cell array к формату группового представления double array массив ячеек, содержащий, например, Ni числовых массивов размера RiQ, преобразуется в
единственный числовой массив размера
Ni
 Ri Q.
i 1
11. Формирование моделей нейронных сетей
321
Следующая таблица поясняет связь этих форм представления.
Аргумент
Формат
Cell array
Size(P)
Size(P{I,1})
P
Ni1
RiQ
T
Nt1
ViQ
Pi
NiID
RiQ
Ai
NlLD
SiQ
Y
No1
UiQ
Pf
NiID
RiQ
Af
NlLD
SiQ
Double array
Size(P)
Ni
 Ri  Q
i 1
Nt
Vi  Q
i 1
Ni
 Ri  ( ID * Q)
i 1
Nl
 S i  ( LD * Q)
i 1
No
U i  Q
i 1
Ni
 Ri  ( ID * Q)
i 1
Nl
 S i  ( LD * Q)
i 1
Алгоритм:
Метод adapt вызывает функцию адаптации, заданную свойством net.adaptFcn со значениями параметров адаптации, заданными свойством net.adaptParam. Заданную входную
последовательность длиной TS циклов сеть обрабатывает следующим способом: на каждом шаге адаптации сети представляется 1 вектор последовательности и обновляются веса и смещения. Таким образом, при проходе одной последовательности параметры сети
обновляются TS раз.
Сопутствующие функции: SIM, INIT, TRAIN.
Переопределяемые методы:
network\sim
network\init
network\train
ADAPTWB
Функция установки режима адаптации
Синтаксис:
[net,Ac,El] = adaptwb(net,Pd,Tl,Ai,Q,TS)
info = adaptwb(code)
322
Нейронные сети. MATLAB 6
Описание:
Функция [net, Ac, El] = adaptwb(net, Pd, Tl, Ai, Q, TS) устанавливает режим адаптации,
при котором веса и смещения каждого слоя могут быть настроены с использованием собственной функции настройки. Функция adaptwb имеет следующие входные и выходные
аргументы.
Входные аргументы:
net – исходная нейронная сеть;
Pd – вектор максимальных задержек по слоям;
Tl – вектор целей для слоя;
Ai – начальные условия на линиях задержки;
Q – количество реализаций для фиксированного момента времени;
TS – число шагов по времени.
Выходные аргументы:
net – структура объекта network object после адаптации;
Ac – массив выходов слоя;
El – массив ошибок для слоя.
Входные и выходные массивы характеризуются следующими размерами:
Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой
массив размера ZijQ;
Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой [];
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой
массив размера SiQ;
El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой [].
Параметры описания массивов ячеек и их связь с параметрами сети представлены
в следующей таблице.
Параметр
описания
Параметр сети
Ni
net.numInputs
Nl
net.numLayers
No
net.numOutputs
Nt
net.numTargets
ID
net.numInputDelays
LD
net.numLayerDelays
Ri
net.inputs{i}.size
Si
net.layers{i}.size
Vi
net.targets{i}.size
TS
Назначение
Количество векторов входа
Количество слоев
Количество выходов
Количество целевых выходов
Максимальное значение задержки на входе
Максимальные значения задержек для слоев
Количество элементов i-го вектора входа
Количество нейронов i-го слоя
Количество элементов i-го вектора цели
Число шагов по времени
11. Формирование моделей нейронных сетей
323
Q
Zij
Количество реализаций для фиксированного
момента времени
Произведение длины вектора входа слоя i на максимальное значение задержки от слоя i к слою j:
Ri * length(net.inputWeights{i, j}.delays)
Функция адаптации adaptwb имеет параметр net.adaptParam.passes, который определяет количество проходов обучающей последовательности в процессе адаптации, по умолчанию 1.
Функция info = adaptwb(code) возвращает информацию о параметрах адаптации, соответствующую следующим значениям аргумента code:
'pnames' – имена параметров адаптации;
'pdefaults' – значения параметров адаптации по умолчанию.
Применение функции:
Функция адаптации adaptwb используется при создании сетей с помощью методов newp,
newlin, а также при формировании сетей с атрибутами, определяемыми пользователем.





Для того чтобы подготовить сеть к адаптации параметров слоев, необходимо:
установить свойство сети net.adaptFcn равным 'adaptwb'. Это автоматически установит
свойство net.adaptParam равным значению по умолчанию;
установить значения свойств net.layerWeights{i, j}.learnFcn, net.biases{i}.learnFcn
соответствующими выбранным функциям настройки.
Для того чтобы фактически адаптировать сеть, необходимо:
выполнить инициализацию сети;
присвоить значения параметрам адаптации, т. е. свойствам net.adaptParam;
применить функцию adapt.
Алгоритм:
Веса и смещения слоя изменяются в соответствии с заданной функцией настройки
на каждом шаге адаптации.
Сопутствующие функции: NEWP, NEWLIN, TRAIN.
В состав 12-го выпуска программных продуктов фирмы MathWorks включена новая
обучающая функция trains, которая реализует адаптивное обучение с последовательным
представлением входов и предназначена для того, чтобы в дальнейшем заменить функцию адаптации adaptwb, которая отнесена к категории устаревших (obsolete). Это означает, что при использовании метода adapt теперь следует устанавливать свойство сети
net.adaptFcn равным 'trains'. Если же используется метод train, то следует установить свойство сети net.trainFcn равным 'trains'. Фактически это означает, что процедуры адаптации
выводятся из употребления и заменяются процедурами обучения. Однако для сохранения
преемственности с предшествующими версиями ППП NNT допустимо использовать
и метод адаптации.
324
Нейронные сети. MATLAB 6
TRAINS
Адаптивное обучение с последовательным
представлением входов
Синтаксис:
[net,TR,Ac,El] = trains(net,Pd,Tl,Ai,Q,TS,VV,TV)
info = trains(code)
Описание:
Функция trains не вызывается непосредственно. К ней обращаются методы adapt
и train, когда свойства net.adaptFcn или net.trainFcn соответствуют значению 'trains'. Функция trains настраивает веса и смещения на каждом шаге адаптивного обучения. При этом
реализуется последовательное представление входов.
Функция [net, TR, Ac, El] = trains(net Pd, Tl, Ai, Q, TS, VV, TV) имеет следующие
входные и выходные аргументы.
Входные аргументы:
net – исходная нейронная сеть;
Pd – вектор максимальных задержек по слоям;
Tl – вектор целей для слоя;
Ai – начальные условия на линиях задержки;
Q – количество реализаций для фиксированного момента времени;
TS – число шагов по времени;
VV – структура, описывающая контрольное множество;
TV – структура, описывающая тестовое множество.
Выходные аргументы:
net – структура объекта network object после адаптации;
TR – характеристики процедуры обучения:
TR.timesteps – длина последней выборки;
TR.perf – значения функции качества на последнем цикле обучения;
Ac – массив выходов слоя для последнего цикла;
El – массив ошибок для слоя для последнего цикла.
Входные и выходные массивы характеризуются следующими размерами:
Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой
массив размера ZijQ;
Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой [];
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой
массив размера SiQ;
El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой [].
Параметры описания массивов ячеек и их связь с параметрами сети представлены
в следующей таблице.
11. Формирование моделей нейронных сетей
325
Параметр
описания
Параметр сети
Ni
net.numInputs
Nl
net.numLayers
No
net.numOutputs
Nt
net.numTargets
ID
net.numInputDelays
LD
net.numLayerDelays
Ri
net.inputs{i}.size
Si
net.layers{i}.size
Vi
net.targets{i}.size
TS
Q
Zij
Назначение
Количество векторов входа
Количество слоев
Количество выходов
Количество целевых выходов
Максимальное значение задержки на входе
Максимальные значения задержек для слоев
Количество элементов i-го вектора входа
Количество нейронов i-го слоя
Количество элементов i-го вектора цели
Число шагов по времени
Количество реализаций для фиксированного
момента времени
Произведение длины вектора входа слоя i на максимальное значение задержки от слоя i к слою j:
Ri * length(net.inputWeights{i, j}.delays)
Функция адаптивного обучения trains имеет параметр net.trainParam.passes, который
определяет количество проходов обучающей последовательности в процессе адаптации,
по умолчанию 1.
Функция trains не использует для оценки представительности выборки контрольного
и тестового подмножеств, поэтому входные аргументы VV и TV игнорируются.
Функция info = trains(code) возвращает информацию о параметрах адаптивного обучения, соответствующую следующим значениям аргумента code:
'pnames' – имена параметров адаптивного обучения;
'pdefaults' – значения параметров адаптивного обучения, принимаемые по умолчанию.
Применение функции:
Чтобы сформировать нейронную сеть, используя функцию адаптивного обучения
trains, следует:




установить свойство net.adaptFcn равным 'trains'. Это автоматически установит свойство net.adaptParam равным значению по умолчанию;
установить значения свойств net.layerWeights{i, j}.learnFcn, net.biases{i}.learnFcn
соответствующими выбранным функциям настройки.
Для того чтобы фактически выполнить адаптивное обучение сети, необходимо:
установить желаемые значения параметров настройки весов и смещений;
вызвать функцию adapt.
Алгоритм:
Элементы матриц весов и векторов смещения изменяются в соответствии с заданной
функцией настройки на каждом шаге адаптивного обучения.
326
Нейронные сети. MATLAB 6
Пример:
Создать нейронную сеть на основе персептрона с вектором входа из двух элементов
со значениями из диапазона [–2 2] и выполнить адаптивное обучение, используя функцию
trains.
Формирование персептрона:
net = newp([–2 2;–2 2],1);
Формирование векторов входа и цели:
P = {[2;2] [1;–2] [–2;2] [–1;1]};
T = {[0] [1] [0] [1]};
Адаптивное обучение с использованием трех циклов:
net.adaptFcn = 'trains';
net.adaptParam.passes = 3;
[net,a,e]=adapt(net,P,T);
а
а =
0
1
0
1
Выход сети после адаптивного обучения полностью совпадает с вектором целей.
Сформировать линейную динaмическую нейронную сеть с одним выходом, линией
задержки на входе [0 1], диапазоном изменения элементов входа [–1 1] и адаптивно обучить ее за 80 проходов с параметром скорости обучения 0.01.
Формирование сети:
net = newlin([–1 1],1,[0 1],0.01);
Формирование векторов входа и цели:
P1 = {0 –1 1 1 0 –1 1 0 0 1};
T1 = {0 –1 0 2 1 –1 0 1 0 1};
Адаптивное обучение:
net.trainFcn='trains';
net.trainParam.passes = 80;
[net,TR]=train(net,P1,T1);
Выполним моделирование сети при заданном входе:
Y = sim(net,P1); Y = [Y{:}]
Y = 0.0201
–0.9411
0.0282
–0.9411
0.0282
0.9732
1.9344
0.0201
0.9732
0.9813
Результат моделирования близок к вектору целей. При этом среднеквадратичная
ошибка составляет
E = mse(Y–[T1{:}])
E =
0.0015
Сопутствующие функции: NEWP, NEWLIN, TRAIN, TRAINB, TRAINC, TRAINR.
11. Формирование моделей нейронных сетей
327
Функции обучения
Метод обучения. В качестве метода обучения сетей в ППП NNT версии 4 применяется
функция train, которая позволяет установить процедуры обучения сети и настройки ее
параметров, присваивая свойствам net.trainFcn и net.trainParam требуемые значения.
TRAIN
Обучение нейронной сети
Синтаксис:
[net, TR] = train(net,P,T,Pi,Ai)
[net, TR] = train(net,P,T,Pi,Ai,VV,TV)
Описание:
Функция [net, TR] = train(net, P, T, Pi, Ai) является методом для объектов класса
network object, который реализует режим обучения нейронной сети. Эта функция характеризуется следующими входными и выходными аргументами.
Входные аргументы:
net – имя нейронной сети;
P – массив входов;
T – вектор целей, по умолчанию нулевой вектор;
Pi – начальные условия на линиях задержки входов, по умолчанию нулевой вектор;
Ai – начальные условия на линиях задержки слоев, по умолчанию нулевой вектор.
Выходные аргументы:
net – структура объекта network object после обучения;
TR – характеристики процедуры обучения:
TR.timesteps – длина последней выборки;
TR.perf – значения функции качества на последнем цикле обучения.
Заметим, что входной аргумент T используется только при наличии целевых выходов.
Аргументы Pi и Pf используются только в случае динамических сетей, имеющих линии
задержки на входах или в слоях.
Входные аргументы P и T могут иметь 2 формата: cell array и double array. Формат cell array
наиболее прост для понимания и соответствует последовательному представлению данных.
Последовательное представление данных. Каждую строку массива ячеек можно рассматривать как временную последовательность, и тогда описание многомерной сети может
быть представлено следующим образом:
P – массив ячеек размера NiTS, каждый элемент которого P{i, ts} – числовой массив
размера RiQ;
T – массив ячеек размера NtTS, каждый элемент которого T{i, ts} – числовой массив
размера ViQ;
Pi – массив ячеек размера NiID, каждый элемент которого Pi{i, k} – числовой массив
размера RiQ;
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
328
Нейронные сети. MATLAB 6
Y – массив ячеек размера NoTS, каждый элемент которого Y{i, ts} – числовой массив размера UiQ;
Pf – массив ячеек размера NiID, каждый элемент которого Pf{i, k} – числовой массив
размера RiQ;
Af – массив ячеек размера NlLD, каждый элемент которого Af{i, k} – числовой массив размера SiQ.
Параметры описания массивов ячеек и их связь с параметрами сети представлены
в следующей таблице.
Параметр
описания
Параметр сети
Ni
net.numInputs
Nl
net.numLayers
No
net.numOutputs
Nt
net.numTargets
ID
net.numInputDelays
TS
Q
LD
net.numLayerDelays
Ri
net.inputs{i}.size
Si
net.layers{i}.size
Vi
net.targets{i}.size
Ui
net.outputs{i}.size
Назначение
Количество векторов входа
Количество слоев
Количество выходов
Количество целевых выходов
Максимальное значение задержки на входе
Число шагов по времени
Количество реализаций для фиксированного
момента времени
Максимальные значения задержек для слоев
Количество элементов i-го вектора входа
Количество нейронов i-го слоя
Количество элементов i-го вектора цели
Количество элементов i-го вектора выхода
Столбцы массивов начальных условий Pi, Pf, Ai, Af упорядочены в соответствии со
следующими условиями:
Pi{i, k} – значение начального условия для линии задержки i-го входа в момент времени ts = k – ID;
Pf{i, k} – значение начального условия для линии задержки i-го входа в момент времени ts = TS + k – ID;
Ai{i, k} – значение начального условия для линии задержки i-го слоя в момент времени ts = k – LD;
Af{i, k} – значение начального условия для линии задержки i-го слоя в момент времени ts = TS + k – LD.
Групповое представление данных можно использовать только при обучении статических
сетей (TS = 1). При этом следует помнить, что при переходе от формата последовательного представления данных cell array к формату группового представления double array массив ячеек, содержащий, например, Ni числовых массивов размера RiQ, преобразуется
в единственный числовой массив размера
Ni
 Ri Q.
i 1
Следующая таблица поясняет связь этих форм представления.
11. Формирование моделей нейронных сетей
329
Формат
Аргумент
Size(P)
Cell array
Size(P{I,1})
P
Ni1
RiQ
T
Nt1
ViQ
Pi
NiID
RiQ
Ai
NlLD
SiQ
Double array
Size(P)
Ni
 Ri  Q
i 1
Nt
Vi  Q
i 1
Ni
 Ri  ( ID * Q)
i 1
Nl
 S i  ( LD * Q)
i 1
Функция [net, TR] = train(net, P, T, Pi, Ai, VV, TV) позволяет использовать в процессе
обучения контрольные и тестовые подмножества для оценки представительности используемых обучающих выборок. Эти подмножества описываются массивами структур со
следующими полями:
VV.P, TV.P – контрольное и тестовое подмножества векторов входов;
VV.T, TV.T – контрольное и тестовое подмножества векторов целей;
VV.Pi, TV.Pi – начальные значения задержек на входе сети для контрольного и тестового подмножеств, по умолчанию нулевые;
VV.Ai, TV.Ai – начальные значения задержек на слоях для контрольного и тестового
подмножеств, по умолчанию нулевые.
Алгоритм:
Метод train вызывает функцию обучения, заданную свойством net.trainFcn со значениями
параметров обучения, заданными свойством net.trainParam. Обычно цикл обучения определяется как предъявление сети всех векторов входа. Затем выполняется настройка параметров
сети. Обучение продолжается до тех пор, пока не будет выполнено заданное число циклов
обучения, не будет достигнуто допустимое значение критерия качества обучения или выполнено любое другое условие остановки для выбранной функции обучения.
Сопутствующие функции: SIM, INIT, ADAPT.
Представление входных данных. Для задания способа представления входных данных
в ППП NNT версии 4 включены функции trainb, trainc, trainr и trains. Эти функции должны
быть заданы как значения свойства net.trainFcn. Для каждой из этих функций требуется
задать желаемую функцию настройки параметров, присваивая соответствующие значения
свойствам net.inputWeights{i, j}.learnFcn, net.layerWeights{i, j}.learnFcn, net.biases{i}.learnFcn.
330
Нейронные сети. MATLAB 6
TRAINB
Групповое обучение
Синтаксис:
1trai
[net,TR,Ac,El] = trainb(net,Pd,Tl,Ai,Q,TS,VV,TV)
info = trainb(code)
Описание:
Функция trainb не вызывается непосредственно. К ней обращается метод train, когда
свойство net.trainFcn соответствует значению 'trainb'. Функция trainb настраивает веса
и смещения при каждом предъявлении сети входной последовательности.
Функция [net, TR, Ac, El] = trainb(net Pd, Tl, Ai, Q, TS, VV, TV) имеет следующие
входные и выходные аргументы.
Входные аргументы:
net – исходная нейронная сеть;
Pd – вектор максимальных задержек по слоям;
Tl – вектор целей для слоя;
Ai – начальные условия на линиях задержки;
Q – количество реализаций для фиксированного момента времени;
TS – число шагов по времени;
VV – структура, описывающая контрольное множество;
TV – структура, описывающая тестовое множество.
Выходные аргументы:
net – структура объекта network object после адаптации;
TR – характеристики процедуры обучения:
TR.epoch – вектор, определяющий циклы обучения;
TR.perf – значения функции качества по циклам обучения;
TR.vperf – значения контрольной функции по циклам обучения;
TR.tperf – значения тестовой функции по циклам обучения;
Ac – массив выходов слоя для последнего цикла;
El – массив ошибок слоя для последнего цикла.
Входные и выходные массивы характеризуются следующими размерами:
Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой
массив размера ZijQ;
Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой [];
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой
массив размера SiQ;
El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой [].
Параметры описания массивов ячеек и их связь с параметрами сети представлены
в следующей таблице.
11. Формирование моделей нейронных сетей
331
Параметр
описания
Параметр сети
Ni
net.numInputs
Nl
net.numLayers
Nt
net.numTargets
ID
net.numInputDelays
LD
net.numLayerDelays
Ri
net.inputs{i}.size
Si
net.layers{i}.size
Vi
net.targets{i}.size
TS
Q
Zij
Назначение
Количество векторов входа
Количество слоев
Количество целевых выходов
Максимальное значение задержки на входе
Максимальные значения задержек для слоев
Количество элементов i-го вектора входа
Количество нейронов i-го слоя
Количество элементов i-го вектора цели
Число шагов по времени
Количество реализаций для фиксированного
момента времени
Произведение длины вектора входа слоя i на максимальное значение задержки от слоя i к слою j:
Ri * length(net.inputWeights{i, j}.delays)
Если входные аргументы VV или TV не пустые ([ ]), то они должны быть массивами
структур:
VV.PD, TV.PD – контрольное и тестовое подмножества векторов входов после линии
задержки, по умолчанию нулевые;
VV.Tl, TV.Tl – контрольное и тестовое подмножества векторов целей слоя;
VV.Ai, TV.Ai – контрольное и тестовое подмножества начальных условий на входе;
VV.Q, TV.Q – число выборок контрольного и тестового подмножеств;
VV.TS, TV.TS – длина выборок контрольного и тестового подмножеств.
Контрольные и тестовые подмножества используются для предотвращения явления
переобучения.
Процедура обучения прекращается при достижении следующих значений параметров
функции trainb:
Параметр
net.trainParam.epochs
net.trainParam.goal
net.trainParam.max_fail
net.trainParam.show
net.trainParam.time
Назначение
Максимальное число циклов обучения, по умолчанию 100
Предельное значение показателя качества обучения, по умолчанию 0
Максимально допустимый уровень превышения ошибки контрольного подмножества по сравнению с обучающим, по умолчанию 5
Интервал вывода данных, по умолчанию 25 циклов, отмена вывода – NaN
Максимальное время обучения в секундах, по умолчанию Inf
Функция info = trainb(code) возвращает информацию о параметрах группового обучения, соответствующую следующим значениям аргумента code:
'pnames' – имена параметров группового обучения;
'pdefaults' – значения параметров группового обучения, принимаемые по умолчанию.
332
Нейронные сети. MATLAB 6
Применение функции:
Чтобы сформировать нейронную сеть, используя функцию обучения trainb, следует:





установить свойство net.trainFcn равным 'trainb'. Это автоматически установит свойство net.trainParam равным значению по умолчанию;
установить значения свойств net.inputWeights{i, j}.learnFcn, net.layerWeights{i, j}.learnFcn,
net.biases{i}.learnFcn соответствующими выбранным функциям настройки.
Для того чтобы фактически выполнить групповое обучение сети, необходимо:
установить желаемые значения параметров настройки весов и смещений;
установить желаемые значения свойств net.trainParam;
вызвать функцию train.
Алгоритм:
Элементы матриц весов и векторов смещения изменяются в соответствии с заданной
функцией настройки на каждом цикле обучения.




Обучение прекращается, когда выполняется одно из следующих условий:
достигнуто максимальное число циклов обучения;
значение функции качества стало меньше предельного;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
Пример:
Сформировать динaмическую линейную нейронную сеть с одним выходом, линией
задержки на входе [0 1], диапазоном изменения элементов входа [–1 1] и адаптивно обучить ее за 200 циклов с параметром скорости обучения 0.01.
Формирование сети:
net = newlin([–1 1],1,[0 1],0.01);
Формирование векторов входа и цели:
P1 = {0 –1 1 1 0 –1 1 0 0 1};
T1 = {0 –1 0 2 1 –1 0 1 0 1};
Групповое обучение:
net.trainFcn='trainb';
net.trainParam.epochs = 200;
[net,TR]=train(net,P1,T1); % Рис.11.42
На рис. 11.42 представлена зависимость показателя качества в течение 200 циклов
обучения.
11. Формирование моделей нейронных сетей
333
Рис. 11.42
Выполним моделирование сети при заданном входе:
Y = sim(net,P1); Y = [Y{:}]
Y = 0.0002
–0.9994
0.0003
–0.9994
0.0003
0.9997
1.9993
0.0002
0.9997
0.9998
Результат моделирования близок к вектору целей. При этом среднеквадратичная
ошибка составляет
E = mse(Y–[T1{:}])
E = 1.5137e–007
Сопутствующие функции: NEWP, NEWLIN, TRAIN.
TRAINC
Обучение нейронной сети c циклическим
представлением входа
Синтаксис:
[net,TR,Ac,El] = trainc(net,Pd,Tl,Ai,Q,TS,VV,TV)
info = trainc(code)
Описание:
Функция trainc не вызывается непосредственно. К ней обращается метод train, когда свойство net.trainFcn соответствует значению 'trainc'. Функция trainc настраивает веса и смещения
при каждом предъявлении сети входной последовательности в циклическом порядке.
Функция [net, TR, Ac, El] = trainc(net Pd, Tl, Ai, Q, TS, VV, TV) имеет следующие
входные и выходные аргументы.
Входные аргументы:
net – исходная нейронная сеть;
Pd – вектор максимальных задержек по слоям;
Tl – вектор целей для слоя;
Ai – начальные условия на линиях задержки;
Q – количество реализаций для фиксированного момента времени;
TS – число шагов по времени;
VV – структура, описывающая контрольное множество;
TV – структура, описывающая тестовое множество.
334
Нейронные сети. MATLAB 6
Выходные аргументы:
net – структура объекта network object после адаптации;
TR – характеристики процедуры обучения:
TR.epoch – вектор, определяющий циклы обучения;
TR.perf – значения функции качества по циклам обучения;
Ac – массив выходов слоя для последнего цикла;
El – массив ошибок слоя для последнего цикла.
Входные и выходные массивы характеризуются следующими размерами:
Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой
массив размера ZijQ;
Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой [];
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой
массив размера SiQ;
El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой [].
Параметры описания массивов ячеек и их связь с параметрами сети представлены
в следующей таблице.
Параметр
описания
Параметр сети
Ni
net.numInputs
Nl
net.numLayers
Nt
net.numTargets
ID
net.numInputDelays
LD
net.numLayerDelays
Ri
net.inputs{i}.size
Si
net.layers{i}.size
Vi
net.targets{i}.size
TS
Q
Zij
Назначение
Количество векторов входа
Количество слоев
Количество целевых выходов
Максимальное значение задержки на входе
Максимальные значения задержек для слоев
Количество элементов i-го вектора входа
Количество нейронов i-го слоя
Количество элементов i-го вектора цели
Число шагов по времени
Количество реализаций для фиксированного
момента времени
Произведение длины вектора входа слоя i на максимальное значение задержки от слоя i к слою j:
Ri * length(net.inputWeights{i, j}.delays)
Функция trainc не выполняет проверки обучающей последовательности на представительность, поэтому входные аргументы VV и TV не используются.
Процедура обучения прекращается при достижении следующих значений параметров
функции trainc:
11. Формирование моделей нейронных сетей
335
Параметр
Назначение
net.trainParam.epochs
Максимальное число циклов обучения, по умолчанию 100
Предельное значение показателя качества обучения, по умолчанию 0
Интервал вывода данных, по умолчанию 25 циклов, отмена вывода – NaN
Максимальное время обучения в секундах, по умолчанию Inf
net.trainParam.goal
net.trainParam.show
net.trainParam.time
Функция info = trainc(code) возвращает информацию о параметрах обучения, соответствующую следующим значениям аргумента code:
'pnames' – имена параметров процедуры обучения с циклическим представлением
входа;
'pdefaults' – значения параметров процедуры обучения с циклическим представлением
входа, принимаемые по умолчанию.
Применение функции:
Чтобы сформировать нейронную сеть, используя функцию обучения trainc, следует:





установить свойство net.trainFcn равным 'trainc'. Это автоматически установит свойство net.trainParam равным значению по умолчанию;
установить значения свойств net.inputWeights{i, j}.learnFcn, net.layerWeights{i, j}.learnFcn,
net.biases{i}.learnFcn соответствующими выбранным функциям настройки.
Для того чтобы фактически выполнить обучение сети, необходимо:
установить желаемые значения параметров настройки весов и смещений;
установить желаемые значения свойств net.trainParam;
вызвать функцию train.
Алгоритм:
Элементы матриц весов и векторов смещения изменяются в соответствии с заданной
функцией настройки на каждом цикле обучения.



Обучение прекращается, когда выполняется одно из следующих условий:
достигнуто максимальное число циклов обучения;
значение функции качества стало меньше предельного;
превышено максимальное время, отпущенное на обучение.
Пример:
Сформировать нейронную сеть на основе персептрона с одним выходом и вектором
входа из двух элементов, принимающих значения в диапазоне [–2 2].
Формирование сети:
net = newp([–2 2; –2 2],1);
Формирование векторов входа и цели:
P = [ 2 1 –2 –1;
2 –2 2 1];
T = [ 0 1 0 1];
336
Нейронные сети. MATLAB 6
Обучение с циклическим представлением входа:
net.trainFcn='trainc';
[net,TR]=train(net,P,T); % Рис.11.43
На рис. 11.43 представлена зависимость показателя качества обучения от количества
циклов обучения. Нетрудно убедиться, что абсолютная точность достигается на третьем
цикле обучения.
Рис. 11.43
Выполним моделирование сети при заданном входе:
Y = sim(net, P)
Y = 0
1
0
1
Полученный результат полностью совпадает с заданием.
Найдем значения весов и смещения:
net.IW{1,1}, net.b{1}
ans = –2
–3
ans =
1
Сопутствующие функции: NEWP, NEWLIN, TRAIN.
TRAINR
Обучение нейронной сети в режиме случайного
представления входа
Синтаксис:
[net,TR,Ac,El] = trainr(net,Pd,Tl,Ai,Q,TS,VV,TV)
info = trainr(code)
Описание:
Функция trainr не вызывается непосредственно. К ней обращается метод train, когда
свойство net.trainFcn соответствует значению 'trainr'. Функция trainr настраивает веса
и смещения при каждом предъявлении сети случайной входной последовательности.
Функция [net, TR, Ac, El] = trainr(net Pd, Tl, Ai, Q, TS, VV, TV) имеет следующие
входные и выходные аргументы.
11. Формирование моделей нейронных сетей
337
Входные аргументы:
net – исходная нейронная сеть;
Pd – вектор максимальных задержек по слоям;
Tl – вектор целей для слоя;
Ai – начальные условия на линиях задержки;
Q – количество реализаций для фиксированного момента времени;
TS – число шагов по времени;
VV – структура, описывающая контрольное множество;
TV – структура, описывающая тестовое множество.
Выходные аргументы:
net – структура объекта network object после адаптации;
TR – характеристики процедуры обучения:
TR.epoch – вектор, определяющий циклы обучения;
TR.perf – значения функции качества по циклам обучения;
Ac – массив выходов слоя для последнего цикла;
El – массив ошибок слоя для последнего цикла.
Входные и выходные массивы характеризуются следующими размерами:
Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой
массив размера ZijQ;
Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой [];
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой
массив размера SiQ;
El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой [].
Входные и выходные массивы характеризуются следующими размерами:
Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой
массив размера ZijQ;
Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой [];
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой
массив размера SiQ;
El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой [].
Параметры описания массивов ячеек и их связь с параметрами сети представлены
в следующей таблице.
338
Нейронные сети. MATLAB 6
Параметр
описания
Параметр сети
Ni
net.numInputs
Nl
net.numLayers
Nt
net.numTargets
ID
net.numInputDelays
LD
net.numLayerDelays
Ri
net.inputs{i}.size
Si
net.layers{i}.size
Vi
net.targets{i}.size
TS
Q
Zij
Назначение
Количество векторов входа
Количество слоев
Количество целевых выходов
Максимальное значение задержки на входе
Максимальные значения задержек для слоев
Количество элементов i-го вектора входа
Количество нейронов i-го слоя
Количество элементов i-го вектора цели
Число шагов по времени
Количество реализаций для фиксированного
момента времени
Произведение длины вектора входа слоя i на максимальное значение задержки от слоя i к слою j:
Ri * length(net.inputWeights{i, j}.delays)
Функция trainr не выполняет проверки обучающей последовательности на представительность, поэтому входные аргументы VV и TV не используются.
Процедура обучения прекращается при достижении следующих значений параметров
функции trainr:
Параметр
Назначение
net.trainParam.epochs
Максимальное число циклов обучения, по умолчанию 100
Предельное значение показателя качества обучения, по умолчанию 0
Интервал вывода данных, по умолчанию 25 циклов, отмена вывода – NaN
Максимальное время обучения в секундах, по умолчанию Inf
net.trainParam.goal
net.trainParam.show
net.trainParam.time
Функция info = trainr(code) возвращает информацию о параметрах обучения, соответствующую следующим значениям аргумента code:
'pnames' – имена параметров процедуры обучения в режиме случайного представления входа;
'pdefaults' – значения параметров процедуры обучения в режиме случайного представления входа, принимаемые по умолчанию.
Применение функции:


Чтобы сформировать нейронную сеть, используя функцию обучения trainr, следует:
установить свойство net.trainFcn равным 'trainr'. Это автоматически установит свойство net.trainParam равным значению по умолчанию;
установить значения свойств net.inputWeights{i, j}.learnFcn, net.layerWeights{i, j}.learnFcn,
net.biases{i}.learnFcn соответствующими выбранным функциям настройки.
11. Формирование моделей нейронных сетей
339
Для того чтобы фактически выполнить обучение сети, необходимо:



установить желаемые значения параметров настройки весов и смещений;
установить желаемые значения свойств net.trainParam;
вызвать функцию train.
Алгоритм:
Элементы матриц весов и векторов смещения изменяются в соответствии с заданной
функцией настройки на каждом цикле обучения.



Обучение прекращается, когда выполняется одно из следующих условий:
достигнуто максимальное число циклов обучения;
значение функции качества стало меньше предельного;
превышено максимальное время, отпущенное на обучение.
Пример:
Сформировать самоорганизующуюся нейронную сеть для разделения векторов входа
на 2 класса. Векторы входа состоят из двух элементов со значениями из диапазона [0 1].
Сеть имеет 2 выхода (по числу классов) и обучается с помощью функции trainr.
Формирование сети:
net = newc([0 1; 0 1], 2);
Формирование векторов входа:
P = [.1 .8 .1 .9;
.2 .9 .1 .8];
Обучение с циклическим представлением входа:
net.trainFcn ='trainr';
net = train(net,P,T);
Выполним моделирование сети и значения выхода преобразуем в индексы классов:
Y = sim(net,P);
Yc = vec2ind(Y)
Yc = 1
2
1
2
Нейронная сеть справилась с классификацией входных векторов на 2 класса, отнеся
первый и третий векторы к классу 1, а второй и четвертый – к классу 2.
Сопутствующие функции: NEWP, NEWLIN, TRAIN.
Функции обучения. Ниже приведены функции ППП NNT, совместимые как с 11, так и с
12 выпусками ПО MW и предназначенные для реализации конкретных алгоритмов обучения и настройки параметров сети. Все эти функции имеют одинаковый формат вызова
[net,TR,Ac,El] = <имя_функции>(NET,Pd,Tl,Ai,Q,TS,VV,TV)
Они имеют следующие входные и выходные аргументы.
Входные аргументы:
net – исходная нейронная сеть;
Pd – вектор максимальных задержек по слоям;
340
Нейронные сети. MATLAB 6
Tl – вектор целей для слоя;
Ai – начальные условия на линиях задержки;
Q – количество реализаций для фиксированного момента времени;
TS – число шагов по времени;
VV – структура, описывающая контрольное множество;
TV – структура, описывающая тестовое множество.
Выходные аргументы:
net – структура объекта network object после адаптации;
TR – массив записей, содержащий характеристики процедуры обучения:
TR.epoch – вектор, определяющий циклы обучения;
TR.perf – значения функции качества по циклам обучения;
TR.vperf – значения контрольной функции по циклам обучения;
TR.tperf – значения тестовой функции по циклам обучения;
Ac – массив выходов слоя для последнего цикла;
El – массив ошибок слоя для последнего цикла.
Входные и выходные массивы характеризуются следующими размерами:
Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой
массив размера ZijQ;
Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой [];
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой
массив размера SiQ;
El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой [].
Входные и выходные массивы характеризуются следующими размерами:
Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой
массив размера ZijQ;
Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой [];
Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ;
Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой
массив размера SiQ;
El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой [].
Параметры описания массивов ячеек и их связь с параметрами сети представлены
в следующей таблице.
11. Формирование моделей нейронных сетей
341
Параметр
описания
Параметр сети
Ni
net.numInputs
Nl
net.numLayers
Nt
net.numTargets
ID
net.numInputDelays
LD
net.numLayerDelays
Ri
net.inputs{i}.size
Si
net.layers{i}.size
Vi
net.targets{i}.size
TS
Q
Zij
Назначение
Количество векторов входа
Количество слоев
Количество целевых выходов
Максимальное значение задержки на входе
Максимальные значения задержек для слоев
Количество элементов i-го вектора входа
Количество нейронов i-го слоя
Количество элементов i-го вектора цели
Число шагов по времени
Количество реализаций для фиксированного
момента времени
Произведение длины вектора входа слоя i на максимальное значение задержки от слоя i к слою j:
Ri * length(net.inputWeights{i, j}.delays)
Если входные аргументы VV или TV не пустые ([ ]), то они должны быть массивами
структур:
VV.PD, TV.PD – контрольное и тестовое подмножества векторов входов после линии
задержки, по умолчанию нулевые;
VV.Tl, TV.Tl – контрольное и тестовое подмножества векторов целей слоя;
VV.Ai, TV.Ai – контрольное и тестовое подмножества начальных условий на входе;
VV.Q, TV.Q – число выборок контрольного и тестового подмножеств;
VV.TS, TV.TS – длина выборок контрольного и тестового подмножеств.
Контрольные и тестовые подмножества используются для предотвращения явления
переобучения.
Функции обучения могут включать следующие параметры:
Параметр
net.trainParam.epochs
net.trainParam.goal
net.trainParam.show
net.trainParam.min_grad
net.trainParam.time
net.trainParam.max_fail
net.trainParam.searchFcn
342
Назначение
Максимальное количество циклов (эпох) обучения,
по умолчанию 100
Предельное значение критерия обучения, по умолчанию 0
Интервал вывода данных, по умолчанию 25 циклов, отмена
вывода – NaN
Минимальное значение градиента критерия качества,
по умолчанию 1e–6
Максимальное время обучения в секундах, по умолчанию Inf
Максимально допустимый уровень превышения ошибки
контрольного подмножества по сравнению с обучающим,
по умолчанию 5
Имя функции поиска одномерного экстремума,
по умолчанию 'srchbac'
Нейронные сети. MATLAB 6
Функции поиска одномерного экстремума также включают достаточно большое
количество настраиваемых параметров, приведенных в следующей таблице:
Параметр
net.trainParam.scal_tol
net.trainParam.alpha
net.trainParam.beta
net.trainParam.delta
net.trainParam.gama
net.trainParam.low_lim
net.trainParam.up_lim
net.trainParam.maxstep
net.trainParam.minstep
net.trainParam.bmax
net.trainParam.mu
net.trainParam.mu_dec
net.trainParam.mu_inc
net.trainParam.mu_max
net.trainParam.mem_reduc
net.trainParam.lr
net.trainParam.lr_inc
net.trainParam.lr_dec
net.trainParam.delta0
net.trainParam.delt_inc
net.trainParam.delt_dec
net.trainParam.deltamax
Назначение
Параметр, связывающий погрешность tol с шагом delta
по формуле tol = delta/scale_tol, по умолчанию 20
Коэффициент, определяющий порог уменьшения критерия
качества, по умолчанию 0.001
Коэффициент, определяющий выбор шага, по умолчанию 0.1
Начальное значение шага, по умолчанию 0.01
Параметр, регулирующий изменение критерия качества,
по умолчанию 0.1
Нижняя граница изменения шага, по умолчанию 0.1
Верхняя граница изменения шага, по умолчанию 0.5
Максимальное значение шага, по умолчанию 100
Минимальное значение шага, по умолчанию 1.0e–6
Максимальный размер шага, по умолчанию 26
Начальное значение
Коэффициент уменьшения параметра mu, по умолчанию 0.1
Коэффициент увеличения параметра mu, по умолчанию 10
Максимальное значение параметра mu, по умолчанию 1e–10
Параметр разбиения матрицы Якоби на подматрицы, по умолчанию 1
Параметр, по умолчанию 0.01
Коэффициент увеличения скорости настройки, по умолчанию 1.05
Коэффициент уменьшения скорости настройки, по умолчанию 0.7
Начальное значение шага настройки в методе Rprop,
по умолчанию 0.07
Коэффициент увеличения шага настройки в методе Rprop,
по умолчанию 1.2
Коэффициент уменьшения шага настройки в методе Rprop,
по умолчанию 0.5
Максимальное значение шага настройки в методе Rprop,
по умолчанию 50
При описании каждой функции одномерного поиска приводится перечень используемых параметров.
Кроме того, все функции возвращают информацию о параметрах обучающей функции, если используется следующий формат вызова:
info = <имя_функции>(code).
В зависимости от значения аргумента code возвращается следующая информация:
'pnames' – имена параметров процедуры обучения;
'pdefaults' – значения параметров процедуры обучения, принимаемые по умолчанию.
11. Формирование моделей нейронных сетей
343
В качестве примера, иллюстрирующего возможности обучения, рассмотрен общий пример, что позволяет сравнивать описываемые алгоритмы обучения по скорости и точности.
Градиентные алгоритмы обучения
Алгоритм градиентного спуска GD
TRAINGD
Синтаксис:
[net,TR,Ac,El] = traingd(NET,Pd,Tl,Ai,Q,TS,VV)
info = traingd(code)
Описание:
Функция traingd обучает нейронную сеть, используя алгоритм градиентного спуска GD.
Функция при своей работе использует следующие параметры:
info = traingd('pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
max_fail:
searchFcn:
lr:
1.0e–006
5
'srchbac'
0.01
Применение функции:
Функция обучения traingd используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.




Для того чтобы подготовить сеть к обучению, необходимо:
установить свойство сети net.trainFcn равным 'traingd'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:
инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Алгоритм:
Функция traingd выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения (perf) по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с методом градиентного спуска вектор настраиваемых
переменных получает следующие приращения:
dX = lr * dperf/dX.

344
Процедура обучения прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
Нейронные сети. MATLAB 6




градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию traingd.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'traingd');
Обучение сети:
net.trainParam.epochs = 500;
net.trainParam.goal = 0.01;
[net,TR] = train(net,P,T); % Рис.11.44
На рис. 11.44 показано, как изменяется точность в процессе обучения; требуемое значение обеспечивается на 332-м цикле обучения.
Рис. 11.44
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0669
0.0962
0.1284
11. Формирование моделей нейронных сетей
0.8350
0.9640
0.9657
345
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью.
Сопутствующие функции: NEWFF, NEWCF, TRAINGDM, TRAINGDA, TRAINGDX, TRAINLM.
TRAINGDA
Обучение нейронной сети методом GDA
Синтаксис:
[net,TR,Ac,El] = traingda(NET,Pd,Tl,Ai,Q,TS,VV)
info = traingda(code)
Описание:
Функция traingda обучает нейронную сеть, используя алгоритм градиентного спуска
с выбором параметра скорости настройки GDA.
Функция при своей работе использует следующие параметры:
info = traingda('pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
lr:
lr_inc:
lr_dec:
max_perf_inc:
0.01
1.05
0.7
1.04
Применение функции:
Функция обучения traingda используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.
Для того чтобы подготовить сеть к обучению, необходимо:
 установить свойство сети net.trainFcn равным 'traingda'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.



Для того чтобы фактически обучить сеть, необходимо:
инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Алгоритм:
Функция traingda выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с методом градиентного спуска вектор настраиваемых переменных получает следующие приращения:
dX = lr * dperf/dX.
346
Нейронные сети. MATLAB 6
Однако в данном случае, в отличие от алгоритма градиентного спуска, параметр скорости настройки выполняет адаптивную функцию. Он увеличивается в lr_inc раз, если
критерий качества обучения сети уменьшается, и это реализуется на каждом цикле обучения. С другой стороны, если критерий качества увеличился более чем в max_perf_inc раз,
то начинается коррекция параметра скорости настройки в сторону уменьшения с коэффициентом lr_dec.





Процедура обучения прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию traingda.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'traingda');
Обучение сети:
net.trainParam.epochs = 500;
net.trainParam.goal = 0.01;
[net,TR] = train(net,P,T); % Рис.11.45
TR =
epoch: [194 double]
perf: [194 double]
vperf: [194 double]
tperf: [194 double]
lr: [194 double]
11. Формирование моделей нейронных сетей
347
Рис. 11.45
На рис. 11.45 показано, как изменяется точность в процессе обучения; требуемое значение обеспечивается на 93-м цикле обучения; при этом параметр скорости настройки
постоянно растет и достигает значения приблизительно 0.93 (рис. 11.46).
Рис. 11.46
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0376
0.1069
0.1922
0.9121
0.9774
0.9783
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью.
Сопутствующие функции: NEWFF, NEWCF, TRAINGD, TRAINGDM, TRAINGDX, TRAINLM.
TRAINGDM
Алгоритм градиентного спуска с возмущением GDM
Синтаксис:
[net,TR,Ac,El] = traingdm(NET,Pd,Tl,Ai,Q,TS,VV)
info = traingdm(code)
348
Нейронные сети. MATLAB 6
Описание:
Функция traingdm обучает нейронную сеть, используя алгоритм градиентного спуска
с возмущением GDM.
Функция при своей работе использует следующие параметры:
info = traingdm('pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
lr:
max_perf_inc:
mc:
0.01
1.04
0.9
Применение функции:
Функция обучения traingdm используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.




Для того чтобы подготовить сеть к обучению, необходимо:
установить свойство сети net.trainFcn равным 'traingdm'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:
инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Алгоритм:
Функция traingdm выполняет процедуру обучения, если функции взвешивания,
накопления и активации имеют производные. Для вычисления производных критерия
качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с методом градиентного спуска с возмущением
вектор настраиваемых переменных получает следующие приращения:
dX = mc*dXprev + lr*mc*dperf/dX,
где dXprev – вектор возмущения весов и смещений с коэффициентом mc.





Процедура обучения прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
11. Формирование моделей нейронных сетей
349
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию traingdm и увеличим
параметр скорости настройки до 0.1.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'traingdm');
Обучение сети:
net.trainParam.epochs = 500;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;
[net,TR] = train(net,P,T); % Рис.11.47
Рис. 11.47
На рис. 11.47 показано, как изменяется точность в процессе обучения; требуемое
значение обеспечивается на 120-м цикле обучения.
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0787
0.0393
0.1006
0.8696
0.8883
0.8884
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью.
Сопутствующие функции: NEWFF, NEWCF, TRAINGD, TRAINGDA, TRAINGDX, TRAINLM.
350
Нейронные сети. MATLAB 6
TRAINGDX
Обучение нейронной сети методом GDX
Синтаксис:
[net,TR,Ac,El] = traingdx(NET,Pd,Tl,Ai,Q,TS,VV)
info = traingdx(code)
Описание:
Функция traingdx обучает нейронную сеть, используя алгоритм градиентного спуска
с возмущением и адаптацией параметра скорости настройки GDX.
Функция при своей работе использует следующие параметры:
info = traingdx('pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
lr:
lr_inc:
lr_dec:
max_perf_inc:
mc:
0.01
1.05
0.7
1.04
0.9
Применение функции:
Функция обучения traingdx используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.




Для того чтобы подготовить сеть к обучению, необходимо:
установить свойство сети net.trainFcn равным 'traingdx'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:
инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Алгоритм:
Функция traingdx выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с методом градиентного спуска с возмущением вектор
настраиваемых переменных получает следующие приращения:
dX = mc*dXprev + lr*mc*dperf/dX,
где dXprev – вектор возмущения весов и смещений с коэффициентом mc.
Однако в данном случае, в отличие от алгоритма traingdm, параметр скорости
настройки выполняет адаптивную функцию. Он увеличивается в lr_inc раз, если критерий
качества обучения сети уменьшается, и это реализуется на каждом цикле обучения.
11. Формирование моделей нейронных сетей
351
С другой стороны, если критерий качества увеличился более чем в max_perf_inc раз,
то начинается коррекция параметра скорости настройки в сторону уменьшения с коэффициентом lr_dec.





Обучение прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию traingdx.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'traingdx');
Обучение сети:
net.trainParam.epochs = 500;
net.trainParam.goal = 0.01;
[net,TR] = train(net,P,T); % Рис.11.48
TR =
epoch: [1106 double]
perf: [1106 double]
vperf: [1106 double]
tperf: [1106 double]
lr: [1106 double]
352
Нейронные сети. MATLAB 6
Рис. 11.48
На рис. 11.48 показано, как изменяется точность в процессе обучения; требуемое значение обеспечивается на 105-м цикле обучения; при этом параметр скорости настройки
постоянно растет и достигает значения приблизительно 1.7 (рис. 11.49).
Рис. 11.49
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0787
0.0393
0.1006
0.8696
0.8883
0.8884
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью.
Сопутствующие функции: NEWFF, NEWCF, TRAINGD, TRAINGDM, TRAINGDA, TRAINLM.
TRAINRP
Алгоритм обучения Rprop
Синтаксис:
[net,TR,Ac,El]= trainrp(NETt,Pd,Tl,Ai,Q,TS,VV)
info = trainrp(code)
11. Формирование моделей нейронных сетей
353
Описание:
Функция trainrp обучает нейронную сеть, используя пороговый алгоритм обратного
распространения ошибки.
Функция при своей работе использует следующие параметры:
info = trainrp('pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
delt_inc:
delt_dec:
delta0:
deltamax:
1.2
0.5
0.07
50
Применение функции:
Функция обучения trainrp используется при создании сетей с помощью методов newff, newcf,
newelm, а также при формировании сетей с атрибутами, определяемыми пользователем.




Для того чтобы подготовить сеть к обучению, необходимо:
установить свойство сети net.trainFcn равным 'trainrp'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:
инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Алгоритм:
Функция trainrp выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с пороговым алгоритмом обратного распространения вектор
настраиваемых переменных получает следующие приращения:
dX = deltaX.*sign(gX),
где вектору deltaX присваиваются начальные значения delta0, а вектор gX – градиент критерия
качества. На каждой итерации элементы deltaX изменяются. Если некоторый элемент вектора
gX изменяет знак при переходе к следующей итерации, то соответствующий элемент вектора
deltaX умножается на коэффициент delta_dec. Если элемент вектора gX сохраняет знак, то соответствующий элемент вектора deltaX умножается на коэффициент delta_inc [36].




354
Процедура обучения прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
Нейронные сети. MATLAB 6

ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию trainrp.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'trainrp');
Обучение сети:
net.trainParam.epochs = 50;
net.trainParam.show = 10;
net.trainParam.goal = 0.01;
[net,TR] = train(net,P,T); % Рис.11.50
На рис. 11.50 показано, как изменяется точность в процессе обучения; требуемое
значение обеспечивается на 10-м цикле обучения.
Рис. 11.50
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0696
0.0704
0.1339
0.8934
0.9390
0.9399
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью.
Сопутствующие функции: NEWFF, NEWCF, TRAINGDM, TRAINGDA, TRAINGDX, TRAINLM,
TRAINCGP, TRAINCGF, TRAINCGB, TRAINSCG, TRAINOSS, TRAINBFG.
11. Формирование моделей нейронных сетей
355
Алгоритмы метода сопряженных градиентов
Алгоритм Флетчера – Ривса CGF
TRAINCGF
Синтаксис:
[net,TR,Ac,El] = traincgf(NET,Pd,Tl,Ai,Q,TS,VV)
info = traincgf(code)
Описание:
Функция traincgf обучает нейронную сеть, используя метод сопряженного градиента
с обратным распространением ошибки в модификации Флетчера – Ривса.
Функция при своей работе использует следующие параметры:
info = traincgf'pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
searchFcn: 'srchbac'
scale_tol:
alpha:
beta:
delta:
gama:
low_lim:
up_lim:
20
0.001
0.1
0.01
0.1
0.1
0.5
maxstep:
minstep:
bmax:
100
1.0 e–006
26
Применение функции:
Функция обучения traincgf используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.

Для того чтобы подготовить сеть к обучению, необходимо:
установить свойство сети net.trainFcn равным 'traincgf'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:



инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Алгоритм:
Функция traincgf выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с алгоритмом метода сопряженных градиентов вектор
настраиваемых переменных получает следующие приращения:
X = X + a*dX,
356
Нейронные сети. MATLAB 6
где dX – направление поиска. Параметр a выбирается так, чтобы минимизировать критерий качества обучения в направлении поиска. Функция одномерного поиска searchFcn
используется для вычисления минимума. Начальное направление поиска задается вектором, противоположным градиенту критерия качества. При успешных итерациях направление поиска определяется на основе нового значения градиента с учетом прежнего
направления поиска согласно формуле
dX = –gX + dX_old*Z,
где gX – вектор градиента; параметр Z может быть вычислен отдельными различными
способами. Для метода сопряженного градиента в модификации Флетчера – Ривса он рассчитывается согласно формуле [41]
Z = Normnew_sqr/norm_sqr,
где normnew_sqr – квадрат нормы текущего градиента; norm_sqr – квадрат нормы предыдущего градиента.





Обучение прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию traincgf.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'traincgf');
Обучение сети:
net.trainParam.epochs = 50;
net.trainParam.show = 10;
net.trainParam.goal = 0.001;
[net,TR] = train(net,P,T); % Рис.11.51
На рис. 11.51 показано, как изменяется точность в процессе обучения; требуемое
значение обеспечивается на 6-м цикле обучения.
11. Формирование моделей нейронных сетей
357
Рис. 11.51
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0005
0.0005
0.0007
0.9862
0.9964
0.9964
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью равной 0.001, т. е. с точностью на порядок
большей, чем в предшествующих примерах.
Сопутствующие функции: NEWFF, NEWCF, TRAINGDM, TRAINGDA, TRAINGDX, TRAINLM,
TRAINCGP, TRAINCGB, TRAINSCG, TRAINCGP, TRAINOSS, TRAINBFG.
Алгоритм Полака – Рибейры CGP
TRAINCGP
Синтаксис:
[net,TR,Ac,El] = traincgp(NET,Pd,Tl,Ai,Q,TS,VV)
info = traincgp(code)
Описание:
Функция traincgp обучает нейронную сеть, используя метод сопряженного градиента с
обратным распространением ошибки в модификации Полака – Рибейры CGP.
Функция при своей работе использует следующие параметры:
info = traincgp'pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
searchFcn: 'srchbac'
358
scale_tol:
alpha:
beta:
delta:
gama:
low_lim:
up_lim:
20
0.001
0.1
0.01
0.1
0.1
0.5
maxstep:
minstep:
bmax:
100
1.0 e–006
26
Нейронные сети. MATLAB 6
Применение функции:
Функция обучения traincgp используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.

Для того чтобы подготовить сеть к обучению, необходимо:
установить свойство сети net.trainFcn равным 'traincgp'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:



инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Алгоритм:
Функция traincgp выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с алгоритмом метода сопряженных градиентов вектор
настраиваемых переменных получает следующие приращения:
X = X + a*dX,
где dX – направление поиска. Параметр a выбирается так, чтобы минимизировать критерий качества обучения в направлении поиска. Функция одномерного поиска searchFcn
используется для вычисления минимума. Начальное направление поиска задается вектором, противоположным градиенту критерия качества. При успешных итерациях направление поиска определяется на основе нового значения градиента с учетом прежнего
направления поиска согласно формуле
dX = –gX + dX_old*Z,
где gX – вектор градиента; параметр Z может быть вычислен отдельными различными
способами. Для метода сопряженного градиента в модификации Полака – Рибейры он
рассчитывается согласно формуле [41]
Z = ((gX – gX_old)’*gX)/norm_sqr,
где gX_old – вектор градиента на предыдущей итерации; norm_sqr – квадрат нормы вектора градиента.





Обучение прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
11. Формирование моделей нейронных сетей
359
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию traincgp.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'traincgp');
Обучение сети:
net.trainParam.epochs = 50;
net.trainParam.show = 10;
net.trainParam.goal = 0.001;
[net,TR] = train(net,P,T); % Рис.11.52
На рис. 11.52 показано, как изменяется точность в процессе обучения; требуемое
значение обеспечивается на 13-м цикле обучения.
Рис. 11.52
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0000
0.0000
0.0000
0.9491
0.9883
0.9891
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью, равной 0.001.
Сопутствующие функции: NEWFF, NEWCF, TRAINGDM, TRAINGDA, TRAINGDX, TRAINLM,
TRAINRP, TRAINCGF, TRAINCGB, TRAINSCG, TRAINOSS, TRAINBFG.
360
Нейронные сети. MATLAB 6
Алгоритм обучения CGB
TRAINCGB
Синтаксис:
[net,TR,Ac,El] = traincgb(NET,Pd,Tl,Ai,Q,TS,VV)
info = traincgb(code)
Описание:
Функция traincgb обучает нейронную сеть, используя метод сопряженного градиента
с обратным распространением ошибки и рестартами в модификации Пауэлла – Биеле CGB.
Функция при своей работе использует следующие параметры:
info = traincgb'pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
searchFcn: 'srchbac'
scale_tol:
alpha:
beta:
delta:
gama:
low_lim:
up_lim:
20
0.001
0.1
0.01
0.1
0.1
0.5
maxstep:
minstep:
bmax:
100
1.0 e–006
26
Применение функции:
Функция обучения traincgb используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.

Для того чтобы подготовить сеть к обучению, необходимо:
установить свойство сети net.trainFcn равным 'traincgb'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:



инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Алгоритм:
Функция traincgb выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с алгоритмом метода сопряженных градиентов вектор
настраиваемых переменных получает следующие приращения:
X = X + a*dX,
где dX – направление поиска; параметр a выбирается так, чтобы минимизировать критерий качества обучения в направлении поиска. Функция одномерного поиска searchFcn
используется для вычисления минимума. Начальное направление поиска задается векто-
11. Формирование моделей нейронных сетей
361
ром, противоположным градиенту критерия качества. При успешных итерациях направление поиска определяется на основе нового значения градиента с учетом прежнего
направления поиска согласно формуле
dX = –gX + dX_old*Z,
где gX – вектор градиента; параметр Z может быть вычислен различными способами.
Метод сопряженного градиента в модификации Пауэлла – Биеле реализует стратегию
рестартов для выбора правильного направления движения к минимуму [34].





Обучение прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию traincgb.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'traincgb');
Обучение сети:
net.trainParam.epochs = 50;
net.trainParam.show = 10;
net.trainParam.goal = 0.001;
[net,TR] = train(net,P,T); % Рис.11.53
На рис. 11.53 показано, как изменяется точность в процессе обучения; требуемое
значение обеспечивается на 5-м цикле обучения.
362
Нейронные сети. MATLAB 6
Рис. 11.53
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0034
0.0034
0.0038
0.9983
0.9999
0.9999
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью, равной 0.001.
Сопутствующие функции:
NEWFF, NEWCF, TRAINGDM, TRAINGDA, TRAINGDX, TRAINLM,
TRAINCGP, TRAINCGF, TRAINCGB, TRAINSCG, TRAINOSS, TRAINBFG.
Алгоритм обучения SCG
TRAINSCG
Синтаксис:
[net,TR,Ac,El] = trainscg(net,Pd,Tl,Ai,Q,TS,VV)
info = trainscg(code)
Описание:
Функция trainscg обучает нейронную сеть, используя комбинацию метода сопряженного градиента с квазиньютоновым подходом в модификации Моллера SCG.
Функция при своей работе использует следующие параметры:
info = trainscg'pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
sigma:
lambda:
5.0e–5
5.0e–7
11. Формирование моделей нейронных сетей
363
Применение функции:
Функция обучения trainscg используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.

Для того чтобы подготовить сеть к обучению, необходимо:
установить свойство сети net.trainFcn равным 'trainscg'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:



инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Алгоритм:
Функция trainscg выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения по переменным веса и смещения используется метод обратного распространения ошибки.
Этот алгоритм реализует упрощенную по сравнению с функциями traincgp, traincgf,
traincgb стратегию метода сопряженных градиентов, предложенную Моллером [29].





Обучение прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию trainscg.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'trainscg');
364
Нейронные сети. MATLAB 6
Обучение сети:
net.trainParam.epochs = 50;
net.trainParam.show = 10;
net.trainParam.goal = 0.001;
[net,TR] = train(net,P,T); % Рис.11.54
На рис. 11.54 показано, как изменяется точность в процессе обучения; требуемое
значение обеспечивается на 14-м цикле обучения.
Рис. 11.54
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0053
0.0061
0.0522
0.9629
0.9899
0.9906
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью, равной 0.001.
Сопутствующие функции:
NEWFF, NEWCF, TRAINGDM, TRAINGDA, TRAINGDX, TRAINLM,
TRAINRP, TRAINCGF, TRAINCGB, TRAINBFG, TRAINCGP, TRAINOSS.
Квазиньютоновы алгоритмы обучения
TRAINBFG
Алгоритм обучения BFGS
Синтаксис:
[net,TR,Ac,El] = trainbfg(NET,Pd,Tl,Ai,Q,TS,VV,TV)
info = trainbfg(code)
Описание:
Функция trainbfg обучает нейронную сеть, используя квазиньютонов алгоритм Бройдена, Флетчера, Гольдфарба и Шано (BFGS).
Функция при своей работе использует следующие параметры:
info = trainbfg('pdefaults')'
11. Формирование моделей нейронных сетей
365
info =
epochs:
show:
goal:
time:
min_grad:
max_fail:
searchFcn:
100
25
0
Inf
1.0e–006
5
'srchbac'
scale_tol:
alpha:
beta:
delta:
gama:
low_lim:
up_lim:
20
0.001
0.1
0.01
0.1
0.1
0.5
maxstep:
minstep:
bmax:
100
1.0 e–006
26
Применение функции:
Функция обучения trainbfg используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.
Для того чтобы подготовить сеть к обучению, необходимо:
 установить свойство сети net.trainFcn равным 'trainbfg'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:
 инициализировать нейронную сеть;
 присвоить, если это необходимо, требуемые значения параметрам обучения;
 применить функцию train.
Алгоритм:
Функция trainbfg выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с квазиньютоновым алгоритмом BFGS вектор настраиваемых переменных получает следующие приращения:
X = X + a*dX,
где dX – направление поиска; параметр a выбирается так, чтобы минимизировать критерий качества обучения в направлении поиска. Функция одномерного поиска searchFcn
используется для вычисления минимума. Начальное направление поиска задается вектором, противоположным градиенту критерия качества. При успешных итерациях направление поиска определяется на основе нового значения градиента и с учетом приближенного значения гессиана согласно формуле[13]
dX = –H\gX,
где gX – вектор градиента; H – приближенная оценка гессиана.
Обучение прекращается, когда выполнено одно из следующих условий:
 значение функции качества стало меньше предельного;
 градиент критерия качества стал меньше значения min_grad;
 достигнуто предельное число циклов обучения;
 превышено максимальное время, отпущенное на обучение;
 ошибка контрольного подмножества превысила ошибку обучающего более чем в max_fail раз.
366
Нейронные сети. MATLAB 6
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию trainbfg.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'trainbfg');
Обучение сети:
net.trainParam.epochs = 50;
net.trainParam.show = 10;
net.trainParam.goal = 0.0001;
[net,TR] = train(net,P,T); % Рис.11.55
На рис. 11.55 показано, как изменяется точность в процессе обучения; требуемое
значение достигается на 14-м цикле обучения и составляет 7.5e–7.
Рис. 11.55
Выполним моделирование сети:
Y = sim(net,P);
Y =
0.0000
0.0000
0.0021
1.0000
0.9999
0.9998
Соответствие между входом и выходом реализуется с очень высокой точностью.
Сопутствующие функции:
NEWFF, NEWCF, TRAINGDM, TRAINGDA, TRAINGDX, TRAINLM,
TRAINRP, TRAINCGF, TRAINCGB, TRAINSCG, TRAINCGP, TRAINOSS.
11. Формирование моделей нейронных сетей
367
Алгоритм обучения OSS
TRAINOSS
Синтаксис:
[net,TR,Ac,El] = trainoss(NET,Pd,Tl,Ai,Q,TS,VV)
info = trainoss(code)
Описание:
Функция trainoss обучает нейронную сетью, используя одношаговый алгоритм метода
секущей OSS.
Функция при своей работе использует следующие параметры:
info = trainoss('pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
searchFcn:
'srchbac'
scale_tol:
alpha:
beta:
delta:
gama:
low_lim:
up_lim:
20
0.001
0.1
0.01
0.1
0.1
0.5
maxstep:
minstep:
bmax:
100
1.0 e–6
26
Применение функции:
Функция обучения trainoss используется при создании сетей с помощью методов newff,
newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем.
Для того чтобы подготовить сеть к обучению, необходимо:
 установить свойство сети net.trainFcn равным 'trainoss'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:
 инициализировать нейронную сеть;
 присвоить, если это необходимо, требуемые значения параметрам обучения;
 применить функцию train.
Алгоритм:
Функция trainbfg выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества
обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с квазиньютоновым алгоритмом BFGS вектор настраиваемых переменных получает следующие приращения:
X = X + a*dX,
где dX – направление поиска; параметр a выбирается так, чтобы минимизировать критерий качества обучения в направлении поиска. Функция одномерного поиска searchFcn
используется для вычисления минимума. Начальное направление поиска задается вектором, противоположным градиенту критерия качества. При успешных итерациях направление поиска определяется на основе нового значения градиента и значений градиентов
на предыдущих шагах согласно формуле [1]
368
Нейронные сети. MATLAB 6
dX = –gX + Ac*X_step + Bc*dgX,
где gX – вектор градиента; X_step – приращение весов на предыдущей итерации;
dgX – изменение градиента на последней итерации.





Обучение прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем в max_fail раз.
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию trainoss.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'trainoss');
Обучение сети:
net.trainParam.epochs = 50;
net.trainParam.show = 10;
net.trainParam.goal = 0.0001;
[net,TR] = train(net,P,T); % Рис.11.56
Рис. 11.56
На рис. 11.56 показано, как изменяется точность в процессе обучения; требуемое
значение обеспечивается на 29-м цикле обучения.
11. Формирование моделей нейронных сетей
369
Выполним моделирование сети:
Y = sim(net,P)
Y =
0.0093
0.0090
0.0127
0.9856
0.9989
0.9990
Требуемое соответствие между входом и выходом нейронной сети обеспечивается
с заданной среднеквадратичной погрешностью, равной 0.0001.
Сопутствующие функции:
NEWFF, NEWCF, TRAINGDM, TRAINGDA, TRAINGDX, TRAINLM,
TRAINRP, TRAINCGF, TRAINCGB, TRAINSCG, TRAINCGP, TRAINBFG.
TRAINLM
Алгоритм Левенберга – Марквардта LM
Синтаксис:
[net,TR,Ac,El] = trainlm(NET,Pd,Tl,Ai,Q,TS,VV)
info = trainlm(code)
Описание:
Функция trainlm обучает нейронную сеть, используя алгоритм Левенберга –
Марквардта LM.
Функция при своей работе использует следующие параметры:
info = trainlm('pdefaults')'
info =
epochs:
100
show:
25
goal:
0
time:
Inf
min_grad:
1.0e–006
max_fail:
5
lr:
mc:
mem_reduc:
mu:
mu_dec:
mu_inc:
0.01
0.9
1
0.001
0.1
10
mu_max:
1.0e10
Применение функции:
Функция обучения trainlm используется при создании сетей с помощью методов
newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми
пользователем.

Для того чтобы подготовить сеть к обучению, необходимо:
установить свойство сети net.trainFcn равным 'trainlm'. Это автоматически установит
значения параметров обучения, соответствующие значениям свойства net.trainParam
по умолчанию.
Для того чтобы фактически обучить сеть, необходимо:



370
инициализировать нейронную сеть;
присвоить, если это необходимо, требуемые значения параметрам обучения;
применить функцию train.
Нейронные сети. MATLAB 6
Алгоритм:
Функция trainlm выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления якобиана критерия качества обучения по переменным веса и смещения используется метод обратного распространения
ошибки. Каждая настраиваемая переменная корректируется в соответствии с методом
Левенберга – Марквардта:
jj = jX * jX;
je = jX * E;
dX = –(jj + I * mu)\je,
где E – матрица ошибок; I – единичная матрица.
Параметр адаптации mu возрастает с коэффициентом mu_inc до тех пор, пока изменение весов и смещений dX не приведет к уменьшению критерия качества; после этого коэффициент mu_inc переключается на mu_dec.
Параметр mem_reduc позволяет находить компромисс между объемами оперативной
памяти и быстродействием, необходимыми для вычисления якобиана. Когда параметр
mem_reduc равен 1, обеспечивается максимальное быстродействие, но и требуются большие объемы памяти. Если увеличить значение mem_reduc вдвое, то потребная память
также уменьшится примерно вдвое, но скорость вычислений несколько замедлится.
Чем больше значение mem_reduc, тем меньше требования к памяти, но время вычислений
существенно увеличивается.





Обучение прекращается, когда выполнено одно из следующих условий:
значение функции качества стало меньше предельного;
градиент критерия качества стал меньше значения min_grad;
достигнуто предельное число циклов обучения;
превышено максимальное время, отпущенное на обучение;
ошибка контрольного подмножества превысила ошибку обучающего более чем
в max_fail раз.
Пример:
Заданы следующие обучающие последовательности входов P и целей T:
P = [0 1 2 3 4 5];
T = [0 0 0 1 1 1];
Поскольку соответствие между входом и целью носит явно выраженный нелинейный
характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей сигнала;
в первом слое используем 2 нейрона с функцией активации tansig, а во втором – 1 нейрон
с функцией активации logsig. Для обучения сети применим функцию trainlm.
Формирование сети:
net = newff([0 5],[2 1],{'tansig','logsig'},'trainlm');
Обучение сети:
net.trainParam.epochs = 50;
net.trainParam.show = 10;
11. Формирование моделей нейронных сетей
371
net.trainParam.goal = 0.0001;
[net,TR] = train(net,P,T); % Рис.11.57
TR =
epoch: [0 1 2 3 4 5 6 7 8 9 10 11 12 13]
perf: [114 double]
vperf: [114 double]
tperf: [114 double]
mu: [114 double]
На рис. 11.57 показано, как из