ПАКЕТЫ ПРИК ЛАДНЫХ ПРОГРАММ В. С. МЕДВЕДЕВ, В. Г. ПОТЕМКИН НЕЙРОННЫЕ СЕТИ 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. Опытному пользователю, создающему собственные архитектуры нейронных сетей, следует применять режим работы из командного окна, который позволяет 3 воспользоваться всеми возможностями ППП NNT. Следует также обратить внимание на интерфейс ППП NNT с системой SIMULINK, что позволяет наглядно отображать архитектуру сети и выполнять моделирование как статических, так и динамических нейронных сетей. При чтении книги читатель найдет большое количество примеров формирования и расчета нейронных сетей. Все операторы в этих примерах проверены и в точности соответствуют приводимым результатам. Таким образом, читатель, предполагающий активно использовать компьютер при изучении материала этой книги, сможет воспроизводить примеры в среде системы MATLAB с установленным ППП NNT. Кроме того, мы предполагаем к моменту выхода книги разместить на сайте www.mathworks.ru М-файлы этих сценариев, которые будут доступны для копирования. Это позволит избавиться от возможных непреднамеренных ошибок пользователя. Авторы выражают благодарность О. А. Мишулиной за полезные советы при подготовке рукописи книги, способствовавшие ее улучшению. В. С. Медведев, В. Г. Потемкин, сентябрь 2001 г. 4 Нейронные сети. MATLAB 6 ВВЕДЕНИЕ В последние годы наблюдается повышенный интерес к нейронным сетям, которые нашли применение в самых различных областях человеческой деятельности – бизнесе, медицине, технике. Нейронные сети используются при решении задач прогнозирования, классификации, управления. Такой впечатляющий успех определяется несколькими причинами [46–49]: Нейронные сети – это исключительно мощный метод имитации процессов и явлений, позволяющий воспроизводить чрезвычайно сложные зависимости. Нейронные сети по свой природе являются нелинейными, в то время как на протяжении многих лет для построения моделей использовался линейный подход. Кроме того, во многих случаях нейронные сети позволяют преодолеть "проклятие размерности", обусловленное тем, что моделирование нелинейных явлений в случае большого числа переменных требует огромного количества вычислительных ресурсов. Другая особенность нейронных сетей связана с тем, что они используют механизм обучения. Пользователь нейронной сети подбирает представительные данные, а затем запускает алгоритм обучения, который автоматически настраивает параметры сети. При этом от пользователя, конечно, требуется какой-то набор эвристических знаний о том, как следует отбирать и подготавливать данные, выбирать нужную архитектуру сети и интерпретировать результаты, однако уровень знаний, необходимый для успешного применения нейронных сетей, гораздо скромнее, чем, например, при использовании традиционных методов. Тем не менее искусственные нейронные сети основаны на весьма простой биологической модели нервной системы. Нервная система человека, построенная из элементов, называемых нейронами, имеет ошеломляющую сложность. Около 1011 нейронов участвуют примерно в1015 передающих связях, имеющих длину метр и более. Каждый нейрон обладает многими качествами, общими с другими элементами организма человека, но его уникальной способностью является прием, обработка и передача электрохимических сигналов по нервным путям, которые образуют коммуникационную систему мозга. Интенсивность сигнала, получаемого нейроном (следовательно, и возможность его активации), сильно зависит от активности линии связи. Каждая линия связи имеет определенную протяженность, и специальные химические вещества передают сигнал вдоль нее. Предполагается, что обучение заключается в первую очередь в изменении интенсивности связей. Например, в классическом опыте Павлова каждый раз 5 непосредственно перед кормлением собаки звонил колокольчик и собака быстро научилась связывать звонок колокольчика с пищей. Мозг, построенный из очень большого числа нейронов (каждый из которых принимает взвешенную сумму входных сигналов и при определенных условиях имеет возможность передавать сигнал дальше), способен решать чрезвычайно сложные задачи. Такую же модель реализуют и искусственные нейронные сети. Теория нейронных сетей возникла из исследований в области искусственного интеллекта, а именно из попыток воспроизвести способность нервных биологических систем обучаться и исправлять ошибки, моделируя низкоуровневую структуру мозга. Основой исследований по искусственному интеллекту в 60–80-е гг. были экспертные системы. Такие системы основывались на высокоуровневом моделировании процесса мышления (в частности, на представлении, что процесс нашего мышления построен на манипуляциях с символами). Скоро стало ясно, что подобные системы, хотя и могут принести пользу в некоторых областях, не отражают ключевых свойств человеческого интеллекта. Согласно одной из точек зрения причина этого состоит в том, что они не в состоянии воспроизвести структуру мозга. Чтобы создать искусственный интеллект, необходимо построить систему с архитектурой похожей на строение мозга. Искусственные нейронные сети также составлены из множества простых элементов, действующих параллельно. Как и в природе, функция нейронной сети в значительной степени определяется связями между элементами. Нейронную сеть можно обучать для выполнения конкретной функции, регулируя значения коэффициентов (весов) связи. Обычно искусственные нейронные сети настраиваются или обучаются так, чтобы конкретные входы преобразовывались в заданный целевой выход. Сеть настраивается (обучается), основываясь на сравнении сигналов выхода и цели до тех пор, пока выход сети не будет соответствовать цели. Чтобы обучить сеть при таком управляемом обучении, как правило, используется много пар значений сигналов вход/цель. Нейронные сети обучаются выполнять сложные функции в различных областях приложений, включая распознавание образов, идентификацию, классификацию объектов, распознавание речи, системы технического зрения и системы управления. В этих случаях применяются достаточно простые нейронные сети, но даже они оказываются мощным инструментом в арсенале специалиста. Сегодня могут быть построены искусственные нейронные сети для решения таких задач, которые являются трудными как для компьютеров, построенных по традиционной схеме, так и для человека. Теория нейронных сетей развивается в течение последних пяти десятилетий, но нашла широкое применение только в последние 15 лет. Поэтому строгая терминология в области нейронных сетей еще не установилась. Этим теория нейронных сетей 6 Нейронные сети. MATLAB 6 отличается от теории управления или оптимизации, где терминология, основные математические методы и процедуры проектирования выверены при решении практических задач в течение многих лет. ППП Neural Network Toolbox служит средством, которое помогает пользователям развивать методы проектирования и расширять область применения нейронных сетей. Поскольку данная область исследований характеризуется значительной новизной, данное пособие описывает только основные положения теории нейронных сетей и используемые в ней методы и процедуры, а на примерах поясняет, как применять их. Мы полагаем, что понимание примеров и их приложений весьма существенно для успешного использования этого ППП. Нейронные сети нашли применение во многих областях техники, где они используются для решения многочисленных прикладных задач: в космонавтике и аэронавтике – для построения систем автоматического пилотирования самолетов, имитации траекторий полета, разработки перспективных конструкций автопилотов, моделирования и обнаружения неисправностей агрегатов летательных аппаратов, управления воздушным движением, обработки аэрокосмической информации; в автомобилестроении – для проектирования автоматических систем управления; в банковском деле – для автоматического чтения документов и их контроля, оценки эффективности кредитных вложений; в военном деле – для управления оружием, слежения за целями, выделения и распознавания объектов, построения новых типов датчиков, обработки звуковых, радиолокационных и телевизионных изображений, постановки и подавления помех, идентификации сигналов и изображений; в электронике – для управления процессом проектирования и размещения микросхем на плате, нелинейного моделирования и анализа отказа микросхем, для построения систем машинного зрения и синтеза речи; в финансовом деле – для анализа кредитных потоков, оценки недвижимости, общего финансового анализа, прогнозирования стоимости валюты; в страховом деле – для определения оптимальной стратегии страхования; в промышленном производстве – для управления производственными процессами, анализа продукции, диагностики работы машин, контроля качества, тестирования продукции, анализа качества сварочных работ, шлифовальных операций, анализа и синтеза химических веществ, прогнозирования цены продукта; Введение 7 в медицине – для анализа раковых клеток, диагностики заболеваний, конструирования протезов, оптимизации времени трансплантации, планирования расходов больницы, консультаций в отсутствие специалистов; в нефтегазовой промышленности – для разведки месторождений; в робототехнике – для управления роботами, построения контроллеров роботов и манипуляторов и систем технического зрения; при передаче данных – для сжатия и отображения данных, распознавания речи, классификации гласных звуков, преобразования текста в речь, для синхронного перевода. Этот перечень можно продолжить и далее. Широкое применение нейронных сетей, значительные ресурсы, вкладываемые в создание программного обеспечения и аппаратуры для реализации нейронных сетей, показывают, что имеется большая заинтересованность в разработке искусственных нейронных сетей. Используемые обозначения Обозначения скаляров, векторов и матриц: скаляры – курсивные строчные буквы: 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). Обозначения для слоев нейронной сети: верхний индекс из одного символа применяется для того, чтобы указать принадлежность некоторого элемента слою. Например, вектор входа слоя 3 обозначается как p3; верхний индекс из двух символов применяется для того, чтобы указать источник сигнала (l) и пункт назначения (k); он используется для обозначения матриц весов входа IWk,l и матриц весов слоя LWk,l. Например, матрица весов от слоя 2 к слою 4 будет обозначаться как LW42. 8 Нейронные сети. MATLAB 6 Пример структурной схемы нейронной сети: На рисунке приведены обозначения, используемые при изображении структурных схем нейронных сетей. Связь математических обозначений с обозначениями, принятыми в алгоритмах и программах ППП. При переходе от математических обозначений к кодам системы MATLAB следует руководствоваться следующими правилами: верхние индексы соответствуют индексам массива ячеек: p1 p{1}; нижние индексы соответствуют индексам массива чисел: p2 p(2), p12 p{1}(2); индекс в круглых скобках соответствует второму индексу массива ячеек: p1(k) p{1, k}. Введение 9 Часть 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. Здесь же показан вертикальный разделитель окон, перемещение которого управляет размещением окон в поле экрана. Отметим также информационное окно текущего каталога на инструментальной панели рабочего стола, а также кнопки вызова подсказки, закрытия и отделения командного окна от рабочего 9 стола. Последняя кнопка позволяет перейти в режим работы предшествующих версий системы MATLAB. Рис. 1.1 Описанный рабочий стол появляется по умолчанию при запуске системы MATLAB 6. Вы можете изменить состав и размещение рабочих окон, открывая новые, закрывая имеющиеся, а также изменяя их размеры с помощью вертикальных и горизонтальных разделителей. Кроме того, можно отделять окна от рабочего стола и помещать их на рабочий стол, используя меню View инструментальной панели. Для настройки таких параметров рабочего стола, как тип и размер шрифта, цвета символов командной строки, следует воспользоваться опцией Preferences меню File (рис. 1.2). 10 Нейронные сети. MATLAB 6 Рис. 1.2 Командное окно Командное окно Command Window показано на рис. 1.3 и предназначено для работы с переменными, файлами и функциями системы MATLAB. Рис. 1.3 В отличие от предшествующих версий в среде системы MATLAB 6 все операторы как в зоне просмотра командного окна, так и в командной строке могут быть активизированы с помощью правой кнопки мыши. При этом появляется контекстное меню со следующими опциями: Evaluate Selection (Вычислить выделенное), Open Selection (Открыть выделенное), Help on Selection (Справка по выделенному), Copy (Копировать), Paste (Вставить). Окно предыстории Окно предыстории вызова операторов Command History показано на рис. 1.4. Оно содержит строки операторов, которые вводились в командном окне с начала сеанса работы. 1. Система MATLAB 6 11 Рис. 1.4 Эти строки можно активизировать к выполнению двойным щелчком левой кнопки мыши, можно переносить из окна на командную строку, а можно использовать правую кнопку мыши. При этом появляется контекстное меню со следующими опциями: Copy (Копировать), Evaluate Selection (Вычислить выделенное), Create M-File (Создать М-файл), Delete Selection (Удалить выделенное), Delete to Selection (Удалить до выделенного), Delete Entire History (Удалить всю предысторию). Окно запуска Окно, или панель запуска, Launch Pad показано на рис. 1.5 и предназначено для вызова программных продуктов, включенных в состав инсталлированной версии системы MATLAB. 12 Нейронные сети. MATLAB 6 Рис. 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, имеющих необходимое расширение. 1. Система MATLAB 6 13 Рис. 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. Это позволяет быстро переходить от одного каталога к другому, получая доступ к интересующим файлам. 14 Нейронные сети. MATLAB 6 Рис. 1.7 Окно рабочей области Окно рабочей области Workspace показано на рис. 1.8 и содержит список переменных (именованные массивы), накопленных в памяти в процессе работы, расширение списка переменных при обращении к функциям, выполнении М-файлов и загрузке сохраненных переменных. Рис. 1.8 На рис. 1.8 показан список переменных, охватывающий все типы данных: это массивы действительных и комплексных (complex) чисел удвоенной точности double array, разновидности этих массивов, описываемые глобальной переменной global и переменными логического типа logical. Кроме того, список содержит массив строк char array, массив разреженной матрицы sparse array, массив записей struct array, массив ячеек 1. Система MATLAB 6 15 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, когда многие предварительные действия вообще не требуют обращения к командной строке и могут быть реализованы с использованием только правой кнопки мыши. Рис. 1.9 После завершения сеанса работы данные в рабочей области не сохраняются, и пользователь должен предусмотреть их сохранение в виде файла данных. Это реализуется либо с помощью опции контекстного меню Save Workspace As…, либо с помощью этой же опции из меню File, либо с использованием команды save. Любая из этих операций приводит к созданию специального двоичного файла с расширением .mat. Чтобы прочитать МАТ-файл и разместить его в рабочей области, следует воспользоваться опцией Import Data… или использовать команду load. Окно рабочей области помимо перечисленных функций выполняет функции обозревателя (средства просмотра) данных. Достаточно выполнить двойной щелчок по левой клавише мыши, чтобы вызвать редактор данных Array Editor. 16 Нейронные сети. MATLAB 6 На рис. 1.10 показан редактор данных, который позволяет в интерактивном режиме просматривать и корректировать одномерные и двумерные числовые массивы, массивы строк и массивы строковых ячеек. Рис. 1.10 Справочная подсистема В состав системы MATLAB 6 входит чрезвычайно мощная подсистема справки Help. Объем документации, к которой организуется доступ, составляет более 250 М и поставляется на отдельном компакт-диске. Обеспечивается доступ не только к встроенной системе Help, но и к документам в формате HTML, а также к полнотекстовым документам в формате PDF. Рис. 1.11 1. Система MATLAB 6 17 Экран справочной системы делится на 2 области: область навигатора Help Navigator, где пользователь может указать интересующую его тему, термин или функцию, относящиеся к продуктам семейства MATLAB, и область для просмотра найденной информации. Остановимся подробнее на описании этих областей. Навигатор справочной системы позволяет установить в поле Product Filter меру использования источников информации: в полном (All) или ограниченном объеме (Selected). С помощью кнопки Contents tab вывести заголовки и оглавления документов; с помощью кнопки Index tab вывести на экран индексный указатель, а с помощью кнопки Search tab обратиться к поисковой системе. Наконец, кнопка Favorites tab позволяет просмотреть и изменить список справочных документов, определенных в качестве первоочередных для просмотра. Как только требуемая информация найдена, она выводится в окно просмотра. При этом обеспечивается возможность перехода к другим страницам, используя стрелки в верхней и нижней частях страницы или клавиши "вперед" и "назад" инструментальной панели этого окна. Здесь же вы можете увидеть кнопку вывода на печать содержимого страницы, а также окно для поиска Find in page, окно с названием документа-источника, а также кнопку создания закладки Add to Favorites. Рис. 1.12 И вновь, как это свойственно среде MATLAB 6, пользователь имеет доступ к контекстному меню со следующими опциями: Evaluate Selection (Вычислить выделенное), Open Selection (Открыть выделенное), Help on Selection (Справка о выделенном), Back (Назад), Forward (Вперед), Reload (Перезагрузить раздел), Copy (Копировать). 18 Нейронные сети. MATLAB 6 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.13 Здесь: Help – кнопка вызова окна подсказки Network/Data Manager Help (рис. 1.14); New Data… – кнопка вызова окна формирования данных Create New Data (рис. 1.15); 1. Система MATLAB 6 19 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 при создании нейронной сети. Рис. 1.14 Чтобы создать нейронную сеть, необходимо выполнить следующие операции: 20 Нейронные сети. MATLAB 6 Сформировать последовательности входов и целей (кнопка New Data), либо загрузить их из рабочей области системы MATLAB или из файла (кнопка Import). Создать новую нейронную сеть (кнопка New Network), либо загрузить ее из рабочей области системы MATLAB или из файла (кнопка Import). Выбрать тип нейронной сети и нажать кнопку Train…, чтобы открыть окно для задания параметров процедуры обучения. Открыть окно Network для просмотра, инициализации, моделирования, обучения и адаптации сети. Окно Create New Data. Это окно показано на рис. 1.15 и включает 2 области редактирования текста для записи имени вводимых данных (область Name) и ввода самих данных (область Value), а также 6 кнопок для указания типа вводимых данных. Рис. 1.15 Различают следующие типы данных: Inputs (Входы) – последовательность значений входов; Targets (Цели) – последовательность значений цели; Input Delay States (Состояния ЛЗ входа) – начальные условия линии задержки на входе; Layer Delay States (Состояния ЛЗ слоя) – начальные условия линии задержки в слое; Outputs (Выходы) – последовательность значений выхода сети; Errors (Ошибки) – разность значений целей и выходов. Как правило, пользователь задает только последовательности входа и цели, т. е. типы данных Inputs и Targets. При этом следует помнить, что при адаптации нейронной сети данные должны быть представлены в виде массива ячеек. Окно Create New Network. Это окно показано на рис. 1.16 и включает поля для задания параметров создаваемой сети. В зависимости от типа сети количество полей и их названия изменяются. 1. Система MATLAB 6 21 Рис. 1.16 Обратимся к описанию полей. Network Name (Имя сети) – стандартное имя сети, присваиваемое GUI-интерфейсом NNTool; в процессе создания новых сетей порядковый номер будет изменяться автоматически. Network Type (Тип сети) – список сетей, доступных для работы с интерфейсом NNTool. Для удобства этот список повторен в нижеследующей таблице. Интерфейс NNTool позволяет создавать нейронные сети только с одним или двумя слоями. № п/п Competitive Cascade-forward backprop 3 Elman backprop 4 Feed-forward backprop 5 Time delay backprop 6 Generalized regression Hopfield Linear layer (design) Linear layer (train) 7 8 9 22 Тип сети 1 2 Название сети Число слоев Обучаемые параметры Конкурирующая сеть Каскадная сеть с прямым распространением сигнала и обратным распространением ошибки Сеть Элмана с обратным распространением ошибки 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 IW{1, 1}, b{1} Нейронные сети. MATLAB 6 10 LVQ 11 12 Perceptron Probabalistic 13 Radial basis (exact fit) Radial basis (fewer neurons) 14 15 Self-organizing map Сеть для классификации входных векторов Персептрон Вероятностная сеть 2 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 допускают введение линий задержек в слое. Сети с двумя слоями имеют последовательную структуру, когда выход первого слоя служит входом второго слоя. Исключение составляют сети 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. Система MATLAB 6 23 Рис. 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, что позволяет начать поиск и загрузку файла из файловой системы. Окно Export or Save from Network/Data Manager. Это окно показано на рис. 1.18 и позволяет передать данные из рабочей области GUI-интерфейса NNTool в рабочую область системы MATLAB или записать их в виде файла на диске. Рис. 1.18 24 Нейронные сети. MATLAB 6 В данном случае нами выбрана переменная network1, которая принадлежит к классу network object и описывает нейронную сеть. После того как эта переменная экспортирована в рабочую область, можно, например, построить модель нейронной сети в системе Simulink с помощью оператора gensim. Диалоговая панель Network показана на рис. 1.19. Рис. 1.19 Она открывается только в том случае, когда в окне Network/Data Manager выделена созданная сеть и становятся активными кнопки View, Initialize, Simulate, Train, Adapt. Панель имеет 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 1. Система MATLAB 6 25 (Установить диапазоны) и Initialize Weights (Инициализировать веса). Если требуется вернуться к прежним диапазонам, то следует выбрать кнопки Revert Ranges (Вернуть диапазоны) и Revert Weights (Вернуть веса). Рис. 1.20 Затем выполняется обучение сети, для чего выбирается закладка Train и открывается диалоговая панель, показанная на рис. 1.21. Рис. 1.21 Панель имеет три закладки: Training Info (Информация об обучающих последовательностях) (рис. 1.21); 26 Нейронные сети. MATLAB 6 Training Parametrs (Параметры обучения) (рис. 1.22); Optional Info (Дополнительная информация) (рис. 1.23). Рис. 1.22 Последняя закладка применяется, когда в процессе обучения используются контрольные и тестовые последовательности. Рис. 1.23 Применяя эти закладки, можно установить имена последовательностей входа и цели, а также параметров процедуры обучения. Теперь можно приступить к обучению сети (кнопка Train Network). 1. Система MATLAB 6 27 Рис. 1.24 Качество обучения сети с прямой передачей сигнала на выбранной обучающей последовательности поясняется на рис. 1.24. Практически нулевая точность достигается за 13 циклов обучения. Соответствующие веса и смещения можно увидеть, если выбрать закладку Weights (рис. 1.25). Рис. 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 28 Нейронные сети. MATLAB 6 Результаты обучения можно просмотреть в окне Network/Data Manager, выбрав кнопку Manager (рис. 1.25). Появляется окно (рис. 1.26); теперь, активизируя имена последовательностей выхода или ошибок network1_outputs и network1_errors, можно просмотреть результаты, используя кнопку View. Получаем выходные данные, практически равные целям, и ошибки порядка 10-14. Рис. 1.26 Пример. Классификация входных векторов. Создать нейронную сеть в виде персептрона, который разделяет векторы входа на два класса. Обозначим эти классы как 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. Система MATLAB 6 29 Рис. 1.27 Чтобы увидеть структурную схему сети, воспользуемся кнопкой View (рис. 1.28). Рис. 1.28 Теперь выполним инициализацию сети, используя закладку Initialize, а затем адаптацию и настройку параметров сети, используя закладку Adapt окна Network. Для этого следует указать имена входа и цели, а также задать количество циклов адаптации (в данном случае достаточно трех циклов) и нажать кнопку Adapt Network. В результате настройки будут установлены следующие значения весов и смещений, которые можно увидеть, выбрав закладку Weights. Для данной сети вектор весов равен IW{1, 1} = [–3 –2], а смещение b{1} = 1. Таким образом, линия переключения, разделяющая плоскость на 2 области, описывается следующим образом: L: –3p1 – 2p2 + 1 = 0. Перейдя в окно Network/Data Manager, можно просмотреть значения сигналов на выходе и ошибку сети (рис. 1.29, а и б соответственно). Нетрудно убедиться, что на обучающей последовательности сеть обучена точно классифицировать входные векторы. 30 Нейронные сети. MATLAB 6 а б Рис. 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 31 Рис. 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, которая позволяет преобразовать массив числовых ячеек в числовой массив. 32 Нейронные сети. 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 Радиальные базисные сети Пример неперекрывающихся функций активации Пример перекрывающихся функций активации 33 demogrn1 demopnn1 Сеть GRNN и аппроксимация функций Сеть PNN и классификация векторов Сети кластеризации и классификации данных Самоорганизующиеся сети democ1 demosm1 demosm2 Настройка слоя Кохонена Одномерная карта Кохонена Двумерная карта Кохонена LVQ-сети demolvq1 Классификация векторов Рекуррентные сети Сети Элмана appelm1 Сеть Элмана Сети Хопфилда demohop1 demohop2 demohop3 demohop4 Пример двумерной модифицированной сети Хопфилда Пример неустойчивой точки равновесия Пример трехмерной модифицированной сети Хопфилда Пример устойчивых паразитных точек равновесия Применение нейронных сетей applin1 applin2 appelm1 appcr1 Предсказание стационарного сигнала Предсказание нестационарного сигнала Детектирование амплитуды с помощью сети Элмана Распознавание символов Нейронные сети и системы управления (среда Simulink) predcstr narmamaglev mrefrobotarm Управление каталитическим реактором Управление магнитной подушкой Управление звеном робота Все демонстрационные примеры описаны в тексте книги. 34 Нейронные сети. 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, которая управляет смещением, рассматривается, как вход и может быть учтена в виде линейной комбинации векторов входа 33 p a w b . 1 (2.2) 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. Она принадлежит к классу сигмоидальных функций, и ее аргумент может принимать любое значение в диапазоне от Сигмоидальной (S-образной) функцией называется непрерывная функция, имеющая две горизонтальные асимптоты и одну точку перегиба. 1 34 Нейронные сети. MATLAB 6 – до +, а выход изменяется в диапазоне от 0 до 1. В ППП Neural Network Toolbox она представлена М-функцией logsig. Благодаря свойству дифференцируемости эта функция часто используется в сетях с обучением на основе метода обратного распространения ошибки. Рис. 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 это выражение записывается так: 2. Модель нейрона и архитектура сети 35 n = W*p + b. (2.4) Структура нейрона, показанная выше, содержит много лишних деталей. При рассмотрении сетей, состоящих из большого числа нейронов, будет использоваться укрупненная структурная схема нейрона (рис. 2.6). Рис. 2.6 Вход нейрона изображается в виде темной вертикальной черты, под которой указывается количество элементов входа R. Размер вектора входа p указывается ниже символа p и равен R1. Вектор входа умножается на вектор-строку 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. Архитектура нейронных сетей Реальная нейронная сеть может содержать один или большее количество слоев и соответственно характеризоваться как однослойная или как многослойная. 36 Нейронные сети. MATLAB 6 2.2.1. Однослойные сети Развернутая схема сети из одного слоя с R входными элементами и S нейронами показана на рис. 2.8. Рис. 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 w22 wS 2 w1R w2 R . wSR (2.6) Заметим, что индексы строк матрицы W указывают адресатов (пункты назначения) весов нейронов, а индексы столбцов – какой источник является входом для этого веса. 2. Модель нейрона и архитектура сети 37 Таким образом, элемент матрицы весов w12 = W(1, 2) определяет коэффициент, на который умножается второй элемент входа при передаче его на первый нейрон. Для однослойной сети с S нейронами укрупненная структурная схема показана на рис. 2.9. Рис. 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) соответственно. 38 Нейронные сети. MATLAB 6 Когда сеть имеет несколько слоев, то каждый слой имеет свою матрицу весов W, вектор смещения b и вектор выхода a. Чтобы различать весовые матрицы, векторы выхода и т. д. для каждого из этих слоев, введем номер слоя как верхний индекс для представляющей интерес переменной. Использование этой системы обозначений для сети из трех слоев можно видеть на показанной ниже структурной схеме и из уравнений, приведенных в нижней части рис. 2.11. Рис. 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 39 Рис. 2.12 Заметим, что выход третьего слоя а3 обозначен через y. Эта сделано для того, чтобы подчеркнуть, что выход последнего слоя является выходом сети. Многослойные сети обладают весьма мощными возможностями. Например, двухслойная сеть, в которой первый слой содержит сигмоидальную, а второй слой – линейную функцию активации, может быть обучена аппроксимировать с произвольной точностью любую функцию с конечным числом точек разрыва. В заключение можно сформулировать следующие выводы. Вход функции активации нейрона определяется смещением и суммой взвешенных входов. Выход нейрона зависит как от входов нейрона, так и от вида функции активации. Один нейрон не может решать сложные задачи, однако несколько нейронов, объединенных в один или несколько слоев, обладают большими возможностями. Архитектура сети состоит из описания того, сколько слоев имеет сеть, количества нейронов в каждом слое, вида функции активации каждого слоя и информации о соединении слоев. Архитектура сети зависит от той конкретной задачи, которую должна решать сеть. Работа сети состоит в вычислении выходов сети на основе известных входов с целью формирования желаемого отображения вход/выход. Конкретная задача определяет число входов и число выходов сети. Кроме числа нейронов в выходном слое сети, для проектировщика важно число нейронов в каждом слое. Большее количество нейронов в скрытых слоях обеспечивает более мощную сеть. Если должно быть реализовано линейное отображение, то следует использовать нейроны с линейными функциями активации. При этом надо помнить, что линейные нейронные сети не могут формировать нелинейные отображения. Использование нелинейных функций активации позволяет настроить нейронную сеть на реализацию нелинейных связей между входом и выходом. Сети со смещением позволяют формировать более сложные связи между входами и выходами, чем сети без смещения. Например, нейрон без смещения, когда все входы нулевые, будет всегда задавать вход функции активации равным нулю, однако нейрон со смещением может быть обучен так, чтобы при тех же условиях задать вход функции активации произвольной формы. В многослойных сетях часто применяются нелинейные сигмоидальные функции активации типа логистической (см. рис. 2.7, в) или гиперболического тангенса (рис. 2.13). a +1 0 n -1 a = tansig(n) Рис. 2.13 Если последний слой многослойной сети использует такие функции активации, то выходы сети будут ограничены. Когда в выходном слое используются линейные нейроны, то выходы сети могут принимать произвольные значения. В ППП NNT предусмотрены 40 Нейронные сети. MATLAB 6 М-функции, позволяющие вычислять производные функций активации. Чтобы получить информацию об имени нужной функции, следует воспользоваться следующим оператором: <имя_функции_активации>('deriv') Например, обращение вида tansig('deriv') ans = dtansig дает возможность узнать, что имя М-функции, позволяющей вычислить производную гиперболического тангенса, dtansig. 2.2.3. Сети с прямой передачей сигнала Однослойная сеть с S нейронами с функциями активации logsig, имеющая R входов, показана на рис. 2.14. Входы Слой нейронов n1 p1 p2 Слой нейронов Вход a1 p W a n 1R SR n2 p3 b a2 R pR S1 S S1 a = f(Wp+b) b2 1 S1 1 b1 1 nS aS 1 bS a = f(Wp+b) Рис. 2.14 Эта сеть, не имеющая обратных связей, называется сетью с прямой передачей сигнала. Такие сети часто имеют один или более скрытых слоев нейронов с сигмоидальными функциями активации, в то время как выходной слой содержит нейроны с линейными функциями активации. Сети с такой архитектурой могут воспроизводить весьма сложные нелинейные зависимости между входом и выходом сети. Для пояснения обозначений в многослойных нейронных сетях внимательно изучите двухслойную сеть, показанную на рис. 2.15 2. Модель нейрона и архитектура сети 41 Вход Выходной слой Скрытый слой p1 IW 21 1 2 11 a1 n1 LW21 41 42 1 b 1 41 41 34 b2 31 31 4 a1= tansig(IW11 p1 + b1) a2 n2 3 31 a2= purelin(LW21 a1 + b2) Рис. 2.15 Эта сеть может быть использована для аппроксимации функций. Она может достаточно точно воспроизвести любую функцию с конечным числом точек разрыва, если задать достаточное число нейронов скрытого слоя. 2.3. Создание, инициализация и моделирование сети Формирование архитектуры сети Первый шаг при работе с нейронными сетями – это создание модели сети. Для создания сетей с прямой передачей сигнала в ППП NNT предназначена функция newff. Она имеет 4 входных аргумента и 1 выходной аргумент – объект класса network. Первый входной аргумент – это массив размера R2, содержащий допустимые границы значений (минимальное и максимальное) для каждого из 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); 42 Нейронные сети. MATLAB 6 Способ инициализации зависит от выбора параметров сети 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 применяется для слоев, использующих сигмоидальные функции активации. Она генерирует начальные веса и смещения для слоя так, чтобы активные области нейронов были распределены равномерно относительно области значений входа. Это имеет несколько преимуществ по сравнению со случайным распределением весов и смещений: во-первых, избыток нейронов минимален, поскольку активные области всех нейронов соответствуют области значений входа, во-вторых, обучение выполняется быстрее, так как для каждой области значений входа найдутся нейроны с той же областью определения аргумента. В рассмотренном выше примере создания сети с прямой передачей сигнала метод 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. Модель нейрона и архитектура сети 43 Рис. 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; % Присваивание значения смещения Предположим, что на сеть подается такая последовательность из четырех векторов входа: 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 одинаковых сети, функционирующих параллельно, и на каждую сеть был подан один из векторов входа и генерировался один из выходов. Динамические сети. Когда сеть содержит линии задержки, вход сети надо рассматривать как последовательность векторов, подаваемых на сеть в определенные моменты времени. 44 Нейронные сети. MATLAB 6 Чтобы пояснить этот случай, рассмотрим простую линейную сеть, которая содержит 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: 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 2. Модель нейрона и архитектура сети 45 Результат такой же, как если применить каждый вход к отдельной сети и вычислить ее выход. Поскольку начальные условия для элементов запаздывания не указаны, то по умолчанию они приняты нулевыми. В этом случае выход сети равен 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]} В самом деле, 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 1 2 2 } 1 / 2 1 / 2 1 2 На рис. 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 строка массива ячеек. Представление входов как массива ячеек соответствует последовательному представлению наблюдаемых данных во времени. 46 Нейронные сети. MATLAB 6 Представление вектора входа может быть интерпретировано иначе, если сформировать временные последовательности для каждой реализации, как это показано на рис. 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 соответствует групповому представлению данных, когда реализации вектора входа для всех значений времени на интервале выборки обрабатываются потоком. 2. Модель нейрона и архитектура сети 47 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 раз: если его использовать повторно для корректировки процесса обучения, то оно фактически превратится в контрольное множество. Итак, процедура построения нейронной сети состоит из следующих шагов: 50 выбора начальной конфигурации сети; например, в виде одного слоя с числом нейронов, равным 1/2 общего количества входов и выходов; моделирования и обучения сети с оценкой контрольной ошибки и использованием дополнительных нейронов или промежуточных слоев; Нейронные сети. 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, 52 Нейронные сети. MATLAB 6 который позволяет выбирать произвольные функции для настройки весов и смещений. Функции настройки весов и смещений задаются свойствами 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-ошибка обучения В этом случае веса не модифицируются, выходы сети остаются нулевыми, поскольку параметр скорости настройки равен нулю и адаптации сети не происходит. Погрешности совпадают со значениями целевой последовательности 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 3. Обучение нейронных сетей 53 cell2mat(a{30}) ans = –0.9944 cell2mat(e{30}) ans = –0.0055975 –0.40855 0.95663 0.93005 –0.0081125 0.043367 0.069947 Построим графики зависимости значений выходов сети и весовых коэффициентов в зависимости от числа итераций (рис. 3.1): subplot(3,1,1) 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. Условие окончания адаптации определяется погрешностью приближения к целевому вектору; в 54 Нейронные сети. MATLAB 6 данном случае мерой такой погрешности является среднеквадратичная ошибка mse(e{i}), которая должна быть меньше 0.015. На рис. 3.1, а показаны выходы нейронов в процессе адаптации сети, на рис. 3.1, б – коэффициенты восстанавливаемой зависимости, которые соответствуют элементам вектора весов входа, а на рис. 3.1, в – ошибка обучения. Как следует из анализа графиков, за 12 шагов получена ошибка обучения 1.489e–3. Предлагаем читателю самостоятельно убедиться, что для исследуемой зависимости обучающие последовательности вида 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 0.84766 –0.36242 3. Обучение нейронных сетей 1.0172 0.94256 55 mse(e{1}) ans = 0.7934 Процедура адаптации выходов и параметров нейронной сети иллюстрируется рис. 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 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; % Значение смещения 56 Нейронные сети. MATLAB 6 Чтобы применить последовательный способ адаптации, представим входы и цели как массивы ячеек: P = {–1/2 T = { –1 1/3 1/6 1/5 1/4}; % Вектор входа 11/15 7/10}; % Вектор цели Попытаемся приспособить сеть для формирования нужного выхода на основе следующего соотношения: y(t) = 2p(t) + p(t–1). Используем для этой цели М-функцию 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 ] – вектор сигнала на выходе сети; 3. Обучение нейронных сетей 61 t q [tiq ] – вектор желаемых (целевых) значений сигнала на выходе сети для выборки с номером q. Затем с помощью того или иного метода обучения определяются значения настраиваемых параметров (весов и смещений) сети, которые обеспечивают минимальное значение функционала ошибки. Большинство методов обучения основано на вычислении градиента функционала ошибки по настраиваемым параметрам. 3.2.1. Обучение однослойной сети Наиболее просто градиент функционала вычисляется для однослойных нейронных сетей. В этом случае M = 1 и выражение для функционала принимает вид: 1 J 1 1 Q S q 1 Q S q qS 1 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 ] S – число нейронов в слое; (3.2) R wij p qj – сигнал на входе функции активации j 0 – вектор входного сигнала; R – число элементов вектора входа; wij – весовые коэффициенты сети. Включим вектор смещения в состав матрицы весов W [wij ], i 1, S , j 1, R , а вектор входа дополним элементом, равным 1. Применяя правило дифференцирования сложной функции, вычислим градиент функционала ошибки, предполагая при этом, что функция активации дифференцируема: Q Q ( f (niq )) J (tiq f (niq )) (tiq 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 (t iq 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]. Метод обратного распространения ошибки Термин "обратное распространение" относится к процессу, с помощью которого могут быть вычислены производные функционала ошибки по параметрам сети. Этот процесс может использоваться в сочетании с различными стратегиями оптимизации. Существует много вариантов и самого алгоритма обратного распространения. Обратимся к одному из них. 3. Обучение нейронных сетей 63 Рассмотрим выражение для градиента критерия качества по весовым коэффициентам для выходного слоя M: 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 a kqM f M wklM alq ( M 1) , m 1, S M . l 0 (3.10) Из уравнения (3.8) следует a kqM wijM 0, f (niqM )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) . M wij 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 akq ( 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 akqM ) f M' (nkqM ) wkM q 1 k 1 nkqM f M' 1 (niq ( M 1) )a qj ( M 2) q ( M 1) ai (3.14) qi ( M 1) a qj ( M 2) , где 64 Нейронные сети. MATLAB 6 qi ( M 1) 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 Для слоев 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. Обучение нейронных сетей 65 x k 1 x k k g k , (3.16) где x k – вектор параметров; k – параметр скорости обучения; g k – градиент функционала, соответствующие итерации с номером k. Вектор в направлении, противоположном градиенту, указывает направление кратчайшего спуска по поверхности функционала ошибки. Если реализуется движение в этом направлении, то ошибка будет уменьшаться. Последовательность таких шагов в конце концов приведет к значениям настраиваемых параметров, обеспечивающим минимум функционала. Определенную трудность здесь вызывает выбор параметра скорости обучения α 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-й 66 Нейронные сети. MATLAB 6 итерации. Во многих случаях метод Ньютона сходится быстрее, чем методы сопряженного градиента, но требует больших затрат из-за вычисления гессиана. Для того чтобы избежать вычисления матрицы Гессе, предлагаются различные способы ее замены приближенными выражениями, что порождает так называемые квазиньютоновы алгоритмы (алгоритм метода секущих плоскостей OSS [1], алгоритм LM Левенберга – Марквардта [17]). 3.3. Алгоритмы обучения Алгоритмы обучения, как правило, функционируют пошагово; и эти шаги принято называть эпохами или циклами. На каждом цикле на вход сети последовательно подаются все элементы обучающей последовательности, затем вычисляются выходные значения сети, сравниваются с целевыми и вычисляется функционал ошибки. Значения функционала, а также его градиента используются для корректировки весов и смещений, после чего все действия повторяются. Начальные значения весов и смещений выбираются случайным образом, а процесс обучения прекращается, когда выполнено определенное количество циклов либо когда ошибка достигнет некоторого малого значения или перестанет уменьшаться. При такой формализации задачи обучения предполагаются известными желаемые (целевые) реакции сети на входные сигналы, что ассоциируется с присутствием учителя, а поэтому такой процесс обучения называют обучением с учителем. Для некоторых типов нейронных сетей задание целевого сигнала не требуется, и в этом случае процесс обучения называют обучением без учителя. Ниже для обозначения алгоритмов используются их англоязычные сокращения, ассоциирующиеся с названиями алгоритмов в ППП Neural Network Toolbox. 3.3.1. Градиентные алгоритмы обучения Алгоритм GD Алгоритм GD, или алгоритм градиентного спуска, используется для такой корректировки весов и смещений, чтобы минимизировать функционал ошибки, т. е. обеспечить движение по поверхности функционала в направлении, противоположном градиенту функционала по настраиваемым параметрам. Рассмотрим двухслойную нейронную сеть прямой передачи сигнала с сигмоидальным и линейным слоями для обучения ее на основе метода обратного распространения ошибки (рис. 3.7): net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traingd'); 3. Обучение нейронных сетей 67 Рис. 3.7 Последовательная адаптация. Чтобы подготовить модель сети к процедуре последовательной адаптации на основе алгоритма GD, необходимо указать ряд параметров. В первую очередь это имя функции настройки learnFcn, соответствующее алгоритму градиентного спуска, в данном случае это М-функция learngd: 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) 68 Нейронные сети. MATLAB 6 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 характеризуется следующими параметрами, заданными по умолчанию: 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. Обучение нейронных сетей 69 Рис. 3.8 Для проверки качества обучения промоделируем спроектированную сеть: a = sim(net,p) a = –1.0042 –0.9958 0.9987 0.9984 Более тщательно ознакомиться с методом градиентного спуска можно с помощью демонстрационной программы nnd12sd1, которая иллюстрирует работу алгоритма GD. Алгоритм GDM Алгоритм GDM, или алгоритм градиентного спуска с возмущением [18], предназначен для настройки и обучения сетей прямой передачи. Этот алгоритм позволяет преодолевать локальные неровности поверхности ошибки и не останавливаться в локальных минимумах. С учетом возмущения метод обратного распространения ошибки реализует следующее соотношение для приращения вектора настраиваемых параметров: w k mcw 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: 70 Нейронные сети. MATLAB 6 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 = [–1 –1 2 2;0 5 0 5]; t = [–1 –1 1 1]; p = num2cell(p,1); t = num2cell(t,1); 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 = 3. Обучение нейронных сетей 71 epochs: goal: lr: max_fail: mc: min_grad: show: time: 100 0 0.0100 5 0.9000 1.0000e–010 25 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.9 a = sim(net,p) a = –0.9956 –0.9998 0.9969 1.0009 Поскольку начальные веса и смещения инициализируются случайным образом, графики ошибок на рис. 3.8 и 3.9 будут отличаться от одной реализации к другой. Более тщательно ознакомиться с методом градиентного спуска с возмущением можно с помощью демонстрационной программы nnd12mo, которая иллюстрирует работу алгоритма GDM. Практика применения описанных выше алгоритмов градиентного спуска показывает, что эти алгоритмы слишком медленны для решения реальных задач. Ниже обсуждаются алгоритмы группового обучения, которые сходятся в десятки и сотни раз быстрее. Ниже 72 Нейронные сети. MATLAB 6 представлены 2 разновидности таких алгоритмов: один основан на стратегии выбора параметра скорости настройки и реализован в виде алгоритма GDA, другой – на стратегии выбора шага с помощью порогового алгоритма обратного распространения ошибки и реализован в виде алгоритма Rprop. Алгоритм GDA Алгоритм GDA, или алгоритм градиентного спуска с выбором параметра скорости настройки, использует эвристическую стратегию изменения этого параметра в процессе обучения. Эта стратегия заключается в следующем. Вычисляются выход и погрешность инициализированной нейронной сети. Затем на каждом цикле обучения вычисляются новые значения настраиваемых параметров и новые значения выходов и погрешностей. Если отношение нового значения погрешности к прежнему превышает величину max_perf_inc (по умолчанию 1.04), то новые значения настраиваемых параметров во внимание не принимаются. При этом параметр скорости настройки уменьшается с коэффициентом lr_dec (по умолчанию 0.7). Если новая погрешность меньше прежней, то параметр скорости настройки увеличивается с коэффициентом lr_inc (по умолчанию 1.05). Эта стратегия способствует увеличению скорости и сокращению длительности обучения. Алгоритм GDA в сочетании с алгоритмом GD определяет функцию обучения traingda, а в сочетании с алгоритмом GDM – функцию обучения traingdx. Вновь обратимся к той же нейронной сети (см. рис. 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; 3. Обучение нейронных сетей 73 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.10 a = sim(net,p) a = –0.9959 –1.0012 0.9963 0.9978 Нетрудно заметить, что количество циклов обучения по сравнению с предыдущим примером сократилось практически в 3 раза при сохранении той же погрешности обучения. Демонстрационная программа nnd12vl иллюстрирует производительность алгоритма с переменным параметром скорости настройки. Алгоритм Rprop Алгоритм Rprop, или пороговый алгоритм обратного распространения ошибки, реализует следующую эвристическую стратегию изменения шага приращения параметров для многослойных нейронных сетей. Многослойные сети обычно используют сигмоидальные функции активации в скрытых слоях. Эти функции относятся к классу функций со сжимающим отображением, поскольку они отображают бесконечный диапазон значений аргумента в конечный диапазон значений функции. Сигмоидальные функции характеризуются тем, что их наклон приближается к нулю, когда значения входа нейрона существенно возрастают. Следствием этого является то, что при использовании метода наискорейшего спуска величина градиента становится малой и приводит к малым изменениям настраиваемых параметров, даже если они далеки от оптимальных значений. Цель порогового алгоритма обратного распространения ошибки Rprop (Resilient propagation) [36] состоит в том, чтобы повысить чувствительность метода при больших 74 Нейронные сети. MATLAB 6 значениях входа функции активации. В этом случае вместо значений самих производных используется только их знак. Значение приращения для каждого настраиваемого параметра увеличивается с коэффициентом delt_inc (по умолчанию 1.2) всякий раз, когда производная функционала ошибки по данному параметру сохраняет знак для двух последовательных итераций. Значение приращения уменьшается с коэффициентом delt_dec (по умолчанию 0.5) всякий раз, когда производная функционала ошибки по данному параметру изменяет знак по сравнению с предыдущей итерацией. Если производная равна 0, то приращение остается неизменным. Поскольку по умолчанию коэффициент увеличения приращения составляет 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. Обучение нейронных сетей 75 На рис. 3.11 приведен график изменения ошибки обучения в зависимости от числа выполненных циклов обучения. Рис. 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. Любая из этих функций может быть использована в сочетании с любой из обучающих функций метода сопряженных градиентов. Есть наилучшие сочетания таких функций, но это зависит от конкретного приложения. И хотя по умолчанию с каждой функцией обучения связана определенная функция одномерного поиска, пользователь может осуществлять их переназначение. 76 Нейронные сети. MATLAB 6 Все алгоритмы метода сопряженных градиентов на первой итерации начинают поиск в направлении антиградиента (3.22) p 0 g 0 . Когда выбрано направление, требуется определить оптимальное расстояние (шаг поиска), на величину которого следует изменить настраиваемые параметры: (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 3. Обучение нейронных сетей 77 Здесь epochs – максимальное количество циклов обучения; show – интервал вывода информации, измеренный в циклах; goal – предельное значение критерия обучения; time – предельное время обучения; min_grad – минимальное значение градиента; max_fail – максимально допустимый уровень превышения ошибки контрольного подмножества по сравнению с обучающим; 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, как в рассматриваемом случае; хотя на практике это зависит от конкретной задачи. Алгоритмы метода сопряженных градиентов требуют не намного больше памяти, чем градиентные алгоритмы, поэтому их можно рекомендовать для обучения нейронных сетей с большим количеством настраиваемых параметров. 78 Нейронные сети. MATLAB 6 Демонстрационная программа nnd12cg иллюстрирует минимизации на основе метода сопряженных градиентов. работу алгоритмов Алгоритм 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. На практике трудно предсказать, какой алгоритм лучше применить для решения конкретной 3. Обучение нейронных сетей 79 задачи. Однако требования по памяти для алгоритма CGP несколько больше, поскольку требуется на каждой итерации 4 вектора, в то время как для алгоритма CGF – только 3. Алгоритм CGB Для всех алгоритмов метода сопряженных градиентов направление поиска периодически переустанавливается на направление антиградиента, или, иными словами, выполняется рестарт. Это происходит в тех случаях, когда возникают проблемы со сходимостью. Например, если количество итераций превысило число настраиваемых параметров сети, либо возникли иные условия, свидетельствующие о плохой сходимости. Одна из таких стратегий рестарта реализована в алгоритме CGB, предложенном Биеле (Beale) и Пауэллом (Powell) [2, 33]. Согласно этой стратегии рестарт выполняется, если текущее и предшествующее направления градиентов слабоортогональны, и это условие определяется следующим образом: gTk 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 80 –1.0038 1.0045 1.0004 Нейронные сети. MATLAB 6 Характеристики алгоритма CGB в данном случае превосходят показатели сходимости алгоритма CGP, хотя для другой задачи или других начальных параметров это может оказаться не так. С точки зрения требований к оперативной памяти для алгоритма CGB требуется 6 векторов, в то время как для алгоритма CGP – 4. Алгоритм 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: 3. Обучение нейронных сетей 83 net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'trainoss'); Функция 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 , где J J W (3.29) (3.30) – матрица Якоби производных функционала ошибки по настраиваемым параметрам; 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 состоит в том, что он требует памяти для хранения матриц больших размеров. Например, размер матрицы Якоби составляет Qn, где 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. Подобно двум предшествующим алгоритмам он реализует гибридный метод поиска и использует кубическую интерполяцию в сочетании с методом деления интервала на части. Этот алгоритм используется по умолчанию для большинства алгоритмов метода сопряженного градиента, так как опыт показал, что он обеспечивает прекрасные результаты при решении практических задач. Алгоритм требует вычисления производной в дополнение к вычислению самого функционала ошибки, однако он организован таким образом, что локализует минимум за меньшее количество шагов. Это справедливо не для всех задач, встречающихся на практике, и тогда пользователь может обратиться к другим алгоритмам одномерного поиска. 88 Нейронные сети. MATLAB 6 В рамках ППП Neural Network Toolbox этот алгоритм реализован в виде М-функции srchcha. Алгоритм 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]; 90 Нейронные сети. MATLAB 6 t = sin(2*pi*p)+0.1*randn(size(p)); % Возмущенные значения функции t1 = sin(2*pi*p); % Обучающая последовательность [net,tr] = train(net,p,t); % Рис.3.19 На рис. 3.19 приведен график изменения ошибки обучения в зависимости от числа циклов обучения. Рис. 3.19 Для того чтобы убедиться, что в данном случае мы сталкиваемся с явлением переобучения, построим графики аппроксимируемой функции, ее приближенных значений и результата аппроксимации (рис. 3.20): an = sim(net,p); % Значения аппроксимирующей функции plot(p,t,'+',p,an,'–',p,t1,':') % Рис.3.20 Рис. 3.20 3. Обучение нейронных сетей 91 Анализ сигналов на рис. 3.20 показывает, что построенная нейронная сеть действительно точно отслеживает входной сигнал, но не восстанавливает функцию синуса. Один из способов исправить ситуацию заключается в том, чтобы использовать сеть с меньшим числом нейронов, т. е. меньшей мощности, которая не могла бы точно воспроизводить на выходе входной сигнал. Демонстрационный пример nnd11gn иллюстрирует, как количество скрытых нейронов влияет на точность обучения сети при аппроксимации сигналов разной сложности; там же вы сможете наблюдать явление переобучения, которое при аппроксимации сигналов небольшой сложности можно предотвратить за счет сокращения числа скрытых нейронов. К сожалению, заранее трудно предсказать, насколько мощной должна быть сеть для конкретного приложения. Поэтому рассмотрим 2 регулярных подхода, которые позволяют преодолеть явление переобучения. Метод регуляризации Первый подход связан с использованием метода регуляризации, предложенного в 1963 г. российским математиком А. Н. Тихоновым [50]. Суть этого метода заключается в том, чтобы видоизменить функционал качества таким образом, чтобы он всегда имел минимум и положение этого минимума непрерывно зависело от параметра регуляризации. Модификация функционала качества. Типичный функционал качества, который используется при обучении нейронных сетей с прямой передачей, – это функционал средней суммы квадратов ошибки обучения mse 1 N 1 N (ei ) 2 (t i ai ) 2 . N i 1 N i 1 (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; 92 Нейронные сети. MATLAB 6 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,б На рис. 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: 100 3. Обучение нейронных сетей 93 show: goal: time: min_grad: max_fail: mem_reduc: mu: mu_dec: mu_inc: mu_max: 25 0 Inf 1e–010 5 1 0.005 0.1 10 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, на котором видно, что в сети существует 94 Нейронные сети. MATLAB 6 переобучение, здесь мы видим, что реакция сети близка к основной функции синуса. Следовательно, сеть хорошо приспособлена к новым входам. Можно попробовать реализовать более мощную исходную сеть, но при этом в реакции сети никогда не будет проявляться эффект переобучения. Таким образом, процедура обучения trainbr представляет собой некоторую регулярную процедуру для определения оптимального числа настраиваемых параметров и, как следствие, оптимального размера сети. Рис. 3.23 Формирование представительной выборки Другой способ преодоления эффекта переобучения связан с организацией целенаправленной процедуры прерывания обучения. Для этого из исходных данных выделяется 3 подмножества. Первое – обучающее подмножество (training set), второе – контрольное подмножество (validation set) и третье – тестовое подмножество (test set). Обучающее подмножество используется для настройки параметров сети; контрольное подмножество используется в течение всего процесса обучения для того, чтобы контролировать представительность используемой выборки. Как правило, ошибка для контрольного подмножества на начальной фазе обучения уменьшается, так же как и ошибка для обучающего подмножества. Однако когда ошибка для контрольного подмножества начинает увеличиваться, это означает, что в сети начал проявляться эффект переобучения. В этом случае фиксируется итерация, на которой ошибка для контрольного подмножества была минимальной, и восстанавливаются соответствующие значения настраиваемых параметров сети. Соответствующая длина выборки признается представительной. Ошибка для тестового подмножества обычно не используется в процессе обучения, а применяется для сравнения различных моделей. Однако полезно рассчитывать погрешность для тестового подмножества в течение всего процесса обучения. Если соответствующая ошибка достигает минимума при ином числе итераций, чем для контрольного подмножества, то это может указывать на неудачное выделение подмножеств из набора исходных данных. Процедура прерывания обучения может быть реализована с любой из обучающих функций, описанных ранее. Для этого просто следует передать информацию о признании 3. Обучение нейронных сетей 95 выборки представительной самой обучающей функции. Следующая последовательность операторов показывает, как организовать процедуру прерывания обучения. Вновь обратимся к задаче аппроксимации функции синуса. Сформируем обучающее подмножество на интервале входных значений от –1 до 1 с шагом 0.05 в виде суммы функции синуса и погрешности, описываемой случайной величиной, распределенной по нормальному закону с дисперсией 0.01: p = [–1:0.05:1]; t = sin(2*pi*p)+ 0.1*randn(size(p)); Затем сформируем контрольное подмножество. Определим входы в диапазоне от –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 96 Нейронные сети. MATLAB 6 Построим графики исследуемых функций (рис. 3.25): an = sim(net,p); % Значения аппроксимирующей функции t1 = sin(2*pi*p); % Значения аппроксимируемой функции plot(p,t,'+',p,an,'–',p,t1,':')% Рис.3.25 Рис. 3.25 Из анализа рис. 3.25 следует, что в сети отсутствует эффект переобучения, хотя реакция на выходе сети не такая гладкая, как при использовании метода регуляризации (рис. 3.23). Предварительная обработка и восстановление данных Вычислительная процедура обучения нейронной сети связана с проведением больших объемов вычислений с данными, диапазоны изменения которых могут существенно различаться и которые имеют случайные разбросы, обусловленные погрешностью их измерения или задания. Поскольку обработка таких данных выполняется на компьютерах, имеющих ограниченный диапазон представления чисел и ограниченную точность выполнения операций умножения и алгебраического сложения в арифметике с плавающей точкой, то необходимо предпринять определенные меры, чтобы такая обработка не привела к потере точности. Для этого осуществляется предварительная обработка данных с целью привести значения элементов обучающего множества к определенному диапазону (масштабирование данных), ограничить разброс случайных величин (нормировка данных), избавиться от несущественных данных (факторный анализ). Поскольку эти операции являются вспомогательными и связаны только с особенностями вычислений, то необходимо предусмотреть восстановление масштабов данных на выходе нейронной сети. Все это направлено на то, чтобы обеспечить достоверность вычислений, повысить точность обучения и в конечном счете обеспечить эффективность функционирования проектируемой нейронной сети. Для этой цели в составе ППП Neural Network Toolbox предусмотрены следующие М-функции для предварительной подготовки и восстановления данных при обучении нейронных сетей: Операция Обработка обучающего множества Масштабирование Нормировка Факторный анализ 3. Обучение нейронных сетей Обработка выходных данных Обработка входных данных premnmx postmnmx tramnmx prestd poststd trastd prepca – trapca 97 Регрессионный анализ – postreg – Масштабирование. Перед тем как начинать процедуру обучения, бывает полезно провести масштабирование векторов входа и целей так, чтобы их элементы оказались в определенном интервале значений. В частности, М-функция premnmx предназначена для приведения данных к интервалу [–1 1]. % Масштабирование входов и целей [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 – средние значения и стандартные отклонения исходных векторов целей. После завершения процедуры обучения эти векторы используются для масштабирования векторов входов и целей, подаваемых на вход сети. Эти величины становятся неотъемлемой частью параметров, определяющих сеть, как, например, ее веса и смещения. 98 Нейронные сети. MATLAB 6 Если выполнено масштабирование входов и целей с использованием М-функции prestd, то выходы сети будут нормированы так, что их среднее значение равно 0, а стандартное отклонение – 1. Для приведения вектора выхода к исходным единицам измерения используется М-функция poststd. Ее следует применять после того, как выполнено моделирование сети: an = sim(net,pn); % Моделирование сети с нормированным входом a = poststd(an,meant,stdt); % Восстановление исходных единиц измерения Если функция нормировки 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); % Моделирование сети 3. Обучение нейронных сетей 99 Регрессионный анализ. В определенной степени качество обучения нейронной сети может быть оценено ошибками обучения, контроля и тестирования, но этого может оказаться недостаточно и требуется более детальный анализ. Один из возможных подходов – это регрессионный анализ выходов сети и соответствующих целей. В составе ППП Neural Network Toolbox для этих целей предназначена М-функция postreg. Следующая последовательность операторов поясняет, как можно выполнить регрессионный анализ для сети, построенной на основе процедуры с прерыванием обучения: 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 100 Нейронные сети. MATLAB 6 На рис. 3.26, а и б показаны соответственно результаты обучения и результаты регрессионного анализа нейронной сети, предназначенной для аппроксимации функций. Выходы сети обозначены кружками; наилучшая подгонка – пунктирной, а точная – сплошной линией. В данном случае трудно отличить наилучшую подгонку от точной, поскольку аппроксимация функции выполнена очень точно. Пример процедуры обучения В этой главе было рассмотрено большое число методов, алгоритмов, стратегий и подходов к обучению нейронных сетей. Поэтому представляется целесообразным показать, как они используются для решения реальных практических задач. Рассмотрим одно из типичных приложений нейронных сетей в медицинских исследованиях. Для этого примера используем данные из медицинского приложения [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. Обучение нейронных сетей 101 в скрытом слое. Сеть должна иметь 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.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,а-в а 102 б в Нейронные сети. MATLAB 6 Рис. 3.28 Первые 2 выхода сети (hdl- и ldl-составляющие) хорошо отслеживают целевое множество, значение близко к 0.9, и это означает, что эти липидные характеристики могут быть определены по измерениям спектра крови. Третий выход (vldl-составляющая) восстанавливается плохо (коэффициент корреляции около 0.6), и это означает, что решение задачи должно быть продолжено. Можно использовать другую архитектуру сети, увеличить количество нейронов в скрытом слое (больше скрытых слоев нейронов) или воспользоваться методом регуляризации. Хотя может оказаться, что восстановление составляющей vldl на основе измерения спектра крови вообще несостоятельно. 3. Обучение нейронных сетей 103 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 элементов входа размера R2; S – число нейронов в слое. 104 Нейронные сети. MATLAB 6 В качестве функции активации персептрона по умолчанию используется функция hardlim. Пример: Функция 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: [11 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. Персептроны 105 Это соответствует рис. 4.1. Структурная схема модели персептрона показана на рис. 4.4 Рис. 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: [11 struct] weightFcn: 'dotprod' Из этого перечня следует, что в качестве функции инициализации по умолчанию используется функция initzero, которая присваивает весам входа нулевые значения. В этом можно убедиться, если извлечь значения элементов матрицы весов и смещения: wts = net.IW{1,1} 106 Нейронные сети. MATLAB 6 wts = 0 0 bias = net.b{1} bias = 0 Теперь переустановим значения элементов матрицы весов и смещения: 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 класса: обучение с учителем и обучение без учителя. При обучении с учителем задается множество примеров требуемого поведения сети, которое называется обучающим множеством {p1 , t1}, {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 = 108 Нейронные сети. MATLAB 6 = wTp + pTp изменится на положительную величину, а после нескольких таких шагов вход функции активации станет положительным и вектор входа будет классифицирован правильно. При этом изменятся настройки весов. 3. Выход нейрона равен 1, а должен быть равен 0 (а = 0, t = 1 и e = t – a= –1). В этом случае вход функции активации wТp положительный и его необходимо скорректировать. Вычтем из вектора весов w вектор входа p, и тогда произведение (wT – pT) p = T T = w p – p p изменится на отрицательную величину, а после нескольких шагов вход функции активации станет отрицательным и вектор входа будет классифицирован правильно. При этом изменятся настройки весов. Теперь правило настройки (обучения) персептрона можно записать, связав изменение вектора весов 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 epT ; b (t a) e . (4.6) Тогда правило настройки (обучения) персептрона можно записать в следующей форме: new W old epT ; W new b old e . b (4.7) Описанные соотношения положены в основу алгоритма настройки параметров персептрона, который реализован в ППП Neural Network Toolbox в виде М-функции learnp. Каждый раз при выполнении функции learnp будет происходить перенастройка параметров персептрона. Доказано, что если решение существует, то процесс обучения персептрона сходится за конечное число итераций. Если смещение не используется, функция learnp ищет решение, изменяя только вектор весов w. Это приводит к нахождению разделяющей линии, перпендикулярной вектору w и которая должным образом разделяет векторы входа. Рассмотрим простой пример персептрона с единственным нейроном и двухэлементным вектором входа: net = newp([–2 2;–2 2],1); Определим смещение b равным 0, а вектор весов w равным [1 –0.8]: 4. Персептроны 109 net.b{1} = 0; w = [1 –0.8]; net.IW{1,1} = w; Обучающее множество зададим следующим образом: p = [1; 2]; t = [1]; Моделируя персептрон, рассчитаем выход и ошибку на первом шаге настройки (обучения): a a e e = = = = sim(net,p) 0 t–a 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). 110 Нейронные сети. MATLAB 6 Рис. 4.5 Эта сеть и задача, которую мы собираемся рассматривать, достаточно просты, так что можно все расчеты выполнить вручную. Предположим, что требуется с помощью персептрона решить задачу классификации векторов, если задано следующее обучающее множество: 2 1 2 1 p1 , t1 0 p 2 , t 2 1 p 3 , t3 0 p 4 , t 4 1 . 2 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 и не требуется изменений в весах или смещении. Таким образом, 4. Персептроны 111 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.15) Чтобы определить, получено ли удовлетворительное решение, требуется сделать один проход через все векторы входа, чтобы проверить, соответствуют ли решения обучающему множеству. Вновь используем первый член обучающей последовательности и получаем: w T (5) w T (4) 3 1; b(5) b(4) 0. Переходя ко второму члену, получим следующий результат: (4.16) w T (6) 2 3, (4.17) b(6) 1. Этим заканчиваются ручные вычисления. Теперь выполним аналогичные расчеты, используя М-функцию 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 Это совпадает с результатами, полученными при ручном расчете. Теперь можно ввести второй элемент обучающего множества и т. д., т. е. повторить всю процедуру ручного счета и получить те же результаты. 112 Нейронные сети. MATLAB 6 Но можно эту работу выполнить автоматически, задав сразу все обучающее множество и выполнив 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] Скорректированные вектор весов и смещение равны 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, которая решает задачу классификации с помощью простого персептрона. Как следует из сказанного выше, для настройки (обучения) персептрона применяется процедура адаптации, которая корректирует параметры персептрона по результатам 4. Персептроны 113 обработки каждого входного вектора. Применение М-функции adapt гарантирует, что любая задача классификации с линейно отделимыми векторами будет решена за конечное число циклов настройки. Для настройки (обучения) персептрона можно было бы воспользоваться также М-функцией train. В этом случае используется все обучающее множество и настройка параметров сети выполняется не после каждого прохода, а в результате всех проходов обучающего множества. К сожалению, не существует доказательства того, что такой алгоритм обучения персептрона является сходящимся. Поэтому использование Мфункции train для обучения персептрона не рекомендуется. Нейронные сети на основе персептрона имеют ряд ограничений. Во-первых, выход персептрона может принимать только одно из двух значений (0 или 1); во-вторых, персептроны могут решать задачи классификации только для линейно отделимых наборов векторов. Если с помощью прямой линии или гиперплоскости в многомерном случае можно разделить пространство входов на 2 области, в которых будут расположены векторы входа, относящиеся к различным классам, то векторы входа считаются линейно отделимыми. Если векторы входа линейно отделимы, то доказано, что при использовании процедуры адаптации задача классификации будет решена за конечное время. Если векторы входа линейно неотделимы, то процедура адаптации не в состоянии классифицировать все векторы должным образом. Демонстрационная программа demop6 иллюстрирует тщетность попытки классифицировать векторы входа, которые линейно неотделимы. Для решения более сложных задач можно использовать сети с несколькими персептронами. Например, для классификации четырех векторов на 4 группы можно построить сеть с двумя персептронами, чтобы сформировать 2 разделяющие линии и таким образом приписать каждому вектору свою область. Отметим еще одну особенность процесса обучения персептрона. Если длина некоторого вектора входа намного больше или меньше длины других векторов, то для обучения может потребоваться значительное время. Это обусловлено тем, что алгоритм настройки связан с добавлением или вычитанием входного вектора из текущего вектора весов. Таким образом, присутствие вектора входа с очень большими или малыми элементами может привести к тому, что потребуется длительное время для настройки параметров. Демонстрационная программа demop4 поясняет, как влияет выброс длины вектора на продолжительность обучения. Можно сделать время обучения нечувствительным к большим или малым выбросам векторов входа, если несколько видоизменить исходное правило обучения персептрона: w T (t a)p T ep T . (4.18) Действительно, из этого соотношения следует, что чем больше компоненты вектора входа p, тем большее воздействие он оказывает на изменение элементов вектора w. Можно уравновесить влияние больших или малых компонент, если ввести масштабирование вектора входа. Решение состоит в том, чтобы нормировать входные данные так, чтобы воздействие любого вектора входа имело примерно равный вклад: w T (t a) 114 pT pT . e p p (4.19) Нейронные сети. MATLAB 6 Нормированное правило обучения персептрона реализуется М-функцией learnpn. Этот алгоритм требует несколько большего времени, но значительно сокращает количество циклов обучения, когда встречаются выбросы векторов входа. Демонстрационная программа demop5 иллюстрирует это правило обучения. В заключение следует отметить, что основное назначение персептронов – решать задачи классификации. Они великолепно справляются с задачей классификации линейно отделимых векторов; сходимость гарантируется за конечное число шагов. Длительность обучения чувствительна к выбросам длины отдельных векторов, но и в этом случае решение может быть построено. Однослойный персептрон может классифицировать только линейно отделимые векторы. Возможные способы преодолеть эту трудность предполагают либо предварительную обработку с целью сформировать линейно отделимое множество входных векторов, либо использование многослойных персептронов. Можно также применить другие типы нейронных сетей, например линейные сети или сети с обратным распространением, которые могут выполнять классификацию линейно неотделимых векторов входа. 4. Персептроны 115 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 которой имеет размер S1. 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 },... ,{pQ t Q }, где p1 , p 2 ,..., pQ – входы сети; t1 , 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] Выход сети соответствует целевому вектору. 118 Нейронные сети. MATLAB 6 Зададим следующий диапазон весов и смещений, рассчитаем критерий качества обучения и построим его линии уровня (рис. 5.4): 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) w1, j w1, j 2 e(k ) e (k ) b 2e(k ) b . Подставляя выражение для ошибки в форме R e(k ) t (k ) w1,i pi (k ) b , j 1 (5.4) получим 5. Линейные сети 119 e(k ) w p j (k ) ; 1, j e(k ) 1. b (5.5) Здесь pj(k) – j-й элемент вектора входа на k-й итерации. Эти соотношения лежат в основе обучающего алгоритма WH w (k 1) w (k ) e(k )p T (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 моделирует настроенную сеть для имеющегося набора векторов, сравнивает результаты с набором целевых векторов и вычисляет среднеквадратичную ошибку. Как только значение ошибки становится меньше заданного или исчерпано предельное число эпох, обучение прекращается. 120 Нейронные сети. MATLAB 6 Обратимся к тому же примеру, который использовался при рассмотрении процедуры адаптации, и выполним процедуру обучения. P = [1 –1.2];% Вектор входов T= [0.5, 1]; % Вектор целей % Максимальное значение параметра обучения maxlr = 0.40*maxlinlr(P,'bias'); % Создание линейной сети 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. Линейные сети 121 а б Рис. 5.5 Если не строить траектории процесса обучения, то можно выполнить обучение, обратившись к М-функции train только 1 раз: 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); 122 Нейронные сети. MATLAB 6 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, для работы которой характерна настройка параметров с учетом ошибки при представлении каждого вектора входа. Затем обучение применяется к скорректированной сети, вычисляются выходы, сравниваются с соответствующими целями и вновь вычисляется ошибка обучения. Если достигнута допустимая погрешность или превышено максимальное число циклов (эпох) обучения, то процедура настройки прекращается. Алгоритм обучения и настройки сходится, если задача классификации разрешима. Проиллюстрируем решение задачи классификации, ранее решенной с помощью персептрона. Используем для этого простейшую линейную сеть, представленную на рис. 5.1. Обучающее множество представлено следующими четырьмя парами векторов входов и целей: 2 p1 , t1 0 2 1 2 1 p 2 , t 2 1 p3 , t 3 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 цикла обучения, а соответствующие параметры сети принимают значения 5. Линейные сети 123 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.7 представлена структурная схема цифрового фильтра, отличительной особенностью которого является то, что он включает динамический компонент – линию задержки (ЛЗ) и 1 слой линейной нейронной сети. Линейный слой ЛЗ pd1 p(k) w11 D n(k) pd2 p(k-1) w12 p(k-N-1) D N pdN a(k) 1 b w1N a = purelin(Wp+b) Рис. 5.7 Последовательность значений входного сигнала {p(k)} поступает на ЛЗ, состоящую из N–1 блока запаздывания; выход ЛЗ – N-мерный вектор pd, составленный из значений входа в моменты времени k, k–1, …, k–N–1. Выход линейного нейронного слоя и фильтра в целом описывается следующим динамическим соотношением: 124 Нейронные сети. MATLAB 6 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 b(t) w13 P3(t) = p(t-2) 1 a = purelin(Wp+b) Рис. 5.8 Предположим, что входной сигнал принимает значения в диапазоне от 0 до 10, и сформируем линейную сеть с одним входом и одним выходом, используя М-функцию newlin: net = newlin([0,10],1); Введем ЛЗ с двумя тактами запаздывания: 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 циклов обучения: 5. Линейные сети 125 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.9 Некоторый сигнал поступает на линию задержки так, что на ее выходе формируются 2 сигнала: p(t–1), p(t–2). Настройка сети реализуется с помощью М-функции adapt, которая изменяет параметры сети на каждом шаге с целью минимизировать погрешность e(t) = a(t) – p(t). Если эта погрешность нулевая, то выход сети a(t) точно равен p(t) и сеть выполняет предсказание должным образом. Ниже приведен сценарий, который предназначен для решения задачи предсказания сигнала на 1 шаг вперед. Входной детерминированный процесс получен в результате прохождения ступенчатого сигнала через колебательное звено. 126 Нейронные сети. MATLAB 6 Поскольку для формирования входа применено динамическое звено второго порядка, то в сети 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 % Построение графиков 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. Линейные сети 127 а б Рис. 5.10 Как видно из этих рисунков, приемлемое для данной постановки задачи количество циклов обучения равно пяти; результаты моделирования показывают, что при длительности процесса 10 с диапазон успешного предсказания находится в пределах 1.8– 10 с. Подавление шумов Задача подавления шумов возникает в следующей ситуации. Когда пилот говорит в микрофон, шум двигателя в кабине добавляется к голосовому сигналу и пассажиры слышат речь с искажениями. Требуется восстановить речь пилота, удалив из нее звуки шумов двигателя. Для решения этой задачи построим адаптивный фильтр, полагая, что в нашем распоряжении имеются записи шумов двигателя (рис. 5.11). Рис. 5.11 Используя адаптируемую нейронную сеть ADALINE, построим такой фильтр, который позволит удалить шум n из зашумленного сигнала m. Рассмотрим подробнее структурную схему, представленную на рис. 5.11. Голос пилота v смешан с помехой от 128 Нейронные сети. MATLAB 6 шумов двигателя, которая формируется фильтром шума по известным записям сигнала n. Зашумленный сигнал m моделирует искаженную речь пилота. Задача состоит в том, чтобы с помощью адаптивного фильтра сформировать такую модель шума а, которая при вычитании из зашумленного сигнала позволила бы выделить речь пилота. Адаптивный фильтр, построенный на базе линейной нейронной сети ADALINE, должен быть настроен так, чтобы убирать шум двигателя. Заметим, что такая адаптивная фильтрация предпочтительнее классического фильтра, в котором шум не вычитается, а отфильтровывается от сигнала m. Многомерные цифровые фильтры Для проектирования многомерных фильтров следует применять сети ADALINE, в которых используется более одного нейрона. Это приведет к тому, что вместо вектора весов входа будет использоваться матрица весов W, а вместо единственного смещения – вектор смещений b. Структурная схема такого многомерного фильтра показана на рис. 5.12. Линейные нейроны ЛЗ pd1 w11 p(k) b1 p(k-1) a2(k) n2(k)` b2 pdN D a1(k) pd2 D n1(k) p(k-N-1) aS(k) nS(k) wS, N bS N a = purelin(Wp+b) Рис. 5.12 Эта схема достаточно сложна для восприятия, и ее можно представить в укрупненном виде (рис. 5.13, а). Если в линии задержки (ЛЗ) требуется показать больше деталей, то можно использовать следующий вариант структурной схемы (рис. 5.13, б). Линейный слой из 3 нейронов Линейный слой из S нейронов ЛЗ Q1 n(k) W (QN)1 N 1 pd(k) p(k) pd(k) p(k) a(k) S1 S(QN) b S1 ЛЗ 11 0 32 31 1 2 n(k) W 31 31 b 1 a(k) 31 S1 2 a 5. Линейные сети б 129 Рис. 5.13 Здесь ЛЗ представлена в развернутом виде, указывая, что на вход весовой матрицы подается текущее значение и значения с запаздыванием на 1 и 2 периода дискретности. Можно использовать и большее число блоков задержки, но указывать их надо в порядке возрастания сверху вниз. 130 В заключение отметим основные преимущества и ограничения линейных сетей: Однослойные линейные сети могут решать задачи линейной аппроксимации функций и распознавания образов. Однослойные линейные сети могут быть либо рассчитаны непосредственно, либо обучены с использованием правила обучения WH. Кроме того, для их настройки могут применяться процедуры адаптации. Архитектура однослойной линейной сети полностью определяется задачей, которая должна будет решена, причем число входов сети и число нейронов в слое определяется числом входов и выходов задачи. Адаптируемые линейные сети ADALINE находят большое практическое применение при построении цифровых фильтров для обработки сигналов. Линейные нейронные сети могут быть успешно обучены только в том случае, когда входы и выходы связаны линейно. Тем не менее даже в том случае, когда линейная сеть не может найти точного решения, она в состоянии построить наиболее близкое решение в смысле минимума среднеквадратичной ошибки при условии, что параметр обучения достаточно мал. Такая сеть найдет наиболее точное решение в рамках линейной структуры сети. Это обусловлено тем, что поверхность ошибки обучения является многомерным параболоидом, имеющим единственный минимум, и алгоритм градиентного спуска должен привести решение к этому минимуму. При работе с моделями линейных сетей могут возникать ситуации, когда число настраиваемых параметров недостаточно, чтобы выполнить все условия; в этом случае говорят, что сеть переопределена. Однако может иметь место и обратная ситуация, когда число настраиваемых параметров слишком велико, и в этом случае говорят, что сеть недоопределена. Тем не менее в обоих случаях метод наименьших квадратов осуществляет настройку, стремясь минимизировать ошибку сети. Эти ситуации поясняются демонстрационными примерами 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, 132 Нейронные сети. MATLAB 6 то его выходом будет 0.5 для любого вектора входа p и вектора веса w при расстоянии между векторами, равном 8.333, или 0.833/b. Радиальная базисная сеть состоит из двух слоев: скрытого радиального базисного слоя, имеющего 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, то выход линейного слоя будет равен весу активного выходного нейрона. Однако это исключительный случай, обычно выход формируют несколько нейронов с разными значениями весов. 6. Радиальные базисные сети 133 Создание сети Для построения радиальных базисных сетей предназначены М-функции newrbe и newrb. Первая позволяет построить радиальную базисную сеть с нулевой ошибкой, вторая позволяет управлять количеством нейронов скрытого слоя. Радиальная базисная сеть с нулевой ошибкой Для построения радиальных базисных сетей с нулевой ошибкой предназначена функция 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. 134 Нейронные сети. MATLAB 6 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]; 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) 6. Радиальные базисные сети 135 Входами функции newrb являются массивы входных и целевых векторов P и T, а также параметры GOAL (допустимая среднеквадратичная ошибка сети), SPREAD (параметр влияния), а выходом – описание радиальной базисной сети. Значение параметра SPREAD должно быть достаточно большим, чтобы покрыть весь диапазон значений входов, но не настолько, чтобы эти значения были одинаково значимыми. Применим функцию 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. Радиальные базисные сети 137 Как следует из анализа рис. 6.6 разложение по радиальным базисным функциям обеспечивает необходимую гладкость. Поэтому их применение для аппроксимации произвольных нелинейных зависимостей вполне оправдано. Разложение вида (6.2) может быть реализовано на двухслойной нейронной сети, первый слой которой состоит из радиальных базисных нейронов, а второй – из единственного нейрона с линейной характеристикой, на котором реализуется суммирование выходов нейронов первого слоя. Приступим к формированию радиальной базисной сети. Сформируем обучающее множество и зададим допустимое значение функционала ошибки, равное 0.01, параметр влияния определим равным 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 138 Нейронные сети. MATLAB 6 В демонстрационных примерах demorb3 и demorb4 исследуется влияние параметра SPREAD на структуру радиальной базисной сети и качество аппроксимации. В демонстрационном примере demorb3 параметр влияния SPREAD установлен равным 0.01. Это означает, что диапазон перекрытия входных значений составляет лишь 0.01, а поскольку обучающие входы заданы с интервалом 0.1, то входные значения функциями активации не перекрываются. GOAL = 0.01; % Допустимое значение функционала ошибки SPREAD = 0.01; % Параметр влияния 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 6. Радиальные базисные сети 139 В процессе вычислений возникают трудности с обращением матриц, и об этом выдаются предупреждения; количество нейронов скрытого слоя устанавливается равным 21, а точность аппроксимации оказывается недопустимо низкой: plot(P,T,'+k') % Точки обучающего множества hold on; X = –1:.01:1; Y = sim(net,X); % Моделирование сети plot(X,Y); % Рис. 6.9 Рис. 6.9 Вывод из выполненного исследования состоит в том, что параметр влияния SPREAD следует выбирать большим, чем шаг разбиения интервала задания обучающей последовательности, но меньшим размера самого интервала. Для данной задачи это означает, что параметр влияния SPREAD должен быть больше 0.1 и меньше 2. 6.1. Сети GRNN Нейронные сети GRNN (Generalized Regression Neural Network) описаны в работе [43] и предназначены для решения задач обобщенной регрессии, анализа временных рядов и аппроксимации функций. Характерной особенностью этих сетей является очень высокая скорость их обучения. Архитектура сети Архитектура сети GRNN показана на рис. 6.10. Она аналогична архитектуре радиальной базисной сети, но отличается структурой второго слоя, в котором используется блок normprod для вычисления нормированного скалярного произведения строки массива весов LW21 и вектора входа a1 в соответствии со следующим соотношением: n2 140 LW 21a1 sum(a1 ) . (6.3) Нейронные сети. MATLAB 6 Рис. 6.10 Первый слой – это радиальный базисный слой с числом нейронов, равным числу элементов 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 % Число нейронов в скрытом слое 6. Радиальные базисные сети 141 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.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); 142 Нейронные сети. MATLAB 6 plot(P,T,'*k','markersize',10) hold on, plot(P,A,'ok','markersize',10); Результат показан на рис. 6.12. Рис. 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 6. Радиальные базисные сети 143 Сформированная сеть GRNN использует всего 8 нейронов в скрытом слое и весьма успешно решает задачу аппроксимации и экстраполяции нелинейной зависимости, восстанавливаемой по экспериментальным точкам. 6.2. Сети PNN Нейронные сети PNN (Probabilistic Neural Networks) описаны в работе [43] и предназначены для решения вероятностных задач, и в частности задач классификации. Архитектура сети Архитектура сети PNN базируется на архитектуре радиальной базисной сети, но в качестве второго слоя использует так называемый конкурирующий слой, который подсчитывает вероятность принадлежности входного вектора к тому или иному классу и в конечном счете сопоставляет вектор с тем классом, вероятность принадлежности к которому выше. Структура сети PNN представлена на рис. 6.14. Рис. 6.14 Предполагается, что задано обучающее множество, состоящее из Q пар векторов вход/цель. Каждый вектор цели имеет K элементов, указывающих класс принадлежности, и, таким образом, каждый вектор входа ставится в соответствие одному из K классов. В результате может быть образована матрица связности T размера KQ, состоящая из нулей и единиц, строки которой соответствуют классам принадлежности, а столбцы – векторам входа. Таким образом, если элемент 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 классов. В результате конкурирующая функция активации второго слоя 144 Нейронные сети. MATLAB 6 compet формирует на выходе значение, равное 1, для самого большого по величине элемента вектора n2 и 0 в остальных случаях. Таким образом, сеть PNN выполняет классификацию векторов входа по K классам. Синтез сети Для создания нейронной сети 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]'; Выполняя моделирование сети для этого набора векторов, получаем 6. Радиальные базисные сети 145 a = sim(net,p); ac = vec2ind(a) ac = 2 1 3 Фрагмент демонстрационной программы 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 относительно медленно, поскольку выполняют очень большие объемы вычислений по сравнению с другими типами нейронных сетей. 6. Радиальные базисные сети 147 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 Самоорганизующиеся сети Формирование сети Создание слоя Кохонена Создание карты Кохонена Работа с сетью Моделирование Инициализация Адаптация Обучение Функции расстояния и взвешивания Отрицательное евклидово расстояние Функции накопления Сумма взвешенных входов Функции активации 147 compet 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. 148 Нейронные сети. MATLAB 6 Конкурирующий слой Вход S1R IW11 p ||ndist|| a1 n1 R1 C 1 R 1 b S 1 1 S11 S11 S1 Рис. 7.1 Нетрудно убедиться, что это слой конкурирующего типа, поскольку в нем применена конкурирующая функция активации. Кроме того, архитектура этого слоя очень напоминает архитектуру скрытого слоя радиальной базисной сети. Здесь использован блок ndist для вычисления отрицательного евклидова расстояния между вектором входа p и строками матрицы весов IW11. Вход функции активации n1 – это результат суммирования вычисленного расстояния с вектором смещения b. Если все смещения нулевые, максимальное значение n1 не может превышать 0. Нулевое значение n1 возможно только, когда вектор входа p оказывается равным вектору веса одного из нейронов. Если смещения отличны от 0, то возможны и положительные значения для элементов вектора n1. Конкурирующая функция активации анализирует значения элементов вектора n1 и формирует выходы нейронов, равные 0 для всех нейронов, кроме одного нейрона – победителя, имеющего на входе максимальное значение. Таким образом, вектор выхода слоя a1 имеет единственный элемент, равный 1, который соответствует нейронупобедителю, а остальные равны 0. Такая активационная характеристика может быть описана следующим образом: * 1 1, i i , i* arg(max n i ) (7.1) a1i * 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 7. Сети кластеризации и классификации данных 149 В этом примере нетрудно видеть, что 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 Определим характеристики слоя Кохонена: net.layers{1} ans = dimensions: distanceFcn: distances: initFcn: netInputFcn: positions: size: topologyFcn: transferFcn: userdata: 2 'dist' [22 double] 'initwb' 'netsum' [0 1] 2 'hextop' 'compet' [11 struct] Из этого описания следует, что сеть использует функцию евклидова расстояния dist, функцию инициализации initwb, функцию обработки входов netsum, функцию активации compet и функцию описания топологии hextop. Характеристики смещений следующие: net.biases{1} ans = initFcn: learn: learnFcn: learnParam: size: userdata: 'initcon' 1 'learncon' [11 struct] 2 [11 struct] Смещения задаются функцией initcon и для инициализированной сети равны net.b{1} ans = 5.4366 5.4366 150 Нейронные сети. MATLAB 6 Функцией настройки смещений является функция learncon, обеспечивающая настройку с учетом параметра активности нейронов. Элементы структурной схемы слоя Кохонена показаны на рис. 7.2, а-б и могут быть получены с помощью оператора gensim(net) Они наглядно поясняют архитектуру и функции, используемые при построении слоя Кохонена. а б Рис. 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 матрицы весов добавлением взвешенной разности вектора входа и значения строки на предыдущем шаге. Таким образом, вектор веса, наиболее близкий к вектору входа, модифицируется так, чтобы расстояние между ними стало еще меньше. Результат такого обучения будет заключаться в том, что победивший нейрон, вероятно, выиграет конкуренцию и в том случае, когда будет представлен новый входной вектор, 7. Сети кластеризации и классификации данных 151 близкий к предыдущему, и его победа менее вероятна, когда будет представлен вектор, существенно отличающийся от предыдущего. Когда на вход сети поступает все большее и большее число векторов, нейрон, являющийся ближайшим, снова корректирует свой весовой вектор. В конечном счете, если в слое имеется достаточное количество нейронов, то каждая группа близких векторов окажется связанной с одним из нейронов слоя. В этом и заключается свойство самоорганизации слоя Кохонена. Настройка параметров сети по правилу Кохонена реализована в виде М-функции learnk. Правило настройки смещений Одно из ограничений всякого конкурирующего слоя состоит в том, что некоторые нейроны оказываются незадействованными. Это проявляется в том, что нейроны, имеющие начальные весовые векторы, значительно удаленные от векторов входа, никогда не выигрывают конкуренции, независимо от того как долго продолжается обучение. В результате оказывается, что такие векторы не используются при обучении и соответствующие нейроны никогда не оказываются победителями. Такие нейронынеудачники называют "мертвыми" нейронами, поскольку они не выполняют никакой полезной функции. Чтобы исключить такую ситуацию и сделать нейроны чувствительными к поступающим на вход векторам, используются смещения, которые позволяют нейрону стать конкурентным с нейронами-победителями. Этому способствует положительное смещение, которое добавляется к отрицательному расстоянию удаленного нейрона. Соответствующее правило настройки, учитывающее нечувствительность мертвых нейронов, реализовано в виде М-функции learncon и заключается в следующем. В начале процедуры настройки всем нейронам конкурирующего слоя присваивается одинаковый параметр активности 1 (7.3) c0 , N где N – количество нейронов конкурирующего слоя, равное числу кластеров. В процессе настройки М-функция learncon корректирует этот параметр таким образом, чтобы его значения для активных нейронов становились больше, а для неактивных нейронов меньше. Соответствующая формула для вектора приращений параметров активности выглядит следующим образом: c lr * (a1i c) , где lr – параметр скорости настройки; (7.4) a1i * – вектор, элемент i* которого равен 1, а остальные – 0. Нетрудно убедиться, что для всех нейронов, кроме нейрона-победителя, приращения отрицательны. Поскольку параметры активности связаны со смещениями соотношением (в обозначениях системы MATLAB) b exp(1) . / c , (7.5) то из этого следует, что смещение для нейрона-победителя уменьшится, а смещения для остальных нейронов немного увеличатся. М-функция learncon использует следующую формулу для расчета приращений вектора смещений 152 Нейронные сети. MATLAB 6 (7.6) b exp(1 log(c)) b . Параметр скорости настройки lr по умолчанию равен 0.001, и его величина обычно на порядок меньше соответствующего значения для М-функции learnk. Увеличение смещений для неактивных нейронов позволяет расширить диапазон покрытия входных значений, и неактивный нейрон начинает формировать кластер. В конечном счете он может начать притягивать новые входные векторы. Это дает два преимущества. Если нейрон не выигрывает конкуренции, потому что его вектор весов существенно отличается от векторов, поступающих на вход сети, то его смещение по мере обучения становится достаточно большим и он становится конкурентоспособным. Когда это происходит, его вектор весов начинает приближаться к некоторой группе векторов входа. Как только нейрон начинает побеждать, его смещение начинает уменьшаться. Таким образом, задача активизации "мертвых" нейронов оказывается решенной. Второе преимущество, связанное с настройкой смещений, состоит в том, что они позволяют выравнять значения параметра активности и обеспечить притяжение приблизительно одинакового количества векторов входа. Таким образом, если один из кластеров притягивает большее число векторов входа, чем другой, то более заполненная область притянет дополнительное количество нейронов и будет поделена на меньшие по размерам кластеры. Обучение сети Реализуем 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), в то время как вторая строка близка к началу координат. Таким образом, сформированная сеть обучена классификации входов. В процессе обучения каждый нейрон в слое, весовой 7. Сети кластеризации и классификации данных 153 вектор которого близок к группе векторов входа, становится определяющим для этой группы векторов. В конечном счете, если имеется достаточное число нейронов, каждая группа векторов входа будет иметь нейрон, который выводит 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; % Число точек 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} 154 Нейронные сети. MATLAB 6 c0 = exp(1)./b0 Начальные значения весов, смещений и параметров активности нейронов представлены в следующей таблице: w0 = 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 b0 = 21.746 21.746 21.746 21.746 21.746 21.746 21.746 21.746 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 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 w = 6.2184 2.4239 1.3277 0.94701 0.31139 0.40935 3.543 4.5845 3.4617 2.8996 4.3171 1.4278 6.7065 0.43696 0.97817 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 7. Сети кластеризации и классификации данных 155 Рассмотренная самонастраивающаяся сеть Кохонена является типичным примером сети, которая реализует процедуру обучения без учителя. Демонстрационный пример democ1 также поясняет процедуру обучения самоорганизующейся сети. 7.1.2. Карта Кохонена Самоорганизующаяся сеть в виде карты Кохонена предназначена для решения задач кластеризации входных векторов. В отличие от слоя Кохонена карта Кохонена поддерживает такое топологическое свойство, когда близким кластерам входных векторов соответствуют близко расположенные нейроны. Первоначальная топология размещения нейронов в слое Кохонена задается М-функциями gridtop, hextop или randtop, что соответствует размещению нейронов в узлах либо прямоугольной, либо гексагональной сетки, либо в узлах сетки со случайной топологией. Расстояния между нейронами вычисляются с помощью специальных функций вычисления расстояний dist, boxdist, linkdist и mandist. Карта Кохонена для определения нейрона-победителя использует ту же процедуру, какая применяется и в слое Кохонена. Однако на карте Кохонена одновременно изменяются весовые коэффициенты соседних нейронов в соответствии со следующим соотношением, именуемым правилом Кохонена: (7.7) i w ( q ) (1 ) i w ( q 1) αp(q) . В этом случае окрестность нейрона-победителя включает все нейроны, которые находятся в пределах некоторого радиуса 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}. Заметим, что топология карты расположения нейронов не обязательно должна быть двумерной. Это могут быть и одномерные и трехмерные карты, и даже карты больших 156 Нейронные сети. MATLAB 6 размерностей. В случае одномерной карты Кохонена, когда нейроны расположены вдоль линии, каждый нейрон будет иметь только двух соседей в пределах радиуса 1 или единственного соседа, если нейрон расположен на конце линии. Расстояния между нейронами можно определять различными способами, используя прямоугольные или гексагональные сетки, однако это никак не влияет на характеристики сети, связанные с классификацией входных векторов. Топология карты Как уже отмечалось выше, можно задать различные топологии для карты расположения нейронов, используя М-функции gridtop, hextop, randtop. Рассмотрим простейшую прямоугольную сетку размера 23 для размещения шести нейронов, которая может быть сформирована с помощью функции 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 и задают позиции расположения нейронов по первой, второй и т. д. размерностям карты. Рис. 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.5000 1.5000 7. Сети кластеризации и классификации данных 0 1.0000 157 0 0 plotsom(pos) % Рис.7.7 0.8660 0.8660 1.7321 1.7321 Рис. 7.7 Заметим, что М-функция hextop используется по умолчанию при создании карт Кохонена при применении функции newsom. Сетка со случайным расположением узлов может быть создана с помощью функции randtop: 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 вычисляет евклидово расстояние между нейронами, размещенными в узлах сетки, в соответствии с формулой 158 Нейронные сети. MATLAB 6 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 Этот массив размера 66 описывает расстояния между нейронами и содержит на диагонали нули, поскольку они определяют расстояние нейрона до самого себя, а затем, двигаясь вдоль строки, – до второго, третьего и т. д. На рис. 7.9 показано расположение нейронов в узлах прямоугольной сетки. Введем понятие окрестности для прямоугольной сетки. В этом случае окрестность размера 1, или просто окрестность 1, включает базовый нейрон и его непосредственных соседей; окрестность 2 включает нейроны из окрестности 1 и их соседей. Столбцы Базовый нейрон Строки Прямоугольный слой Окрестность 1 Окрестность 2 Окрестность 3 Рис. 7.9 Размер, а соответственно и номер окрестности, определяется максимальным значением координаты смещения нейрона от базового. Вводимое таким способом расстояние между нейронами называется расстоянием максимального координатного смещения и может быть вычислено по формуле (7.11) d max(abs(posi pos j )), где posi, posj – векторы положения нейронов с номерами i и j. Для вычисления этого расстояния в ППП NNT предназначениа М-функция boxdist. Для конфигурации нейронов, показанной на рис. 7.6, эти расстояния равны: pos = gridtop(2,3); d = boxdist(pos) d = 0 1 1 1 2 2 7. Сети кластеризации и классификации данных 159 1 1 1 2 2 0 1 1 2 2 1 0 1 1 1 1 1 0 1 1 2 1 1 0 1 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, и т. д. Для вычисления расстояния связи в ППП 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 160 1 0 1 2 2 1 2 3 3 2 Нейронные сети. MATLAB 6 1 2 2 3 2 1 3 2 0 1 1 2 1 0 2 1 1 2 0 1 2 1 1 0 В случае прямоугольной сетки оно совпадает с расстоянием связи. Архитектура сети Архитектура самоорганизующейся карты Кохонена показана на рис. 7.10. Рис. 7.10 Эта архитектура аналогична структуре слоя Кохонена за исключением того, что здесь не используются смещения. Конкурирующая функция активации возвращает 1 для элемента выхода a1, соответствующего победившему нейрону; все другие элементы вектора a1 равны 0. Однако в сети Кохонена выполняется перераспределение нейронов, соседствующих с победившим нейроном. При этом можно выбирать различные топологии размещения нейронов и различные меры для вычисления расстояний между нейронами. Создание сети Для создания самоорганизующейся карты Кохонена в составе ППП NNT предусмотрена М-функция newsom. Допустим, что требуется создать сеть для обработки двухэлементных векторов входа с диапазоном изменения элементов от 0 до 2 и от 0 до 1 соответственно. Предполагается использовать гексагональную сетку размера 23. Тогда для формирования такой нейронной сети достаточно воспользоваться оператором net = newsom([0 2; 0 1], [2 3]); net.layers{1} ans = dimensions: [2 3] distanceFcn: 'linkdist' distances: [66 double] initFcn: 'initwb' netInputFcn: 'netsum' positions: [26 double] size: 6 topologyFcn: 'hextop' transferFcn: 'compet' userdata: [11 struct] 7. Сети кластеризации и классификации данных 161 Из анализа характеристик этой сети следует, что она использует по умолчанию гексагональную топологию 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 Векторы входа помечены символом * и расположены по периметру рисунка, а начальное расположение нейронов соответствует точке с координатами (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 – размер окрестности нейрона-победителя. 162 Нейронные сети. MATLAB 6 В соответствии с соотношениями (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 параметра: размер окрестности и параметр скорости обучения. Этап упорядочения. На этом этапе используется фиксированное количество шагов. Начальный размер окрестности назначается равным максимальному расстоянию между нейронами для выбранной топологии и затем уменьшается до величины, используемой на этапе подстройки в соответствии со следующим правилом: s nd 1.00001 (max(d ) 1)(1 ) , (7.16) 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 . Параметр скорости обучения изменяется по следующему правилу: lr tune _ lr S . s 7. Сети кластеризации и классификации данных (7.19) 163 Параметр скорости обучения продолжает уменьшаться, но очень медленно, и именно поэтому этот этап именуется подстройкой. Малое значение окрестности и медленное уменьшение параметра скорости обучения хорошо настраивают сеть при сохранении размещения, найденного на предыдущем этапе. Число шагов на этапе подстройки должно значительно превышать число шагов на этапе размещения. На этом этапе происходит тонкая настройка весов нейронов по отношению к набору векторов входа. Как и в случае слоя Кохонена, нейроны карты Кохонена будут упорядочиваться так, чтобы при равномерной плотности векторов входа нейроны карты Кохонена также были распределены равномерно. Если векторы входа распределены неравномерно, то и нейроны на карте Кохонена будут иметь тенденцию распределяться в соответствии с плотностью размещения векторов входа. Таким образом, при обучении карты Кохонена решается не только задача кластеризации входных векторов, но и выполняется частичная классификация. Выполним обучение карты Кохонена размера 23 с гексагональной сеткой и с мерой, определяемой расстоянием связи 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.12. Рис. 7.12 Положение нейронов и их нумерация определяются массивом весовых векторов, который для данного примера имеет вид: 164 Нейронные сети. MATLAB 6 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. Номер кластера на рисунке соответствует номеру соответствующего нейрона на карте Кохонена. Если сформировать произвольный вектор входа, то карта Кохонена должна указать его принадлежность к тому или иному кластеру: 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. Сети кластеризации и классификации данных 165 а б Рис. 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]: a = sim(net,[1;0]) a = (10,1) 1 Как и следовало ожидать, он отнесен к кластеру с номером 10. Двумерная карта Кохонена Этот пример демонстрирует обучение двумерной карты Кохонена. Сначала создадим обучающий набор случайных двумерных векторов, элементы которых распределены по равномерному закону в интервале [–1 1]: P = rands(2,1000); plot(P(1,:),P(2,:),'+') % Рис.7.14 166 Нейронные сети. MATLAB 6 Рис. 7.14 Для кластеризации векторов входа создадим самоорганизующуюся карту Кохонена размера 56 с 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, в). Нетрудно убедиться, что нейроны карты весьма равномерно покрывают область векторов входа. а б Рис. 7.15 в Определим принадлежность нового вектора к одному из кластеров карты Кохонена и построим соответствующую вершину вектора на рис. 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. Сети кластеризации и классификации данных 167 Из анализа рис. 7.16 следует, что количество векторов входной последовательности, отнесенных к определенному кластеру, колеблется от 13 до 50. Рис. 7.16 Таким образом, в процессе обучения двумерная самоорганизующаяся карта Кохонена выполнила кластеризацию массива векторов входа. Следует отметить, что на этапе размещения было выполнено лишь 20 % от общего числа шагов обучения, т. е. 80 % общего времени обучения связано с тонкой подстройкой весовых векторов. Фактически на этом этапе выполняется в определенной степени классификация входных векторов. Слой нейронов карты Кохонена можно представлять в виде гибкой сетки, которая натянута на пространство входных векторов. В процессе обучения карты, в отличие от обучения слоя Кохонена, участвуют соседи нейрона-победителя, и, таким образом, топологическая карта выглядит более упорядоченной, чем области кластеризации слоя Кохонена. Читатель может продолжить изучение самоорганизующихся сетей, обратившись к демонстрационным программам demosm1 и demosm2. 7.2. LVQ-сети Ниже рассматриваются сети для классификации входных векторов, или LVQ (Learning Vector Quantization)-сети. Как правило, они выполняют и кластеризацию и классификацию векторов входа. Эти сети являются развитием самоорганизующихся сетей Кохонена [23]. По команде help lvq можно получить следующую информацию об М-функциях, входящих в состав ППП Neural Network Toolbox и относящихся к построению LVQ-сетей: Learning Vector Quantization Сети для классификации векторов New networks newlvq Using networks sim init adapt train 168 Формирование сети Создание сети для классификации входных векторов Работа с сетью Моделирование Инициализация Адаптация Обучение Нейронные сети. MATLAB 6 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. Рис. 7.17 LVQ-cеть имеет 2 слоя: конкурирующий и линейный. Конкурирующий слой выполняет кластеризацию векторов, а линейный слой соотносит кластеры с целевыми классами, заданными пользователем. Как в конкурирующем, так и в линейном слое приходится 1 нейрон на кластер или целевой класс. Таким образом, конкурирующий слой способен поддержать до S1 кластеров; эти кластеры, в свою очередь, могут быть соотнесены с S2 целевыми классами, причем S2 не превышает S1. Например, предположим, что нейроны 1–3 конкурирующего слоя определяют 3 кластера, которые принадлежат к одному целевому классу #2 линейного слоя. Тогда выходы 7. Сети кластеризации и классификации данных 169 конкурирующих нейронов 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 – массив размера R2 минимальных и максимальных значений для R элементов вектора входа; S1 – количество нейронов конкурирующего слоя; PC – вектор с S2 элементами, определяющими процентную долю принадлежности входных векторов к определенному классу; LR – параметр скорости настройки (по умолчанию 0.01); LF – имя функции настройки (по умолчанию для версии MATLAB 5 – 'learnlv2', для версии MATLAB 6 – 'learnlv1'). Предположим, что задано 10 векторов входа и необходимо создать сеть, которая, во-первых, группирует эти векторы в 4 кластера, а во-вторых, соотносит эти кластеры с одним из двух выходных классов. Для этого следует использовать LVQ-сеть, первый конкурирующий слой которой имеет 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 170 Нейронные сети. MATLAB 6 Рис. 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: positions: size: topologyFcn: transferFcn: userdata: 4 'dist' [44 double] 'initwb' 'netsum' [0 1 2 3] 4 'hextop' 'compet' [11 struct] net.layers{2} ans = dimensions: 2 distanceFcn: 'dist' distances: [22 double] initFcn: 'initwb' netInputFcn: 'netsum' positions: [0 1] size: 2 topologyFcn: 'hextop' transferFcn: 'purelin' userdata: [11 struct] Обучение сети Правила настройки параметров Правило LVQ1. LVQ-сеть обучается на основе множества пар вход/выход, составленных из элементов обучающей последовательности {P, T}: p1 , t1, p2 , t 2 ,..., pQ , t Q . (7.20) Каждый целевой вектор имеет единственный элемент, равный 1, а остальные равны 0. 7. Сети кластеризации и классификации данных 171 Для обучения сети необходимо задать вектор входа p, и тогда в конкурирующем слое будет выполнена настройка элементов матрицы весов IW11. Предположим, что весовые коэффициенты нейрона i* наиболее близки к вектору входа p и нейрон i* выигрывает конкуренцию. Тогда конкурирующая функция активации возвращает 1 в качестве элемента i* вектора a1, причем все другие элементы a1 равны 0. Во втором, линейном слое произведение LW21a1 выделяет некоторый столбец матрицы LW21 и связанный с ним класс k*. Таким образом, сеть связывает вектор входа p с классом k*. Это назначение может оказаться либо правильным, либо ошибочным. Поэтому в процессе обучения необходимо откорректировать строку i* матрицы IW11 таким образом, чтобы приблизить ее к вектору p, если назначение правильное, и удалить от вектора p, если назначение неправильное. Основываясь на этих рассуждениях, можно сформулировать правило LVQ1 для настройки параметров сети: * IW11 (q) i 11 i* IW (q) i* i * (q 1) lr p(q) (q 1) , IW11 (q 1) lr p(q) i* IW11 (q 1) , a k2* t k * 1; IW11 i IW11 * (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 (7.22) min i , 0.5 0.7, d d j i то корректировка производится и правило настройки соответствующих весовых векторов выглядит следующим образом: * IW11 (q) * IW11 (q 1) lr p(q) * IW11 (q 1) ; i i i 11 11 IW ( q ) IW ( q 1 ) lr p ( q ) IW11 (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)); 172 Нейронные сети. MATLAB 6 Выполним синтез LVQ-сети: net = newlvq(minmax(P),4,[.6 .4]); net.inputWeights{1} ans = delays: 0 initFcn: 'midpoint' learn: 1 learnFcn: 'learnlv2' learnParam: [11 struct] size: [4 2] userdata: [11 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') plot(V(:,1),V(:,2),'or') % Рис.7.19 Рис. 7.19 7. Сети кластеризации и классификации данных 173 В свою очередь, массив весов линейного слоя указывает, как центры кластеризации распределяются по классам: 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.20 Наряду с процедурой обучения можно применить и процедуру адаптации в течение 200 циклов для 10 векторов, что равносильно 2000 циклам обучения с использованием функции train: net.adaptparam.passes = 200; 174 Нейронные сети. MATLAB 6 Обучающая последовательность при использовании функции 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} 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 Рекуррентные сети Элмана Формирование сети Создание сети Элмана Работа с сетью Моделирование Инициализация Адаптация Обучение Функции взвешивания Скалярное произведение Производная скалярного произведения Функции накопления Сумма взвешенных входов Производная суммы взвешенных входов Функции активации Линейная Гиперболический тангенс Логистическая Производная линейной функции Производная гиперболического тангенса Производная логистической функции Функции оценки качества сети Среднеквадратичная ошибка обучения Среднеквадратичная ошибка обучения при применении регуляризации 175 dmse 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) Эта рекуррентная матричная форма уравнений состояния лишний раз подчеркивает название изучаемых нейронных сетей. Второй, линейный слой является безынерционным и описывается соотношениями 2 21 1 2 n (k ) LW a (k ) b ; 2 2 a (k ) purelin( n (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; % Число нейронов рекуррентного слоя 8. Рекуррентные сети 177 Элементы входа для данной задачи изменяются в диапазоне от –2 до 2. Для обучения используется метод градиентного спуска с возмущением и адаптацией параметра скорости настройки, реализованный в виде М-функции traingdx: net = newelm([–2 2],[S1 S2],{'tansig','purelin'},'traingdx'); Сеть использует следующие функции адаптации, инициализации, обучения и оценки качества: adaptFcn: 'adaptwb' initFcn: 'initlay' performFcn: 'mse' trainFcn: 'traingdx' Слои сети Элмана имеют следующие характеристики: net.layers{1} ans = dimensions: 10 distanceFcn: distances: initFcn: netInputFcn: positions: size: topologyFcn: transferFcn: userdata: 'dist' [1010 double] 'initnw' 'netsum' [0 1 2 3 4 5 6 7 8 9] 10 'hextop' 'tansig' [11 struct] net.layers{2} ans = dimensions: 1 distanceFcn: 'dist' distances: 0 initFcn: 'initnw' netInputFcn: 'netsum' positions: 0 size: 1 topologyFcn: 'hextop' transferFcn: 'purelin' userdata: [11 struct] Скрытый слой использует функцию активации tansig, которая для сети Элмана принимается по умолчанию; инициализация весов и смещений реализуется методом NW (Nguen – Widrow) с помощью М-функции initnw. Второй слой использует линейную функцию активации purelin. По умолчанию для настройки весов и смещений используется функция learngdm, а для оценки качества обучения – функция mse. Обучение сети Для обучения сети Элмана могут быть использованы как процедура адаптации, так и процедура обучения, реализуемые с помощью функций adapt и train соответственно. 178 В процессе процедуры адаптации на каждом шаге выполняются следующие действия: моделирование сети при подаче полного набора векторов входа и вычисление ошибки сети; вычисление приближенного градиента функционала ошибки относительно весов и смещений методом обратного распространения ошибки; настройка весов с использованием функции настройки, выбираемой пользователем; рекомендуется функция learngdm. В процессе процедуры обучения на каждом цикле выполняются следующие действия: моделирование сети при подаче последовательности входных сигналов, сравнение с целевыми выходами и вычисление ошибки; Нейронные сети. MATLAB 6 вычисление приближенного градиента функционала ошибки относительно весов и смещений методом обратного распространения ошибки; настройка весов с использованием функции настройки, выбираемой пользователем; рекомендуется функция traingdx. Сети Элмана не обеспечивают высокой точности решения, поскольку присутствие обратной связи в рекуррентном слое не позволяет вычислить точно градиент функционала. В дальнейшем для обучения сети Элмана используется М-функция 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 8. Рекуррентные сети Рекуррентная модифицированная сеть Хопфилда Формирование сети Создание модифицированной сети Хопфилда Операции с весовой функцией Скалярное произведение 181 Net input functions netsum 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 = 182 Нейронные сети. MATLAB 6 –1 1 –1 –1 1 1 Выполним синтез сети: 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' [33 double] 'initwb' 'netsum' [0 1 2] 3 'hextop' 'satlins' [11 struct] Из этого списка следует, что в слое используется функция инициализации initwb, функция суммирования входов netsum и функция активации satlins. На рис. 8.6, в показан блок, описывающий матрицу весов, которая определяет переходную матрицу динамической модели рекуррентного слоя. Динамическая модель рекуррентного слоя модифицированной сети Хопфилда описывается следующим образом: 8. Рекуррентные сети 183 a1 (k ) satlins( LW11a1 (k 1) b1 ), a1 (0) p . (8.4) При внимательном анализе приведенного соотношения можно действительно убедиться, что матрица весов LW11 равносильна переходной матрице динамической системы, а вектор смещений b1 – вектору передачи единичного входа. Необходимо сформировать эти элементы, если заданы точки равновесия системы t в вершинах гиперкуба. Синтез сети Метод проектирования модифицированных сетей Хопфилда описан в работе [25], на основе этого метода разработан алгоритм синтеза, который реализован в ППП NT в виде подфункции solvehop2(t) М-функции newhop. Если задано множество целевых точек равновесия, представленных матрицей T, то функция newhop возвращает матрицу весов и вектор смещений для рекуррентного слоя сети Хопфилда. При этом гарантируется, что точки устойчивого равновесия будут соответствовать целевым векторам, но могут появиться и так называемые паразитные точки. В процессе синтеза сети число таких нежелательных точек сводится к минимуму. Пусть задано Q целевых векторов, образующих матрицу T размера SQ: (8.5) T [t1 , t 2 , ..., t Q1 , t Q ]. Образуем новую матрицу Y размера SQ–1 следующего вида: Y [t1 t Q , t 2 t Q , ..., t Q1 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). 184 Нейронные сети. MATLAB 6 Соответствующая матрица весов рекуррентного слоя и вектор смещения вычисляются следующим образом: W Φ; b Ft Q. (8.11) Когда сеть спроектирована, она может быть проверена с одним или большим числом векторов входа. Весьма вероятно, что векторы входа, близкие к целевым точкам, равновесия найдут свои цели. Способность модифицированной сети Хопфилда быстро обрабатывать наборы векторов входа позволяет проверить сеть за относительно короткое время. Сначала можно проверить, что точки равновесия целевых векторов действительно принадлежат вершинам гиперкуба, а затем можно определить области притяжения этих точек и обнаружить паразитные точки равновесия, если они имеются. Рассмотрим следующий пример. Предположим, что требуется создать модифицированную сеть Хопфилда с двумя точками равновесия, заданными в трехмерном пространстве: 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 8. Рекуррентные сети 185 Эта точка расположена вблизи первого положения равновесия, так что можно ожидать, что сеть будет сходиться именно к этой точке. При таком способе вызова функции sim в качестве второго параметра указываются такт дискретности и количество шагов моделирования: [Y,Pf,Af] = sim(net,{1 5},{},Ai); Y{1} Y = –1 –1 1 Действительно, из заданного начального состояния сеть вернулась в устойчивое положение равновесия. Желательно, чтобы сеть вела себя аналогичным образом при задании любой начальной точки в пределах куба, вершины которого составлены изо всех комбинаций чисел 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 186 Нейронные сети. MATLAB 6 Рассчитаем веса и смещения модифицированной сети Хопфилда, использую М-функцию 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 0 1.1618 Проверим, принадлежат ли вершины квадрата к сети Хопфилда: 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. Рекуррентные сети 187 Рис. 8.8 Читатель может продолжить изучение модифицированных сетей Хопфилда, обратившись к демонстрационным примерам. Пример двумерной сети можно найти в демонстрации demohop1, пример неустойчивой точки равновесия – в демонстрации demohop2. Демонстрация demohop3 дает пример трехмерной модифицированной сети Хопфилда. Демонстрация demohop4 иллюстрирует появление устойчивых паразитных точек равновесия. 188 Нейронные сети. MATLAB 6 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(4tk ) = sin(4kh), 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). 192 Нейронные сети. MATLAB 6 Рис. 9.9 Для создания такой сети предназначена М-функция 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. Применение нейронных сетей 193 Рис. 9.11 Как следует из этого графика, для настройки на слежение нейронной сети требуется около 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. 194 Нейронные сети. MATLAB 6 Рис. 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); 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)); 9. Применение нейронных сетей 195 Синтез сети Нейронная сеть должна иметь только 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.14 Сеть выполняет поставленную задачу. Погрешность моделирования показана на рис. 9.15 и находится в пределах точности компьютера при вычислениях с плавающей точкой: e = T–a; plot(time, e) 196 Нейронные сети. MATLAB 6 Рис. 9.15 Построенная линейная нейронная сеть может быть использована для идентификации и моделирования динамических систем, причем для линейных систем погрешности близки к 0. Для нелинейных систем такой подход при достаточно малых амплитудах входного сигнала обеспечивает линеаризацию с минимальной среднеквадратичной ошибкой. Если нелинейная система переместится в другую рабочую точку, то изменятся и параметры нейронной сети. Для того чтобы получить линеаризованную модель за короткое время, частота замеров должна быть достаточно высокой, а на вход нелинейной системы необходимо подать пробный сигнал в виде случайного процесса небольшой амплитуды. Это ускорит адаптацию сети, поскольку большее количество измерений, характеризующих динамику системы, будет представлено на коротком интервале времени. Учет в случае нелинейных систем большего числа запаздывающих входов позволяет минимизировать ошибку при моделировании нелинейной системы. Если система характеризуется существенной нелинейностью, то более подходящими будут сети с обучением методом обратного распространения ошибки или радиальные базисные сети. Читатель может обратиться к демонстрационному примеру applin3, где рассмотрена подобная задача. 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. Применение нейронных сетей 197 Рис. 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.17 Определим такую обучающую последовательность: в качестве целевого выхода T примем массив Y, а входную последовательность P зададим на основе текущего и предшествующего значений входа R. Для использования алгоритмов адаптации представим обучающие последовательности в виде массивов ячеек: 198 Нейронные сети. MATLAB 6 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{:})) Рис. 9.18 Из анализа этого графика следует, что сети требуется 2.5 с для настройки на реакцию первого фильтра и немногим более 0.2 с для настройки на реакцию второго фильтра. Это объясняется тем, что фактические настройки параметров сети стационарны и соответствуют значениям параметров второго фильтра. Читатель может обратиться к демонстрационному примеру applin4, где исследуется подобная задача. 9.2. Распознавание образов Часто полезно иметь устройство, которое выполняет распознавание образов. В частности, очень эффективны и выгодны машины, которые могут читать символы. Машина, которая читает банковские чеки, может выполнять за то же самое время намного 9. Применение нейронных сетей 199 больше проверок, чем человек. Этот вид приложений сохраняет время и деньги, а также устраняет условия, при которых человек выполняет монотонную, периодически повторяющуюся работу. Демонстрационная программа сценарий appcr1 иллюстрирует, как распознавание символов может быть выполнено в сети с обратным распространением. Постановка задачи Требуется создать нейронную сеть для распознавания 26 символов латинского алфавита. В качестве датчика предполагается использовать систему распознавания, которая выполняет оцифровку каждого символа, находящегося в поле зрения. В результате каждый символ будет представлен шаблоном размера 57. Например, символ 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.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} 200 Нейронные сети. MATLAB 6 Пример: Определим шаблон для символа 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. Архитектура сети Для работы нейронной сети требуется 35 входов и 26 нейронов в выходном слое. Для решения задачи выберем двухслойную нейронную сеть с логарифмическими сигмоидальными функциями активации в каждом слое. Такая функция активации выбрана потому, что диапазон выходных сигналов для этой функции определен от 0 до 1, и этого достаточно, чтобы сформировать значения выходного вектора. Структурная схема такой нейронной сети показана на рис. 9.21. Рис. 9.21 Скрытый слой имеет 10 нейронов. Такое число нейронов выбрано на основе опыта и разумных предположений. Если при обучении сети возникнут затруднения, то можно увеличить количество нейронов этого уровня. Сеть обучается так, чтобы сформировать 9. Применение нейронных сетей 201 единицу в единственном элементе вектора выхода, позиция которого соответствует номеру символа, и заполнить остальную часть вектора нулями. Однако наличие шумов может приводить к тому, что сеть не будет формировать вектора выхода, состоящего точно из единиц и нулей. Поэтому по завершении этапа обучения выходной сигнал обрабатывается М-функцией compet, которая присваивает значение 1 единственному элементу вектора выхода, а всем остальным – значение 0. Инициализация сети Вызовем М-файл prprob, который формирует массив векторов входа alphabet размера 3526 с шаблонами символов алфавита и массив целевых векторов 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.22 Обучение Чтобы создать нейронную сеть, которая может обрабатывать зашумленные векторы входа, следует выполнить обучение сети как на идеальных, так и на зашумленных векторах. Сначала сеть обучается на идеальных векторах, пока не будет обеспечена минимальная сумма квадратов погрешностей. Затем сеть обучается на 10 наборах идеальных и зашумленных векторов. Две копии свободного от шума алфавита используются для того, чтобы сохранить способность сети классифицировать идеальные векторы входа. К сожалению, после того, как описанная выше сеть обучилась 202 Нейронные сети. MATLAB 6 классифицировать сильно зашумленные векторы, она потеряла способность правильно классифицировать некоторые векторы, свободные от шума. Следовательно, сеть снова надо обучить на идеальных векторах. Это гарантирует, что сеть будет работать правильно, когда на ее вход будет передан идеальный символ. Обучение выполняется с помощью функции 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 Рис. 9.23 Обучение в присутствии шума Чтобы спроектировать нейронную сеть, не чувствительную к воздействию шума, обучим ее с применением двух идеальных и двух зашумленных копий векторов алфавита. Целевые векторы состоят из четырех копий векторов. Зашумленные векторы имеют шум со средним значением 0.1 и 0.2. Это обучает нейрон правильно распознавать зашумленные символы и в то же время хорошо распознавать идеальные векторы. При обучении с шумом максимальное число циклов обучения сократим до 300, а допустимую погрешность увеличим до 0.6 (рис. 9.24): netn = net; netn.trainParam.goal = 0.6; 9. Применение нейронных сетей 203 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 Повторное обучение в отсутствие шума Поскольку нейронная сеть обучалась в присутствии шума, то имеет смысл повторить ее обучение без шума, чтобы гарантировать, что идеальные векторы входа классифицируются правильно. 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; 204 Нейронные сети. MATLAB 6 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 зашумленных последовательностей для каждого символа и вычисляется выход сети. Выходной сигнал обрабатывается М-функцией compet с той целью, чтобы выбрать только один из 26 элементов вектора выхода. После этого оценивается количество ошибочных классификаций и вычисляется процент ошибки. Соответствующий график погрешности сети от уровня входного шума показан на рис. 9.25. plot(noise_range,network1*100,'––',noise_range,network2*100); Рис. 9.25 Сеть 1 обучена на идеальных векторах входа, а сеть 2 – на зашумленных. Обучение сети на зашумленных векторах входа значительно снижает погрешность распознавания реальных векторов входа. Сети имеют очень малые погрешности, если среднеквадратичное значение шума находится в пределах от 0.00 до 0.05. Когда к 9. Применение нейронных сетей 205 векторам был добавлен шум со среднеквадратичным значением 0.2, в обеих сетях начали возникать заметные ошибки. При этом погрешности нейронной сети, обученной на зашумленных векторах, на 3–4 % ниже, чем для сети, обученной на идеальных входных последовательностях. Если необходима более высокая точность распознавания, сеть может быть обучена либо в течение более длительного времени, либо с использованием большего количества нейронов в скрытом слое. Можно также увеличить размер векторов, чтобы пользоваться шаблоном с более мелкой сеткой, например 1014 точек вместо 57. Проверим работу нейронной сети для распознавания символов. Сформируем зашумленный вектор входа для символа J (рис. 9.26): noisyJ = alphabet(:,10) + randn(35,1)*0.2; plotchar(noisyJ); % Зашумленный символ J (рис.9.26) Рис. 9.26 A2 = sim(net,noisyJ); A2 = compet(A2); answer = find(compet(A2) == 1) answer = 10 plotchar(alphabet(:,answer)); % Распознанный символ J Нейронная сеть выделила 10 правильных элементов и восстановила символ J без ошибок (рис. 9.27). Рис. 9.27 Эта задача демонстрирует, как может быть разработана простая система распознавания изображений. Заметим, что процесс обучения не состоял из единственного обращения к обучающей функции. Сеть была обучена несколько раз при различных 206 Нейронные сети. MATLAB 6 векторах входа. Обучение сети на различных наборах зашумленных векторов позволило обучить сеть работать с изображениями, искаженными шумами, что характерно для реальной практики. 9.3. Нейронные сети и системы управления В настоящее время нейронные сети нашли успешное применение для проектирования систем управления динамическими процессами. Универсальные возможности аппроксимации с помощью многослойного персептрона делают их полезным инструментом для решения задач идентификации, проектирования и моделирования нелинейных регуляторов [15]. Ниже описаны 3 архитектуры нейронных сетей, которые реализованы в ППП Neural Network Toolbox в виде следующих контроллеров: контроллера c предсказанием (NN Predictive Controller); контроллера на основе модели авторегрессии со скользящим средним (NARMA-L2 Controller); контроллера на основе эталонной модели (Model Reference Controller). Ниже представлено краткое описание каждой из этих архитектур и способы их применения на практике. Применение нейронных сетей для решения задач управления позволяет выделить 2 этапа проектирования: этап идентификации управляемого процесса; этап синтеза закона управления. На этапе идентификации разрабатывается модель управляемого процесса в виде нейронной сети, которая на этапе синтеза используется для синтеза регулятора. Для каждой из трех архитектур используется одна и та же процедура идентификации, однако этапы синтеза существенно различаются. При управлении с предсказанием модель управляемого процесса используется для того, чтобы предсказать его будущее поведение, а алгоритм оптимизации применяется для расчета такого управления, которое минимизирует разность между желаемыми и действительными изменениями выхода модели. При управлении на основе модели авторегрессии со скользящим средним регулятор представляет собой достаточно простую реконструкцию модели управляемого процесса. При управлении на основе эталонной модели регулятор – это нейронная сеть, которая обучена управлять процессом так, чтобы он отслеживал поведение эталонного процесса. При этом модель управляемого процесса активно используется при настройке параметров самого регулятора. В последующих разделах обсуждаются все 3 структуры систем управления и архитектуры соответствующих нейросетевых контроллеров. Каждый раздел включает краткое изложение принципа управления динамическим процессом и сопровождается описанием сценария функционирования проектируемой системы, который реализован в виде комбинации GUI-интерфейса и динамической модели регулятора в системе Simulink. Динамические модели систем управления с нейросетевыми регуляторами размещены в специальном разделе Control Systems набора блоков Neural Network Blocksets (рис. 9.28) и включают 3 упомянутые выше модели регуляторов, а также блок построения графиков. 9. Применение нейронных сетей 207 Рис. 9.28 Поскольку ни один конкретный регулятор не является универсальным, то описаны функциональные возможности всех трех типов регуляторов, каждый из которых имеет свои преимущества и недостатки. Регулятор с предсказанием. Этот регулятор использует модель управляемого процесса в виде нейронной сети, для того чтобы предсказать будущие реакции процесса на случайные сигналы управления. Алгоритм оптимизации вычисляет управляющие сигналы, которые минимизируют разность между желаемыми и действительными изменениями сигнала на выходе модели и таким образом оптимизируют управляемый процесс. Построение модели управляемого процесса выполняется автономно с использованием нейронной сети, которая обучается в групповом режиме с использованием одного из алгоритмов обучения. Контроллер, реализующий такой регулятор, требует значительного объема вычислений, поскольку для расчета оптимального закона управления оптимизация выполняется на каждом такте управления. Регулятор NARMA-L2. Изо всех архитектур этот регулятор требует наименьшего объема вычислений. Данный регулятор – это просто некоторая реконструкция нейросетевой модели управляемого процесса, полученной на этапе автономной идентификации. Вычисления в реальном времени связаны только с реализацией нейронной сети. Недостаток метода состоит в том, что модель процесса должна быть задана в канонической форме пространства состояния, которой соответствует сопровождающая матрица, что может приводить к вычислительным погрешностям. Регулятор на основе эталонной модели. Требуемый объем вычислений для этого регулятора сравним с предыдущим. Однако архитектура регулятора с эталонной моделью требует обучения нейронной сети управляемого процесса и нейронной сети регулятора. При этом обучение регулятора оказывается достаточно сложным, поскольку обучение основано на динамическом варианте метода обратного распространения ошибки [16]. Достоинством регуляторов на основе эталонной модели является то, что они применимы к различным классам управляемых процессов. 208 Нейронные сети. MATLAB 6 9.3.1. Регулятор с предсказанием Регулятор с предсказанием, реализованный в ППП Neural Network Toolbox, использует модель нелинейного управляемого процесса в виде нейронной сети для того, чтобы предсказывать его будущее поведение. Кроме того, регулятор вычисляет сигнал управления, который оптимизирует поведение объекта на заданном интервале времени. Идентификация управляемого процесса. Схема подсистемы идентификации показана на рис. 9.29. Она включает модель управляемого процесса в виде нейронной сети, которая должна быть обучена в автономном режиме так, чтобы минимизировать ошибку между реакциями процесса и модели e = yp – ym на последовательность пробных сигналов u. Рис. 9.29 Нейронная сеть регулятора управляемого процесса представлена на рис. 9.30; она имеет 2 слоя нейронов и использует линии задержки (ЛЗ), чтобы запомнить предшествующие значения входов и выходов процесса с целью предсказать будущие значения выхода. Рис. 9.30 Настройка параметров этой сети выполняется автономно методом группового обучения, используя данные, полученные при испытаниях реального объекта. Для обучения сети может быть использован любой из обучающих алгоритмов для нейронных сетей. Принцип управления с предсказанием. Управление с предсказанием использует принцип удаляющегося горизонта [40], когда нейросетевая модель управляемого процесса предсказывает реакцию объекта управления на определенном интервале времени в будущем. Предсказания используются программой численной оптимизации для того, чтобы вычислить управляющий сигнал, который минимизирует следующий критерий качества управления: 9. Применение нейронных сетей 209 J N2 Nu j N1 j 1 ( yr (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.32 Динамическая модель управляемого процесса описывается обыкновенными нелинейными дифференциальными уравнениями: dh dt w1 (t ) w2 (t ) 0.2 h ; dC k1Cb w (t ) w (t ) b (Cb1 Cb ) 1 (Cb 2 Cb ) 2 , h h (1 k 2Cb ) 2 dt 210 следующими (9.5) Нейронные сети. MATLAB 6 где 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. MAT-файлы данных: cstr1, cstr2, cstr3 – данные для обучения нейросетевой модели каталитического реактора. Функции одномерной оптимизации: csrchbac – поиск с обратной прогонкой; csrchbre – метод Брента (Brent), объединяющий методы золотого сечения и квадратичной интерполяции; csrchcha – метод кубической интерполяции Чараламбуса; csrchgol – метод золотого сечения; csrchhyb – гибридный метод бисекции и кубической интерполяции. Функции для синтеза управления с предсказанием: calcjjdjj – вычисление функционала качества и его градиента; predopt – оптимизация регулятора с предсказанием; dyduvar – вычисление частных производных выхода по входу. 9. Применение нейронных сетей 211 Модели Simulink: cstr – модель каталитического реактора; predcstr – GUI-приложение для контроллера с предсказанием; ptest3sim2 – нейросетевая модель управляемого процесса, используемая М-функцией predopt для предсказания процесса в будущем. Вспомогательные функции: sfunxy2 – S-функция для вывода графиков; nncontrolutil – поддержка, обеспечивающая возможность обращения к частным функциям из системы Simulink. Выполнить запуск демонстрационного примера можно несколькими способами: в окне запуска приложений Launch Pad выбрать опцию Demos для ППП Neural Network Toolbox; ввести команду predcstr, используя командное окно системы MATLAB. В любом случае открывается окно системы Simulink со следующей структурой системы управления (рис. 9.34). Рис. 9.34 Эта структура включает блок управляемого процесса Plant и блок контроллера NN Predictive Controller, а также блоки генерации эталонного ступенчатого сигнала со случайной амплитудой Random Reference, отсчета времени Clock, построения графиков Graph. Особенность этой структуры заключается в том, что она выполняет не только функции блок-схемы системы Simulink, но и функции графического интерфейса пользователя GUI [53]. Для того чтобы начать работу, необходимо активизировать блок NN Predictive Controller двойным щелчком левой кнопки мыши. Появится окно, показанное на рис. 9.35. 212 Нейронные сети. MATLAB 6 Рис. 9.35 Оно выполняет функции графического интерфейса пользователя. Обратите внимание на информацию, которая руководит вашими действиями и указана в области фрейма в виде сообщения Прежде чем установить параметры контроллера, постройте модель управляемого процесса. Это означает, что прежде всего необходимо выполнить идентификацию управляемого процесса, т. е. построить его нейросетевую модель, воспользовавшись специальной процедурой Plant Identification. Вид окна Plant Identification приведен на рис. 9.36. Это окно универсально и может быть использовано для построения нейросетевых моделей для любого динамического объекта, который описан моделью Simulink. В рассматриваемом случае такой моделью является нелинейная динамическая модель каталитического реактора CSTR. Процедура идентификации позволяет построить нейронную сеть, которая будет моделировать динамику управляемого процесса. Если модель должна использоваться при настройке контроллера, то ее следует создать прежде, чем начнется расчет контроллера. Кроме того, вам может потребоваться создание новой модели объекта, если спроектированный контроллер будет функционировать неудовлетворительно. 9. Применение нейронных сетей 213 Рис. 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 с указанием входных и выходных портов, используемых при построении нейросетевой модели управляемого процесса. 214 Нейронные сети. MATLAB 6 С помощью кнопки 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 9. Применение нейронных сетей 215 Training Data заменена на кнопку Erase Generated Data, что позволяет удалить сгенерированные данные. Рис. 9.38 В окне фрейма содержится сообщение Обучающая последовательность состоит из 8000 замеров. Можно начинать обучение нейронной сети. Для этого следует воспользоваться кнопкой Train Network (Обучить сеть). Начнется обучение нейросетевой модели. После завершения обучения его результаты отображаются на графиках, как это показано на рис. 9.39, а и б, где построены соответственно результаты обучения и тестирования на контрольном множестве. 216 Нейронные сети. MATLAB 6 а б Рис. 9.39 Текущее состояние отмечено в окне Plant Identification (рис. 9.40) сообщением Обучение завершено. Вы можете сгенерировать или импортировать новые данные, продолжить обучение или сохранить полученные результаты, выбрав кнопки OK или Apply. В результате параметры нейросетевой модели управляемого процесса будут введены в блок NN Predictive Controller системы Simulink. Рис. 9.40 9. Применение нейронных сетей 217 После этого мы вновь возвращаемся к окну 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. Возвращаемся к модели Simulink (рис. 9.34) и начинаем моделирование, выбрав опцию Start из меню Simulation. В процессе моделирования выводятся графики входа и выхода управляемого процесса (рис. 9.41). Рис. 9.41 Из анализа полученных данных следует, что реакция системы на ступенчатые воздействия со случайной амплитудой вполне удовлетворительна, имеет колебательный характер с достаточно быстрым затуханием; на интервале 20 с все воздействия эффективно отрабатываются. Таким образом, регулятор с предсказанием, реализованный в виде нейронной сети, можно использовать для управления каталитическим реактором с непрерывным перемешиванием. 9.3.2. Регулятор NARMA-L2 Нейросетевой регулятор, описанный в этом разделе, использует в качестве модели управляемого процесса модель нелинейной авторегрессии со скользящим средним (Nonlinear Autoregressive-Moving Average – NARMA-L2). Схема демонстрационного примера управления магнитной подушкой показана на рис. 9.42. 218 Нейронные сети. MATLAB 6 Рис. 9.42 Окно Model Browser в левой части рисунка содержит перечень всех блоков, входящих в состав системы управления, представленной в виде модели системы Simulink. Управляемым объектом является магнит, который движется только в вертикальном направлении в электромагнитном поле, как это схематично показано на рис. 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. Применение нейронных сетей 219 Рис. 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) то это означает, что необходимо сформировать нелинейный регулятор следующего общего вида: (9.9) u(k ) G[ y(k ), y(k 1), , y(k n 1), y r (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 ) yr (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) модифицируется следующим образом: 220 Нейронные сети. MATLAB 6 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 Здесь следует обратить внимание на участки сети, которые выполняют аппроксимацию нелинейных операторов 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. Применение нейронных сетей Л Л З Рис. 9.46 221 На схеме явным образом выделена эталонная модель, которая задает желаемую траекторию для выхода управляемого процесса. Демонстрационный пример 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. Выполнить запуск демонстрационного примера можно несколькими способами: в окне запуска приложений Launch Pad выбрать опцию Demos для ППП Neural Network Toolbox; ввести команду narmamaglev в командном окне системы MATLAB. Для того чтобы начать работу, необходимо активизировать блок NARMA-L2 Controller двойным щелчком левой кнопки мыши. Появится окно, показанное на рис. 9.47. Рис. 9.47 222 Нейронные сети. MATLAB 6 Обратите внимание, что это окно дает возможность обучить модель NARMA-L2. Отдельного окна для обучения регулятора нет, так как регулятор NARMA-L2, в отличие от регулятора с предсказанием, определяется непосредственно по модели. Это окно работает так же, как и другие окна идентификации объекта управления, поэтому повторно подробно процесс обучения рассматривать не будем. После окончания обучения нажать на клавишу OK для ввода данных регулятора в модель Simulink. Возвращаемся к модели Simulink (см. рис. 9.34) и начинаем моделирование, выбрав опцию Start из меню Simulation. Графики задающего сигнала и выхода системы приведены на рис. 9.48. Рис. 9.48 Из анализа полученных данных следует, что реакция системы на ступенчатые воздействия со случайной амплитудой вполне удовлетворительна, имеет колебательный характер с достаточно быстрым затуханием; на интервале 5 с все уставки эффективно отрабатываются. Таким образом, регулятор NARMA-L2, реализованный в виде нейронной сети, можно использовать для управления магнитной подушкой. 9.3.3. Регулятор на основе эталонной модели В этом разделе описана система управления с эталонной моделью, при реализации которой используются 2 нейронные сети: для регулятора и для модели объекта управления. Схема демонстрационного примера управления звеном робота показана на рис. 9.49. 9. Применение нейронных сетей 223 Рис. 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 – задающий сигнал на входе модели. Соответствующая динамическая модель, реализованная в системе Simulink, показана на рис. 9.51. 224 Нейронные сети. MATLAB 6 Рис. 9.51 Структурная схема, поясняющая принцип построения системы управления с эталонной моделью, показана на рис. 9.52. Ошибка управления Эталонная модель Нейронная сеть модели объекта Командный вход Нейронная сеть регулятора Ошибка модели Объект управления Управляющий вход Выход объекта Рис. 9.52 В ней следует выделить эталонную модель, которая задает желаемую траекторию движения звена робота, удовлетворяющую дифференциальному уравнению (9.14), а также нейронные сети, реализующие регулятор и модель объекта управления. Архитектуру нейронной сети регулятора можно описать профилем 5–13–1 (5 входов, 13 нейронов скрытого слоя и 1 выход). Она показана на рис. 9.53 и имеет 2 слоя. Здесь же показана и нейронная сеть модели объекта, которая также состоит из двух слоев. Линии задержки, используемые для формирования входов нейронных сетей, имеют такт дискретности, равный 0.05 с. 9. Применение нейронных сетей 225 Рис. 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. 226 Нейронные сети. 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. Применение нейронных сетей 227 Рис. 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]. 228 Нейронные сети. 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. Применение нейронных сетей 229 Часть 2. ОПЕРАТОРЫ, ФУНКЦИИ И КОМАНДЫ 10. ВЫЧИСЛИТЕЛЬНАЯ МОДЕЛЬ НЕЙРОННОЙ СЕТИ ППП Neural Network Toolbox использует специальный класс объектов network object. Эти объекты представлены в ППП в виде массивов записей, поля которых определяют их свойства, характеристики и параметры. Массивы записей позволяют задать вычислительную модель нейронной сети, для которой используется стандартное имя net, являющееся также и именем массива записей. 10.1. Описание сети Описание архитектуры Архитектура нейронной сети характеризуется количеством входов, слоев, выходов, целей, смещений, а также топологией их соединения. Перечисленные ниже поля массива записей net определяют свойства нейронной сети, связанные с ее архитектурой. net Тип Размер Значение по умолчанию Имя поля .numInputs Integer >= 0 11 0 Количество входов сети .numLayers Integer >= 0 11 0 Количество слоев .biasConnect Boolean array NumLayers1 [] .inputConnect Boolean array NumLayers NumInputs [] .layerConnect Boolean array NumLayers NumLayers [] .outputConnect Boolean array 1NumLayers [] .targetConnect Boolean array 1NumLayers [] Матрица связности для смещений Матрица связности для входов Матрица связности для слоев Матрица связности для выходов Матрица связности для целей .numOutputs Integer >= 0 11 (только для чтения) 0 Количество выходов сети .numTargets Integer >= 0 11 (только для чтения) 0 Количество целей сети .numInputDelays Integer >= 0 11 (только для чтения) 0 Максимальное значение задержки для входов сети .numLayerDelays Integer >= 0 11 (только для чтения) 0 Максимальное значение задержки для слоев сети 228 numInputs число входов Количество векторов входа сети. Количество векторов входа следует отличать от количества элементов вектора входа. Число входов задается целым положительным числом и указывает, как много векторов входа подано на сеть; по умолчанию 0. В свою очередь, количество элементов каждого входного вектора задается свойством inputs{i}.size. Любое изменение свойства numInputs будет влиять на размеры матрицы связности inputConnect и массивов ячеек inputs{i}. numLayers число слоев Количество слоев. Число слоев задается целым положительным числом; по умолчанию 0. Любое изменение этого свойства будет влиять на размер матриц связности biasConnect, inputConnect, layerConnect, outputConnect, targetConnect, а также размеры массивов весов и смещений IW, LW, b. biasConnect матрица связности Матрица связности для смещений. Это одномерная булева матрица размера Nl1, где Nl – количество слоев, определяемых свойством numLayers. Наличие или отсутствие смещения в слое i отмечается в элементе вектора biasConnect(i) как 1 или 0 соответственно. Наличие смещения означает, что в массивах ячеек biases{i} и b{i} будут созданы структуры, задающие все характеристики смещения. inputConnect матрица связности Матрица связности для входов. Это булева матрица размера NlNi, где Nl – количество слоев, определяемых свойством numLayers, и Ni – количество входов, определяемых свойством numInputs. Наличие или отсутствие веса при связывании слоя i со слоем j отмечается в элементе матрицы inputConnect(i, j) как 1 или 0 соответственно. Наличие веса означает, что в массивах ячеек inputWeights{i} и IW{i} будут созданы структуры, задающие характеристики весов входа. layerConnect матрица связности Матрица связности для слоев. Это булева матрица размера NlNl, где Nl – количество слоев, определяемых свойством numLayers. Наличие или отсутствие веса в слое i по входу j отмечается в элементе матрицы layerConnect(i, j) как 1 или 0 соответственно. Наличие веса означает, что в массивах ячеек layerWeights{i} и LW{i} будут созданы структуры, задающие характеристики весов слоя. outputConnect матрица связности Матрица связности для выходов. Это одномерная булева матрица размера 1Nl, где Nl – количество слоев, определяемых свойством numLayers. Наличие или отсутствие выхода в слое i отмечается в элементе вектора outputConnect(i) как 1 или 0 соответственно. Наличие выхода изменяет значение свойства numOutputs и означает, что в массиве ячеек outputs{i} будет сформирована структура, задающая характеристики выхода. targetConnect матрица связности 10. Вычислительная модель нейронной сети 229 Матрица связности для целей. Это одномерная булева матрица размера 1Nl, где Nl – количество слоев, определяемых свойством numLayers. Наличие или отсутствие целевого выхода в слое i отмечается в элементе вектора targetConnect(i) как 1 или 0 соответственно. Наличие цели изменяет значение свойства 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 230 Нейронные сети. MATLAB 6 Функции инициализации, адаптации и обучения Перечисленные ниже свойства объекта net включают перечень функций, которые используются для инициализации, адаптации и обучения нейронной сети. 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 параметры функции адаптации 10. Вычислительная модель нейронной сети 231 Параметры функции адаптации. Это свойство определяет набор параметров для используемой функции адаптации. Узнать набор таких параметров можно, применяя оператор help в следующей функциональной форме: help(net.adaptFcn). 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 Размер numInputs1 Значение по умолчанию Имя поля {01} Описатель i-го входа сети .range Double array size2 [] Допустимый диапазон значений .size Integer >= 0 11 0 .userdata Struct 11 11 Количество элементов вектора входа Информация пользователя .note Char 1var 'Put your custom input Текст information here.' inputs 232 массив ячеек Нейронные сети. MATLAB 6 Описатель входов сети. Массив ячеек размера Ni1, где Ni – число входов сети, равное numInputs, состоящий из ячеек inputs{i}, каждая из которых является массивом записей для описания i-го входа сети. range массив значений Допустимый диапазон значений для элементов векторов входа. Это свойство определяет границы допустимых значений для элементов каждого вектора входа сети и является числовым массивом размера Ri2, где 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} Размер, состав Значение по умолчанию Имя поля numLayers1 {01} Описатель i-го слоя сети .dimensions Double array 1numdim [] .distanceFcn Char boxdist | dist| linkdist|mandist ‘‘ .distances [] .initFcn Double array(только для чтения) Char initnw | initwb ‘‘ Распределение нейронов по размерностям слоя Функции вычисления расстояния между нейронами Расстояния между нейронами Функции инициализации .netInputFcn Char ‘‘ Функции накопления .positions [] Положения нейронов .size Array (только для чтения) Integer >= 0 11 0 Количество нейронов .topologyFcn Char ‘‘ Функции топологии .transferFcn Char gridtop | hextop | randtop compet | hardlim | hardlims | logsig | poslin | purelin | radbas | satlin | ‘‘ Функции активации Cell array netprod | netsum 10. Вычислительная модель нейронной сети 233 .userdata Struct satlins | softmax | tansig | tribas 11 .note Char 1var layers Информация пользователя 11 'Put your cus- Текст tom input information here.' массив ячеек Описатель слоев нейронной сети. Массив ячеек размера Nl1, где 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 234 положения нейронов (только для чтения) Нейронные сети. MATLAB 6 Размещение нейронов в слое. Это свойство определяет положения нейронов layers{i}.positions в i-м слое. Их значения зависят от используемой функции топологии многомерного слоя layers{i}.topologyFcn и его размера layers{i}.dimensions. Для построения графика расположения нейронов в многомерном слое рекомендуется использовать М-функцию plotsom. Пример: Если первый двумерный слой нейронной сети 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], а функция топологии слоя 10. Вычислительная модель нейронной сети 235 net.layers{1}.topologyFcn – randtop, то расположение нейронов этого слоя будет таким, как показано на рис. 10.2 plotsom(net.layers{1}.positions) Рис. 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 Размер Значение по умолчанию numLayers1 {01} Имя поля Описатель составляющей выхода от слоя i Количество элементов вектора выхода Информация пользователя Integer >= 0 11 (только для чтения) Struct 11 0 Char 'Put your custom Текст input information here.' 1var 11 массив ячеек Описатель выходов сети. Массив ячеек размера Nl1, где Nl – число слоев сети numLayers, состоящий из ячеек outputs{i}, каждая из которых является массивом записей для описания выходов, которые заданы вектором связности outputConnect(i). outputs 236 Нейронные сети. MATLAB 6 количество элементов (только для чтения) Количество элементов вектора выхода. Это свойство определяет количество элементов для каждого вектора выхода outputs{i} и может принимать только неотрицательные значения (по умолчанию 0). Его значение всегда совпадает со значением параметра layers{i}.size. size массив записей userdata Поле для записи информации пользователя. Это свойство обеспечивает место для записи информации, относящейся к выходу слоя i сети. Предусмотрено только одно поле outputs{i}.userdata.note для записи текста. По умолчанию оно содержит строку 'Put your custom input information here.' – "Информацию разместите здесь". Описание целей Перечисленные ниже свойства объекта net включают перечень функций, которые используются для инициализации, адаптации и обучения нейронной сети. Тип net Размер Значение по умолчанию .targets{i} Cell array {11} {10} .size Integer >= 0 (только для чтения) 11 0 .userdata Struct 11 Char 1var .note targets 11 Имя поля Описатель составляющей целевого выхода от слоя i Количество элементов целевого выхода Информация пользователя 'Put your custom in- Текст put information here.' массив ячеек Описатель целевых выходов сети. Массив ячеек размера Nl1, где 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.' – "Информацию разместите здесь". 10. Вычислительная модель нейронной сети 237 Описание смещений Перечисленные ниже свойства объекта net включают перечень функций, которые используются для описания смещений в нейронной сети. Тип net .biases{i} Размер, состав Значение по умолчанию Имя поля Cell array numLayers1 {01} .initFcn Char ‘‘ .learn Boolean initcon | initzero | rands 0|1 0 Описатель вектора смещений для слоя i Функции инициализации Индикатор настройки .learnFcn Char learncon | learngd | learngdm | learnp | learnpn | learnwh ‘‘ Функции настройки .learnParam Параметры функции настройки 0 Количество элементов 11 Информация пользователя 'Put your custom input Текст information here.' [] .size Integer >= 0 .userdata Struct 11 .note Char 1var (только для чтения) 11 массив ячеек Описатель векторов смещений. Массив ячеек размера Nl1, где 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 параметры функции настройки 238 Нейронные сети. MATLAB 6 Параметры функции настройки. Свойство biases{i}.learnParam определяет набор параметров для используемой функции настройки biases{i}.learnFcn. Узнать набор таких параметров можно, применяя оператор help в следующей функциональной форме: help(net.biases{i}.learnFcn). 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 Размер numLayersnumInputs Значение по умолчанию {01} .delays Double array 1var [] .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 (только для 11 0 чтения) 10. Вычислительная модель нейронной сети Имя поля Описатель массива весов от входа j к слою i Индикатор линий задержки Функции инициализации Индикатор настройки Функции настройки Параметры функции настройки Функции формирования взвешенных входов Количество элементов 239 .userdata .note inputWeights Struct 11 Char 1var Информация пользователя 'Put your custom Текст input information here.' 11 массив ячеек Описатель весов входа. Массив размера NlNi, где 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). 240 Нейронные сети. MATLAB 6 weightFcn dist | dotprod | mandist | negdist | normprod Функции для применения матриц весов. Это свойство определяет, какая функция inputWeights{i,j}.weightFcn применяется для вычисления взвешенных входов для слоя. Пользователь может расширить список таких функций. size размер матрицы весов (только для чтения) Размер матрицы весов. Свойство inputWeights{i, j}.size определяет размер матрицы весов, связывающей слой i со входом j. Это вектор-строка, в которой указано число строк и столбцов матрицы весов 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 {11} {01} .delays Double array 1var [] .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 0 Имя поля Описатель весов от слоя j к слою i Индикатор линий задержки Функции инициализации Индикатор настройки Функции настройки Параметры функции настройки Функции взвешивания dist | dotprod | mandist | negdist | normprod 11 ‘‘ 0 Количество элементов 11 11 Информация пользователя 10. Вычислительная модель нейронной сети 241 .note layerWeights Char 1var 'Put your custom input Текст information here.' массив ячеек Описатель весов слоя. Массив размера Nl Nl, где Nl – число слоев numLayers объекта net, состоящий из ячеек layerWeights{i, j}. Каждая ячейка является массивом записей и служит для описания свойств весов, которые формируют матрицу весов. Последняя определяет веса связей слоя i со слоем j сети и согласуется с матрицей связности layerConnect(i, j). индикатор линий задержки 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 242 dist | dotprod | mandist | negdist | normprod Нейронные сети. MATLAB 6 Функции для применения матриц весов. Это свойство определяет, какая функция 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. массив записей userdata Поле для записи информации пользователя. Это свойство обеспечивает место для записи информации, относящейся к матрице весов слоя i сети. Предусмотрено только одно поле layerWeights{i,j}.userdata.note для записи текста. По умолчанию оно содержит строку 'Put your custom input information here.' – "Информацию разместите здесь". Матрицы весов и векторы смещений Перечисленные ниже свойства объекта net включают перечень функций, которые используются для описания матриц весов и векторов смещений. Тип Размер .IW Cell array NumLayers NumInputs {00} Массив ячеек для матриц весов входа .LW Cell array NumLayers NumLayers {00} Массив ячеек для матриц весов слоя .b Cell array NumLayers 1 {01} Массив ячеек для векторов смещений net Значение по умолчанию Имя поля массив ячеек Матрицы весов входа. Массив ячеек IW размера NlNi, где 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) 10. Вычислительная модель нейронной сети 243 и соответствовать параметру layerWeights{i, j}.size. массив ячеек b Векторы смещений. Вектор ячеек b размера Nl1, где Nl – число слоев numLayers объекта net, каждый элемент которого является вектором смещений для слоя i сети; структура этого вектора согласована с вектором связности biasConnect(i). Длина вектора смещений для слоя i должна соответствовать параметру biases{i}.size. Информационные поля В структуре объекта net имеются поля, предназначенные для записи информации. net Тип Размер Значение по умолчанию .hint Struct 1var 11 .userdata Struct 11 11 Char 1var '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] размера numLayers1; inputConnect = [1 1; 0 0; 0 0] размера numLayersnumInputs; layerConnect = [0 0 0; 1 0 0; 0 1 0] размера numLayersnumLayers; 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 – массив размера R2 минимальных и максимальных значений для 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 – массив размера R2 минимальных и максимальных значений для 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: 11. Формирование моделей нейронных сетей 251 net = train(net,P1,T1); Характеристика процедуры обучения показана на рис. 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 252 Нейронные сети. MATLAB 6 В этом случае процедура обучения не достигает предельной точности в течение 200 циклов обучения и, судя по виду кривой, имеет статическую ошибку. Значения весов и смещений несколько изменяются: 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. 11. Формирование моделей нейронных сетей 253 Линейный слой LIND NEWLIND Синтаксис: net = newlind(P, T) Описание: Линейный слой LIND использует для расчета весов и смещений процедуру решения систем линейных алгебраических уравнений на основе метода наименьших квадратов, и поэтому в наибольшей степени он приспособлен для решения задач аппроксимации, когда требуется подобрать коэффициенты аппроксимирующей функции. В задачах управления такой линейный слой можно применять для идентификации параметров динамических систем. Функция net = newlind(P, T) формирует нейронную сеть, используя только обучающие последовательности входа P размера RQ и цели T размера SQ. Выходом является объект класса 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. Выполним моделирование сформированного линейного слоя: 254 Нейронные сети. MATLAB 6 Y = sim(net,P) Y = 0.0300 2.0100 3.9900 5.9700 Читатель может самостоятельно убедиться, построив соответствующие графики зависимостей, что аппроксимирующая кривая в полной мере соответствует правилу наименьших квадратов. Алгоритм: Функция 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 – массив размера R2 минимальных и максимальных значений для R векторов входа; Si – количество нейронов в слое i; TFi – функция активации слоя i, по умолчанию tansig; btf – обучающая функция, реализующая метод обратного распространения, по умолчанию trainlm; blf – функция настройки, реализующая метод обратного распространения, по умолчанию learngdm; pf – критерий качества обучения, по умолчанию mse. Выходные аргументы: net – объект класса network object многослойной нейронной сети. Свойства сети: Функциями активации могут быть любые дифференцируемые функции, например tansig, logsig или purelin. Обучающими функциями могут быть любые функции, реализующие метод обратного распространения: trainlm, trainbfg, trainrp, traingd и др. 11. Формирование моделей нейронных сетей 255 Функция 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 = newff([0 10],[5 1],{'tansig' 'purelin'}); gensim(net) % Рис.11.12 Рис. 11.12 256 Нейронные сети. MATLAB 6 Выполним моделирование сети и построим графики сигналов выхода и цели (рис. 11.13): Y = sim(net,P); plot(P, T, P, Y, 'o') % Рис.11.13 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 и свидетельствуют о хорошем отображении входной последовательности в выходную последовательность. 11. Формирование моделей нейронных сетей 257 6 4 2 0 -2 0 2 4 6 8 10 Рис. 11.15 Алгоритм: Многослойная сеть прямой передачи сигнала включает 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 – массив размера R2 минимальных и максимальных значений для R векторов входа; ID – вектор параметров линии задержки на входе сети; Si – количество нейронов в слое i; TFi – функция активации слоя i, по умолчанию tansig; btf – обучающая функция, реализующая метод обратного распространения, по умолчанию trainlm; 258 Нейронные сети. MATLAB 6 blf – функция настройки, реализующая метод обратного распространения, по умолчанию learngdm; pf – критерий качества обучения, по умолчанию mse. Выходные аргументы: 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 = {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. Формирование моделей нейронных сетей 259 Рис. 11.16 Обучим сеть в течение 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. 260 Нейронные сети. MATLAB 6 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 – массив размера R2 минимальных и максимальных значений для 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; перейдите к обучающей функции trainrp, которая работает медленнее, но требует меньшей памяти, чем М-функция trainbfg. Функциями настройки могут быть функции, реализующие метод обратного распространения: learngd, learngdm Критерием качества обучения может быть любая дифференцируемая функция: mse, msereg. 11. Формирование моделей нейронных сетей 261 Пример: Создать каскадную нейронную сеть, чтобы обеспечить следующее отображение последовательности входа 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.17 Обучим сеть в течение 50 циклов: net.trainParam.epochs = 50; net = train(net,P,T); Характеристика точности обучения показана на рис. 11.18; установившаяся среднеквадратичная ошибка составляет приблизительно 0.002, что на порядок выше, чем для сети FF ( см. рис. 11.14). 262 Нейронные сети. MATLAB 6 Рис. 11.18 Выполним моделирование каскадной двухслойной сети, используя обучающую последовательность входа: Y = sim(net,P); plot(P,T,P,Y,'o') Результат моделирования представлен на рис. 11.19. Рис. 11.19 Алгоритм: Каскадная сеть прямой передачи использует функции взвешивания dotprod, накопления netsum и заданные пользователем функции активации. Первый каскад характеризуется матрицей весов входа, другие каскады – матрицами весов выхода предшествующего каскада; все каскады имеют смещения. Выход последнего каскада является выходом сети. Веса и смещения инициализируются с помощью М-функции initnw. 11. Формирование моделей нейронных сетей 263 Режим адаптации реализуется М-функцией 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 – массив размера RQ из Q входных векторов, R – число элементов вектора входа; T – массив размера SQ из Q векторов цели; 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 264 Нейронные сети. MATLAB 6 gensim(net) % Рис.11.20 Рис. 11.20 Сформированная радиальная базисная сеть имеет 3 нейрона с функцией активации radbas. Выполним моделирование сети для нового входа (рис. 11.21): 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.21 Рис. 11.21 Алгоритм: Функция newrb создает радиальную базисную сеть с двумя слоями. Первый слой включает нейроны с функцией активации radbas и использует функции взвешивания dist 11. Формирование моделей нейронных сетей 265 и накопления netprod. Второй, линейный слой включает нейроны с функцией активации purelin и использует функции взвешивания dotprod и накопления netsum. Сеть формируется следующим образом. Изначально первый слой не имеет нейронов. Сеть моделируется и определяется вектор входа с самой большой погрешностью, добавляется нейрон с функцией активации radbas и весами, равными вектору входа, затем вычисляются весовые коэффициенты линейного слоя, чтобы не превысить допустимой средней квадратичной погрешности. Сопутствующие функции: SIM, NEWRBE, NEWGRNN, NEWPNN. NEWRBE Радиальная базисная сеть с нулевой ошибкой RBE Синтаксис: net = newrbe(P,T,spread) Описание: Функция net = newrb(P, T, spread) формирует радиальную базисную сеть с нулевой ошибкой и имеет следующие входные и выходные аргументы. Входные аргументы: P – массив размера RQ из Q входных векторов, R – число элементов вектора входа; T – массив размера SQ из Q векторов цели; spread – параметр влияния, по умолчанию 1.0. Выходные аргументы: 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 266 Нейронные сети. MATLAB 6 Рис. 11.22 Алгоритм: Функция newrbe создает радиальную базисную сеть с двумя слоями. Первый слой включает нейроны с функцией активации radbas и использует функции взвешивания dist и накопления netprod. Второй, линейный слой включает нейроны с функцией активации purelin и использует функции взвешивания dotprod и накопления netsum. Функция 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 – массив размера RQ из Q входных векторов, R – число элементов вектора входа; T – массив размера SQ из Q векторов цели; spread – параметр влияния, по умолчанию 1.0. 11. Формирование моделей нейронных сетей 267 Выходные аргументы: net – объект класса network object обобщенной регрессионной сети. Чем больше число используемых радиальных базисных функций, тем более гладкой будет аппроксимация функции. Чтобы выполнить точную аппроксимацию, следует использовать значение параметра spread меньшее, чем расстояние между векторами входа. Чтобы получить гладкую аппроксимацию, следует увеличить значение параметра spread. Свойства: Функция newgrnn создает двухслойную нейронную сеть, архитектура которой совпадает с архитектурой радиальной базисной сети. Первый слой включает нейроны с функцией активации radbas и использует функции взвешивания dist и накопления netprod. Второй, линейный слой включает нейроны с функцией активации purelin и использует функции взвешивания normprod и накопления netsum. Смещения используются только в первом слое. Функция newgrnn устанавливает веса первого слоя равными P', а смещения – равными 0.8326/spread, что приводит к радиальным базисным функциям, которые пересекают величину 0.5 при значениях взвешенных входов spread. Веса второго слоя W2 устанавливаются равными T. Примеры: Создадим обобщенную регрессионную сеть с входами P и целями T: P = 0:3; T = [0.0 2.0 4.1 5.9]; net = newgrnn(P,T); gensim(net) % Рис.11.24 Рис. 11.23 268 Нейронные сети. MATLAB 6 На рис. 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 Рис. 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) – разновидность радиальных базисных сетей, применяемая для решения задач классификации. 11. Формирование моделей нейронных сетей 269 Функция net = newgrnn(P, T, spread) формирует обобщенную регрессионную сеть и имеет следующие входные и выходные аргументы. Входные аргументы: P – массив размера RQ из Q входных векторов, R – число элементов вектора входа; T – массив размера SQ из Q векторов цели; spread – параметр влияния, по умолчанию 1.0. Выходные аргументы: net – объект класса network object вероятностной нейронной сети. Если параметр spread близок к нулю, то сеть будет действовать как классификатор ближайших соседей. Когда параметр spread возрастает, то вероятностная сеть будет учитывать влияние близлежащих векторов. Пример: Задача классификации определена множествами входа 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 Результат, как и следовало ожидать, совпадает с множеством целей. 270 Нейронные сети. MATLAB 6 Алгоритм: Функция newpnn создает двухслойную нейронную сеть, архитектура которой совпадает с архитектурой радиальной базисной сети. Первый слой включает нейроны с функцией активации radbas и использует функции взвешивания dist и накопления netprod. Второй, линейный слой включает нейроны с функцией активации compet и использует функции взвешивания dotprod и накопления netsum. Смещения используются только в первом слое. Функция newpnn устанавливает веса первого слоя равными P', а смещения слоя – равными 0.8326/spread, в результате чего радиальные базисные функции достигают уровня 0.5 при значениях взвешенных входов spread. Веса второго слоя W2 устанавливаются равными T. Сопутствующие функции: SIM, IND2VEC, VEC2IND, NEWRB, NEWRBE, NEWGRNN. Самоорганизующиеся сети NEWC Слой Кохонена WC Синтаксис: net = newc(PR,s,klr,clr) Описание: Конкурирующий слой Кохонена относится к классу самоорганизующихся нейронных сетей, которые предназначены для решения задач кластеризации и классификации. Функция net = newc(PR, s, klr, clr) формирует слой Кохонена и имеет следующие входные и выходные аргументы. Входные аргументы: PR – массив размера R2 из Q минимальных и максимальных значений вектора входа; s – число нейронов; klr – параметр настройки функции learnk, по умолчанию 0.01; clr – параметр настройки функции learncon, по умолчанию 0.001. Выходные аргументы: net – объект класса network object, определяющий слой Кохонена. Свойства: Конкурирующий слой Кохонена использует функции взвешивания negdist, накопления netsum и активации compet. Веса и смещения слоя инициализируются с помощью М-функций midpoint и initcon. Адаптация и обучение выполняются функциями adaptwb и trainwb1, которые модифицируют значения веса и смещения, применяя функции настройки learnk и learncon. 11. Формирование моделей нейронных сетей 271 Примеры: Зададим массив входа 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.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') 272 Нейронные сети. MATLAB 6 Рис. 11.27 На рис. 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 – массив размера R2 из Q минимальных и максимальных значений вектора входа; di – число нейронов по i-размерности карты, по умолчанию двумерная карта с числом нейронов [5 8]; tfcn – функция топологии карты, по умолчанию hextop; dfcn – функция расстояния, по умолчанию linkdist; olr – параметр скорости обучения на этапе размещения, по умолчанию 0.9; osteps – число циклов обучения на этапе размещения, по умолчанию 1000; 11. Формирование моделей нейронных сетей 273 tlr – параметр скорости обучения на этапе подстройки, по умолчанию 0.02; tnd – размер окрестности на этапе подстройки, по умолчанию 1. Выходные аргументы: net – объект класса network самоорганизующуюся карту Кохонена. object, определяющий многомерную Свойства сети: Самоорганизующаяся карта Кохонена имеет единственный слой с функциями взвешивания negdist, накопления netsum и активации compet. Слой характеризуется весовой матрицей входа, но не имеет смещений. Инициализация слоя реализуется с помощью функции midpoint. Адаптация и обучение выполняются функциями adaptwb и trainwb1, которые используют функцию настройки learnsom. Топология карты задается функциями hextop, gridtop и randtop. Функциями расстояния могут быть выбраны из списка {linkdist | dist | mandist}. Пример: Задан случайный вектор входа, элементы которого расположены в диапазонах [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 274 Нейронные сети. MATLAB 6 Рис. 11.29 Затем реализуется процедура обучения. Следует отметить, что процедура обучения длится достаточно долго; компьютер с частотой 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. Формирование моделей нейронных сетей 275 Рис. 11.31 Из анализа рис. 11.31 следует, что количество входных векторов, отнесенных к определенному кластеру, колеблется от 12 до 35. Таким образом, в процессе обучения двумерная самоорганизующаяся карта Кохонена выполнила кластеризацию массива векторов входа. Сопутствующие функции: SIM, INIT, ADAPT, TRAIN, ADAPTWB, TRAINWB1. Сети – классификаторы входных векторов NEWLVQ Нейронная сеть LVQ Синтаксис: net = newlvq(PR,S1,PC,LR,LF) Описание: Нейронные сети-классификаторы входных векторов, или сети LVQ, в отличие от самоорганизующихся сетей выполняют не только кластеризацию, но и классификацию входных векторов. Функция net = newlvq(PR, s1, PC, lr, lf) формирует сеть LVQ и имеет следующие входные и выходные аргументы. Входные аргументы: PR – массив размера R2 из Q минимальных и максимальных значений вектора входа; s1 – число нейронов скрытого слоя; PC – вектор размера 1S2, указывающий распределение по долям векторов каждого класса; lr – параметр скорости настройки, по умолчанию 0.01; lf – функция настройки, по умолчанию learnlv2. Выходные аргументы: net – объект класса network object, определяющий сеть-классификатор LVQ. 276 Нейронные сети. MATLAB 6 Свойства сети: Сеть 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 Структура нейронной сети 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 11. Формирование моделей нейронных сетей 277 Классификация входного вектора выполнена без ошибок. Сопутствующие функции: 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 – массив размера R2 минимальных и максимальных значений для R векторов входа; Si – количество нейронов в слое i; TFi – функция активации слоя i, по умолчанию tansig; btf – обучающая функция, реализующая метод обратного распространения, по умолчанию traingdx; blf – функция настройки, реализующая метод обратного распространения, по умолчанию learngdm; pf – критерий качества обучения, по умолчанию mse. Выходные аргументы: net – объект класса network object динамической сети Элмана. Свойства сети: Обучающими функциями могут быть любые функции, реализующие метод обратного распространения: trainlm, trainbfg, trainrp, traingd и др. Функциями настройки могут быть функции, реализующие метод обратного распространения: learngd, learngdm. Критерием качества обучения может быть любая дифференцируемая функция: mse, msereg. При реализации сети Элмана не рекомендуется применять такие алгоритмы обучения, как trainlm или trainrp, которые работают с большим размером шага. Пример: Зададим вход P в виде случайной булевой последовательности из нулей и единиц; выходом сети должна быть такая булева последовательность T, элементы которой 278 Нейронные сети. MATLAB 6 принимают значение 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 Рис. 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 11. Формирование моделей нейронных сетей 0 0 0 0 0 0 0 0 0 279 Результат свидетельствует о том, что сеть справилась с поставленной задачей. Алгоритм: Сеть Элмана состоит из Nl слоев, использующих функции взвешивания dotprod, накопления netsum и заданные пользователем функции активации. Все слои имеют смещения. Выход последнего слоя является выходом сети. Веса и смещения инициализируются с помощью функции initnw. Адаптация реализуется с помощью функции adaptwb, которая настраивает веса с помощью заданной функции настройки. Сопутствующие функции: NEWFF, NEWCF, SIM, INIT, ADAPT, TRAIN. NEWHOP Сеть Хопфилда HOP Синтаксис: net = newhop(T) Описание: Сети Хопфилда применяются для решения задач распознавания образов. Функция net = newhop(T) имеет 1 входной аргумент – массив T размера RQ, объединяющий Q целевых векторов (со значениями +1 или –1), R – число элементов вектора входа. Функция возвращает рекуррентную сеть Хопфилда в виде объекта класса network object. Свойства: Сеть Хопфилда имеет 1 нейронный слой с функциями взвешивания dotprod, накопления netsum и активации satlins. Слой охвачен динамической обратной связью и имеет смещения. Пример: Создадим сеть Хопфилда с двумя устойчивыми точками в трехмерном пространстве: T = [–1 –1 1; 1 –1 1]'; net = newhop(T); gensim(net) % Рис.11.34 280 Нейронные сети. MATLAB 6 Рис. 11.34 Проверим, что сеть устойчива в этих точках, и используем их как начальные условия для линии задержки. Если сеть устойчива, можно ожидать, что выходы Y будут те же самые. Ai = T; [Y,Pf,Af] = sim(net,2,[],Ai); 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. Формирование моделей нейронных сетей 281 11.2. Функции активации Функция активации, или передаточная функция нейрона, преобразует каждый элемент ni вектора входа нейрона в элемент ai вектора выхода: ai f (ni ) . Если рассматривать слой нейронов, то выражение функции активации через параметры слоя может быть записано в следующей векторной форме: a m f ( W m a m1 b m ) f m (n m ) , где a m – вектор выхода нейронов размера S m1 для слоя m; Wm – матрица весовых коэффициентов размера S m S m –1 для слоя m; bm – вектор смещений размера S m1 для слоя 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). Кроме того, для функций активации определена информационная функция вида info = <имя_функции>(code), где аргумент code может принимать следующие значения: 'name' – полное название функции активации; 'deriv' – имя производной функции активации; 'active' – активный диапазон входа функции активации; 'output' – диапазон выхода функции активации. Персептрон HARDLIM, DHARDLIM Функция активации с жесткими ограничениями Блок Simulink: Синтаксис: A = hardlim(N) info = hardlim(code) 282 dA_dN = dhardlim(N,A) Нейронные сети. MATLAB 6 Описание: Функция 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 dA_dN = dhardlim(N,A) dA_dN = 0 0 0 Применение функции: Функция активации 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. 11. Формирование моделей нейронных сетей 283 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 Зададим следующий вектор входа симметричной функции активации с жесткими ограничениями для слоя из трех нейронов и рассчитаем вектор выхода 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'. 284 Нейронные сети. MATLAB 6 Алгоритм: Функция активации 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. Пример: Информация о функции активации 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) dA_dN = dpurelin(N,A) 11. Формирование моделей нейронных сетей 285 A = dA_dN = 0.1000 0.8000 –0.7000 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. Пример: Информация о функции активации 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]; 286 Нейронные сети. MATLAB 6 A = poslin(N) A = 0.1000 0.8000 0 dA_dN = dposlin(N,A) dA_dN = 1 1 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) dA_dN = dsatlin(N,A) Описание: Функция 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 11. Формирование моделей нейронных сетей 287 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. SATLINS, DSATLINS Симметричная линейная функция с ограничениями Блок Simulink: Синтаксис: A = satlins(N) info = satlins(code) dA_dN = dsatlins(N, A) Описание: Функция A = satlins(N) реализует симметричную линейную функцию активации с ограничениями. Функция info = satlins(code) сообщает информацию о функции satlins. 288 Нейронные сети. MATLAB 6 Функция 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 определяются следующими соотношениями: 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. Радиальные базисные сети 11. Формирование моделей нейронных сетей 289 Радиальная базисная функция 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.35 Зададим следующий вектор входа радиальной базисной функции активации для слоя из трех нейронов и рассчитаем вектор выхода A и производную dA_dN: 290 Нейронные сети. MATLAB 6 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 2 n ; dradbas(n) 2ne 2 n . Сопутствующие функции: SIM, TRIBAS, DRADBAS. Треугольная функция активации TRIBAS, DTRIBAS Блок Simulink: Синтаксис: A = tribas(N) info = tribas(code) dA_dN = dtribas(N,A) Описание: Функция 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 11. Формирование моделей нейронных сетей 291 inrange = outrange = –1 0 1 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'. Алгоритм: Функция активации 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. 292 Нейронные сети. MATLAB 6 Сопутствующие функции: 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 Зададим следующий вектор входа конкурирующей функции активации, вычислим выход и представим входы и выходы в виде столбцовых диаграмм (рис. 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. Формирование моделей нейронных сетей 293 Рис. 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 не имеет производной. Пример: Информация о функции активации softmax: name = softmax('name') dname = softmax('deriv') inrange = softmax('active') outrange = softmax('output') name = Soft Max 294 Нейронные сети. MATLAB 6 dname = '' inrange = –Inf outrange = 0 Inf 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) dA_dN = dlogsig(N,A) Описание: Функция A = logsig(N) реализует логистическую сигмоидальную функцию активации. Функция info = logsig(code) сообщает информацию о функции logsig. Функция dA_dN = logsig(N, A) вычисляет производную функции logsig. 11. Формирование моделей нейронных сетей 295 Пример: Информация о функции активации 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'. Алгоритм: Функция активации logsig и ее производная dlogsig определяются следующими соотношениями: 296 Нейронные сети. MATLAB 6 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 11. Формирование моделей нейронных сетей 297 Рис. 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 tansig2 (n) . Приведенное выражение для функции tansig(n) математически эквивалентно функции tanh(N), но отличается тем, что выполняется быстрее, чем реализация функции tanh в системе MATLAB. Для нейронных сетей, где быстродействие играет важную роль, это весьма существенно [42]. Сопутствующие функции: SIM, DTANSIG, LOGSIG. 298 Нейронные сети. MATLAB 6 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 размера RQ и матрицы весов W размера SR. Результатом является матрица Z размера SQ. Функция df = dotprod('deriv') возвращает имя М-функции, которая вычисляет производную скалярного произведения по одному из сомножителей. Функции dZ_dP = ddotprod('p', W, P, Z) и dZ_dW = ddotprod('w', W, P, Z) имеют следующие входные и выходные аргументы: W – матрица весов размера SR; P – массив входов размера RQ; Z – матрица размера SQ, где S – число нейронов в слое, Q – число векторов входа, R – число элементов каждого вектора входа; dZ_dP – матрица производной dZ/dP размера SR; dZ_dW – матрица производной dZ/dW размера RQ. Примеры: Вычислим вектор взвешенных входов Z, если заданы случайные матрица весов W и вектор входа P: W P Z W = 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 11. Формирование моделей нейронных сетей 299 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 – матрица весов размера 300 Нейронные сети. MATLAB 6 SR, P – массив входов размера RQ. Результатом является массив значений взвешенных входов Z размера SQ. Функция 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. Функции расстояний могут использоваться как функции взвешивания, но их основное назначение характеризовать топологию вероятностных и самоорганизующихся сетей путем вычисления расстояний между нейронами в слое. 11. Формирование моделей нейронных сетей 301 Евклидово расстояние DIST Блок SIMULINK: Синтаксис: Z = dist(W,P) df = dist('deriv') D = dist(pos) Описание: Функция взвешивания Z = dist(W, P) вычисляет евклидово расстояние между каждой строкой wi матрицы весов W и каждым столбцом pj матрицы входов P в соответствии со следующим соотношением: zij = norm(wi – pj'). (11.1) Функция Z = dist(W, P) вычисляет матрицу взвешенных входов для матрицы входов P размера RQ и матрицы весов W размера SR. Результатом является матрица Z размера SQ. Функция df = dist('deriv') возвращает пустую строку, поскольку производная не определена. Функция dist может быть использована как функция для вычисления расстояний между нейронами в слое. Функция расстояния D = dist(pos) вычисляет расстояние между нейронами для сетей с топологией. Входной аргумент pos – это матрица координат расположения нейронов в N-мерном пространстве размера NS; выходной аргумент D – это матрица расстояний размера SS. Примеры: Вычислим вектор взвешенных входов Z, если заданы случайные матрица весов W размера 43 и вектор входа P размера 31: W P Z Z = rand(4,3); = rand(3,1); = dist(W,P) = 0.6791 0.3994 0.3234 0.5746 Результатом является вектор размера 41, вычисленный в соответствии с соотношением (11.1). Рассмотрим сеть с топологией, для которой задана случайная матрица координат для 10 нейронов в трехмерном пространстве и требуется рассчитать матрицу евклидовых расстояний между ними. pos = rand(3,10); D = dist(pos) 302 Нейронные сети. MATLAB 6 D = Columns 0 0.5304 0.9195 0.9366 0.5776 1.0651 0.9003 1.1471 0.3750 1.0744 Columns 1.1471 0.9753 0.4052 0.8125 0.9155 0.5243 0.2948 0 0.8512 0.1166 1 through 0.5304 0 0.7033 0.4450 0.7648 1.1121 0.8339 0.9753 0.2967 0.9119 8 through 0.3750 0.2967 0.6520 0.6215 0.6276 0.8666 0.6631 0.8512 0 0.7709 7 0.9195 0.7033 0 0.5551 0.6438 0.7713 0.3219 0.4052 0.6520 0.4235 10 1.0744 0.9119 0.4235 0.7844 0.8969 0.4576 0.2754 0.1166 0.7709 0 0.9366 0.4450 0.5551 0 0.9521 1.1444 0.7971 0.8125 0.6215 0.7844 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 В результате получаем симметричную матрицу взаимных расстояний между нейронами. Применение функции: Функция взвешивания 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 применяется в самоорганизующихся сетях как функция взвешивания. 11. Формирование моделей нейронных сетей 303 Функция взвешивания Z = negdist(W, P) вычисляет отрицательное евклидово расстояние между каждой строкой wi матрицы весов W и каждым столбцом pj матрицы входов P в соответствии со следующим соотношением: zij = norm(wi – pj'). (11.2) Функция Z = dist(W, P) вычисляет матрицу взвешенных входов для матрицы входов P размера RQ и матрицы весов W размера SR. Результатом является матрица Z размера SQ. Функция df = dist('deriv') возвращает пустую строку, поскольку производная не определена. Пример: Вычислим вектор взвешенных входов Z, если заданы случайные матрица весов W размера 43 и вектор входа P размера 31: 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')). 304 (11.3) Нейронные сети. MATLAB 6 Функция Z = mandist(W, P) вычисляет матрицу взвешенных входов для матрицы входов P размера RQ и матрицы весов W размера SR. Результатом является матрица Z размера SQ. Функция df = dist('deriv') возвращает пустую строку, поскольку производная не определена. Функция mandist может быть использована как функция для вычисления расстояний между нейронами в слое. Функция расстояния D = mandist(pos) вычисляет расстояние между нейронами для сетей с топологией. Входной аргумент pos – это матрица координат расположения нейронов в N-мерном пространстве размера NS; выходной аргумент D – это матрица расстояний размера SS. Пример: Вычислим вектор взвешенных входов Z, если заданы случайные матрица весов W размера 43 и вектор входа P размера 31: W P Z Z = rand(4,3); = rand(3,1); = mandist(W,P) = 0.8265 0.9830 1.0359 1.7712 Результатом является вектор размера 41, вычисленный в соответствии с соотношением (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 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.2565 0.9084 0.8333 0 0.9730 1.0287 1.5443 1.7622 1.0977 1.2194 11. Формирование моделей нейронных сетей 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 305 0 0.8238 1.5772 0.8238 0 1.8356 1.5772 1.8356 0 Применение функции: Функция суммарного координатного смещения используется в сетях с топологией, например в картах Кохонена newsom. Чтобы применить эту функцию для других сетей с топологией, необходимо установить значение свойства net.layerWeight{i,j}.distanceFcn равным 'mandist'. Чтобы применить функцию взвешивания mandist, следует установить свойство net.inputWeight{i, j}.weightFcn равным 'mandist'. Алгоритм: Сумммарное координатное смещение d между векторами x и y вычисляется в системе MATLAB следующим образом: d = sum(abs(x–y)). Сопутствующие функции: SIM, DIST, LINKDIST. Максимальное координатное смещение BOXDIST Синтаксис: d = boxdist(pos) Описание: Функция d = boxdist(pos) вычисляет расстояния максимального координатного смещения между нейронами слоя, если задан массив координат нейронов pos размера NS, где N – размерность пространства расположения нейронов. Выходом является массив расстояний размера SS. Функция 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 306 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.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 Нейронные сети. MATLAB 6 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.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 Применение функции: Функция максимального координатного смещения используется в сетях с топологией, например в картах Кохонена 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 размера NS, где N – размерность пространства расположения нейронов. Выходом является массив расстояний размера SS. Пример: Пусть задан массив случайных координат трехмерного пространства, в которых размещены 10 нейронов. Требуется вычислить массив расстояний связи между этими нейронами (рис. 11.41): pos = rand(3,10); 11. Формирование моделей нейронных сетей 307 Рис. 11.41 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. 308 Нейронные сети. MATLAB 6 Функции накопления Функции, задающие правила формирования входа нейрона, называются функциями накопления. Как правило, это либо сумма взвешенных входов, либо их поэлементное произведение. Сумма взвешенных входов NETSUM, DNETSUM Блок Simulink: Синтаксис: N = netsum(Z1,Z2,...) df = netsum('deriv') dN_dZi = dnetsum(Zi,N) Описание: Функция N = netprod(Z1, Z2, ...) вычисляет функцию накопления потенциала нейрона в виде суммы элементов взвешенных входов Zi размера SQ, где 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 – массивы одинакового размера SQ. Пример: Вычислить функцию накопления потенциала для следующих взвешенных входов: 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 11. Формирование моделей нейронных сетей 309 Определим 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 Применение функции: Функция вычисления потенциала 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 размера SQ, где S – число нейронов в слое, Q – число элементов вектора входа. Для описания операции, выполняемой этим блоком, можно ввести следующую нотацию: 310 Нейронные сети. MATLAB 6 N .Z i Z1 . * Z 2 . * ... . * Z n , где символ . (11.5) обозначает поэлементное произведение. Функция df = netprod('deriv') возвращает имя М-функции, которая вычисляет производную от поэлементного произведения массивов. Функция dN_dZi = dnetprod(Zi, N) вычисляет производную от поэлементного произведения взвешенных входов N по одному из входов. Здесь N, Zi и dN_dZi – массивы одинакового размера SQ. Пример: Вычислить функцию накопления для следующих взвешенных входов: 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 Вычислить функцию накопления с учетом вектора смещения 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'. 11. Формирование моделей нейронных сетей 311 Алгоритм: Производная поэлементного произведения взвешенных входов по каждому из них равна поэлементному произведению остальных взвешенных входов, за исключением особого случая, когда взвешенный вход содержит нулевой элемент. Сопутствующие функции: SIM, NETSUM, CONCUR. 11.4. Функции инициализации Функции инициализации выполняют подготовку нейронной сети к инициализации и выполняют саму инициализацию, присваивая начальные значения матрицам весов и векторам смещений. Инициализация нейронной сети INIT Синтаксис: net = init(net) Описание: Функция net = init(net) выполняет инициализацию нейронной сети, используя функцию инициализации, определяемую свойством net.initFcn, и значения параметров, определяемые свойством net.initParam. Пример: Сформировать персептрон с одним нейроном, вход которого имеет 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]; 312 Нейронные сети. MATLAB 6 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. В сетях с обратным распространением ошибки свойство 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 не имеет параметров инициализации. 11. Формирование моделей нейронных сетей 313 Применение функции: Функция инициализации 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. 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. 314 Нейронные сети. MATLAB 6 Для того чтобы фактически инициализировать сеть, т. е. присвоить значения матрицам весов и векторам смещений, необходимо применить функцию 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'. Для того чтобы фактически инициализировать сеть, т. е. присвоить значения матрицам весов и векторам смещений, необходимо применить функцию init. Алгоритм: Метод Nguyen – Widrow генерирует значения начальных весов и смещений так, чтобы активные области слоя нейронов были бы распределены приблизительно равномерно в пространстве входа. Его преимуществами по сравнению с методом инициализации случайных весов и смещений являются следующие: оптимальное количество используемых нейронов; ускорение процедуры обучения, поскольку активные зоны нейронов соответствуют пространству входа. Ограничения метода инициализации Nguyen – Widrow связаны с тем, что его можно применять только к слоям, имеющим смещения, с функцией взвешивания dotprod и функцией накопления netsum. Если эти условия не выполняются, то следует использовать метод инициализации rands. Сопутствующие функции: INITWB, INITLAY, INIT. 11. Формирование моделей нейронных сетей 315 Инициализация нулевых значений весов и смещений INITZERO IСинтаксис: W = initzero(S,PR) b = initzero(S,[1 1]) Описание: Функция W = initzero(S, PR) присваивает матрице весов слоя нулевые значения и имеет следующие входные и выходные аргументы. Входные аргументы: S – число нейронов в слое; PR – матрица размера R2, задающая диапазоны изменения элементов входного вектора. Выходной аргумент: W – нулевая матрица весов размера SR. Функция b = initzero(S, [1 1]) присваивает вектору смещений слоя нулевые значения и имеет следующие входные и выходные аргументы. Входной аргумент: S – число нейронов в слое. Выходной аргумент: b – нулевой вектор смещений размера S1. Пример: Присвоить нулевые значения матрице весов и вектору смещения для слоя с пятью нейронами и вектором входа, элементы которого принимают значения в диапазонах [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, необходимо: 316 установить свойство сети net.initFcn равным 'initlay'. Это автоматически установит свойство net.initParam равным пустой матрице [ ], так как функция initlay не имеет параметров инициализации; установить значение свойства net.layers{i}.initFcn равным 'initwb'; Нейронные сети. MATLAB 6 установить значения свойств 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 – матрица размера R2, задающая диапазоны изменения элементов входного вектора [Pmin Pmax]. Выходной аргумент: W – матрица весов размера SR с элементами столбцов, равными (Pmin+Pmax)/2. Пример: Присвоить нулевые значения матрице весов и вектору смещения для слоя с пятью нейронами и вектором входа, элементы которого принимают значения в диапазонах [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. 11. Формирование моделей нейронных сетей 317 Для того чтобы фактически инициализировать сеть, т. е. присвоить нулевые значения матрицам весов и векторам смещений, необходимо применить функцию init. Сопутствующие функции: INITWB, INITLAY, INIT. RANDS Инициализация случайных весов/смещений Синтаксис: W = rands(S,PR) M = rands(S,R) v = rands(S) Описание: Функции семейства rands предназначены для инициализации случайных массивов весов и смещений. Функция W = rands(S, PR) имеет 2 входных аргумента: S – число нейронов; PR – массив минимальных и максимальных значений вектора входа размера R2. Выходом является случайная матрица весов размера SR с элементами из диапазона [–1 1]. Функция M = rands(S, R) использует в качестве второго аргумента параметр R, соответствующий числу элементов вектора входа. Выходом также является случайная матрица весов размера SR с элементами из диапазона [–1 1]. Функция v = rands(S) возвращает случайный вектор размера S1 с элементами из диапазона [–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, необходимо: 318 Нейронные сети. MATLAB 6 установить свойство сети 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 формы обращения, которые возвращают случайную матрицу весов размера SR с нормированными столбцами. Пример: Сформируем случайный массив из четырех нормированных трехэлементных столбцов: 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 формы обращения, которые возвращают случайную матрицу весов размера SR с нормированными строками. 11. Формирование моделей нейронных сетей 319 Пример: Создадим случайную матрицу из трех нормированных четырехэлементных строк: 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 – матрица размера R2, задающая диапазоны изменения элементов входного вектора, по умолчанию [1 1]'. Выходной аргумент: b – вектор смещений размера S1. Функция 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 не имеет параметров инициализации; 320 Нейронные сети. MATLAB 6 установить значение свойства 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.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 – массив входов; 11. Формирование моделей нейронных сетей 321 T – вектор целей, по умолчанию нулевой вектор; Pi – начальные условия на линиях задержки входов, по умолчанию нулевой вектор; Ai – начальные условия на линиях задержки слоев, по умолчанию нулевой вектор. Выходные аргументы: net – структура объекта network object после адаптации; Y – массив выходов; E – массив ошибок; Pf – начальные условия на линиях задержки входов после адаптации; Af – начальные условия на линиях задержки слоев после адаптации. Заметим, что входной аргумент T используется только при наличии целевых выходов. Аргументы Pi и Pf используются только в случае динамических сетей, имеющих линии задержки на входах или в слоях. Входные аргументы P и T могут иметь 2 формата: формат cell array и double array. Формат cell array наиболее прост для понимания и соответствует последовательному представлению данных. Последовательное представление данных. Каждую строку массива ячеек можно рассматривать как временную последовательность, и тогда описание многомерной сети может быть выполнено следующим образом: P – массив ячеек размера NiTS, каждый элемент которого P{i, ts} – числовой массив размера RiQ; T – массив ячеек размера NtTS, каждый элемент которого P{i, ts} – числовой массив размера ViQ; Pi –массив ячеек размера NiID, каждый элемент которого Pi{i, k} – числовой массив размера RiQ; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Y – массив ячеек размера NoTS, каждый элемент которого Y{i, ts} – числовой массив размера UiQ; Pf – массив ячеек размера NiID, каждый элемент которого Pf{i, k} – числовой массив размера RiQ; Af – массив ячеек размера NlLD, каждый элемент которого Af{i, k} – числовой массив размера SiQ. Параметры описания массивов ячеек и их связь с параметрами сети показаны в следующей таблице. Параметр описания 322 Параметр сети Ni net.numInputs Nl net.numLayers No net.numOutputs Nt net.numTargets ID net.numInputDelays Назначение Количество векторов входа Количество слоев Количество выходов Количество целевых выходов Максимальное значение задержки на входе Нейронные сети. MATLAB 6 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 числовых массивов размера RiQ, преобразуется в единственный числовой массив размера Ni Ri Q. i 1 Следующая таблица поясняет связь этих форм представления. Формат Аргумент P Cell array Size(P) Size(P{I,1}) Ni1 RiQ T Nt1 ViQ Pi NiID RiQ Ai NlLD SiQ Y No1 UiQ 11. Формирование моделей нейронных сетей Double array Size(P) Ni Ri Q i 1 Nt Vi Q i 1 Ni Ri ( ID * Q) i 1 Nl Si ( LD * Q) i 1 No U i Q i 1 323 Pf NiID RiQ Af NlLD SiQ Ni Ri ( ID * Q) i 1 Nl Si ( 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) Описание: Функция [net, Ac, El] = adaptwb(net, Pd, Tl, Ai, Q, TS) устанавливает режим адаптации, при котором веса и смещения каждого слоя могут быть настроены с использованием собственной функции настройки. Функция adaptwb имеет следующие входные и выходные аргументы. Входные аргументы: net – исходная нейронная сеть; Pd – вектор максимальных задержек по слоям; Tl – вектор целей для слоя; Ai – начальные условия на линиях задержки; Q – количество реализаций для фиксированного момента времени; TS – число шагов по времени. Выходные аргументы: net – структура объекта network object после адаптации; Ac – массив выходов слоя; El – массив ошибок для слоя. Входные и выходные массивы характеризуются следующими размерами: 324 Нейронные сети. MATLAB 6 Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой массив размера ZijQ; Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой []; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой массив размера SiQ; El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой []. Параметры описания массивов ячеек и их связь с параметрами сети представлены в следующей таблице. Параметр описания Параметр сети 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) Функция адаптации adaptwb имеет параметр net.adaptParam.passes, который определяет количество проходов обучающей последовательности в процессе адаптации, по умолчанию 1. Функция info = adaptwb(code) возвращает информацию о параметрах адаптации, соответствующую следующим значениям аргумента code: 'pnames' – имена параметров адаптации; 'pdefaults' – значения параметров адаптации по умолчанию. Применение функции: Функция адаптации adaptwb используется при создании сетей с помощью методов newp, newlin, а также при формировании сетей с атрибутами, определяемыми пользователем. 11. Формирование моделей нейронных сетей 325 Для того чтобы подготовить сеть к адаптации параметров слоев, необходимо: установить свойство сети 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 допустимо использовать и метод адаптации. 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 – вектор максимальных задержек по слоям; 326 Нейронные сети. MATLAB 6 Tl – вектор целей для слоя; Ai – начальные условия на линиях задержки; Q – количество реализаций для фиксированного момента времени; TS – число шагов по времени; VV – структура, описывающая контрольное множество; TV – структура, описывающая тестовое множество. Выходные аргументы: net – структура объекта network object после адаптации; TR – характеристики процедуры обучения: TR.timesteps – длина последней выборки; TR.perf – значения функции качества на последнем цикле обучения; Ac – массив выходов слоя для последнего цикла; El – массив ошибок для слоя для последнего цикла. Входные и выходные массивы характеризуются следующими размерами: Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой массив размера ZijQ; Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой []; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой массив размера SiQ; El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой []. Параметры описания массивов ячеек и их связь с параметрами сети представлены в следующей таблице. Параметр описания Параметр сети 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 на 11. Формирование моделей нейронных сетей 327 максимальное значение задержки от слоя 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. Алгоритм: Элементы матриц весов и векторов смещения изменяются в соответствии с заданной функцией настройки на каждом шаге адаптивного обучения. Пример: Создать нейронную сеть на основе персептрона с вектором входа из двух элементов со значениями из диапазона [–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 328 Нейронные сети. MATLAB 6 Выход сети после адаптивного обучения полностью совпадает с вектором целей. Сформировать линейную дин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. Функции обучения Метод обучения. В качестве метода обучения сетей в ППП 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 – начальные условия на линиях задержки входов, по умолчанию нулевой вектор; 11. Формирование моделей нейронных сетей 329 Ai – начальные условия на линиях задержки слоев, по умолчанию нулевой вектор. Выходные аргументы: net – структура объекта network object после обучения; TR – характеристики процедуры обучения: TR.timesteps – длина последней выборки; TR.perf – значения функции качества на последнем цикле обучения. Заметим, что входной аргумент T используется только при наличии целевых выходов. Аргументы Pi и Pf используются только в случае динамических сетей, имеющих линии задержки на входах или в слоях. Входные аргументы P и T могут иметь 2 формата: cell array и double array. Формат cell array наиболее прост для понимания и соответствует последовательному представлению данных. Последовательное представление данных. Каждую строку массива ячеек можно рассматривать как временную последовательность, и тогда описание многомерной сети может быть представлено следующим образом: P – массив ячеек размера NiTS, каждый элемент которого P{i, ts} – числовой массив размера RiQ; T – массив ячеек размера NtTS, каждый элемент которого T{i, ts} – числовой массив размера ViQ; Pi – массив ячеек размера NiID, каждый элемент которого Pi{i, k} – числовой массив размера RiQ; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Y – массив ячеек размера NoTS, каждый элемент которого Y{i, ts} – числовой массив размера UiQ; Pf – массив ячеек размера NiID, каждый элемент которого Pf{i, k} – числовой массив размера RiQ; Af – массив ячеек размера NlLD, каждый элемент которого Af{i, k} – числовой массив размера SiQ. Параметры описания массивов ячеек и их связь с параметрами сети представлены в следующей таблице. Параметр описания Параметр сети Ni net.numInputs Nl net.numLayers No net.numOutputs Nt net.numTargets ID net.numInputDelays TS Q LD 330 net.numLayerDelays Назначение Количество векторов входа Количество слоев Количество выходов Количество целевых выходов Максимальное значение задержки на входе Число шагов по времени Количество реализаций для фиксированного момента времени Максимальные значения задержек для слоев Нейронные сети. MATLAB 6 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 числовых массивов размера RiQ, преобразуется в единственный числовой массив размера Ni Ri Q. i 1 Следующая таблица поясняет связь этих форм представления. Аргумент Формат Cell array Size(P) Size(P{I,1}) P Ni1 RiQ T Nt1 ViQ Pi NiID RiQ Ai NlLD SiQ Double array Size(P) Ni Ri Q i 1 Nt Vi Q i 1 Ni Ri ( ID * Q) i 1 Nl Si ( LD * Q) i 1 Функция [net, TR] = train(net, P, T, Pi, Ai, VV, TV) позволяет использовать в процессе обучения контрольные и тестовые подмножества для оценки представительности 11. Формирование моделей нейронных сетей 331 используемых обучающих выборок. Эти подмножества описываются массивами структур со следующими полями: 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. 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 – структура, описывающая тестовое множество. 332 Нейронные сети. MATLAB 6 Выходные аргументы: net – структура объекта network object после адаптации; TR – характеристики процедуры обучения: TR.epoch – вектор, определяющий циклы обучения; TR.perf – значения функции качества по циклам обучения; TR.vperf – значения контрольной функции по циклам обучения; TR.tperf – значения тестовой функции по циклам обучения; Ac – массив выходов слоя для последнего цикла; El – массив ошибок слоя для последнего цикла. Входные и выходные массивы характеризуются следующими размерами: Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой массив размера ZijQ; Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой []; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой массив размера SiQ; El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой []. Параметры описания массивов ячеек и их связь с параметрами сети представлены в следующей таблице. Параметр описания Параметр сети 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 не пустые ([ ]), то они должны быть массивами структур: 11. Формирование моделей нейронных сетей 333 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' – значения параметров группового обучения, принимаемые по умолчанию. Применение функции: Чтобы сформировать нейронную сеть, используя функцию обучения trainb, следует: установить свойство net.trainFcn равным 'trainb'. Это автоматически установит свойство net.trainParam равным значению по умолчанию; установить значения свойств net.inputWeights{i, j}.learnFcn, net.layerWeights{i, j}.learnFcn, net.biases{i}.learnFcn соответствующими выбранным функциям настройки. Для того чтобы фактически выполнить групповое обучение сети, необходимо: установить желаемые значения параметров настройки весов и смещений; установить желаемые значения свойств net.trainParam; вызвать функцию train. Алгоритм: Элементы матриц весов и векторов смещения изменяются в соответствии с заданной функцией настройки на каждом цикле обучения. 334 Обучение прекращается, когда выполняется одно из следующих условий: достигнуто максимальное число циклов обучения; значение функции качества стало меньше предельного; Нейронные сети. MATLAB 6 превышено максимальное время, отпущенное на обучение; ошибка контрольного подмножества превысила ошибку обучающего более чем в 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.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. 11. Формирование моделей нейронных сетей 335 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 – структура, описывающая тестовое множество. Выходные аргументы: net – структура объекта network object после адаптации; TR – характеристики процедуры обучения: TR.epoch – вектор, определяющий циклы обучения; TR.perf – значения функции качества по циклам обучения; Ac – массив выходов слоя для последнего цикла; El – массив ошибок слоя для последнего цикла. Входные и выходные массивы характеризуются следующими размерами: Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой массив размера ZijQ; Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой []; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой массив размера SiQ; El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой []. Параметры описания массивов ячеек и их связь с параметрами сети представлены в следующей таблице. 336 Нейронные сети. 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) Функция trainc не выполняет проверки обучающей последовательности на представительность, поэтому входные аргументы VV и TV не используются. Процедура обучения прекращается при достижении следующих значений параметров функции trainc: Параметр Назначение 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 соответствующими выбранным функциям настройки. Для того чтобы фактически выполнить обучение сети, необходимо: установить желаемые значения параметров настройки весов и смещений; 11. Формирование моделей нейронных сетей 337 установить желаемые значения свойств 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]; Обучение с циклическим представлением входа: net.trainFcn='trainc'; [net,TR]=train(net,P,T); % Рис.11.43 На рис. 11.43 представлена зависимость показателя качества обучения от количества циклов обучения. Нетрудно убедиться, что абсолютная точность достигается на третьем цикле обучения. Рис. 11.43 Выполним моделирование сети при заданном входе: Y = sim(net, P) 338 Нейронные сети. MATLAB 6 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) имеет следующие входные и выходные аргументы. Входные аргументы: net – исходная нейронная сеть; Pd – вектор максимальных задержек по слоям; Tl – вектор целей для слоя; Ai – начальные условия на линиях задержки; Q – количество реализаций для фиксированного момента времени; TS – число шагов по времени; VV – структура, описывающая контрольное множество; TV – структура, описывающая тестовое множество. Выходные аргументы: net – структура объекта network object после адаптации; TR – характеристики процедуры обучения: TR.epoch – вектор, определяющий циклы обучения; TR.perf – значения функции качества по циклам обучения; Ac – массив выходов слоя для последнего цикла; El – массив ошибок слоя для последнего цикла. Входные и выходные массивы характеризуются следующими размерами: Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой массив размера ZijQ; Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой []; 11. Формирование моделей нейронных сетей 339 Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой массив размера SiQ; El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой []. Входные и выходные массивы характеризуются следующими размерами: Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой массив размера ZijQ; Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой []; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой массив размера SiQ; El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой []. Параметры описания массивов ячеек и их связь с параметрами сети представлены в следующей таблице. Параметр описания Параметр сети 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: 340 Нейронные сети. MATLAB 6 Параметр Назначение 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 соответствующими выбранным функциям настройки. Для того чтобы фактически выполнить обучение сети, необходимо: установить желаемые значения параметров настройки весов и смещений; установить желаемые значения свойств net.trainParam; вызвать функцию train. Алгоритм: Элементы матриц весов и векторов смещения изменяются в соответствии с заданной функцией настройки на каждом цикле обучения. Обучение прекращается, когда выполняется одно из следующих условий: достигнуто максимальное число циклов обучения; значение функции качества стало меньше предельного; превышено максимальное время, отпущенное на обучение. Пример: Сформировать самоорганизующуюся нейронную сеть для разделения векторов входа на 2 класса. Векторы входа состоят из двух элементов со значениями из диапазона [0 1]. Сеть имеет 2 выхода (по числу классов) и обучается с помощью функции trainr. Формирование сети: net = newc([0 1; 0 1], 2); Формирование векторов входа: P = [.1 .8 .1 .9; .2 .9 .1 .8]; 11. Формирование моделей нейронных сетей 341 Обучение с циклическим представлением входа: 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 – вектор максимальных задержек по слоям; Tl – вектор целей для слоя; Ai – начальные условия на линиях задержки; Q – количество реализаций для фиксированного момента времени; TS – число шагов по времени; VV – структура, описывающая контрольное множество; TV – структура, описывающая тестовое множество. Выходные аргументы: net – структура объекта network object после адаптации; TR – массив записей, содержащий характеристики процедуры обучения: TR.epoch – вектор, определяющий циклы обучения; TR.perf – значения функции качества по циклам обучения; TR.vperf – значения контрольной функции по циклам обучения; TR.tperf – значения тестовой функции по циклам обучения; Ac – массив выходов слоя для последнего цикла; El – массив ошибок слоя для последнего цикла. Входные и выходные массивы характеризуются следующими размерами: Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой массив размера ZijQ; Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой []; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; 342 Нейронные сети. MATLAB 6 Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой массив размера SiQ; El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой []. Входные и выходные массивы характеризуются следующими размерами: Pd – массив ячеек размера IDNiTS, каждый элемент которого Pd{i, j, ts} – числовой массив размера ZijQ; Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i, ts} – числовой массив размера ViQ, возможно пустой []; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Ac – массив ячеек размера Nl(LD+TS), каждый элемент которого Ac{i, k} – числовой массив размера SiQ; El – массив ячеек размера NlTS, каждый элемент которого El{i, k} – числовой массив размера ViQ, возможно пустой []. Параметры описания массивов ячеек и их связь с параметрами сети представлены в следующей таблице. Параметр описания Параметр сети 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 – длина выборок контрольного и тестового подмножеств. 11. Формирование моделей нейронных сетей 343 Контрольные и тестовые подмножества используются для предотвращения явления переобучения. Функции обучения могут включать следующие параметры: Параметр net.trainParam.epochs net.trainParam.goal net.trainParam.show net.trainParam.min_grad net.trainParam.time net.trainParam.max_fail net.trainParam.searchFcn Назначение Максимальное количество циклов (эпох) обучения, по умолчанию 100 Предельное значение критерия обучения, по умолчанию 0 Интервал вывода данных, по умолчанию 25 циклов, отмена вывода – NaN Минимальное значение градиента критерия качества, по умолчанию 1e–6 Максимальное время обучения в секундах, по умолчанию Inf Максимально допустимый уровень превышения ошибки контрольного подмножества по сравнению с обучающим, по умолчанию 5 Имя функции поиска одномерного экстремума, по умолчанию 'srchbac' Функции поиска одномерного экстремума также включают достаточно большое количество настраиваемых параметров, приведенных в следующей таблице: Параметр 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 344 Назначение Параметр, связывающий погрешность 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 Нейронные сети. MATLAB 6 net.trainParam.lr_dec net.trainParam.delta0 net.trainParam.delt_inc net.trainParam.delt_dec net.trainParam.deltamax Коэффициент уменьшения скорости настройки, по умолчанию 0.7 Начальное значение шага настройки в методе Rprop, по умолчанию 0.07 Коэффициент увеличения шага настройки в методе Rprop, по умолчанию 1.2 Коэффициент уменьшения шага настройки в методе Rprop, по умолчанию 0.5 Максимальное значение шага настройки в методе Rprop, по умолчанию 50 При описании каждой функции одномерного поиска приводится перечень используемых параметров. Кроме того, все функции возвращают информацию о параметрах обучающей функции, если используется следующий формат вызова: info = <имя_функции>(code). В зависимости от значения аргумента code возвращается следующая информация: 'pnames' – имена параметров процедуры обучения; 'pdefaults' – значения параметров процедуры обучения, принимаемые по умолчанию. В качестве примера, иллюстрирующего возможности обучения, рассмотрен общий пример, что позволяет сравнивать описываемые алгоритмы обучения по скорости и точности. Градиентные алгоритмы обучения Алгоритм градиентного спуска 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, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: 11. Формирование моделей нейронных сетей 345 установить свойство сети net.trainFcn равным 'traingd'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция traingd выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения (perf) по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с методом градиентного спуска вектор настраиваемых переменных получает следующие приращения: dX = lr * dperf/dX. Процедура обучения прекращается, когда выполнено одно из следующих условий: значение функции качества стало меньше предельного; градиент критерия качества стал меньше значения 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-м цикле обучения. 346 Нейронные сети. MATLAB 6 Рис. 11.44 Выполним моделирование сети: Y = sim(net,P) Y = 0.0669 0.0962 0.1284 0.8350 0.9640 0.9657 Требуемое соответствие между входом и выходом нейронной сети обеспечивается с заданной среднеквадратичной погрешностью. Сопутствующие функции: 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: 11. Формирование моделей нейронных сетей 0.01 1.05 0.7 1.04 347 Применение функции: Функция обучения traingda используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: установить свойство сети net.trainFcn равным 'traingda'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция traingda выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с методом градиентного спуска вектор настраиваемых переменных получает следующие приращения: dX = lr * dperf/dX. Однако в данном случае, в отличие от алгоритма градиентного спуска, параметр скорости настройки выполняет адаптивную функцию. Он увеличивается в 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]; Поскольку соответствие между входом и целью носит явно выраженный нелинейный характер, то будем использовать нейронную сеть с нелинейными сигмоидальными функциями активации. Выберем двухслойную нейронную сеть с прямой передачей 348 Нейронные сети. MATLAB 6 сигнала; в первом слое используем 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: [194 double] perf: [194 double] vperf: [194 double] tperf: [194 double] lr: [194 double] Рис. 11.45 На рис. 11.45 показано, как изменяется точность в процессе обучения; требуемое значение обеспечивается на 93-м цикле обучения; при этом параметр скорости настройки постоянно растет и достигает значения приблизительно 0.93 (рис. 11.46). 11. Формирование моделей нейронных сетей 349 Рис. 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) Описание: Функция 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, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: 350 Нейронные сети. MATLAB 6 установить свойство сети net.trainFcn равным 'traingdm'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция traingdm выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с методом градиентного спуска с возмущением вектор настраиваемых переменных получает следующие приращения: dX = mc*dXprev + lr*mc*dperf/dX, где dXprev – вектор возмущения весов и смещений с коэффициентом mc. Процедура обучения прекращается, когда выполнено одно из следующих условий: значение функции качества стало меньше предельного; градиент критерия качества стал меньше значения min_grad; достигнуто предельное число циклов обучения; превышено максимальное время, отпущенное на обучение; ошибка контрольного подмножества превысила ошибку обучающего более чем в max_fail раз. Пример: Заданы следующие обучающие последовательности входов 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; 11. Формирование моделей нейронных сетей 351 [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. 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 352 lr: lr_inc: lr_dec: max_perf_inc: mc: 0.01 1.05 0.7 1.04 0.9 Нейронные сети. MATLAB 6 max_fail: 5 Применение функции: Функция обучения traingdx используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: установить свойство сети net.trainFcn равным 'traingdx'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция traingdx выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с методом градиентного спуска с возмущением вектор настраиваемых переменных получает следующие приращения: dX = mc*dXprev + lr*mc*dperf/dX, где dXprev – вектор возмущения весов и смещений с коэффициентом mc. Однако в данном случае, в отличие от алгоритма traingdm, параметр скорости настройки выполняет адаптивную функцию. Он увеличивается в lr_inc раз, если критерий качества обучения сети уменьшается, и это реализуется на каждом цикле обучения. С другой стороны, если критерий качества увеличился более чем в max_perf_inc раз, то начинается коррекция параметра скорости настройки в сторону уменьшения с коэффициентом lr_dec. Обучение прекращается, когда выполнено одно из следующих условий: значение функции качества стало меньше предельного; градиент критерия качества стал меньше значения min_grad; достигнуто предельное число циклов обучения; превышено максимальное время, отпущенное на обучение; ошибка контрольного подмножества превысила ошибку обучающего более чем в max_fail раз. Пример: Заданы следующие обучающие последовательности входов P и целей T: P = [0 1 2 3 4 5]; 11. Формирование моделей нейронных сетей 353 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: [1106 double] perf: [1106 double] vperf: [1106 double] tperf: [1106 double] lr: [1106 double] Рис. 11.48 На рис. 11.48 показано, как изменяется точность в процессе обучения; требуемое значение обеспечивается на 105-м цикле обучения; при этом параметр скорости настройки постоянно растет и достигает значения приблизительно 1.7 (рис. 11.49). 354 Нейронные сети. MATLAB 6 Рис. 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. Алгоритм обучения Rprop TRAINRP Синтаксис: [net,TR,Ac,El]= trainrp(NETt,Pd,Tl,Ai,Q,TS,VV) info = trainrp(code) Описание: Функция 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, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: 11. Формирование моделей нейронных сетей 355 установить свойство сети net.trainFcn равным 'trainrp'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция trainrp выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с пороговым алгоритмом обратного распространения вектор настраиваемых переменных получает следующие приращения: dX = deltaX.*sign(gX), где вектору deltaX присваиваются начальные значения delta0, а вектор gX – градиент критерия качества. На каждой итерации элементы deltaX изменяются. Если некоторый элемент вектора gX изменяет знак при переходе к следующей итерации, то соответствующий элемент вектора deltaX умножается на коэффициент delta_dec. Если элемент вектора gX сохраняет знак, то соответствующий элемент вектора deltaX умножается на коэффициент delta_inc [36]. Процедура обучения прекращается, когда выполнено одно из следующих условий: значение функции качества стало меньше предельного; градиент критерия качества стал меньше значения min_grad; достигнуто предельное число циклов обучения; превышено максимальное время, отпущенное на обучение; ошибка контрольного подмножества превысила ошибку обучающего более чем в 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'); Обучение сети: 356 Нейронные сети. MATLAB 6 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. Алгоритмы метода сопряженных градиентов Алгоритм Флетчера – Ривса 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 scale_tol: alpha: 11. Формирование моделей нейронных сетей 20 0.001 maxstep: minstep: 100 1.0 e–006 357 goal: time: min_grad: max_fail: searchFcn: 0 Inf 1.0e–006 5 'srchbac' beta: delta: gama: low_lim: up_lim: 0.1 0.01 0.1 0.1 0.5 bmax: 26 Применение функции: Функция обучения traincgf используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: установить свойство сети net.trainFcn равным 'traincgf'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция traincgf выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с алгоритмом метода сопряженных градиентов вектор настраиваемых переменных получает следующие приращения: X = X + a*dX, где dX – направление поиска. Параметр a выбирается так, чтобы минимизировать критерий качества обучения в направлении поиска. Функция одномерного поиска searchFcn используется для вычисления минимума. Начальное направление поиска задается вектором, противоположным градиенту критерия качества. При успешных итерациях направление поиска определяется на основе нового значения градиента с учетом прежнего направления поиска согласно формуле dX = –gX + dX_old*Z, где gX – вектор градиента; параметр Z может быть вычислен отдельными различными способами. Для метода сопряженного градиента в модификации Флетчера – Ривса он рассчитывается согласно формуле [41] Z = Normnew_sqr/norm_sqr, где normnew_sqr – квадрат нормы текущего градиента; norm_sqr – квадрат нормы предыдущего градиента. 358 Обучение прекращается, когда выполнено одно из следующих условий: значение функции качества стало меньше предельного; градиент критерия качества стал меньше значения 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. Для обучения сети применим функцию 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.51 Выполним моделирование сети: Y = sim(net,P) Y = 0.0005 0.0005 0.0007 11. Формирование моделей нейронных сетей 0.9862 0.9964 0.9964 359 Требуемое соответствие между входом и выходом нейронной сети обеспечивается с заданной среднеквадратичной погрешностью равной 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' 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 Применение функции: Функция обучения traincgp используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: установить свойство сети net.trainFcn равным 'traincgp'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция traincgp выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного 360 Нейронные сети. MATLAB 6 распространения ошибки. В соответствии с алгоритмом метода сопряженных градиентов вектор настраиваемых переменных получает следующие приращения: 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 раз. Пример: Заданы следующие обучающие последовательности входов 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. Формирование моделей нейронных сетей 361 На рис. 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. Алгоритм обучения 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 362 scale_tol: alpha: beta: delta: gama: low_lim: 20 0.001 0.1 0.01 0.1 0.1 maxstep: minstep: bmax: 100 1.0 e–006 26 Нейронные сети. MATLAB 6 searchFcn: 'srchbac' up_lim: 0.5 Применение функции: Функция обучения traincgb используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: установить свойство сети net.trainFcn равным 'traincgb'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция traincgb выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с алгоритмом метода сопряженных градиентов вектор настраиваемых переменных получает следующие приращения: X = X + a*dX, где dX – направление поиска; параметр a выбирается так, чтобы минимизировать критерий качества обучения в направлении поиска. Функция одномерного поиска searchFcn используется для вычисления минимума. Начальное направление поиска задается вектором, противоположным градиенту критерия качества. При успешных итерациях направление поиска определяется на основе нового значения градиента с учетом прежнего направления поиска согласно формуле dX = –gX + dX_old*Z, где gX – вектор градиента; параметр Z может быть вычислен различными способами. Метод сопряженного градиента в модификации Пауэлла – Биеле реализует стратегию рестартов для выбора правильного направления движения к минимуму [34]. Обучение прекращается, когда выполнено одно из следующих условий: значение функции качества стало меньше предельного; градиент критерия качества стал меньше значения min_grad; достигнуто предельное число циклов обучения; превышено максимальное время, отпущенное на обучение; ошибка контрольного подмножества превысила ошибку обучающего более чем в max_fail раз. 11. Формирование моделей нейронных сетей 363 Пример: Заданы следующие обучающие последовательности входов 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-м цикле обучения. Рис. 11.53 Выполним моделирование сети: Y = sim(net,P) Y = 0.0034 0.0034 0.0038 0.9983 0.9999 0.9999 Требуемое соответствие между входом и выходом нейронной сети обеспечивается с заданной среднеквадратичной погрешностью, равной 0.001. 364 Нейронные сети. MATLAB 6 Сопутствующие функции: 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 Применение функции: Функция обучения trainscg используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: установить свойство сети net.trainFcn равным 'trainscg'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция trainscg выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. Этот алгоритм реализует упрощенную по сравнению с функциями traincgp, traincgf, traincgb стратегию метода сопряженных градиентов, предложенную Моллером [29]. Обучение прекращается, когда выполнено одно из следующих условий: 11. Формирование моделей нейронных сетей 365 значение функции качества стало меньше предельного; градиент критерия качества стал меньше значения 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'); Обучение сети: 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 Выполним моделирование сети: 366 Нейронные сети. MATLAB 6 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. Квазиньютоновы алгоритмы обучения Алгоритм обучения BFGS TRAINBFG Синтаксис: [net,TR,Ac,El] = trainbfg(NET,Pd,Tl,Ai,Q,TS,VV,TV) info = trainbfg(code) Описание: Функция trainbfg обучает нейронную сеть, используя квазиньютонов алгоритм Бройдена, Флетчера, Гольдфарба и Шано (BFGS). Функция при своей работе использует следующие параметры: info = trainbfg('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 Применение функции: Функция обучения trainbfg используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: установить свойство сети net.trainFcn равным 'trainbfg'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. 11. Формирование моделей нейронных сетей 367 Алгоритм: Функция trainbfg выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с квазиньютоновым алгоритмом BFGS вектор настраиваемых переменных получает следующие приращения: X = X + a*dX, где dX – направление поиска; параметр a выбирается так, чтобы минимизировать критерий качества обучения в направлении поиска. Функция одномерного поиска searchFcn используется для вычисления минимума. Начальное направление поиска задается вектором, противоположным градиенту критерия качества. При успешных итерациях направление поиска определяется на основе нового значения градиента и с учетом приближенного значения гессиана согласно формуле[13] dX = –H\gX, где gX – вектор градиента; H – приближенная оценка гессиана. Обучение прекращается, когда выполнено одно из следующих условий: значение функции качества стало меньше предельного; градиент критерия качества стал меньше значения min_grad; достигнуто предельное число циклов обучения; превышено максимальное время, отпущенное на обучение; ошибка контрольного подмножества превысила ошибку обучающего более чем в max_fail раз. Пример: Заданы следующие обучающие последовательности входов 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. 368 Нейронные сети. MATLAB 6 Рис. 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. Алгоритм обучения 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, а также при формировании сетей с атрибутами, определяемыми пользователем. 11. Формирование моделей нейронных сетей 369 Для того чтобы подготовить сеть к обучению, необходимо: установить свойство сети net.trainFcn равным 'trainoss'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция trainbfg выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. Для вычисления производных критерия качества обучения по переменным веса и смещения используется метод обратного распространения ошибки. В соответствии с квазиньютоновым алгоритмом BFGS вектор настраиваемых переменных получает следующие приращения: X = X + a*dX, где dX – направление поиска; параметр a выбирается так, чтобы минимизировать критерий качества обучения в направлении поиска. Функция одномерного поиска searchFcn используется для вычисления минимума. Начальное направление поиска задается вектором, противоположным градиенту критерия качества. При успешных итерациях направление поиска определяется на основе нового значения градиента и значений градиентов на предыдущих шагах согласно формуле [1] 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. 370 Нейронные сети. MATLAB 6 Формирование сети: 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-м цикле обучения. Выполним моделирование сети: 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')' 11. Формирование моделей нейронных сетей 371 info = epochs: show: goal: time: min_grad: max_fail: 100 25 0 Inf 1.0e–006 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 по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция 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, тем меньше требования к памяти, но время вычислений существенно увеличивается. Обучение прекращается, когда выполнено одно из следующих условий: 372 Нейронные сети. 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. Для обучения сети применим функцию trainlm. Формирование сети: net = newff([0 5],[2 1],{'tansig','logsig'},'trainlm'); Обучение сети: net.trainParam.epochs = 50; net.trainParam.show = 10; 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: [114 double] vperf: [114 double] tperf: [114 double] mu: [114 double] На рис. 11.57 показано, как изменяется точность в процессе обучения; требуемое значение обеспечивается на 13-м цикле обучения. 11. Формирование моделей нейронных сетей 373 Рис. 11.57 Данный алгоритм имеет адаптивный параметр mu, изменение которого показано на рис. 11.58. Рис. 11.58 Из анализа этого рисунка следует, что на первых трех циклах обучения фактически реализуется градиентный метод, а затем метод Ньютона с аппроксимацией гессиана. Выполним моделирование сети: Y = sim(net,P) Y = 0.0012 0.0012 0.0049 0.9889 0.9897 0.9897 Требуемое соответствие между входом и выходом нейронной сети обеспечивается с заданной среднеквадратичной погрешностью, равной 0.0001. Сопутствующие функции: NEWFF, NEWCF, TRAINGD, TRAINGDM, TRAINGDA, TRAINGDX. 374 Нейронные сети. MATLAB 6 Алгоритм обучения BR TRAINBR Синтаксис: [net,TR,Ac,El] = trainbr(net,Pd,Tl,Ai,Q,TS,VV) info = trainbr(code) Описание: Функция trainbr обучает нейронную сеть, используя алгоритм Левенберга – Марквардта, дополненный регуляризацией по Байесу BR. Такие сети находят широкое применение при решении задач аппроксимации нелинейных зависимостей. Функция при своей работе использует следующие параметры: info = trainbr('pdefaults')' info = epochs: 100 show: 25 goal: 0 time: Inf min_grad: 1.0e–006 max_fail: 5 mem_reduc: mu: mu_dec: mu_inc: mu_max: 1 0.005 0.1 10 1.0e+010 Применение функции: Функция обучения trainbr используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к обучению, необходимо: установить свойство сети net.trainFcn равным 'trainbr'. Это автоматически установит значения параметров обучения, соответствующие значениям свойства net.trainParam по умолчанию. Для того чтобы фактически обучить сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train. Алгоритм: Функция trainbr выполняет процедуру обучения, если функции взвешивания, накопления и активации имеют производные. В отличие от всех ранее описанных процедур эта функция использует метод регуляризации, что позволяет успешно справиться с проблемой переобучения. Для этого осуществляется минимизация комбинированного функционала качества обучения, который учитывает не только сумму квадратов ошибок обучения, но квадраты весов. Эта стратегия регуляризации, называемая регуляризацией по методу Байеса, подробно рассмотрена в работах [11, 23]. При реализации функции trainbr эта стратегия встроена в алгоритм Левенберга – Марквардта. 11. Формирование моделей нейронных сетей 375 Для вычисления якобиана функционала качества по переменным веса и смещения используется метод обратного распространения ошибки. Каждая настраиваемая переменная корректируется в соответствии с методом Левенберга – Марквардта: 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 = [–1:.05:1]; T = sin(2*pi*P) + 0.1*randn(size(P)); Сформируем для решения этой задачи двухслойную нейронную сеть прямой передачи сигнала. Вход сети принимает значения в диапазоне от –1 до 1. Первый слой имеет 20 нейронов с функцией активации tansig, второй слой имеет 1 нейрон с функцией активации purelin. В качестве обучающей используем функцию trainbr. Формирование сети: net = newff([–1 1],[20,1],{'tansig','purelin'},'trainbr'); Обучение сети (рис. 11.59): net.trainParam.epochs = 50; net.trainParam.show = 10; net = train(net,P,T); % Рис.11.59 376 Нейронные сети. MATLAB 6 Рис. 11.59 Количество настраиваемых параметров на 50 циклах обучения стабилизировалось и равно 15. Выполним моделирование сети и построим графики исследуемых функций. Y = sim(net,P); plot(P,Y,P,T,'+') % Рис.11.60 Рис. 11.60 Из анализа рис. 11.60 следует, что выход сети сглаживает входные данные и обеспечивает оптимальную структуру сети по числу настраиваемых параметров, не допуская в ней явления переобучения. Сопутствующие функции: NEWFF, NEWCF, TRAINGDM, TRAINGDA, TRAINGDX, TRAINLM, TRAINRP, TRAINCGF, TRAINCGB, TRAINSCG, TRAINCGP, TRAINOSS. 11.5.1. Функции оценки качества обучения Процесс обучения нейронных сетей связан с такой настройкой ее весов и смещений, чтобы минимизировать некоторый функционал, зависящий от ошибок сети, т. е. разности 11. Формирование моделей нейронных сетей 377 между желаемым и реальным сигналами на ее выходе. В качестве таких функционалов в ППП NNT используются: сумма квадратов ошибок N SSE ei2 ; (11.6) i 1 средняя квадратичная ошибка MSE 1 N 2; ei N i 1 (11.7) комбинированная ошибка pp N 2 1 pp n 2 ; MSEREG xj ei n N i 1 j 1 средняя абсолютная ошибка MAE (11.8) 1 N | e | . N i 1 (11.9) Для вычисления этих функционалов качества и предназначены соответствующие функции пакета, рассматриваемые ниже. Все эти функции и их производные имеют одинаковый формат вызова perf = <имя_функции>(E,X,pp) perf = <имя_функции>(E,net,pp) dPerf_dE = d<имя_функции>('e',E,X,perf,pp) dPerf_dX = d<имя_функции>('x',E,X,perf,pp) Входные аргументы: E – матрица или массив ячеек вектора ошибки; X – вектор весов и смещений; pp – параметр функционала; net – нейронная сеть в виде объекта network object; 'e', 'x' – аргументы операции дифференцирования; perf – критерий качества обучения. Выходные аргументы: perf – критерий качества обучения; dPerf_dE – производная критерия качества по вектору ошибки; dPerf_dX – производная критерия качества по вектору параметров. Входной аргумент E может иметь 2 формата: cell array и double array. В формате cell array массив E имеет следующие размеры: E – массив ячеек размера NtTS, каждый элемент которого E{i, ts} – числовой массив размера ViQ, где Nt – количество целевых выходов; TS – число шагов по времени; Q – количество реализаций для фиксированного момента времени; Vi – количество элементов i-го вектора цели. В формате double array Nt числовых массивов E размера ViQ преобразуются в единственный числовой массив размера Nt V i 1 378 i Q. Нейронные сети. MATLAB 6 Кроме того, все функции возвращают информацию о параметрах функции критерия качества, если используется следующий формат вызова: info = <имя_функции>(code). В зависимости от значения аргумента code возвращается следующая информация: 'name' – полное название функции критерия качества; 'deriv' – имя производной функции критерия качества; 'pnames' – имена параметров функции критерия качества; 'pdefaults' – значения параметров функции критерия качества, принимаемые по умолчанию. Критерий суммы квадратов ошибок SSE, DSSE Синтаксис: perf = sse(E,X,pp) perf = sse(E,net,pp) info = sse(code) dPerf_dE = dsse('e',E,X,perf,pp) dPerf_dX = dsse('x',E,X,perf,pp) Описание: Функции perf = sse(E, X, pp) и perf = sse(E, net, pp) вычисляют критерий качества обучения в виде сумм квадратов ошибок по формуле (11.6). Функции dPerf_dE = dsse('e', E, X, perf, pp) и dPerf_dX = dsse('x', E, X, perf, pp) вычисляют градиенты функционала качества по векторам ошибки, а также весов и смещений. Применение функции: Для того чтобы использовать функцию критерия качества sse, необходимо установить свойство net.performFcn равным 'sse'. Это автоматически установит значения параметра net.performParam равными пустому массиву [ ], поскольку данная функция не имеет таких параметров. Примеры: Получим информацию о данной функции и ее производной: sse('name'), sse('deriv'), ans = Sum squared error ans = dsse ans = {} sse('pnames') Сформируем двухслойную нейронную сеть прямой передачи с одноэлементным входом, изменяющимся в диапазоне [–10 10], которая имеет 4 скрытых нейрона с функцией активации tansig и 1 нейрон на выходе с функцией активации purelin: net = newff([–10 10],[4 1],{'tansig','purelin'}); Зададим векторы входа и целей: P = [–10 –5 0 5 10]; T = [ 0 0 1 1 1]; Промоделируем исходную нейронную сеть и вычислим ее ошибку: Y = sim(net, P); 11. Формирование моделей нейронных сетей 379 E = T–Y E = –0.4714 –1.4040 –0.2399 0.6419 0.0049 Вычислим функционал качества sse: net.performFcn = 'sse'; perf = sse(E) perf = 2.6629 Теперь вычислим градиенты функционала качества. Градиент функционала по вектору ошибки вычисляется следующим образом: dPerf_dE = dsse('e',E,X) dPerf_dE = –0.9427 –2.8079 –0.4798 1.2837 0.0097 Для вычислений градиента функционала по вектору настраиваемых параметров сформируем этот вектор, который объединяет веса и смещения сети: X = [net.IW{1}; net.b{1}]' X = 0.5600 –0.5600 0.5600 –0.5600 –5.6000 1.8667 1.8667 –5.6000 Градиент функционала по вектору параметров dPerf_dX = dsse('x',E,X) dPerf_dX= 0 0 0 0 0 0 Этот градиент равен нулевому вектору, поскольку функционал качества не зависит явным образом от параметров сети. MSE, DMSE Критерий средней квадратичной ошибки Синтаксис: perf = mse(E,X,pp) perf = mse(E,net,pp) info = mse(code) dPerf_dE = dmse('e',E,X,perf,pp) dPerf_dX = dmse('x',E,X,perf,pp) Описание: Функции perf = mse(E, X, pp) и perf = mse(E, net, pp) вычисляют критерий качества обучения в виде средней суммы квадратов ошибок по формуле (11.7). Функции dPerf_dE = dmse('e', E, X, perf, pp) и dPerf_dX = dmse('x', E, X, perf, pp) вычисляют градиенты функционала качества по векторам ошибки, а также весов и смещений. Применение функции: Функция критерия качества mse используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы использовать функцию критерия качества mse, необходимо установить свойство net.performFcn равным 'mse'. Это автоматически установит значения параметра net.performParam равными пустому массиву [ ], поскольку данная функция не имеет таких параметров. Пример: Получим информацию о данной функции и ее производной: 380 Нейронные сети. MATLAB 6 mse('name'), mse('deriv'), mse('pnames') ans = Mean squared error ans = dmse ans = {} Сформируем двухслойную нейронную сеть прямой передачи с одноэлементным входом, изменяющимся в диапазоне [–10 10], которая имеет 4 скрытых нейрона с функцией активации tansig и 1 нейрон на выходе с функцией активации purelin: net = newff([–10 10],[4 1],{'tansig','purelin'}); Зададим векторы входа и целей: P = [–10 –5 0 5 10]; T = [ 0 0 1 1 1]; Промоделируем исходную нейронную сеть и вычислим ее ошибку: Y = sim(net, P); E = T–Y E = –0.4714 –1.4040 –0.2399 0.6419 0.0049 Вычислим функционал качества mse: net.performFcn = 'mse'; perf = mse(E) perf = 0.5326 Теперь вычислим градиенты функционала качества. Градиент функционала по вектору ошибки вычисляется следующим образом: dPerf_dE = dmse('e',E,X) dPerf_dE = –0.1885 –0.5616 –0.0960 0.2567 0.0019 Для вычислений градиента функционала по вектору настраиваемых параметров сформируем этот вектор, который объединяет веса и смещения сети: X = [net.IW{1}; net.b{1}]' X = 0.5600 –0.5600 0.5600 –0.5600 –5.6000 1.8667 1.8667 –5.6000 Градиент функционала по вектору параметров dPerf_dX = dmse('x',E,X) dPerf_dX= 0 0 0 0 0 0 Этот градиент равен нулевому вектору, поскольку функционал качества не зависит явным образом от параметров сети. Сопутствующие функции: MSEREG, MAE. MSEREG, DMSEREG Комбинированный критерий качества Синтаксис: perf = mse(E,X,pp) perf = mse(E,net,pp) info = mse(code) dPerf_dE = dmsereg('e',E,X,perf,PP) dPerf_dX = dmsereg('x',E,X,perf,PP) 11. Формирование моделей нейронных сетей 381 Описание: Функции perf = msereg(E, X, pp) и perf = msereg(E, net, pp) вычисляют комбинированный критерий качества обучения по формуле (11.8). Функции dPerf_dE = dmsereg('e', E, X, perf, pp) и dPerf_dX = dmsereg('x', E, X, perf, pp) вычисляют градиенты функционала качества по векторам ошибки, а также весов и смещений. Применение функции: Функция критерия качества msereg используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы использовать функцию критерия качества msereg, необходимо установить свойство net.performFcn равным 'msereg'. Это автоматически установит значения параметра net.performParam равными значениям по умолчанию. Пример: Получим информацию о данной функции и ее производной: msereg('name'), msereg('deriv'), msereg('pnames'), msereg('pdefaults') ans = Mean squared error with regularization ans = dmsereg ans = 'ratio' ans = ratio: 0.9000 Это единственный функционал качества, который состоит из двух слагаемых: среднеквадратичной ошибки с весом ratio и штрафной функции, оцениваемой суммой квадратов весов и смещений с весом 1–ratio. Сформируем двухслойную нейронную сеть прямой передачи с одноэлементным входом, изменяющимся в диапазоне [–10 10], которая имеет 4 скрытых нейрона с функцией активации tansig и 1 нейрон на выходе с функцией активации purelin: net = newff([–10 10],[4 1],{'tansig','purelin'}); Зададим векторы входа и целей: P = [–10 –5 0 5 10]; T = [ 0 0 1 1 1]; Промоделируем исходную нейронную сеть и вычислим ее ошибку: Y = sim(net, P); E = T–Y E = –0.4714 –1.4040 –0.2399 0.6419 0.0049 Вычислим функционал качества msereg: net.performFcn = 'msereg'; net.performParam.ratio = 0.9; perf = msereg(E,net) perf = 0.5326 Теперь вычислим градиенты функционала качества. Градиент функционала по вектору ошибки вычисляется следующим образом: dPerf_dE = dmsereg('e',E,X) dPerf_dE = –0.1885 –0.5616 382 –0.0960 0.2567 0.0019 Нейронные сети. MATLAB 6 Для вычислений градиента функционала по вектору настраиваемых параметров сформируем этот вектор, который объединяет веса и смещения сети: X = [net.IW{1}; net.b{1}]' X = 0.5600 –0.5600 0.5600 –0.5600 –5.6000 1.8667 1.8667 –5.6000 Градиент функционала по вектору параметров dPerf_dX = dmsereg('x',E,X,perf,net.performParam) dPerf_dX = –0.0140 0.0140 –0.0140 0.0140 0.1400 –0.0467 –0.0467 0.1400 Этот градиент не равен нулевому вектору, поскольку функционал качества зависит явным образом от параметров сети. Сопутствующие функции: MSE, MAE. MAE, DMAE Критерий средней абсолютной ошибки Синтаксис: perf = mae(E,X,pp) perf = mae(E,net,pp) info = mae(code) dPerf_dE = dmae('e',E,X,perf,pp) dPerf_dX = dmae('x',E,X,perf,pp) Описание: Функции perf = mae(E, X, pp) и perf = mae(E, net, pp) вычисляют критерий качества обучения в виде средней суммы абсолютных ошибок по формуле (11.9). Функции dPerf_dE = dmae('e', E, X, perf, pp) и dPerf_dX = dmae('x', E, X, perf, pp) вычисляют градиенты функционала качества по векторам ошибки, а также весов и смещений. Применение функции: Функция критерия качества mae используется при создании сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы использовать функцию критерия качества mae, необходимо установить свойство net.performFcn равным 'mae'. Это автоматически установит значения параметра net.performParam равными пустому массиву [ ], поскольку данная функция не имеет таких параметров. Пример: Получим информацию о данной функции и ее производной: mae('name'), mae('deriv'), mae('pnames') ans = Mean absolute error ans = dmae ans = {} Сформируем двухслойную нейронную сеть прямой передачи с одноэлементным входом, изменяющимся в диапазоне [–10 10], которая имеет 4 скрытых нейрона с функцией активации tansig и 1 нейрон на выходе с функцией активации purelin: net = newff([–10 10],[4 1],{'tansig','purelin'}); 11. Формирование моделей нейронных сетей 383 Зададим векторы входа и целей: P = [–10 –5 0 5 10]; T = [ 0 0 1 1 1]; Промоделируем исходную нейронную сеть и вычислим ее ошибку: Y = sim(net, P); E = T–Y E = –0.4714 –1.4040 –0.2399 0.6419 0.0049 Вычислим функционал качества mae: net.performFcn = 'mae'; perf = mae(E) perf = 0.5524 Теперь вычислим градиенты функционала качества. Градиент функционала по вектору ошибки вычисляется следующим образом: dPerf_dE = dmae('e',{E},X); [dPerf_dE{:}] ans = –1 –1 –1 1 1 Для вычислений градиента функционала по вектору настраиваемых параметров сформируем вектор, который объединяет веса и смещения сети: X = [net.IW{1}; net.b{1}]' X = 0.5600 –0.5600 0.5600 –0.5600 –5.6000 1.8667 1.8667 –5.6000 Градиент функционала по вектору параметров dPerf_dX = dmae('x',{E},{X}) dPerf_dX = 0 Сопутствующие функции: MSE, MSEREG. 11.6. Функции настройки параметров Функции настройки параметров нейронной сети предназначены для вычисления приращений весов и смещений при обучении или адаптации сети. Входные и выходные аргументы для всех функций настройки параметров одинаковы и приведены в начале данного раздела. Входные аргументы: W – матрица весов размера SR; b – вектор смещений размера S1; P – вектор из единиц размера 1Q; Z – взвешенный вектор входа размера SQ; N – матрица векторов входа нейрона размера SQ; A – векторы выхода размера SQ; T – векторы целей слоя размера SQ; E – векторы ошибок слоя размера SQ; gW – градиент функционала по настраиваемым параметрам размера SQ; gA – градиент функционала по выходу сети размера SQ; 384 Нейронные сети. MATLAB 6 D – матрица расстояний между нейронами размера SS; LP – параметры процедуры настройки, при их отсутствии LP = [ ]; ls – начальный вектор настраиваемых параметров (по умолчанию пустой массив). Выходные аргументы: dW – матрица приращений весов размера SR; db – вектор приращений смещений размера S1; LS – новый вектор настраиваемых параметров. Кроме того, все функции возвращают информацию о параметрах функций настройки, если используется следующий формат вызова: info = <имя_функции>(code). В зависимости от значения аргумента code возвращается следующая информация: 'pnames' – имена параметров процедуры настройки; 'pdefaults' – значения параметров процедуры настройки, принимаемые по умолчанию; 'needg' – возвращается 1, если процедура использовала значения градиентов gW или gA. LEARNP Функция настройки параметров персептрона Синтаксис: [dW,LS] = learnp(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) [db,LS] = learnp(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,ls) info = learnp (code) Описание: Функция learnp предназначена для настройки весов и смещений персептрона. Эта функция не имеет параметров настройки. Применение функции: Функция настройки параметров сети learnp используется при создании сетей с помощью метода newp, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainb'. Это автоматически установит значения параметров обучения, соответствующие функции trainb; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn, net.biases{i}.learnFcn равными 'learnp'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения; применить функцию train или adapt. 11. Формирование моделей нейронных сетей 385 Пример: Определим сеть со случайными векторами входа p и ошибки e: p = rand(2,1); e = rand(3,1); Вызов функции learnp можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnp([],p,[],[],[],[],e,[],[],[],[],[]) dW = 0.5766 0.1403 0.4617 0.1123 0.8468 0.2060 Алгоритм: Функция learnp рассчитывает приращения весов dW в соответствии со следующим обучающим правилом персептрона [Ros]: p' , e 1; dw 0, e 0; p' , e 1. Эти выражения можно представить в следующей обобщенной форме: dw e *p' . Сопутствующие функции: LEARNPN LEARNPN, NEWP, ADAPTWB, TRAINWB, ADAPT, TRAIN. Нормированная функция настройки параметров персептрона Синтаксис: [dW,LS] = learnpn(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) [db,LS] = learnp(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,ls) info = learnpn (code) Описание: Функция learnpn предназначена для настройки весов и смещений персептрона. Эта функция не имеет параметров настройки. Применение функции: Функция настройки параметров сети learnpn используется при создании сетей с помощью метода newp, а также при формировании сетей с атрибутами, определяемыми пользователем. 386 Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainb'. Это автоматически установит значения параметров обучения, соответствующие функции trainb; Нейронные сети. MATLAB 6 установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn, net.biases{i}.learnFcn равными 'learnpn'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Пример: Определим сеть со случайными векторами входа p и ошибки e: p = rand(2,1); e = rand(3,1); Вызов функции learnpn можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnpn([],p,[],[],[],[],e,[],[],[],[],[]) dW = 0.4122 0.1003 0.3301 0.0803 0.6055 0.1473 Алгоритм: Функция learnpn рассчитывает приращения весов dW в соответствии со следующим обучающим правилом: pn p /(sqrt (1 p(1)^2 ... p( R)^2); pn ' , e 1; dw 0, e 0; pn ' , e 1. Эти выражения можно представить в обобщенной форме: dw e *pn ' . Сопутствующие функции: LEARNP, NEWP, ADAPT, TRAIN. LEARNWH Функция настройки методом Видроу – Хоффа Синтаксис: [dW,LS] = learnwh(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) [db,LS] = learnwh(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,ls) info = learnwh (code) 11. Формирование моделей нейронных сетей 387 Описание: Функция leanrwh предназначена для настройки параметров нейронных сетей по методу Видроу – Хоффа. Параметры процедуры learnwh представлены в следующей таблице. Параметр LP.lr Назначение Скорость настройки, по умолчанию 0.01 Применение функции: Функция настройки параметров сети learnwh используется при создании линейных нейронных сетей с помощью метода newlin, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainb'. Это автоматически установит значения параметров обучения, соответствующие функции trainb; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn, net.biases{i}.learnFcn равными 'learnwh'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Пример: Определим сеть со случайными векторами входа p и ошибки e с двухэлементным входом и тремя нейронами и параметром скорости настройки lr: p = rand(2,1); e = rand(3,1); lp.lr = 0.5; Вызов функции learnwh можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnwh([],p,[],[],[],[],e,[],[],[],lp,[]) dW = 0.2883 0.0701 0.2309 0.0562 0.4234 0.1030 388 Нейронные сети. MATLAB 6 Алгоритм: Функция learnwh рассчитывает приращения весов dW в соответствии с обучающим правилом Видроу – Хоффа [44, 45] в зависимости от нормированного вектора входа pn, ошибки e и параметра скорости настройки lr: pn p /(sqrt (1 p(1)^2 ... p( R)^2); dw lr * e * pn '. Сопутствующие функции: MAXLINLR, NEWLIN, ADAPT, TRAIN. LEARNGD Функция настройки методом градиентного спуска Синтаксис: [dW,LS] = learngd(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) [db,LS] = learngd(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,ls) info = learngd(code) Описание: Функция learngd предназначена для настройки весов и смещений сети методом градиентного спуска. Параметры процедуры learngd представлены в следующей таблице. Параметр LP.lr Назначение Скорость настройки, по умолчанию 0.01 Применение функции: Функция настройки параметров сети learngd используется при создании линейных нейронных сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn, net.biases{i}.learnFcn равными 'learngd'. Для того чтобы фактически адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам адаптации; применить функцию adapt. Пример: Допустим, что на некотором шаге настройки слоя с тремя нейронами и двухэлементным входом известен случайный вектор градиента gW, а параметр скорости настройки задан равным 0.5: gW = rand(3,2); 11. Формирование моделей нейронных сетей 389 lp.lr = 0.5; Тогда вызов функции learngd можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learngd([],[],[],[],[],[],[],gW,[],[],lp,[]) dW = 0.4751 0.2430 0.1156 0.4456 0.3034 0.3810 Алгоритм: Функция learngd рассчитывает приращение веса dW в зависимости от градиента функционала качества по вектору весов gW и параметра скорости настройки lr в соответствии с методом градиентного спуска: dW = lr*gW. Сопутствующие функции: LEARNGDM, NEWFF, NEWCF, ADAPT, TRAIN. LEARNGDM Функция настройки методом градиентного спуска с возмущением Синтаксис: [dW,LS] = learngdm(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) [db,LS] = learngdm(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,ls) info = learngdm(code) Описание: Функция learngdm предназначена для расчета приращений весов и смещений нейронной сети методом градиентного спуска c возмущением. Параметры процедуры learngdm представлены в следующей таблице. Параметр LP.lr LP.mc Назначение Скорость настройки, по умолчанию 0.01 Параметр возмущения, по умолчанию 0.9 Применение функции: Функция настройки параметров сети learngdm используется при создании линейных нейронных сетей с помощью методов newff, newcf, newelm, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn, net.biases{i}.learnFcn равными 'learngdm'. Для того чтобы фактически адаптировать сеть, необходимо: 390 Нейронные сети. MATLAB 6 инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам адаптации; применить функцию adapt. Пример: Допустим, что на некотором шаге настройки слоя с тремя нейронами и двухэлементным входом известен случайный вектор градиента gW, а параметры скорости настройки и возмущения заданы равными 0.6 и 0.8 соответственно: gW = rand(3,2); lp.lr = 0.6; lp.mc = 0.8; Тогда вызов функции learngdm можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: ls = []; [dW,ls] = learngdm([],[],[],[],[],[],[],gW,[],[],lp,ls) dW = 0.2739 0.2668 0.0111 0.3693 0.4928 0.4752 ls = dw: [32 double] ls.dw ans = 0.2739 0.2668 0.0111 0.3693 0.4928 0.4752 Функция learngdm возвращает матрицу приращения весов и сохраняет эту матрицу для следующего шага настройки. Алгоритм: Функция learngdm рассчитывает приращение веса dW в зависимости от градиента функционала качества gW по вектору весов, параметров скорости настройки lr и возмущения mc в соответствии с методом градиентного спуска с возмущением: dW = mc*dWprev + (1–mc)*lr*gW. Предыдущее приращение веса dWprev считывается из переменной ls.dw. Сопутствующие функции: LEARNGD, NEWFF, NEWCF, ADAPT, TRAIN. LEARNLV1 Функция настройки весов LVQ-сети по правилу LVQ1 Синтаксис: [dW,LS] = learnlv1(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) info = learnlv1(code) 11. Формирование моделей нейронных сетей 391 Описание: Функция learnlv1 предназначена для настройки весов LVQ-сети по правилу LVQ1. Параметры процедуры learnlv1 представлены в следующей таблице. Параметр LP.lr Назначение Скорость настройки, по умолчанию 0.01 Применение функции: Функция настройки параметров сети learnlv1 используется при создании линейных нейронных сетей с помощью метода newlvq, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainr'. Это автоматически установит значения параметров обучения, соответствующие функции trainr; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn равными 'learnlv1'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Пример: Определим слой нейронной сети с двухэлементным входом и тремя нейронами со случайными массивами входа p, весов w и выхода a; зададим также градиент функционала по выходу gA и параметр скорости настройки lr: p = rand(2,1); w = rand(3,2); a = compet(negdist(w,p)); gA = [–1;1;1]; lp.lr = 0.5; Вызов функции learnlv1 можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnlv1(w,p,[],[],a,[],[],[],gA,[],lp,[]) dW = 0 0 0 0 –0.0294 –0.1063 392 Нейронные сети. MATLAB 6 Алгоритм: Функция learnlv1 рассчитывает приращение весов dW в зависимости от градиента функционала качества gW по вектору выхода и параметра скорости настройки lr в соответствии с правилом LVQ1, но только для тех нейронов, выход которых a(i) равен 1: lr * (p w(i,:), gA(i) 0; dw (i,:) lr * (p w(i,:), gA(i) 1. Сопутствующие функции: LEARNLV2, ADAPT, TRAIN. LEARNLV2 Функция настройки весов LVQ-сети по правилу LVQ2 Синтаксис: [dW,LS] = learnlv2(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) info = learnlv2 (code) Описание: Функция learnlv2 предназначена для настройки весов LVQ-сети по правилу LVQ2. Параметры процедуры learnlv2 представлены в следующей таблице. Параметр LP.lr LP.window Назначение Скорость настройки, по умолчанию 0.01 Параметр окна, по умолчанию 0.25 Применение функции: Функция настройки параметров сети learnlv2 используется при создании линейных нейронных сетей с помощью метода newlvq, а также при формировании сетей с атрибутами, определяемыми пользователем. Эта функция применяется только после того, как сеть настроена с помощью правила LVQ1. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainr'. Это автоматически установит значения параметров обучения, соответствующие функции trainr; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn равными 'learnlv2'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. 11. Формирование моделей нейронных сетей 393 Пример: Определим слой нейронной сети с двухэлементным входом и тремя нейронами со случайными массивами входа p, весов w и выхода a; зададим также градиент функционала по выходу gA и параметр скорости настройки lr: p = rand(2,1); w = rand(3,2); n = negdist(w,p); a = compet(n); gA = [–1;1;1]; lp.lr = 0.5; lp.window = 0.25; Вызов функции learnlv2 можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnlv2(w,p,[],n,a,[],[],[],gA,[],lp,[]) dW = 0 0 0 0 0 0 Алгоритм: Функция learnlv2 рассчитывает приращение весов dW в зависимости от градиента функционала качества gW по вектору выхода и параметра скорости настройки lr в соответствии с правилом LVQ2.1 [24]. Это правило реализует следующую процедуру. Необходимо выбрать нейрон k1 в качестве победителя и нейрон k2 в качестве проигравшего. Если один из них принадлежит к требуемому классу, а другой – нет, то первому присваивается индекс j, а второму – индекс i. Затем вычисляется расстояние di вектора входа до нейрона ki и dj до нейрона kj. Если выполняется условие d dj 1 window , min( i , ) d j di 1 window то нейрон kj приближается, а нейрон ki удаляется от вектора входа согласно следующим соотношениям: dw (i, :) lr * (p'w (i, :)); dw (i, :) lr * (p'w (i, :)). Сопутствующие функции: LEARNLV1, ADAPT, TRAIN. LEARNK Функция настройки весов для слоя Кохонена Синтаксис: [dW,LS] = learnk(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) info = learnk(code) 394 Нейронные сети. MATLAB 6 Описание: Функция learnk предназначена для настройки весов слоя Кохонена. Параметры процедуры learnk представлены в следующей таблице. Параметр LP.lr Назначение Скорость настройки, по умолчанию 0.01 Применение функции: Функция настройки параметров сети learnk используется при создании слоев Кохонена с помощью метода newc, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainr'. Это автоматически установит значения параметров обучения, соответствующие функции trainr; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn равными 'learnk'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Пример: Определим слой Кохонена сети с двухэлементным входом и тремя нейронами со случайными массивами входа p, весов w и выхода a; зададим также параметр скорости настройки lr: p = rand(2,1); a = rand(3,1); w = rand(3,2); lp.lr = 0.5; Вызов функции learnk можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnk(w,p,[],[],a,[],[],[],[],[],lp,[]) dW = 0.0940 –0.2951 0.2468 –0.1068 0.4658 –0.1921 11. Формирование моделей нейронных сетей 395 Алгоритм: Функция learnlv2 рассчитывает приращение весов dW в зависимости от градиента функционала качества gW по вектору выхода и параметра скорости настройки lr в соответствии с правилом LVQ2.1 [24]. Функция learnk рассчитывает приращение весов dW в зависимости от вектора входа p, выхода a, весов w и параметра скорости настройки lr в соответствии с правилом Кохонена [24]: lr * (p' w ), a 0; dw a 0. 0, Сопутствующие функции: LEARNIS, LEARNOS, ADAPT, TRAIN. LEARNCON Функция настройки смещений для слоя Кохонена Синтаксис: [db,LS] = learncon(b,P,Z,N,A,T,E,gW,gA,D,LP,ls) info = learncon(code) Описание: Функция learncon предназначена для настройки смещений слоя Кохонена по правилу справедливых смещений. Параметры процедуры learncon представлены в следующей таблице. Параметр LP.lr Назначение Скорость настройки, по умолчанию 0.001 Применение функции: Функция настройки параметров сети learncon используется при создании слоев Кохонена с помощью метода newc, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainr'. Это автоматически установит значения параметров обучения, соответствующие функции trainr; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.biases{i}.learnFcn равными 'learncon'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: 396 инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Нейронные сети. MATLAB 6 Пример: Определим слой Кохонена сети с двухэлементным входом и тремя нейронами со случайными массивами выхода a, вектора смещений b; зададим также параметр скорости настройки lr: a = rand(3,1); b = rand(3,1); lp.lr = 0.5; Вызов функции learnk можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: db = learncon(b,[],[],[],a,[],[],[],[],[],lp,[]) db = 0.1590 0.3076 0.5565 Алгоритм: Функция learncon реализует правило настройки с учетом нечувствительности части нейронов, называемых мертвыми; суть этого правила заключается в следующем. В начале процедуры настройки всем нейронам конкурирующего слоя присваивается одинаковый параметр активности с0 = 1/N, где N – количество нейронов в слое. В процессе настройки функция learncon корректирует этот параметр таким образом, чтобы его значения для активных нейронов становились больше, а для неактивных нейронов меньше согласно формуле ck = (1 – lr) * ck –1 + lr*a . М-функция learncon использует следующую формулу для расчета приращений вектора смещений: b exp(1 log(c)) b. Параметр скорости настройки lr по умолчанию равен 0.001, и его величина на порядок меньше соответствующего значения для функции learnk. Сопутствующие функции: LEARNK, LEARNOS, ADAPT, TRAIN. LEARNIS Функция настройки по вектору входа Синтаксис: [dW,LS] = learnis(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) info = learnis(code) Описание: Функция learnis предназначена для настройки весов слоя Кохонена по вектору входа (правило Гроссберга) и является альтернативой функции настройки learnk. Параметры процедуры learnis представлены в следующей таблице. Параметр LP.lr Назначение Скорость настройки, по умолчанию 0.5 11. Формирование моделей нейронных сетей 397 Применение функции: Функция настройки параметров сети learnis используется при создании слоев Кохонена с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainr'. Это автоматически установит значения параметров обучения, соответствующие функции trainr; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn равными 'learnis'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Пример: Определим слой Кохонена с двухэлементным входом и тремя нейронами со случайными массивами входа p, весов w и выхода a; зададим также параметр скорости настройки lr: p = rand(2,1); a = rand(3,1); w = rand(3,2); lp.lr = 0.5; Вызов функции learnis можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnis(w,p,[],[],a,[],[],[],[],[],lp,[]) dW = 0.0571 –0.1791 0.1200 –0.0519 0.4152 –0.1713 Алгоритм: Функция learnis рассчитывает изменение вектора весов dw для данного нейрона в зависимости от векторов входа p, выхода a, весов w и параметра скорости настройки lr в соответствии с правилом Гроссберга настройки по вектору входа [14]: dw = lr*a*(p' – w). Сопутствующие функции: LEARNK, LEARNOS, ADAPT, TRAIN. LEARNOS Функция настройки по вектору выхода Синтаксис: [dW,LS] = learnos(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) 398 Нейронные сети. MATLAB 6 info = learnos(code) Описание: Функция learnos предназначена для настройки весов слоя Кохонена по вектору выхода (правило Гроссберга) и является альтернативой функции настройки learnis. Параметры процедуры learnos представлены в следующей таблице. Параметр LP.lr Назначение Скорость настройки, по умолчанию 0.5 Применение функции: Функция настройки параметров сети learnos используется при создании слоев Кохонена с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainr'. Это автоматически установит значения параметров обучения, соответствующие функции trainr; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn равными 'learnos'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Пример: Определим слой Кохонена с двухэлементным входом и тремя нейронами со случайными массивами входа p, весов w и выхода a; зададим также параметр скорости настройки lr: p = rand(2,1); a = rand(3,1); w = rand(3,2); lp.lr = 0.5; Вызов функции learnos можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnos(w,p,[],[],a,[],[],[],[],[],lp,[]) dW = –0.0738 –0.0248 0.0140 0.0048 0.4146 0.0319 11. Формирование моделей нейронных сетей 399 Алгоритм: Функция learnos рассчитывает изменение весов dW для слоя Кохонена в зависимости от векторов входа p, выхода a, весов w и параметра скорости настройки lr в соответствии с правилом Гроссберга настройки по вектору выхода [14]: dw = lr * (a – w) * p'. Сопутствующие функции: LEARNIS, LEARNK, ADAPT, TRAIN. LEARNSOM Функция настройки весов карты Кохонена Синтаксис: [dW,LS] = learnsom(W,P,Z,N,A,T,E,gW,gA,D,LP,ls) info = learnsom (code) Описание: Функция leanrnsom предназначена для настройки весов карты Кохонена. Параметры процедуры learnos представлены в следующей таблице. Параметр Назначение LP.order_lr Скорость настройки на этапе упорядочения, по умолчанию 0.9 Число шагов на этапе упорядочения, по умолчанию 1000 Скорость настройки на этапе подстройки, по умолчанию 0.02 Размер окрестности нейрона-победителя, по умолчанию 1 LP.order_steps LP.tune_lr LP.tune_nd Применение функции: Функция настройки параметров сети leanrnsom используется при создании слоев Кохонена с помощью метода newsom, а также при формировании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainr'. Это автоматически установит значения параметров обучения, соответствующими функции trainr; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующими функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn равными 'leanrnsom'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: 400 инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Нейронные сети. MATLAB 6 Примеры: Определим карту Кохонена с расположением нейронов на гексагональной сетке размера 23, а также расстояния между ними; зададим случайные массивы входа p, выхода a и весов w, а также параметры процедуры настройки: p = rand(2,1); a = rand(6,1); w = rand(6,2); pos = hextop(2,3); d = linkdist(pos); lp.order_lr = 0.9; lp.order_steps = 1000; lp.tune_lr = 0.02; lp.tune_nd = 1; Вызов функции learnsom можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: ls = []; [dW,ls] = learnsom(w,p,[],[],a,[],[],[],[],d,lp,ls) dW = 0.2217 0.0945 0.8432 –0.2912 0.6194 –1.3035 0.2836 –1.2292 0.0469 –0.2965 0.3090 –0.9659 ls = step: 1 nd_max: 2 Алгоритм: Функция learnsom вычисляет приращения весов dW в зависимости от вектора входа p, массива параметров соседства A2 и параметра скорости настройки lr: dW lr * A2 * (p' w) Элементы массива параметров соседства А2 для нейронов, расположенных в окрестности нейрона-победителя i, вычисляются следующим образом: 1, a(i, q) 1; A2(i, q) 0.5, a( j, q) 1 & D(i, j ) nd ; 0, в остальных случаях, где a(i, q) – элемент выхода нейронной сети; D(i, j) – расстояние между нейронами i и j; nd – размер окрестности нейрона-победителя. Процесс обучения карты Кохонена включает 2 этапа: этап упорядочения и этап подстройки. На этих этапах корректируются параметр скорости настройки lr и размер 11. Формирование моделей нейронных сетей 401 окрестности nd. Параметр lr изменяется от значения order_lr до tune_lr, а размер окрестности nd – от максимального до значения, равного 1. Сопутствующие функции: ADAPT, TRAIN. LEARNН Функция настройки по правилу Хебба Синтаксис: [dW,LS] = learnh(W,P,Z,N,A,T,E,gW,gA,D,LP,LS) info = learnh(code) Описание: Функция learnh предназначена для расчета приращений весов нейронной сети по правилу Хебба. Параметры процедуры learnh представлены в следующей таблице. Параметр LP.lr Назначение Скорость настройки, по умолчанию 0.5 Применение функции: Функция настройки параметров сети learnh используется при создании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainr'. Это автоматически установит значения параметров обучения, соответствующие функции trainr; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn равными 'learnh'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Пример: Определим нейронную сеть с двухэлементным входом и тремя нейронами со случайными массивами входа p и выхода a; зададим также параметр скорости настройки lr: p = rand(2,1); a = rand(3,1); lp.lr = 0.5; 402 Нейронные сети. MATLAB 6 Вызов функции learnh можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnh([],p,[],[],a,[],[],[],[],[],lp,[]) dW = 0.2883 0.0701 0.2309 0.0562 0.4234 0.1030 Алгоритм: Функция learnh рассчитывает приращения весов dW в зависимости от векторов входа p, выхода a и параметра скорости настройки lr в соответствии с обучающим правилом Хебба [19]: dW = lr * a * p'. Сопутствующие функции: LEARNHD, ADAPT, TRAIN. MAXLINLR Максимальное значение параметра скорости настройки для линейной сети Синтаксис: lr = maxlinlr(P) lr = maxlinlr(P,'bias') Описание: Функция maxlinlr применяется для расчета максимального значения параметра скорости настройки для линейной сети. Функция lr = maxlinlr(P) возвращает максимальный параметр скорости настройки для линейной сети без смещения, которая обучается только по векторам, входящим в массив векторов входа P размера RQ. Функция lr = maxlinlr(P, 'bias') возвращает максимальный параметр скорости настройки для линейной сети со смещением. Пример: Зададим числовой массив входа, состоящий из четырех двухэлементных векторов, и вычислим максимальные значения параметра скорости настройки для линейной сети без смещения и со смещением: P = [ 1 2 –4 7; 0.1 3 10 6]; lr = maxlinlr(P) % Без смещения lr = 0.0069 lr = maxlinlr(P,'bias') % Со смещением lr = 0.0067 Сопутствующие функции: LEARNWH. LEARNНD Функция настройки по правилу Хебба с затуханием Синтаксис: [dW,LS] = learnhd(W,P,Z,N,A,T,E,gW,gA,D,LP,LS) 11. Формирование моделей нейронных сетей 403 info = learnhd(code) Описание: Функция learnhd предназначена для настройки весов нейронной сети по методу Хебба с затуханием. Параметры процедуры learnhd представлены в следующей таблице. Параметр LP.lr LP.dr Назначение Скорость настройки, по умолчанию 0.5 Параметр затухания, по умолчанию 0.01 Применение функции: Функция настройки параметров сети learnhd используется при создании сетей с атрибутами, определяемыми пользователем. Для того чтобы подготовить сеть к настройке, необходимо: установить свойство сети net.trainFcn равным 'trainr'. Это автоматически установит значения параметров обучения, соответствующие функции trainr; установить свойство сети net.adaptFcn равным 'trains'. Это автоматически установит значения параметров адаптации, соответствующие функции trains; установить свойства net.inputWeights{i,j}.learnFcn, net.layerWeights{i,j}.learnFcn равными 'learnhd'. Для того чтобы фактически обучить или адаптировать сеть, необходимо: инициализировать нейронную сеть; присвоить, если это необходимо, требуемые значения параметрам обучения или адаптации; применить функцию train или adapt. Пример: Определим сеть со случайными входом p, выходом a и весами w для слоя с двухэлементным входом и тремя нейронами; зададим также параметры скорости настройки lr и затухание dr. p = rand(2,1); a = rand(3,1); w = rand(3,2); lp.lr = 0.5; lp.dr = 0.05; Вызов функции learnhd можно организовать следующим образом, поскольку не все входные аргументы требуются для вызова этой функции: dW = learnhd(w,p,[],[],a,[],[],[],[],[],lp,[]) dW = –0.0237 –0.0327 0.2734 0.1787 0.1234 0.0812 404 Нейронные сети. MATLAB 6 Алгоритм: Функция learnhd рассчитывает приращения весов dW в зависимости от векторов входа p, выхода a, весов w, а также параметра скорости настройки lr и параметра затухания dr в соответствии с обучающим правилом Хебба c затуханием [19]: dW = lr * a * (p'–w) – dr * w. Сопутствующие функции: LEARNH, ADAPT, TRAIN. 11.6.1. Функции одномерного поиска Функции поиска одномерного экстремума используются при расчете весов и смещений в процессе обучения с применением методов сопряженного градиента и квазиньютоновых методов. Рассмотренные алгоритмы обучения и настройки – это стратегии, которые обеспечивают минимизацию некоторого функционала качества. В процессе работы этих алгоритмов, как правило, возникает задача одномерного поиска минимума вдоль заданного направления. Это могут быть направления антиградиента или сопряженные направления. В рамках ППП Neural Network Toolbox используется 5 функций одномерного поиска. При работе того или иного алгоритма они задаются параметром srchFcn, который определяет имя функции поиска. Для многих процедур эта функция задается по умолчанию, но она может быть изменена по желанию пользователя при определении процедуры обучения или функции настройки. Аргументы входов и выходов для всех функций одномерного поиска одинаковы и имеют следующие значения. Входные аргументы: net – нейронная сеть; X – вектор текущих параметров сети; Pd – векторы входа с учетом запаздывания; Tl – векторы целей для слоя; Ai – начальные значения на ЛЗ; Q – количество реализаций векторов входа; TS – шаг по времени; dX – вектор приращений настраиваемых параметров; gX – вектор градиента функционала по настраиваемым параметрам; perf – значение функционала качества для текущего вектора настраиваемых параметров X; dperf – производная функционала качества в текущей точке X в направлении dX; delta – начальный размер шага; tol – допустимая точность поиска экстремума; ch_perf – изменение значения функционала качества на предшествующем шаге. Выходные аргументы: A – размер шага, доставляющий минимум функционалу качества; gX – градиент в точке минимума; perf – значение функционала качества в точке минимума; 11. Формирование моделей нейронных сетей 405 retcode – трехэлементный код завершения. Первые 2 элемента определяют, сколько вычислений функции потребовалось на каждом из двух этапов минимизации; третий элемент – код возврата, который фиксирует следующие события: Код возврата Событие Нормальное завершение Использован минимальный шаг Использован максимальный шаг Условие выбора шага не выполнено 0 1 2 3 delta – новое значение шага поиска; tol – обновленная допустимая точность при поиске. Используемые массивы имеют следующие размеры: Pd – массив ячеек размера NoNiTS, каждый элемент которого Pd{i,j,ts} – числовой массив размера DijQ; Tl – массив ячеек размера NlTS, каждый элемент которого Tl{i,ts} – числовой массив размера ViQ; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i,k} – числовой массив размера SiQ. Параметры описания массивов ячеек и их связь с параметрами сети представлены в следующей таблице. Параметр описания Параметр сети Ni net.numInputs Nl net.numLayers No net.numOutputs LD net.numLayerDelays Ri net.inputs{i}.size Si net.layers{i}.size Vi net.targets{i}.size Dij SRCHGOL Назначение Количество векторов входа Количество слоев Количество выходов Максимальные значения задержек для слоев Количество элементов i-го вектора входа Количество нейронов i-го слоя Количество элементов i-го вектора цели Произведение длины вектора входа слоя i на максимальное значение задержки от слоя i к слою j: Ri * length(net.inputWeights{i, j}.delays) Одномерная минимизация методом золотого сечения Синтаксис: [A,gX,perf,retcode,delta,tol] = srchgol(net,X,Pd,Tl,Ai,Q,TS,dX,gX,perf,dperf,delta,tol,ch_perf) Описание: Функция srchgol реализует одномерный поиск минимума функционала в заданном направлении. Программа использует метод золотого сечения. 406 Нейронные сети. MATLAB 6 Процедура srchgol имеет следующие параметры: Параметр alpha bmax scal_tol Назначение Коэффициент, определяющий порог уменьшения критерия качества Максимальный размер шага Параметр, связывающий погрешность tol с шагом delta Значения для этих параметров устанавливаются по умолчанию при выборе одной из следующих функций обучения: traincgf, traincgb, traincgp, trainbfg, trainoss. Применение функции: Функция одномерного поиска srchgol используется при обучении и настройке сетей с помощью методов newff, newcf, newelm. Для того чтобы подготовить сеть к обучению, например, с помощью функции traincgf, используя функцию srchgol, следует: установить свойство net.trainFcn равным 'traincgf'. Это автоматически установит свойство net.trainParam, соответствующее параметрам функции traincgf; установить свойство net.trainParam.searchFcn равным 'srchgol'. Пример: Заданы векторы входа p и целей t, требуется сформировать нейронную сеть, выходы которой близки к заданным целям: p = [0 1 2 3 4 5]; t = [0 0 0 1 1 1]; Выберем архитектуру двухслойной сети с прямой передачей сигнала; зададим диапазон входов от 0 до 10, первый слой имеет 2 нейрона с функцией активации tansig, второй – 1 нейрон с функцией активации logsig. Используем функции обучения traincgf и поиска одномерного экстремума srchgol: net = newff([0 10],[2 1],{'tansig','logsig'},'traincgf'); net.trainParam.searchFcn = 'srchgol'; net.trainParam.epochs = 50; net.trainParam.show = 10; net.trainParam.goal = 0.0001; net = train(net,p,t); a = sim(net,p) a = 0.0041 0.0042 0.0133 0.9840 0.9983 0.9984 Алгоритм: Функция srchgol находит минимум функционала ошибки обучения в направлении dX, используя метод золотого сечения, реализованный в виде алгоритма, предложенного в работе [41]. Сопутствующие функции: SRCHBAC, SRCHBRE, SRCHCHA, SRCHHYB. 11. Формирование моделей нейронных сетей 407 Одномерная минимизация методом Брента SRCHBRE Синтаксис: [A,gX,perf,retcode,delta,tol] = srchbre(net,X,Pd,Tl,Ai,Q,TS,dX,gX,perf,dperf,delta,tol,ch_perf) Описание: Функция srchbre реализует одномерный поиск экстремума функционала в заданном направлении. Программа использует метод Брента, который является комбинацией метода золотого сечения и квадратичной интерполяции. Процедура srchbre имеет следующие параметры: Параметр alpha beta bmax scal_tol Назначение Коэффициент, определяющий порог уменьшения критерия качества Коэффициент, определяющий выбор шага Максимальный размер шага Параметр, связывающий погрешность tol с шагом delta Значения для этих параметров устанавливаются по умолчанию при выборе одной из следующих функций обучения: traincgf, traincgb, traincgp, trainbfg, trainoss. Применение функции: Функция одномерного поиска srchbre используется при обучении и настройке сетей с помощью методов newff, newcf, newelm. Для того чтобы подготовить сеть к обучению, например, с помощью функции traincgf, используя функцию srchbre, следует: установить свойство net.trainFcn равным 'traincgf'. Это автоматически установит свойство net.trainParam, соответствующее параметрам функции traincgf; установить свойство net.trainParam.searchFcn равным 'srchbre'. Функция srchbre может использоваться с любой из перечисленных обучающих функций: traincgf, traincgb, traincgp, trainbfg, trainoss. Пример: Заданы векторы входа p и целей t, требуется сформировать нейронную сеть, выходы которой близки к заданным целям: p = [0 1 2 3 4 5]; t = [0 0 0 1 1 1]; Выберем архитектуру двухслойной сети с прямой передачей сигнала; зададим диапазон входов от 0 до 10, первый слой имеет 2 нейрона с функцией активации tansig, второй – 1 нейрон с функцией активации logsig. Используем функции обучения traincgf и поиска одномерного экстремума srchbre: net = newff([0 10],[2 1],{'tansig','logsig'},'traincgf'); net.trainParam.searchFcn = 'srchbre'; 408 Нейронные сети. MATLAB 6 net.trainParam.epochs = 50; net.trainParam.show = 10; net.trainParam.goal = 0.0001; net = train(net,p,t); a = sim(net,p) a = 0.0013 0.0013 0.0104 0.9954 0.9981 0.9981 Алгоритм: Функция srchbre находит минимум ошибки обучения в направлении dX, используя алгоритм Брента, который является комбинацией метода золотого сечения и квадратичной интерполяции [4]. Сопутствующие функции: SRCHBAC, SRCHCHA, SRCHGOL, SRCHHYB. Одномерная минимизация на основе гибридного метода SRCHHYB Синтаксис: [A,gX,perf,retcode,delta,tol] = srchhyb(net,X,P,T,Q,TS,dX,gX,perf,dperf,delta,tol,ch_perf) Описание: Функция srchhyb реализует одномерный поиск минимума функционала в заданном направлении. Программа использует гибридный метод половинного деления и кубической интерполяции. Процедура srchhyb имеет следующие параметры: Параметр alpha beta bmax scale_tol Назначение Коэффициент, определяющий порог уменьшения критерия качества Коэффициент, определяющий выбор шага Максимальный размер шага Параметр, связывающий погрешность tol с шагом delta Применение функции: Функция одномерного поиска srchhyb используется при обучении и настройке сетей с помощью методов newff, newcf, newelm. Для того чтобы подготовить сеть к обучению, например, с помощью функции traincgf, используя функцию srchhyb, следует: установить свойство net.trainFcn равным 'traincgf'. Это автоматически установит свойство net.trainParam, соответствующее параметрам функции traincgf; установить свойство net.trainParam.searchFcn равным 'srchhyb'. Функция srchhyb может использоваться с любой из следующих обучающих функций: traincgf, traincgb, traincgp, trainbfg, trainoss. Пример: Заданы векторы входа p и целей t, требуется сформировать нейронную сеть, выходы которой близки к заданным целям: 11. Формирование моделей нейронных сетей 409 p = [0 1 2 3 4 5]; t = [0 0 0 1 1 1]; Выберем архитектуру двухслойной сети с прямой передачей сигнала; зададим диапазон входов от 0 до 10, первый слой имеет 2 нейрона с функцией активации tansig, второй – 1 нейрон с функцией активации logsig. Используем функции обучения traincgf и поиска одномерного экстремума srchhyb: net = newff([0 10],[2 1],{'tansig','logsig'},'traincgf'); net.trainParam.searchFcn = 'srchhyb'; net.trainParam.epochs = 50; net.trainParam.show = 10; net.trainParam.goal = 0.0001; net = train(net,p,t); a = sim(net,p) a = 0.0000 0.0000 0.0001 1.0000 1.0000 1.0000 Алгоритм: Функция srchhyb находит минимум ошибки обучения в направлении dX, используя гибридный алгоритм, который является комбинацией метода золотого сечения и кубической интерполяции [41]. Сопутствующие функции: SRCHBAC, SRCHBRE, SRCHCHA, SRCHGOL. SRCHCHA Одномерная минимизация на основе метода Чараламбуса Синтаксис: [A,gX,perf,retcode,delta,tol] = srchcha(net,X,Pd,Tl,Ai,Q,TS,dX,gX,perf,dperf,delta,tol,ch_perf) Описание: Функция srchcha реализует одномерный поиск минимума функционала в заданном направлении. Программа использует метод Чараламбуса. Процедура srchcha имеет следующие параметры: Параметр alpha beta gama scale_tol Назначение Коэффициент, определяющий порог уменьшения критерия качества Коэффициент, определяющий выбор шага Параметр, регулирующий изменение критерия качества Параметр, связывающий погрешность tol с шагом delta Применение функции: Функция одномерного поиска srchcha используется при обучении и настройке сетей с помощью методов newff, newcf, newelm. Для того чтобы подготовить сеть к обучению, например, с помощью функции traincgf, используя функцию srchcha, следует: установить свойство net.trainFcn равным 'traincgf'. Это автоматически установит свойство net.trainParam, соответствующее параметрам функции traincgf; 410 Нейронные сети. MATLAB 6 установить свойство net.trainParam.searchFcn равным 'srchcha'. Функция srchcha может использоваться с любой из следующих обучающих функций: traincgf, traincgb, traincgp, trainbfg, trainoss. Пример: Заданы векторы входа p и целей t, требуется сформировать нейронную сеть, выходы которой близки к заданным целям: p = [0 1 2 3 4 5]; t = [0 0 0 1 1 1]; Выберем архитектуру двухслойной сети с прямой передачей сигнала; зададим диапазон входов от 0 до 10, первый слой имеет 2 нейрона с функцией активации tansig, второй – 1 нейрон с функцией активации logsig. Используем функции обучения traincgf и поиска одномерного экстремума srchcha: net = newff([0 10],[2 1],{'tansig','logsig'},'traincgf'); net.trainParam.searchFcn = 'srchcha'; net.trainParam.epochs = 50; net.trainParam.show = 10; net.trainParam.goal = 0.0001; net = train(net,p,t); a = sim(net,p) a = 0.0020 0.0021 0.0115 0.9897 0.9972 0.9973 Алгоритм: Функция srchhyb находит минимум ошибки обучения в направлении dX, используя метод Чараламбуса [8]. Сопутствующие функции: SRCHBAC, SRCHBRE, SRCHGOL, SRCHHYB. SRCHBAC Одномерная минимизация на основе метода перебора с возвратами Синтаксис: [a,gX,perf,retcode,delta,tol] = srchbac(net,X,Pd,Tl,Ai,Q,TS,dX,gX,perf,dperf,delta,tol,ch_perf) Описание: Функция srchbac реализует одномерный поиск минимума функционала в заданном направлении. Программа использует метод перебора с возвратами. Процедура srchbac имеет следующие параметры: Параметр alpha beta low_lim up_lim Назначение Коэффициент, определяющий порог уменьшения критерия качества Коэффициент, определяющий выбор шага Нижняя граница изменения шага Верхняя граница изменения шага 11. Формирование моделей нейронных сетей 411 maxstep minstep scale_tol Максимальное значение шага Минимальное значение шага Параметр, связывающий погрешность tol с шагом delta Применение функции: Функция одномерного поиска srchbac используется при обучении и настройке сетей с помощью методов newff, newcf, newelm. Для того чтобы подготовить сеть к обучению, например, с помощью функции traincgf, используя функцию srchbac, следует: установить свойство net.trainFcn равным 'traincgf'. Это автоматически установит свойство net.trainParam, соответствующее параметрам функции traincgf; установить свойство net.trainParam.searchFcn равным 'srchbac'. Функция srchcha может использоваться с любой из следующих обучающих функций: traincgf, traincgb, traincgp, trainbfg, trainoss. Пример: Заданы векторы входа p и целей t, требуется сформировать нейронную сеть, выходы которой близки к заданным целям: p = [0 1 2 3 4 5]; t = [0 0 0 1 1 1]; Выберем архитектуру двухслойной сети с прямой передачей сигнала; зададим диапазон входов от 0 до 10, первый слой имеет 2 нейрона с функцией активации tansig, второй – 1 нейрон с функцией активации logsig. Используем функции обучения traincgf и поиска одномерного экстремума srchbac: net = newff([0 10],[2 1],{'tansig','logsig'},'traincgf'); net.trainParam.searchFcn = 'srchbac'; net.trainParam.epochs = 50; net.trainParam.show = 10; net.trainParam.goal = 0.0001; net = train(net,p,t); a = sim(net,p) a = 0.0024 0.0025 0.0119 0.9851 0.9951 0.9952 Алгоритм: Функция srchbac находит минимум функционала качества обучения в направлении dX, используя алгоритм перебора с возвратами [9]. Сопутствующие функции: SRCHBRC, SRCHCHA, SRCHGOL, SRCHHYB. 11.7. Масштабирование и восстановление данных В этом разделе описаны функции масштабирования, препроцессорной обработки и восстановления данных, применяемые для повышения эффективности формирования нейронных сетей. 412 Нейронные сети. MATLAB 6 PREMNMX Приведение данных к интервалу [–1 1] Синтаксис: [pn,minp,maxp,tn,mint,maxt] = premnmx(p,t) [pn,minp,maxp] = premnmx(p) Описание: Функция premnmx выполняет препроцессорную обработку обучающей последовательности путем приведения значений элементов векторов входа и цели к интервалу [–1 1]. Входные аргументы: p – матрица векторов входа размера RQ; t – матрица векторов целей размера SQ. Выходные аргументы: pn – матрица нормированных векторов входа размера RQ; minp – вектор минимальных элементов входа размера R1; maxp – вектор максимальных элементов входа размера R1; tn – матрица нормированных векторов целей размера SQ; mint – вектор минимальных элементов векторов целей размера S1; maxt – вектор максимальных элементов векторов целей размера S1. Пример: Следующие команды нормализуют приведенный набор данных так, чтобы значения входа и цели попадали в интервал [–1,1]: p = [–10 –7.5 –5 –2.5 0 2.5 5 7.5 10]; t = [0 7.07 –10 –7.07 0 7.07 10 7.07 0]; [pn,minp,maxp,tn,mint,maxt] = premnmx(p,t) pn = –1.0000 –0.7500 –0.5000 –0.2500 0 0.2500 0.5000 0.7500 1.0000 minp = –10 maxp = 10 tn = 0 0.7070 –1.0000 –0.7070 0 0.7070 1.0000 0.7070 0 mint = –10 maxt = 10 Если требуется нормировать только вектор входа, то можно использовать следующий оператор: [pn,minp,maxp] = premnmx(p); Алгоритм: Приведение данных к диапазону [–1 1] выполняется по формуле pn = 2 * (p – minp)/(maxp – minp) – 1. Сопутствующие функции: PRESTD, PREPCA, POSTMNMX. 11. Формирование моделей нейронных сетей 413 PRESTD Приведение данных к нормальному закону распределения Синтаксис: [pn,meanp,stdp,tn,meant,stdt] = prestd(p,t) [pn,meanp,stdp] = prestd(p) Описание: Функция prestd выполняет препроцессорную обработку обучающей последовательности путем приведения значений элементов векторов входа к нормальному закону распределения c нулевым средним и дисперсией, равной 1. Входные аргументы: p – матрица векторов входа размера RQ; t – матрица векторов целей размера SQ. Выходные аргументы: pn – матрица приведенных векторов входа размера RQ; meanp – вектор средних значений векторов входа размера R1; stdp – вектор среднеквадратичных отклонений векторов входа размера R1; tn – матрица приведенных векторов целей размера S Q; meant – вектор средних значений векторов целей размера S1; stdt – вектор среднеквадратичных отклонений векторов целей размера S1. Пример: Задана следующая обучающая последовательность векторов входа и целей. Требуется выполнить ее приведение к нормальному закону распределения с параметрами [0 1]. p = [–0.92 0.73 –0.47 0.74 0.29; –0.08 0.86 –0.67 –0.52 0.93]; t = [–0.08 3.4 –0.82 0.69 3.1]; [pn,meanp,stdp,tn,meant,stdt] = prestd(p,t) pn = –1.3389 0.8836 –0.7328 0.8971 0.2910 –0.2439 1.0022 –1.0261 –0.8272 1.0950 meanp = 0.0740 0.1040 stdp = 0.7424 0.7543 tn = –0.7049 1.1285 –1.0947 –0.2992 0.9704 meant = 1.2580 stdt = 1.8982 Если задана только последовательность векторов входа, то следует применить оператор [pn,meanp,stdp] = prestd(p); 414 Нейронные сети. MATLAB 6 Алгоритм: Приведение данных к нормальному закону распределения с параметрами [0 1] выполняется по формуле pn = (p – meanp)/stdp. Сопутствующие функции: PREMNMX, PREPCA. PREРСА Выделение главных компонентов Синтаксис: [ptrans,transMat] = prepca(P,min_frac) Описание: Функция prepca выполняет препроцессорную обработку обучающей последовательности, применяя факторный анализ. Это позволяет преобразовать входные данные так, чтобы векторы входа оказались некоррелированными. Кроме того, может быть уменьшен и размер векторов путем удержания только тех компонентов, дисперсия которых превышает некоторое заранее установленное значение min_frac. Входные аргументы: P – матрица центрированных векторов входа размера RQ; min_frac – нижняя граница значения дисперсии удерживаемых компонентов. Выходные аргументы: ptrans – преобразованный набор векторов входа; transMat – матрица преобразований. Примеры: Зададим массив двухэлементных векторов входа и выполним их факторный анализ, удерживая только те компоненты вектора, дисперсия которых превышает 2 % общей дисперсии. Сначала с помощью функции prestd приведем входные данные к нормальному закону распределения, а затем применим функцию prepca. P = [–1.5 –0.58 0.21 –0.96 –0.79; –2.2 –0.87 0.31 –1.4 –1.2]; [pn,meanp,stdp] = prestd(P) pn = –1.2445 0.2309 1.4978 –0.3785 –1.2331 0.2208 1.5108 –0.3586 meanp = –0.7240 –1.0720 stdp = 0.6236 0.9148 [ptrans,transMat] = prepca(pn,0.02) ptrans = 1.7519 –0.3194 –2.1274 transMat = –0.7071 –0.7071 11. Формирование моделей нейронных сетей –0.1058 –0.1399 0.5212 0.1738 415 Поскольку в данном примере вторая строка массива P почти кратна первой, то в результате факторного анализа преобразованный массив содержит только одну строку. Алгоритм: Функция prepca для выделения главных компонентов использует процедуру SVDразложения матрицы центрированных векторов входа по сингулярным числам. Векторы входа умножаются на матрицу, строки которой являются собственными векторами ковариационной матрицы векторов входа. В результате получаем векторы входа с некоррелированными компонентами, которые упорядочены по величине дисперсий. Те компоненты, дисперсия которых не превышает заданное значение, удаляются; в результате сохраняются только главные компоненты [22]. Предполагается, что входные данные центрированы с помощью функции prestd так, что их среднее значение равно 0, а дисперсия – 1. Сопутствующие функции: PRESTD, PREMNMX. POSTMNMX Восстановление данных после масштабирования функцией premnmx Синтаксис: [p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt) p = postmnmx(pn,minp,maxp) Описание: Функция postmnmx выполняет постпроцессорную обработку, связанную с восстановлением данных, которые были масштабированы к диапазону [–1 1] с помощью функции premnmx. Входные аргументы: pn – матрица нормированных векторов входа размера RQ; minp – вектор минимальных элементов исходного массива p размера R1; maxp – вектор максимальных элементов исходного массива p размера R1; tn – матрица нормированных векторов целей размера SQ; mint – вектор минимальных элементов исходного массива t размера S1; maxt – вектор максимальных элементов исходного массива t размера S1. Выходные аргументы: p – восстановленная матрица векторов входа размера RQ; t – восстановленная матрица векторов целей размера SQ. Пример: В этом примере сначала с помощью функции premnmx выполняется масштабирование обучающей последовательности к диапазону [–1 1], затем создается и обучается нейронная сеть прямой передачи, выполняется ее моделирование и восстановление выхода с помощью функции postmnmx. P = [–0.92 0.73 –0.47 416 0.74 0.29; Нейронные сети. MATLAB 6 –0.08 0.86 –0.67 –0.52 0.93]; t = [–0.08 3.40 –0.82 0.69 3.10]; [pn,minp,maxp,tn,mint,maxt] = premnmx(P,t); net = newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm'); net = train(net,pn,tn); an = sim(net,pn) an = –0.6493 1.0000 –1.0000 –0.2844 0.8578 a = postmnmx(an,mint,maxt) a = –0.0800 3.4000 –0.8200 0.6900 3.1000 Восстановленный вектор выхода нейронной сети совпадает с исходным вектором целей. Алгоритм: Восстановление данных, масштабированных к диапазону [–1 1], выполняется по формуле p = 0.5*(pn + 1)*(maxp – minp) + minp. Сопутствующие функции: PREMNMX, PREPCA, POSTSTD. POSTSTD Восстановление данных после применения функции prestd Синтаксис: [p,t] = poststd(pn,meanp,stdp,tn,meant,stdt) p = poststd(pn,meanp,stdp) Описание: Функция poststd выполняет постпроцессорную обработку, связанную с восстановлением данных, которые были масштабированы к нормальному закону распределения с параметрами [0 1] с помощью функции prestd. Входные аргументы: pn – матрица масштабированных векторов входа размера RQ; meanp – вектор средних значений исходного массива входов размера R1; stdp – вектор среднеквадратичных отклонений исходного массива входов размера R1; tn – матрица масштабированных векторов целей размера SQ; meant – вектор средних значений массива целей размера S1; stdt – вектор среднеквадратичных отклонений массива целей размера S1. Выходные аргументы: p – восстановленная матрица векторов входа размера RQ; t – восстановленная матрица векторов целей размера SQ. Примеры: В этом примере сначала с помощью функции prestd выполняется масштабирование обучающей последовательности к нормальному закону распределения с параметрами [0 1], затем создается и обучается нейронная сеть прямой передачи, выполняется ее моделирование и восстановление выхода с помощью функции poststd. 11. Формирование моделей нейронных сетей 417 p = [–0.92 0.73 –0.47 0.74 0.29; –0.08 0.86 –0.67 –0.52 0.93]; t = [–0.08 3.40 –0.82 0.69 3.10]; [pn,meanp,stdp,tn,meant,stdt] = prestd(p,t); net = newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm'); net = train(net,pn,tn); an = sim(net,pn) an = –0.7049 1.1285 –1.0947 –0.2992 0.9704 a = poststd(an,meant,stdt) a = –0.0800 3.4000 –0.8200 0.6900 3.1000 Восстановленный вектор выхода нейронной сети совпадает с исходным вектором целей. Алгоритм: Восстановление данных, масштабированных к нормальному закону распределения с параметрами [0 1], выполняется по формуле p = stdp * pn + meanp. Сопутствующие функции: PREMNMX, PREPCA, POSTMNMX, PRESTD. POSTREG Постпроцессорная обработка выхода сети с расчетом линейной регрессии Синтаксис: [m,b,r] = postreg(A,T) Описание: Функция [m, b, r] = postreg(A, T) выполняет постпроцессорную обработку выхода нейронной сети и рассчитывает линейную регрессию между векторами выхода и цели. Входные аргументы: A – 1Q массив выходов сети, каждый элемент которого выход сети; T – 1Q массив целей, каждый элемент которого целевой вектор. Выходные аргументы: m – наклон линии регрессии; b – точка пересечения линии регрессии с осью Y; r – коэффициент регрессии. Примеры: В данном примере с помощью функции prestd нормализуется множество обучающих данных, на нормализованных данных вычисляются главные компоненты, создается и обучается сеть, затем сеть моделируется. Выход сети с помощью функции poststd денормализуется и вычисляется линейная регрессия между выходом (ненормализованным) сети и целями, чтобы проверить качество обучения сети. P = [–0.92 0.73 –0.47 0.74 0.29; –0.08 0.86 –0.67 –0.52 0.93]; T = [–0.08 3.40 –0.82 0.69 3.10]; 418 Нейронные сети. MATLAB 6 [pn,meanp,stdp,tn,meant,stdt] = prestd(P,T); [ptrans,transMat] = prepca(pn,0.02); net = newff(minmax(ptrans),[5 1],{'tansig' 'purelin'},'trainlm'); net = train(net,ptrans,tn); an = sim(net,ptrans) an = –0.7049 1.1285 –1.0947 –0.2992 0.9704 a = poststd(an,meant,stdt) a = –0.0800 3.4000 –0.8200 0.6900 3.1000 [m,b,r] = postreg(a,t) % Рис.11.61 m = 1.0000 b = 5.6881e–014 r = 1.0000 В данном примере параметры линейной регрессии свидетельствуют о хорошей согласованности векторов выхода нейронной сети и цели, и это означает, что синтезированная нейронная сеть успешно реализует свою функцию. Рис. 11.61 Сопутствующие функции: PREMNMX, PREPCA. Масштабирование текущих входов к диапазону [–1 1] TRAMNMX Синтаксис: pn = tramnmx(p,minp,maxp) Описание: Функция pn = tramnmx(p, minp, maxp) приводит текущие входные данные к диапазону [–1 1], если известны их минимальное и максимальное значения. Эта функция применяется, когда нейронная сеть обучена с помощью данных, нормированных функцией premnmx. Входные аргументы: p – матрица векторов входа размера RQ; minp – вектор минимальных элементов входа размера R1; maxp – вектор максимальных элементов входа размера R1. Выходные аргументы: pn – матрица нормированных векторов входа размера RQ. 11. Формирование моделей нейронных сетей 419 Пример: Следующие операторы масштабируют обучающую последовательность к диапазону [–1 1], формируют и обучают нейронную сеть прямой передачи. p = [–10 –7.5 –5 –2.5 0 2.5 5 7.5 10]; t = [0 7.07 –10 –7.07 0 7.07 10 7.07 0]; [pn,minp,maxp,tn,mint,maxt] = premnmx(p,t); net = newff(minmax(pn),[5 1],{‘tansig’ ‘purelin’},’trainlm’); net = train(net,pn,tn); Если в дальнейшем к обученной сети будут приложены новые входы, то они должны быть масштабированы с помощью функции tramnmx. Выход сети должен быть восстановлен с помощью функции postmnmx. p2 = [4 –7]; pn = tramnmx(p2,minp,maxp); an = sim(net,pn) an = 0.9552 0.8589 a = postmnmx(an,mint,maxt) a = 9.5518 8.5893 Алгоритм: Масштабирование текущих данных к диапазону [–1 1] выполняется по формуле pn = 2 * (p – minp)/(maxp – minp) – 1. Сопутствующие функции: PREMNMX, PRESTD, PREPCA, TRASTD, TRAPCA. TRASTD Масштабирование текущих входов к нормальному закону распределения Синтаксис: pn = trastd(p,meanp,stdp) Описание: Функция pn = trastd(p, meanp, stdp) приводит текущие входные данные к нормальному закону распределения с параметрами [0 1], если они принадлежат к множеству с известными средним значением и среднеквадратичным отклонением. Эта функция применяется, когда нейронная сеть была обучена с помощью данных, нормированных функцией prestd. Входные аргументы: p – матрица векторов входа размера RQ; meanp – вектор средних значений элементов входа размера R1; stdp – вектор среднеквадратичных отклонений элементов входа размера R1. Выходные аргументы: pn – матрица нормированных векторов входа размера RQ. 420 Нейронные сети. MATLAB 6 Пример: Следующие операторы масштабируют обучающую последовательность к нормальному закону распределения с параметрами [0 1], формируют и обучают нейронную сеть прямой передачи. p = [–0.92 0.73 –0.47 0.74 0.29; –0.08 0.86 –0.67 –0.52 0.93]; t = [–0.08 3.4 –0.82 0.69 3.1]; [pn,meanp,stdp,tn,meant,stdt] = prestd(p,t); net = newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm'); net = train(net,pn,tn); Если в дальнейшем к обученной сети будут приложены новые входы, то они должны быть масштабированы с помощью функции trastd. Выход сети должен быть восстановлен с помощью функции poststd. p2 = [1.5 –0.8; 0.05 –0.3]; pn = trastd(p2,meanp,stdp); an = sim(net,pn) an = 0.8262 –1.0585 a = poststd(an,meant,stdt) a = 2.8262 –0.7512 Алгоритм: Масштабирование текущих данных к нормальному закону распределения с параметрами [0 1] выполняется по формуле pn = (p – meanp)/stdp. Сопутствующие функции: PREMNMX, PREPCA, PRESTD, TRAPCA, TRAMNMX. TRAPCA Масштабирование текущих входов с учетом факторного анализа Синтаксис: Ptrans = trapca(P,TransMat) Описание: Функция Ptrans = trapca(P, TransMat) преобразует текущие входные данные с учетом факторного анализа, примененного к обучающей последовательности. Эта функция применяется, когда нейронная сеть была обучена с помощью данных, предварительно обработанных функциями prestd и prepca. Входные аргументы: P – матрица текущих векторов входа размера RQ; TransMat – матрица преобразования, связанная с факторным анализом. Выходные аргументы: Ptrans – преобразованный массив векторов входа. 11. Формирование моделей нейронных сетей 421 Пример: Следующие операторы выполняют главный факторный анализ обучающей последовательности, удерживая только те компоненты, которые имеют дисперсию, превышающую значение 0.02. P = [–1.5 –0.58 0.21 –0.96 –0.79; –2.2 –0.87 0.31 –1.40 –1.20]; t = [–0.08 3.4 –0.82 0.69 3.1]; [pn,meanp,stdp,tn,meant,stdt] = prestd(P,t); [ptrans,transMat] = prepca(pn,0.02) ptrans = 1.7519 –0.3194 –2.1274 0.5212 0.1738 transMat = –0.7071 –0.7071 net = newff(minmax(ptrans),[5 1],{'tansig' 'purelin'},'trainlm'); net = train(net,ptrans,tn); Если в дальнейшем к сети будут приложены новые входы, то они должны быть масштабированы с помощью функций trastd и trapca. Выход сети должен быть восстановлен с помощью функции poststd: p2 = [1.50 –0.8; 0.05 –0.3]; p2n = trastd(p2,meanp,stdp); p2trans = trapca(p2n,transMat) p2trans = –3.3893 –0.5106 an = sim(net,p2trans) an = 0.7192 1.1292 a = poststd(an,meant,stdt) a = 2.6231 3.4013 Алгоритм: Масштабирование текущих данных с учетом факторного анализа выполняется по формуле Ptrans = TransMat * P. Сопутствующие функции: PRESTD, PREMNMX, PREPCA, TRASTD, TRAMNMX. 11.8. Вспомогательные функции Ниже представлены различные утилиты, которые составляют ядро ППП Neural Network Toolbox. В первую очередь это утилиты для вычисления сигналов в различных точках нейронной сети, а также функционала качества обучения сети и связанных с ним вычислений градиента, а также функций Якоби и Гессе. Значительное место занимают реализации операций с массивами и матрицами, а также утилиты графики, позволяющие отображать входные данные, топологию сетей, строить поверхности ошибок и тректории обучения в пространстве параметров нейронной сети. Утилиты вычислений 422 Нейронные сети. MATLAB 6 CALCA Расчет сигналов сети на заданном интервале времени Синтаксис: [Ac,N,LWZ,IWZ,BZ] = calca(net,Pd,Ai,Q,TS) Описание: Функция [Ac, N, LWZ, IWZ, BZ] = calca(net, Pd, Ai, Q, TS) вычисляет сигналы в слоях нейронной сети как реакцию на входы c учетом линий задержки. Входные аргументы: net – имя нейронной сети; Pd – выходы линий задержки; Ai – начальные условия на линиях задержки по выходам слоев; Q – количество выборок для фиксированного момента времени; TS – число шагов по времени. Выходные аргументы: Ac – массив векторов, объединяющих выходы нейронов и слоя; N – входы функций активации; LWZ – массив взвешенных выходов слоя; IWZ – массив взвешенных входов; BZ – массив смещений. Пример: Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, тремя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с линией задержки [1 2] (рис. 11.62). net = newlin([0 1],3,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; Рис. 11.62 Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для восьми шагов по времени, вектор начальных условий на линии задержки входов Pi: P = {0 0.1 0.3 0.6 0.4 0.7 0.2 0.1}; 11. Формирование моделей нейронных сетей 423 Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P]; Pd = calcpd(net,8,1,Pc) Pd(:,:,1) = [31 double] Pd(:,:,2) = [31 double] ... Pd(:,:,8) = [31 double] Сформируем вектор начальных условий на линии задержки выхода слоя для каждого из трех нейронов: Ai = {[0.5; 0.1; 0.2] [0.6; 0.5; 0.2]}; Применяя функцию calca, рассчитаем сигналы в слое на каждом временном шаге TS: [Ac,N,LWZ,IWZ,BZ] = Ac = Columns 1 through [31 double] [31 double] calca(net,Pd,Ai,1,8) 4 [31 double] [31 double] Columns 9 through 10 [31 double] [31 double] N = Columns 1 through 4 [31 double] [31 double] Columns 5 through 8 [31 double] [31 double] LWZ(:,:,1) = [31 double] LWZ(:,:,2) = [31 double] ... LWZ(:,:,8) = [31 double] IWZ(:,:,1) = [31 double] IWZ(:,:,2) = [31 double] ... IWZ(:,:,8) = [31 double] BZ = [31 double] [31 double] [31 double] [31 double] [31 double] [31 double] [31 double] [31 double] [31 double] Сопутствующие функции: CALCA1, CALCPD. CALCA1 Расчет сигналов сети на одном шаге по времени Синтаксис: [Ac,N,LWZ,IWZ,BZ] = calca1(net,Pd,Ai,Q) Описание: Функция [Ac, N, LWZ, IWZ, BZ] = calca1(net, Pd, Ai, Q) вычисляет сигналы в слоях нейронной сети как реакцию на входы c учетом линий задержки для одного шага по времени. Эта функция применяется в последовательных процедурах обучения с использованием функции trains, которые требуют вычисления реакции сети на каждом шаге по времени. 424 Нейронные сети. MATLAB 6 Входные аргументы: net – имя нейронной сети; Pd – выходы линий задержки; Ai – начальные условия на линиях задержки по выходам слоев; Q – количество реализаций для фиксированного момента времени. Выходные аргументы: Ac – массив векторов, объединяющих выходы нейронов и слоя; N – входы функций активации; LWZ – массив взвешенных выходов слоя; IWZ – массив взвешенных входов; BZ – массив смещений. Пример: Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, тремя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с ЛЗ [1 2] (см. рис. 11.62). net = newlin([0 1],3,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для трех шагов по времени, вектор начальных условий на линии задержки входов Pi: P = {0 0.1 0.3}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P]; Pd = calcpd(net,3,1,Pc) Pd(:,:,1) = [31 double] Pd(:,:,2) = [31 double] Pd(:,:,3) = [31 double] Сформируем вектор начальных условий на линии задержки выхода слоя для каждого из трех нейронов: Ai = {[0.5; 0.1; 0.2] [0.6; 0.5; 0.2]}; Применяя функцию calca1, рассчитаем сигналы в слое на первом шаге по времени: [A1,N1,LWZ1,IWZ1,BZ1] = calca1(net,Pd(:,:,1),Ai,1) A1 = [31 double] N1 = [31 double] LWZ1 = [31 double] IWZ1 = [31 double] BZ1 = [31 double] Теперь можно вычислить новые состояния на ЛЗ, используя массивы Ai и A, и рассчитать сигналы слоя на втором шаге по времени: Ai2 = [Ai(:,2:end) A1]; [A2,N2,LWZ2,IWZ2,BZ2] = calca1(net,Pd(:,:,2),Ai2,1) 11. Формирование моделей нейронных сетей 425 A2 = N2 = LWZ2 = IWZ2 = BZ2 = [31 double] [31 double] [31 double] [31 double] [31 double] Сопутствующие функции: CALCA, CALCPD. Расчет запаздывающих входов сети CALCPD Синтаксис: Pd = calcpd(net,TS,Q,Pc) Описание: Функция Pd = calcpd(net, TS, Q, Pc) вычисляет запаздывающие входы сети после их прохождения через ЛЗ. Входные аргументы: net – имя нейронной сети; TS – число элементов во временной выборке; Q – число выборок; Pc – массив векторов, объединяющий векторы входов сети и начальных условий на ЛЗ. Выходные аргументы: Pd – массив запаздывающих входов. Пример: Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, тремя нейронами и линией задержки на входе с параметрами [0 2 4]: net = newlin([0 1],3,[0 2 4]); Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для трех шагов по времени и вектор начальных условий на линии задержки Pi: P = {0 0.1 0.3}; Pi = {0.2 0.3 0.4 0.1}; Запаздывающие входы (значения входов после прохождения через рассчитываются с помощью функции calcpd после их объединения в вектор Рс: ЛЗ) Pc = [Pi P]; Pd = calcpd(net,3,1,Pc) Pd(:,:,1) = [31 double] Pd(:,:,2) = [31 double] Pd(:,:,3) = [31 double] Теперь можно просмотреть значения запаздывающих входов для двух первых шагов: Pd{1,1,1} ans = 0 426 Нейронные сети. MATLAB 6 0.4000 0.2000 Pd{1,1,2} ans = 0.1000 0.1000 0.3000 Сопутствующие функции: CALCA, CALCA1. CALCE Расчет ошибок слоя на заданном интервале времени Синтаксис: El = calce(net,Ac,Tl,TS) Описание: Функция El = calce(net, Ac, Tl, TS) рассчитывает ошибки слоя нейронной сети на интервале времени TS. Входные аргументы: net – имя нейронной сети; Tl – массив векторов целей слоя; Ac – массив векторов, объединяющих выходы нейронов и слоя; Q – количество выборок для фиксированного момента времени. Выходные аргументы: El – массив ошибок слоя на интервале времени TS. Пример: Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и ЛЗ на входе с параметрами [0 2 4]; в сети используется обратная связь с ЛЗ [1 2]. net = newlin([0 1],2,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для пяти шагов по времени, вектор начальных условий на ЛЗ входов Pi: P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P]; Pd = calcpd(net,5,1,Pc); Сформируем вектор начальных условий на ЛЗ выхода слоя для каждого из двух нейронов и рассчитаем сигналы в слое на пяти шагах по времени: Ai = {[0.5; 0.1] [0.6; 0.5]}; [Ac,N,LWZ,IWZ,BZ] = calca(net,Pd,Ai,1,5); Определим цели слоя для двух нейронов для каждого из пяти временных шагов и рассчитаем ошибки слоя: 11. Формирование моделей нейронных сетей 427 Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]}; El = calce(net,Ac,Tl,5) El = [21 double] [21 double] [21 double] [21 double] [21 double] Просмотрим ошибки слоя 1 на временном шаге 2: El{1,2} ans = 0.3000 0.1000 Сопутствующие функции: CALCA, CALCE1, CALCPD. CALCE1 Расчет ошибок слоя на одном шаге по времени Синтаксис: El = calce1(net,A,Tl) Описание: Функция El = calce(net, Ac, Tl) рассчитывает ошибки слоя нейронной сети на одном шаге по времени. Входные аргументы: net – имя нейронной сети; A – массив выходов слоя на одном шаге; Tl – массив векторов целей слоя. Выходные аргументы: El – массив ошибок слоя на одном шаге по времени. Пример: Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и ЛЗ на входе с параметрами [0 2 4]; в сети используется обратная связь с ЛЗ [1 2]. net = newlin([0 1],2,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для пяти шагов по времени, вектор начальных условий на ЛЗ входов Pi: P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P]; Pd = calcpd(net,5,1,Pc); Сформируем вектор начальных условий на ЛЗ выхода слоя для каждого из двух нейронов и рассчитаем сигналы в слое на пяти шагах по времени: Ai = {[0.5; 0.1] [0.6; 0.5]}; [A1,N1,LWZ1,IWZ1,BZ1] = calca1(net,Pd(:,:,1),Ai,1) 428 Нейронные сети. MATLAB 6 Определим цели слоя для двух нейронов для каждого из пяти временных шагов и рассчитаем ошибки слоя на первом шаге: Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]}; El = calce1(net,A1,Tl(:,1)) El = [21 double] Просмотрим ошибку слоя на первом шаге: El{1} ans = 0.1000 0.2000 Теперь можно вычислить новые состояния на ЛЗ, используя массивы Ai и A, и рассчитать сигналы слоя на втором шаге по времени: Ai2 = [Ai(:,2:end) A1]; [A2,N2,LWZ2,IWZ2,BZ2] = calca1(net,Pd(:,:,2),Ai2,1); El = calce1(net,A2,Tl(:,2)) El{1} ans = 0.3000 0.1000 Сопутствующие функции: CALCA1, CALCE, CALCPD. FORMX Формирование объединенного вектора весов и смещений Синтаксис: X = formx(net,B,IW,LW) Описание: Функция X = formx(net, B, IW, LW) извлекает из описания сети матрицы весов и векторы смещений и объединяет их в единый вектор. Входные аргументы: net – нейронная сеть; B – массив ячеек размера Nl1, включающий векторы смещений для Nl слоев; IW – массив ячеек размера Nl1, включающий матрицы весов входа; LW – массив ячеек размера NlNl, состоящий из весовых матриц Nl слоев. Выходные аргументы: X – объединенный вектор весов и смещений. Примеры: Создадим однослойную сеть с тремя нейронами и двухэлементным вектором входа со значениями из диапазонов [0 1] и [–1 1]: net = newff([0 1; –1 1],[3]); Выведем значения массивов весов и смещений: 11. Формирование моделей нейронных сетей 429 b = net.b b = [31 double] b{1} ans = 3.7981 –0.9154 –1.6816 iw = net.iw iw = [32 double] iw{1} ans = –2.7464 1.9986 1.8307 2.2455 –1.4865 –2.3082 lw = net.lw lw = {[]} Объединим массивы весов и смещений в общий вектор: x = formx(net,net.b,net.iw,net.lw); x' ans = –2.7464 1.8307 –1.4865 1.9986 2.2455 –2.3082 3.7981 –0.9154 –1.6816 В результате сформирован единый вектор, в котором сначала расположены элементы весовой матрицы по столбцам, а затем присоединен вектор смещений. Сопутствующие функции: GETX, SETX. GETX Извлечение объединенного вектора весов и смещений из описания сети Синтаксис: X = getx(net) Описание: Функция X = getx(net) извлекает объединенный вектор весов и смещений, если известен дескриптор нейронной сети net. Пример: Создадим однослойную сеть с тремя нейронами и двухэлементным вектором входа со значениями из диапазонов [0 1] и [–1 1]: net = newff([0 1; –1 1],[3]); Выведем значения массивов весов и смещений: net.iw{1,1} ans = –4.7161 3.5899 –0.6304 net.b{1} ans = 430 0.5653 1.6304 2.4043 Нейронные сети. MATLAB 6 4.7829 –1.7950 –2.1097 Эти же значения можно вывести в виде объединенного вектора, который содержится в описании нейронной сети: x = getx(net); x' ans = –4.7161 3.5899 –0.6304 0.5653 1.6304 2.4043 4.7829 –1.7950 –2.1097 Сопутствующие функции: SETX, FORMX. Включение объединенного вектора весов и смещений в описание сети SETX Синтаксис: net = setx(net,X) Описание: Функция net = setx(net, X) включает объединенный вектор весов и смещений X в описание нейронной сети с дескриптором net. Пример: Создадим однослойную сеть с тремя нейронами и двухэлементным вектором входа со значениями из диапазонов [0 1] и [–1 1]: net = newff([0 1; –1 1],[3]); net.iw net.b ans = [32 double] ans = [31 double] Сеть имеет 6 весовых коэффициентов и 3 элемента смещений, т. е. всего 9 значений. Зададим этим элементам случайные значения и включим их в описание нейронной сети: net = setx(net,rand(9,1)); Эти значения можно вывести на экран с помощью команды getx(net). Сопутствующие функции: GETX, FORMX. CALCPERF Расчет сигналов и функционала качества слоя Синтаксис: [perf,El,Ac,N,BZ,IWZ,LWZ] = calcperf(net,X,Pd,Tl,Ai,Q,TS) Описание: Функция [perf, El, Ac, N, LWZ, IWZ, BZ] = calcperf(net, X, Pd, Tl, Ai, Q, TS) вычисляет функционал качества и сигналы в слое нейронной сети net. 11. Формирование моделей нейронных сетей 431 Входные аргументы: net – имя нейронной сети; X – объединенный вектор весов и смещений; Pd – массив задержанных входов; Tl – массив векторов целей слоя; Ai – начальные условия на линиях задержки в слоях; Q – число выборок; TS – размер выборки. Выходные аргументы: perf – значение функционала качества; El – массив ошибок слоя; Ac – массив векторов, объединяющих выходы нейронов и слоя; N – входы функций активации; LWZ – массив взвешенных выходов слоя; IWZ – массив взвешенных входов; BZ – массив смещений. Пример: Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и ЛЗ на входе с параметрами [0 2 4]; в сети используется обратная связь с ЛЗ [1 2]. net = newlin([0 1],2,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для пяти шагов по времени, вектор начальных условий на ЛЗ входов Pi: P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P]; Pd = calcpd(net,5,1,Pc); Сформируем вектор начальных условий на ЛЗ выхода слоя для каждого из двух нейронов и массив векторов целей на пяти шагах по времени: Ai = {[0.5; 0.1] [0.6; 0.5]}; Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]}; Извлечем объединенный вектор весов и смещений из описания сети X = getx(net); Вычислим функционал качества и сигналы в сети [perf,El,Ac,N,BZ,IWZ,LWZ] = calcperf(net,X,Pd,Tl,Ai,1,5); Выведем значения функционала качества и массива ошибок слоя perf perf = 0.2470 cat(2, El{:}) 432 Нейронные сети. MATLAB 6 ans = 0.1000 0.2000 0.3000 0.1000 0.5000 0.6000 0.8000 0.9000 0.5000 0.1000 Сопутствующие функции: CALCGX, CALCPD, GETX. CALCGX Расчет градиента функционала качества по объединенному вектору весов и смещений Синтаксис: [gX,normgX] = calcgx(net,X,Pd,BZ,IWZ,LWZ,N,Ac,El,perf,Q,TS) Описание: Функция [gX, normgX] = calcgx(net, X, Pd, BZ, IWZ, LWZ, N, Ac, El, perf, Q, TS) вычисляет градиент функционала качества по объединенному вектору весов и смещений X. Если слой не имеет ЛЗ, то результатом является истинный градиент; если сеть имеет ЛЗ, то результатом является аппроксимация градиента, называемая градиентом Элмана. Входные аргументы: net – имя нейронной сети; X – объединенный вектор весов и смещений; Pd – массив задержанных входов; BZ – массив векторов смещений; IWZ – массив взвешенных входов слоя; LWZ – массив взвешенных выходов слоя; N – массив входов функций активации; Ac – массив векторов, объединяющих выходы нейронов и слоя; El – массив ошибок слоя; perf – значение функционала качества; Q – число выборок; TS – размер выборки. Выходные аргументы: gX – градиент dPerf/dX; normgX – значение нормы градиента. Пример: Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и ЛЗ на входе с параметрами [0 2 4]; в сети используется обратная связь с ЛЗ [1 2]. net = newlin([0 1],2,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для пяти шагов по времени, вектор начальных условий на ЛЗ входов Pi: P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; 11. Формирование моделей нейронных сетей 433 Pc = [Pi P]; Pd = calcpd(net,5,1,Pc); Сформируем вектор начальных условий на ЛЗ выхода слоя для каждого из двух нейронов и массив векторов целей на пяти шагах по времени: Ai = {[0.5; 0.1] [0.6; 0.5]}; Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]}; Извлечем из описания сети объединенный вектор весов и смещений сети и вычислим функционал качества и сигналы сети: X = getx(net); [perf,El,Ac,N,BZ,IWZ,LWZ] = calcperf(net,X,Pd,Tl,Ai,1,5); В заключение используем функцию calcgx, чтобы вычислить градиент функционала по объединенному вектору весов и смещений: [gX,normgX] = calcgx(net,X,Pd,BZ,IWZ,LWZ,N,Ac,El,perf,1,5); gX' ans = 0.172 0.154 0.06 0.042 0.078 0.08 0.012 0.024 0.01 0.020 0.046 0.032 0.032 0.014 0.44 0.380 normgX normgX = 0.6440 Поскольку в сети присутствуют ЛЗ, то в данном случае вычисляется градиент Элмана. Сопутствующие функции: CALCJX, CALCJEJJ. CALCJX Расчет функции Якоби функционала качества относительно объединенной матрицы весов и смещений Синтаксис: jx = calcjx(net,PD,BZ,IWZ,LWZ,N,Ac,Q,TS) Описание: Функция jX = calcjx(net, PD, BZ, IWZ, LWZ, N, Ac, Q, TS) вычисляет функцию Якоби функционала качества относительно объединенной матрицы весов и смещений. Входные аргументы: net – имя нейронной сети; PD – массив задержанных входов; BZ – массив векторов смещений; IWZ – массив взвешенных векторов входа; LWZ – массив взвешенных векторов выхода; N – массив входов функций активации; Ac – массив векторов, объединяющих выходы нейронов и слоя; Q – число выборок; TS – размер выборки. Выходные аргументы: jX – якобиан функционала качества относительно объединенной матрицы весов и смещений. 434 Нейронные сети. MATLAB 6 Пример: Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и ЛЗ на входе с параметрами [0 2 4]; в сети используется обратная связь с ЛЗ [1 2]. net = newlin([0 1],2, [0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для пяти шагов по времени, вектор начальных условий на ЛЗ входов Pi: P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P]; Pd = calcpd(net,5,1,Pc); Зададим 2 начальных значения запаздывающих выходов слоя для каждого из двух нейронов и цели слоя для двух нейронов на 5 шагов по времени: Ai = {[0.5; 0.1] [0.6; 0.5]}; Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]}; Извлечем из описания сети объединенный вектор весов и смещений сети и вычислим функционал качества и сигналы сети: X = getx(net); [perf,El,Ac,N,BZ,IWZ,LWZ] = calcperf(net,X,Pd,Tl,Ai,1,5); Теперь можно применить функцию calcjx, чтобы вычислить якобиан функционала качества по объединенной матрице весов и смещений: jX = calcjx(net,Pd,BZ,IWZ,LWZ,N,Ac,1,5); jX jX = 0 0 –0.4000 0 –0.2000 0 –0.6000 0 –0.5000 0 –0.5000 0 –0.1000 0 –1.0000 0 0 0 0 –0.4000 0 –0.2000 0 –0.6000 0 –0.5000 0 –0.5000 0 –0.1000 0 –1.0000 0.1000 0 0.1000 0 –0.3000 0 0 0 0 0 –0.6000 0 –0.5000 0 –1.0000 0 0 –0.3000 0 –0.6000 –0.1000 0 –0.3000 0 0 0 0 –0.1000 –0.1000 0 0 0 0 –0.4000 0 –0.1000 –0.30 0 –0.4000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 –0.6000 0 0 0 0 0 0 0 –0.5000 0 0 0 0 –1.0000 0 –1.0000 –1.0000 0 –1.0000 0 0 –0.4000 0 –0.6000 0 –0.4000 0 –0.3000 0 –0.1000 0 –0.3000 0 0 0 –0.1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 –1.0000 0 –1.0000 0 –1.0000 Сопутствующие функции: CALCGX, CALCJEJJ. 11. Формирование моделей нейронных сетей 435 CALCJEJJ Расчет градиента и приближенной функции Гессе для функционала качества Синтаксис: [je,jj,normje] = calcjejj(net,Pd,BZ,IWZ,LWZ,N,Ac,El,Q,TS,MR) Описание: Функция [je, jj, normgX] = calcjejj(net, PD, BZ, IWZ, LWZ, N, Ac, El, Q, TS, MR) вычисляет градиент, матрицу, аппроксимирующую гессиан, и норму градиента функционала качества. Входные аргументы: net – имя нейронной сети; PD – массив задержанных входов; BZ – массив векторов смещений; IWZ – массив взвешенных векторов входа; LWZ – массив взвешенных векторов выхода; N – массив входов функций активации; Ac – массив векторов, объединяющих выходы нейронов и слоя; El – массив ошибок слоя; Q – число выборок; TS – размер выборки; MR – коэффициент экономии памяти. Выходные аргументы: je – градиент функционала качества; jj – матрица, аппроксимирующая гессиан функционала качества; normgX – норма градиента функционала качества. Применение функции: Функция calcjejj вычисляет градиент je и матрицу jj, аппроксимирующую гессиан функционала качества, которые используются в алгоритмах минимизации функции многих переменных. Функционал качества как функция настраиваемых параметров нейронной сети и является такой многомерной функцией. Как градиент, так и матрица, аппроксимирующая гессиан функционала качества, связаны с якобианом функционала следующими соотношениями: градиент рассчитывается по формуле (11.10) g JT e , а гессиан может быть приближенно вычислен как (11.11) H JT J , где J – матрица Якоби производных функционала качества по настраиваемым параметрам; e – вектор ошибок сети. Вычисление якобиана может потребовать больших объемов памяти для хранения матриц. Поэтому, как это часто делается при работе с матрицами, выполним ее декомпозицию, т. е. представим матрицу в виде разбиения на несколько подматриц. Если выделить 2 подматрицы; то соотношение (11.11) может быть записано в виде 436 Нейронные сети. MATLAB 6 J T H J T J 1T J 1 J 2 J T J J 2 1T 1 J 2 J 1 J 1T J 2 . J T2 J 2 (11.12) В этом случае уже не требуется хранить полную матрицу Якоби, а оценка гессиана может быть вычислена с использованием подматриц меньших размеров. Причем в процессе вычислений использованные подматрицы могут быть удалены из оперативной памяти. Разбиение матрицы на подматрицы регулирует коэффициент экономии памяти mr, который указывает, на какое число подматриц разбивается исходная матрица. Если параметр mr равен 1, то используется полная матрица Якоби; если mr равен 2, то матрица Якоби разбивается по строкам на 2 подматрицы. Это экономит половину объема памяти, требуемой для вычисления полного якобиана. Пример: Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и ЛЗ на входе с параметрами [0 2 4]; в сети используется обратная связь с ЛЗ [1 2]. net = newlin([0 1],2, [0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; net.iw ans = [23 double] net.lw ans = [24 double] net.b ans = [21 double] Данная сеть имеет 16 настраиваемых параметров: 6 элементов весовой матрицы входа, 8 элементов весовой матрицы в обратной связи и 2 элемента вектора смещения. Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для пяти шагов по времени, вектор начальных условий на ЛЗ входов Pi: P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P]; Pd = calcpd(net,5,1,Pc); Зададим 2 начальных значения запаздывающих выходов слоя для каждого из двух нейронов и цели слоя для двух нейронов на 5 шагов по времени: Ai = {[0.5; 0.1] [0.6; 0.5]}; Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]}; Извлечем из описания сети объединенный вектор весов и смещений сети и вычислим функционал качества и сигналы сети: X = getx(net); [perf,El,Ac,N,BZ,IWZ,LWZ] = calcperf(net,X,Pd,Tl,Ai,1,5); В заключение используем функцию calcjejj, задав коэффициент экономии памяти равным 2: tic, [je,jj,normje] = calcjejj(net,Pd,BZ,IWZ,LWZ,N,Ac,El,1,5,2); toc 11. Формирование моделей нейронных сетей 437 elapsed_time = 0.8800 je' ans = –0.860 –0.770 –0.300 –0.210 –0.390 –0.400 –0.060 –0.120 –0.050 –0.100 –0.230 –0.160 –0.160 –0.070 –2.200 –1.900 jj jj = 0.6200 0 0.1900 0 0 0.6200 0 0.1900 0.1900 0 0.2700 0 0 0.1900 0 0.2700 0.2100 0 0.1200 0 0 0.2100 0 0.1200 0 0 0.2400 0 0 0 0 0.2400 0 0 0.2000 0 0 0 0 0.2000 0.0600 0 0.2600 0 0 0.0600 0 0.2600 0.0500 0 0.0900 0 0 0.0500 0 0.0900 1.4000 0 0.9000 0 0 1.4000 0 0.9000 0.2100 0 0 0 0 0 0.0600 0 0 0.2100 0 0 0 0 0 0.0600 0.1200 0 0.2400 0 0.2000 0 0.2600 0 0 0.1200 0 0.2400 0 0.2000 0 0.2600 0.3000 0 0.1200 0 0.1000 0 0.2800 0 0 0.3000 0 0.1200 0 0.1000 0 0.2800 0.1200 0 0.3600 0 0.3000 0 0.3000 0 0 0.1200 0 0.3600 0 0.3000 0 0.3000 0.1000 0 0.3000 0 0.2500 0 0.2500 0 0 0.1000 0 0.3000 0 0.2500 0 0.2500 0.2800 0 0.3000 0 0.2500 0 0.6100 0 0 0.2800 0 0.3000 0 0.2500 0 0.6100 0.1700 0 0.0600 0 0.0500 0 0.3500 0 0 0.1700 0 0.0600 0 0.0500 0 0.3500 1.0000 0 0.6000 0 0.5000 0 1.1000 0 0 1.0000 0 0.6000 0 0.5000 0 1.1000 0.0500 0 1.4000 0 0 0.0500 0 1.4000 0.0900 0 0.9000 0 0 0.0900 0 0.9000 0.1700 0 1.0000 0 0 0.1700 0 1.0000 0.0600 0 0.6000 0 0 0.0600 0 0.6000 0.0500 0 0.5000 0 0 0.0500 0 0.5000 0.3500 0 1.1000 0 0 0.3500 0 1.1000 0.2600 0 0.6000 0 0 0.2600 0 0.6000 0.6000 0 5.0000 0 0 0.6000 0 5.0000 Результаты будут одинаковыми при любом значении коэффициента экономии памяти, однако время вычислений будет расти. Увеличим коэффициент экономии памяти до значения 4: tic, [je,jj,normje] = calcjejj(net,Pd,BZ,IWZ,LWZ,N,Ac,El,1,5,4); toc elapsed_time = 0.9900 Как и следовало ожидать, время вычислений увеличилось от 0.88 с до 0.99 с, т. е. на 12 %. Сопутствующие функции: CALCJX. Операции с массивами данных Входной массив P, соответствующий TS моментам времени, может быть представлен в виде массива ячеек Pseq, каждая из которых содержит данные для фиксированного момента времени (сечение по времени): Pseq = { [p1(1), p2(1), …, pQ(1)] [p1(2), p2(2), …, pQ(2)] ……… [p1(TS), p2(TS), …, pQ(TS)] }. Этот массив имеет TS ячеек, каждая из которых содержит числовой массив размера RQ. Такое описание входного массива ячеек соответствует последовательному представлению наблюдаемых данных во времени. Если сформировать временные последовательности, то входной массив Р можно описать иначе. Тогда можно говорить о том, что на вход сети подается R реализаций из интервала времени [1 TS], которые могут быть описаны следующим числовым массивом Pcon: Pcon = [ [p1(1), p1(2), …, p1(TS)]; [p2(1), p2(2), …, p2(TS)]; ……. ; [pQ(1), pQ(2), …, pQ(TS)] ]. 438 Нейронные сети. MATLAB 6 Представление входов как числового массива реализаций в формате double соответствует групповому представлению данных. Преобразование массива числовых ячеек в массив double CELL2MAT Синтаксис: M = cell2mat(C) Описание: Функция M = cell2mat(C) преобразует массив числовых ячеек C = {M11 M12 ... ; M21 M22 ... ; ...} в числовой массив M = [M11 M12 ...; M21 M22 ... ; ...]. Пример: С = {[1 2] [3]; [4 5; 6 7] [8; 9]}; cellplot(С) % Рис. 11.63 Рис. 11.63 M = cell2mat(С) M = 1 2 4 5 6 7 3 8 9 Сопутствующие функции: MAT2CELL. COMBVEC Объединение выборок разных размеров Синтаксис: P = combvec(P1, P2, …) Описание: Функция P = combvec(P1, P2, …) объединяет выборки разных размеров в единую выборку по следующему правилу. Процедура выполняется рекуррентно так, что на каждом шаге объединяются только 2 выборки. Рассмотрим первый шаг, когда объединяются массивы P1 размера m1n1 и P2 размера m2n2. Тогда образуется массив вида 11. Формирование моделей нейронных сетей 439 P1 P1 P2 (1,1) P2 (2,1) P= P2 (1, n2) P2 (2, n2) P1 P2 (m2,1) . P2 (m2, n2) Этот массив имеет m1+m2 строк и n1n2 столбцов. На следующем шаге массив Р принимается за Р1, а массив Р3 – за массив Р2 и процедура повторяется. Пример: Рассмотрим следующие 2 выборки Р1 и Р2 и рассчитаем объединенную выборку Р: P1 = [1 2 3; 4 5 6]; P2 = [7 8; 9 10]; P = combvec(P1,P2) P = 1 2 3 4 5 6 7 7 7 9 9 9 1 4 8 10 2 5 8 10 3 6 8 10 Добавим выборку Р3: P3 = [4 5 6]; P = combvec(P,P3) P = 1 4 7 9 4 2 5 7 9 4 3 1 2 3 6 4 5 6 7 8 8 8 9 10 10 10 4 4 4 4 1 4 7 9 5 2 5 7 9 5 3 1 2 3 6 4 5 6 7 8 8 8 9 10 10 10 5 5 5 5 1 4 7 9 6 2 5 7 9 6 3 1 2 3 6 4 5 6 7 8 8 8 9 10 10 10 6 6 6 6 Тот же самый результат будет получен, если применить оператор P = combvec(P1,P2,P3). Прямое и обратное преобразования группового и последовательного представления данных CON2SEQ, SEQ2CON Синтаксис: S = con2seq(P) S = con2seq(P, TS) P = seq2con(S) Описание: Функция S = con2seq(P) преобразует числовой массив P размера QTS, соответствующий групповому представлению данных, в массив ячеек S размера 1TS, содержащих числовые массивы размера Q1 и соответствующий последовательному представлению данных. Функция S = con2seq(P, TS) преобразует массив ячеек P размера Qm*TS, соответствующий групповому представлению данных, в массив ячеек S размера QTS, соответствующий последовательному представлению. При этом каждая ячейка содержит числовой массив размера 1m. 440 Нейронные сети. MATLAB 6 Функция P = seq2con(S) преобразует массив ячеек S размера QTS, содержащих числовые массивы размера Rm, в массив ячеек Р размера Q1. При этом каждая ячейка содержит числовой массив размера Rm*TS. Пример: Преобразуем числовой массив P размера 23, соответствующий групповому представлению данных, в массив ячеек S размера 13, содержащих числовые массивы размера 21, соответствующий последовательному представлению данных: P = [1 4 2; 2 5 3] S = con2seq(P) p2 = [21 double] [21 double] [21 double] Преобразуем массив ячеек P размера Q1, содержащих массивы размера Rm*TS, который соответствует структуре группового представления, в массив ячеек S размера QTS, содержащих массивы размера Rm, который соответствует структуре последовательного представления данных: P = { [1 2; 1 2]; [3 4; 3 4]; [5 6; 5 6] }; S = con2seq(P,2) S = [21 double] [21 double] [21 double] [21 double] [21 double] [21 double] Этому массиву соответствует следующее описание: cell2mat(S), cellplot(S) ans = 1 1 3 3 5 5 2 2 4 4 6 6 Преобразуем массив ячеек S размера QTS, содержащих числовые массивы размера Rm, в массив ячеек Р размера Q1. При этом каждая ячейка содержит числовой массив размера Rm*TS: S = {[1; 1] [5; 4] [1; 2]; [3; 9] [4; 1] [9; 8]} P = seq2con(S) S = [21 double] [21 double] [21 double] [21 double] [21 double] [21 double] 11. Формирование моделей нейронных сетей 441 P = [23 double] [23 double] Сформируем числовой массив P, соответствующий групповому представлению: P = cell2mat(P) P = 1 5 1 4 3 4 9 1 1 2 9 8 Сопутствующие функции: CONCUR. CONCUR Создание группы векторов смещений Синтаксис: B = concur(b, q) Описание: Функция B = concur(b, q) преобразует вектор смещения b размера S1 или массив ячеек размера Nl1, содержащий векторы смещения для Nl слоев сети, в массив размера Sq или в массив ячеек размера Nl1, содержащий числовые массивы размера Sq. Примеры: Функция concur создает 3 копии вектора смещения для данного слоя нейронной сети: b = [1; 3; 2; –1]; B = concur(b,3) ans = 1 1 1 3 3 3 2 2 2 –1 –1 –1 Двухслойная нейронная сеть имеет 2 вектора смещения, которые для применения функции concur необходимо объединить в вектор ячеек: b1 = [1; 3; 2; –1]; b2 = [3; 2; –1]; b = {b1; b2} B = concur(b,3) b = [41 double] [31 double] B = [43 double] [33 double] 442 Нейронные сети. MATLAB 6 Применение функции: Следующий оператор вычисляет взвешенный вход для слоя с функцией накопления netsum, двумя векторами весов и одним вектором смещения: n = netsum(z1, z2, b) Это соотношение реализуется, если векторы z1, z2 и имеют одинаковые размеры, например Sq. Однако если сеть моделируется с помощью функций sim, adapt или train как отклик на q групп векторов, то массивы z1 и z2 должны иметь размер Sq. Прежде чем объединить вектор смещения b с массивами z1 и z2, следует сделать q его копий: n = netsum(z1,z2,concur(b,q)) Сопутствующие функции: NETSUM, NETPROD, SIM, SEQ2CON, CON2SEQ. IND2VEC, VEC2IND Прямое и обратное преобразования вектора индексов классов в матрицу связности Синтаксис: vec = ind2vec(ind) ind = vec2ind(vec) Описание: Функция vec = ind2vec(ind) преобразует вектор индексов классов в матрицу связности с единицами в каждом столбце, расположенными в строке, соответствующей значению индекса. Матрица связности определена в классе разреженных матриц. Функция ind = vec2ind(vec) преобразует матрицу связности в вектор индексов классов так, что индекс класса соответствует номеру строки. Примеры: Преобразовать вектор индексов классов в матрицу связности. ind = [1 3 2 3], vec = ind2vec(ind), vec = full(vec) ind = 1 3 2 3 vec = vec = (1,1) 1 1 0 0 (3,2) 1 0 0 1 (2,3) 1 0 1 0 (3,4) 1 0 0 1 Преобразовать матрицу связности в вектор индексов классов. vec = [1 0 0 0; 0 0 1 0; 0 1 0 1]; ind = vec2ind(vec) ind = 1 3 MAT2CELL 2 3 Преобразование числового массива в массив ячеек Синтаксис: C = mat2cell(M, mrow, ncol) 11. Формирование моделей нейронных сетей 443 Описание: Функция C = mat2cell(M, mrow, ncol) преобразует числовой массив M размера rowcol в массив ячеек, содержащих блоки, разбиение на которые задается векторами mrow и ncol. При этом должно соблюдаться условие: sum(mrow) = row, sum(ncol) = col. Пример: Преобразовать числовой массив М размера 34 в массив ячеек с разбиением mrow = [2 1], ncol = [1 2 1]. M = [1 2 3 4; 5 6 7 8; 9 10 11 12]; C = mat2cell(M,[2 1],[1 2 1]) C = [21 double] [22 double] [21 double] [ 9] [12 double] [ 12] [C{1,:}; C{2,:}] ans = 1 2 3 4 5 6 7 8 9 10 11 12 Сопутствующие функции: CELL2MAT. MINMAX Вычисление минимальных и максимальных элементов векторов входа Синтаксис: pr = minmax(P) Описание: Функция pr = minmax(P) вычисляет минимальные и максимальные значения элементов массива P векторов входа размера RQ и возвращает массив pr размера R2 минимальных и максимальных значений строк массива P. Примеры: P = [0 1 2; –1 –2 –0.5]; pr = minmax(P) pr = 0 2.0000 –2.0000 –0.5000 NORMC, NORMR Нормировка матрицы по строкам и столбцам Синтаксис: Mr = normr(M) Mc = normc(M) Описание: Функция Mr = normr(M) нормирует длины строк матрицы M к 1. Функция Mc = normc(M) нормирует длины столбцов матрицы M к 1. 444 Нейронные сети. MATLAB 6 Примеры: Нормировать матрицу М по строкам и столбцам. M = [1 2; 3 4]; normr(M) ans = 0.4472 0.8944 0.6000 0.8000 normc(M) ans = 0.3162 0.4472 0.9487 0.8944 Анализируя результаты, нетрудно убедиться, что нормированные первая строка и второй столбец одинаковы, поскольку они коллинеарны. Сопутствующие функции: PNORMC. Псевдонормировка столбцов матрицы PNORMC Синтаксис: pM = pnormc(M,r) Описание: Функция pM = pnormc(M, r) нормирует столбцы до заданной длины r, добавляя дополнительную строку к исходной матрице. Такая операция определена как псевдонормировка матрицы. Необходимо соблюдать условие, чтобы длина столбцов исходной матрицы не превышала r. При вызове функции с одним входным аргументом в форме pM = pnormc(M) по умолчанию принимается, что r равно 1. Пример: M = [0.1 0.6; 0.3 0.1]; pM = pnormc(M) pM = 0.1000 0.6000 0.3000 0.1000 0.9487 0.7937 Сопутствующие функции: NORMC, NORMR. QUANT Округление элементов массива до ближайшего кратного базису округления Синтаксис: qP = quant(P, q) 11. Формирование моделей нейронных сетей 445 Описание: Функция qP = quant(P, q) округляет элементы массива Р до ближайшего значения, кратного базису округления q. Пример: Округлим элементы массива Р с точностью до 0.1: P = [1.333 4.756 –3.897]; qP = quant(P,0.1) qP = 1.3000 4.8000 –3.9000 Сумма квадратов элементов массива SUMSQR Синтаксис: s = sumsqr(M) Описание: Функция s = sumsqr(M) вычисляет сумму квадратов всех элементов массива M. Пример: M = [ 1 2 3; 4 5 6]; s = sumsqr(M) s = 91 Графические утилиты Отображение векторов в виде линий PLOTV Синтаксис: plotv(P, LineStyle) Описание: Функция plotv(P, LineStyle) строит векторы столбцов массива входа Р размера RQ; строковая переменная LineStyle позволяет задать тип линии согласно следующей таблице. Тип линии Непрерывная Штриховая Двойной пунктир Штрихпунктирная Значение LineStyle '–', по умолчанию '– –' ':' '–.' Число строк R массива Р должно быть не меньше чем 2; при значениях R, больших, чем 2, для построения графика используются только первые 2 строки массива Р. Пример: P = [–0.4 0.7 0.2; 446 Нейронные сети. MATLAB 6 –0.5 0.1 0.5]; plotv(P,'–'); % Рис.11.64 Результат построения представлен на рис. 11.64. Рис. 11.64 Сопутствующие функции: PLOTVEC. Отображение векторов входа в виде маркеров PLOTVEC Синтаксис: plotvec(P,color,Marker) plotvec(P) hh = plotvec(...) Описание: Функция plotvec(P, color, Marker) отображает векторы столбцов массива входа Р размера RQ в виде маркеров, цвет каждого из которых задается элементами вектор-строки color; строковая переменная Marker позволяет задать тип маркера согласно следующей таблице. Тип маркера Плюс Точка Звездочка Кружок Крест Квадрат Ромб Значение Marker '+', по умолчанию '.' '*' 'o' 'x' 's' 'd' Тип маркера Пятигранник Шестигранник Стрелка вниз Стрелка вверх Стрелка влево Стрелка вправо Значение Marker 'p' 'h' 'v' '^' '<' '>' Число строк R массива Р должно быть не меньше чем 2; для отображения маркеров используются первые 2 или 3 строки массива Р. Графики строятся либо в двумерном, либо в трехмерном пространстве соответственно. Функция plotvec(P) использует тип маркера по умолчанию, а элементы вектор-строки color соответствуют номеру столбца массива Р. Функция hh = plotvec(...) возвращает вектор дескрипторов для всех маркеров. 11. Формирование моделей нейронных сетей 447 Пример: P =[ 0.1000 1.0000 0.5000 –1.0000 2.0000 0.5000 1.0000 0.1000 0.7000 t = minmax(P)'; axis(t(:)') c = [1 2 3 4]; plotvec(P,c,’o’) % Рис.11.65 0.7000 0.1000 0.5000]; Результат представлен на рис. 11.65. Рис. 11.65 Сопутствующие функции: PLOTV. PLOTPV Отображение векторов входов и целей в виде маркеров Синтаксис: plotpv(P,T) plotpv(P,T,v) Описание: Функция plotpv(P, T) отображает векторы столбцов массива входа Р размера RQ и массива целей размера SQ в виде маркеров различного типа. Число строк этих массивов R и S должно быть не более трех. Функция plotpv(P, T, v) позволяет задать пределы построения графика: для двумерных векторов в виде вектора [x_min x_max y_min y_max]; для трехмерных векторов в виде вектора [x_min x_max y_min y_max z_min z_max]. Пример: Определим выходы и цели персептрона: P = [0 0 1 1; 0 1 0 1; 1 0 0 1]; T = [0 0 0 1]; plotpv(P,T) % Рис.11.66 448 Нейронные сети. MATLAB 6 Результат представлен на рис. 11.66. Рис. 11.66 Сопутствующие функции: PLOTPC. PLOTPC Построение разделяющей линии или плоскости в пространстве векторов входа для персептрона Синтаксис: plotpc(W,b) plotpc(W,b,hh) h = plotpc(…) Описание: Функция plotpc(W, b) строит разделяющую линию или плоскость, если заданы матрица весов W размера SR и вектор смещений размера S1, причем значение R должно быть не более трех. Разделяющая линия или плоскость строятся в пространстве векторов входа, координатные оси которого предварительно формируются с помощью функции plotpv. Функция plotpc(W, b, hh) иcпользует вектор hh дескрипторов графических объектов Line последних построенных линий и удаляет их перед тем, как построить новую разделяющую линию или плоскость. Функция h = plotpc(...) возвращает вектор дескрипторов вновь созданных графических объектов Line. Примеры: Определим векторы входов и целей и отобразим их в двумерном пространстве входов: P = [0 0 1 1; 0 1 0 1]; T = [0 0 0 1]; plotpv(P,T) Создадим персептрон со входами P, зададим произвольные значения весам и смещениям и построим разделяющую линию в пространстве входов: net = newp(minmax(P),1); 11. Формирование моделей нейронных сетей 449 net.iw{1,1} = [–1.2 –1]; net.b{1} = 1.3; plotpc(net.iw{1,1},net.b{1}) % Рис.11.67 На рис. 11.67 построено начальное положение разделяющей линии и требуется выполнить процедуру настройки параметров персептрона, чтобы правильно классифицировать векторы входа. Рис. 11.67 Перейдем к построению разделяющей плоскости в трехмерном пространстве: P = [0 0 1 1; 0 1 0 1; 1 0 0 1]; T = [0 0 0 1]; plotpv(P,T) Следующие функции создают персептрон со входами, соответствующими значениям вектора P, назначают значения его весам и смещениям и строят разделяющую плоскость: net = newp(minmax(P),1); net.iw{1,1} = [–1.2 –1 –0.5]; net.b{1} = 1.3; plotpc(net.iw{1,1},net.b{1}) % Рис.11.68 Результат представлен на рис. 11.68. 450 Нейронные сети. MATLAB 6 Рис. 11.68 Анализ рис. 11.68 позволяет сделать вывод, что векторы входов и цели в начальном состоянии находятся по разные стороны от плоскости. Сопутствующие функции: PLOTPV. Диаграмма Хинтона для весов HINTONW Синтаксис: hintonw(W,maxw,minw) hintonw(W) Описание: Функция hintonw(W, maxw, minw) отображает значения элементов матрицы весов W размера SR в виде диаграммы Хинтона; при этом аргумент maxw соответствует максимальному, а minw – минимальному элементу весовой матрицы. Диаграмма Хинтона – это прямоугольная сетка, в узлах которой изображаются квадраты, площадь которых пропорциональна значению соответствующего веса; цвет квадрата соответствует знаку веса: красный (темный) для отрицательных и зеленый (светлый) для положительных весов. Функция hintonw(W) использует по умолчанию для аргумента maxw значение max(max(abs(W))), а для аргумента minw значение maxw/100. Пример: Зададим случайную матрицу весов и построим для нее диаграмму Хинтона (рис. 11.69), используя значения дополнительных аргументов по умолчанию: W = rands(4,5) W = 0.9003 0.7826 –0.5377 0.5242 0.2137 –0.0871 –0.0280 –0.9630 0.6428 –0.1106 0.2309 0.5839 0.8436 0.4764 –0.6475 –0.1886 11. Формирование моделей нейронных сетей 0.8709 0.8338 –0.1795 0.7873 451 hintonw(W) % Рис.11.69 Рис. 11.69 Сопутствующие функции: HINTONWB. HINTONWB Диаграмма Хинтона для весов и смещений Синтаксис: hintonwb(W,b,maxw,minw) hintonwb(W,b) Описание: Функция hintonw(W, b, maxw, minw) отображает значения элементов матрицы весов W размера SR и вектора смещений размера S1 в виде диаграммы Хинтона; при этом аргумент maxw соответствует максимальному, а minw – минимальному элементу весовой матрицы. Элементы вектора смещений показаны в левой части диаграммы. Функция hintonw(W, b) использует по умолчанию для аргумента maxw значение max(max(abs(W))), а для аргумента minw значение maxw/100. Пример: Зададим случайные матрицу весов и вектор смещений и построим для них диаграмму Хинтона (рис. 11.70), используя значения дополнительных аргументов по умолчанию: W = rands(4,5); b = rands(4,1); hintonwb(W,b) % Рис.11.70 452 Нейронные сети. MATLAB 6 Рис. 11.70 Сопутствующие функции: HINTONW. PLOTPERF График функции качества обучения Синтаксис: plotperf(tr,goal,name,epoch) plotperf(tr) Описание: Функция plotperf(TR, goal, name, epoch) предназначена для построения графиков критерия качества обучения, предельной точности и графиков точности обучения с учетом контрольного и тестового подмножеств. Функция имеет следующие входные аргументы: TR – массив записей с характеристиками обучения, возвращаемый функцией train; goal – предельная точность, по умолчанию NaN; name – имя обучающей функции, по умолчанию ' '; epoch – число циклов обучения. Пример: Зададим 8 значений вектора входа P, соответствующий им вектор целей T, а также контрольное подмножество в виде векторов VV.P и VV.T: P = 1:8; T = sin(P); VV.P = P; VV.T = T+rand(1,8)*0.1; Создадим и обучим двухслойную сеть прямой передачи с четырьмя нейронами в первом слое с функцией активации tansig и одним нейроном во втором слое также с функцией активации tansig: net = newff(minmax(P),[4 1],{'tansig','tansig'}); [net,tr] = train(net,P,T,[],[],VV); 11. Формирование моделей нейронных сетей 453 В процессе выполнения процедуры train для построения графика точности обучения также применяется функция plotperf, и во многих случаях этого бывает достаточно для оценки процедуры обучения. Однако функция plotperf позволяет оформить графики результатов обучения и по завершении этой процедуры, используя дополнительные аргументы. Например, выполняя обучение с предельной точностью, заданной по умолчанию, на заключительном графике можно указать требуемую точность и оценить длительность обучения (рис. 11.71): plotperf(tr, 0.005) % Рис.11.71 Рис. 11.71 Для достижения требуемой точности обучения, равной 0.005, требуется не более 10 циклов. Сопутствующие функции: TRAIN. ERRSURF, PLOTES Вычисление и построение графика поверхности ошибки для нейрона Синтаксис: ES = errsurf(p,t,wv,bv,f) plotes(wv,bv,ES,v) Описание: Функция ES = errsurf(p, t, wv, bv, f) вычисляет массив ES, описывающий поверхность ошибки для нейрона с одним вектором входа p размера 1Q, одним вектором целей t размера 1Q; также должны быть заданы векторы весов wv и смещений b и функция активации нейрона f. Функция plotes(wv, bv, ES, v) строит график поверхности ошибок и линий уровня для нейрона в зависимости от весов wv и смещений b, если задан массив ES, вычисленный с помощью функции errsurf. Для удобства изображения поверхности в трехмерном пространстве можно изменять значение вектора v, который задает направление угла зрения, по умолчанию вектор v равен [–37.5, 30]. 454 Нейронные сети. MATLAB 6 Пример: p = [3 2]; t = [0.4 0.8]; wv = –4:0.4:4; bv = wv; ES = errsurf(p,t,wv,bv,'logsig'); plotes(wv,bv,es,[60 30]) % Рис.11.72 Результат построения представлен на рис. 11.72. Рис. 11.72 Сопутствующие функции: PLOTEP. PLOTEP Построение траектории обучения на поверхности ошибки Синтаксис: h = plotep(w,b,e) h = plotep(w,b,e,h) Описание: Функция h = plotep(w, b, e) строит изображающую точку на графиках поверхности ошибок и линий уровня, построенных с помощью функции plotes. Входные аргументы: w – текущий вектор весов; b – текущий вектор смещений; e – текущая ошибка. Выходные аргументы: h – дескриптор, содержащий информацию для построения изображающей точки. Функция h = plotep(w, b, e, h) – это рекуррентная форма вышеописанной функции, которая позволяет построить траекторию движения изображающей точки. 11. Формирование моделей нейронных сетей 455 Применение функции: Возможность применения функции plotep для построения траектории обучения в пространстве настраиваемых параметров поясняется нижеприведенным script-файлом, который описывает сценарий построения такой траектории. Читатель может реализовать этот сценарий на своем компьютере. Авторы предполагают разместить наиболее интересные примеры расчета нейронных сетей в виде М-файлов на сайте www.mathworks.ru. Данный сценарий обязательно будет включен в число этих М-файлов. Script % Задание обучающей последовательности P = 1:8; T = sin(P); % Построение поверхности ошибок w_range = –1:0.2:1; b_range = –1:0.2:1; ES = errsurf(P, T, w_range, b_range, 'purelin'); plotes(w_range, b_range,ES); % Формирование нейронной сети maxlr = 0.40*maxlinlr(P, 'bias'); net = newlin([–2 2], 1, [0], maxlr); % Задание начальной точки subplot(1, 2, 2); h = text(sum(get(gca, 'xlim'))*0.5 sum(get(gca, 'ylim'))*0.5, '*Укажите точку*'); set(h,'horizontal', 'center', 'fontweight', 'bold'); [net.IW{1,1} net.b{1}] = ginput(1); delete(h); % Построение траектории обучения limiting = net.trainParam.epochs; limloop = limiting+1; net.trainParam.epochs = 1; net.trainParam.goal = .001; net.trainParam.show = Inf; h = plotep(net.IW{1}, net.b{1}, mse(T–sim(net, P))); [net, tr] = train(net, P, T); r = tr; epoch = 1; cont = 1; while (length(r.epoch)<limloop & cont) epoch = epoch+1; [net, tr]=train(net, P, T); if length(tr.epoch)>1 h = plotep(net.IW{1,1}, net.b{1}, tr.perf(2), h); r.epoch = [r.epoch epoch]; r.perf = [r.perf tr.perf(2)]; r.vperf = [r.vperf NaN]; r.tperf = [r.tperf NaN]; else cont = 0; end; end; Рис. 11.73 456 Нейронные сети. MATLAB 6 На рис. 11.73 показан результат выполнения сценария для построения траектории обучения в пространстве настраиваемых параметров. Траектории обучения наглядно видны на графиках линий уровня. Сопутствующие функции: ERRSURF, PLOTES. Информация о сети и ее топологии DISP, DISPLAY Вывод на экран свойств нейронной сети Синтаксис: disp(net) display(net) Описание: Команда disp(net) выводит на экран свойства нейронной сети с именем net. Команда display(net) выводит на экран не только свойства нейронной сети, но и ее имя. Пример: Создадим персептрон и выведем на экран его свойства: net = newp([–1 1; 0 2],3); display(net) net = Neural Network object: architecture: numInputs: 1 numLayers: 1 biasConnect: [1] inputConnect: [1] layerConnect: [0] outputConnect: [1] targetConnect: [1] numOutputs: 1 (read–only) numTargets: 1 (read–only) numInputDelays: 0 (read–only) numLayerDelays: 0 (read–only) subobject structures: inputs: {11 cell} of inputs layers: {11 cell} of layers outputs: {11 cell} containing targets: {11 cell} containing biases: {11 cell} containing inputWeights: {11 cell} containing layerWeights: {11 cell} containing functions: adaptFcn: ‘adaptwb’ initFcn: ‘initlay’ performFcn: ‘mae’ trainFcn: ‘trainwb’ 11. Формирование моделей нейронных сетей 1 output 1 target 1 bias 1 input weight no layer weights 457 parameters: adaptParam: initParam: performParam: trainParam: .passes (none) (none) .epochs, .goal, .max_fail, .show, .time values: {11 cell} containing 1 input weight matrix {11 cell} containing no layer weight matrices {11 cell} containing 1 bias vector weight and bias IW: LW: b: other: userdata: (user stuff) Справка: help network/disp help network/display Сопутствующие функции: DISP, SIM, INIT, TRAIN, ADAPT. PLOTSOM Отображение топологии карты Кохонена Синтаксис: plotsom(pos) plotsom(W,D,nd) Описание: Функция plotsom(pos) отображает топологию карты Кохонена в виде узлов N-мерной сетки, используя массив координат узлов размера NS, помечает узлы красным цветом и соединяет их линиями. Координаты узлов сетки рассчитываются с помощью М-функций gridtop, hextop, randtop. Размерность сетки при использовании функции plotsom не должна превышать значения 3; если размерность сетки больше, то выводятся только 3 координаты. Функция plotsom(W, D, nd) строит сетку в пространстве весов, задаваемых матрицей W размера SN, если заданы матрица расстояний D размера SS и евклидово расстояние nd между соседними нейронами, по умолчанию равное 1. Пример: Рассмотрим способы отображения двумерных и трехмерных карт Кохонена; для этого с помощью М-функции gridtop рассчитаем сетку с прямоугольной топологией: pos = gridtop(4,3); plotsom(pos) % Рис.11.74,а Для отображения двумерной карты Кохонена в пространстве весов зададим случайную матрицу весов W размера 122 и вычислим матрицу расстояний D на выбранной сетке: W = rand(12,2); D = dist(pos); plotsom(W,D) % Рис.11.74,б 458 Нейронные сети. MATLAB 6 а б Рис. 11.74 Выполним аналогичные построения для трехмерной карты Кохонена: pos = gridtop(4,3,3); plotsom(pos) % Рис.11.75,а D = dist(pos); W = rand(36,3); plotsom(W, D) % Рис.11.75,б а б Рис. 11.75 Сопутствующие функции: NEWSOM, LEARNSOM, INITSOM. 11. Формирование моделей нейронных сетей 459 GRIDTOP Расчет сетки с прямоугольной топологией Синтаксис: gridtop(dim1,dim2,...,dimN) Описание: Функция pos = gridtop(dim1, dim2, ..., dimN) рассчитывает положения нейронов на N-мерной сетке с прямоугольной топологией, если задано число нейронов dimI по размерности i, и возвращает массив координат узлов pos размера NS, где S = N dim i . i 1 Пример: Рассчитать положения нейронов на четырехмерной сетке с прямоугольной топологией размера 5432 и выполнить попытку построить график. pos = gridtop(5,4,3,2); plotsom(pos) % Рис.11.76 Warning – PLOTSOM only shows first three dimensions. Предупреждение – PLOTSOM выводит только 3 размерности. Рис. 11.76 В результате будет построен график только по трем последним размерностям (рис. 11.76). Сопутствующие функции: HEXTOP, RANDTOP. HEXTOP Расчет сетки с гексагональной топологией Синтаксис: pos = hextop(dim1,dim2,...,dimN) Описание: Функция pos = hextop(dim1, dim2, ..., dimN) рассчитывает положения нейронов на N-мерной сетке с гексагональной топологией, если задано число нейронов dimI по размерности i, и возвращает массив координат узлов pos размера NS, где S = N dim . i i 1 Пример: Рассчитать положения нейронов на трехмерной сетке с гексагональной топологией размера 543 с 60 нейронами и построить график их расположения 460 Нейронные сети. MATLAB 6 pos = hextop(5,4,3); plotsom(pos) % Рис.11.77 Рис. 11.77 Сопутствующие функции: GRIDTOP, RANDTOP. RANDTOP Расчет сетки со случайной топологией Синтаксис: pos = randtop(dim1,dim2,...,dimN) Описание: Функция pos = hextop(dim1, dim2, ..., dimN) рассчитывает положения нейронов на N-мерной сетке с гексагональной топологией, если задано число нейронов dimI по размерности i, и возвращает массив координат узлов pos размера NS, где S = N dim . i i 1 Пример: Рассчитать положения нейронов на трехмерной сетке со случайной топологией размера 543 с 60 нейронами и построить график их расположения. pos = randtop(5,4,3); plotsom(pos) % Рис.11.78 Рис. 11.78 Сопутствующие функции: GRIDTOP, HEXTOP. 11. Формирование моделей нейронных сетей 461 NNTOOL Вызов графического интерфейса пользователя Синтаксис: nntool Описание: Команда nntool открывает окно Network/Data Manager (Управление сетью/данными), которое позволяет управлять вводом и выводом данных, создавать, обучать и моделировать нейронные сети. Подробно работа с графическим интерфейсом пользователя ППП Neural Network Toolbox описана в разд. 1.2. 11.9. Моделирование нейронных сетей и система Simulink Функции моделирования сети Моделирование нейронной сети SIM Синтаксис: [Y,Pf,Af,E,perf] = sim(net,P,Pi,Ai,T) [Y,Pf,Af,E,perf] = sim(net,{Q TS},Pi,Ai,T) [Y,Pf,Af,E,perf] = sim(net,Q,Pi,Ai,T) Описание: Функция [Y, Pf, Af E, perf] = sim(net, P, Pi, Ai, T) выполняет моделирование нейронной сети и имеет следующие входные и выходные аргументы. Входные аргументы: net – имя нейронной сети; P – массив входов; Pi – начальные условия на ЛЗ входов, по умолчанию нулевой вектор; Ai – начальные условия на ЛЗ слоев, по умолчанию нулевой вектор; T – вектор целей, по умолчанию нулевой вектор. Выходные аргументы: Y – массив выходов; Pf – состояния на ЛЗ входов после моделирования; Af – состояния на ЛЗ слоев после моделирования; E – массив ошибок; perf – значение функционала качества. Заметим, что аргументы Pi, Ai, Pf и Af являются необязательными и применяются в случае динамических сетей с ЛЗ. Входные аргументы P и T могут иметь 2 формата: cell array и double array. Формат cell array наиболее прост для понимания и соответствует последовательному представлению данных. 462 Нейронные сети. MATLAB 6 Последовательное представление данных. Каждую строку массива ячеек можно рассматривать как временную последовательность, и тогда описание многомерной сети может быть выполнено следующим образом: P – массив ячеек размера NiTS, каждый элемент которого P{i, ts} – числовой массив размера RiQ; T – массив ячеек размера NtTS, каждый элемент которого P{i, ts} – числовой массив размера ViQ; Pi –массив ячеек размера NiID, каждый элемент которого Pi{i, k} – числовой массив размера RiQ; Ai – массив ячеек размера NlLD, каждый элемент которого Ai{i, k} – числовой массив размера SiQ; Y – массив ячеек размера NoTS, каждый элемент которого Y{i, ts} – числовой массив размера UiQ; Pf – массив ячеек размера NiID, каждый элемент которого Pf{i, k} – числовой массив размера RiQ; Af – массив ячеек размера NlLD, каждый элемент которого Af{i, k} – числовой массив размера SiQ. Параметры описания массивов ячеек и их связь с параметрами сети показаны в следующей таблице. Параметр описания Параметр сети 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; 11. Формирование моделей нейронных сетей 463 Ai{i, k} – значение начального условия для линии задержки i-го слоя в момент времени ts = k – LD; Af{i, k} – значение начального условия для линии задержки i-го слоя в момент времени ts = TS + k – LD. Групповое представление данных можно использовать только при адаптации статических сетей (TS = 1). При этом следует помнить, что при переходе от формата последовательного представления данных cell array к формату группового представления double array массив ячеек, содержащий, например, Ni числовых массивов размера RiQ преобразуется в единственный числовой массив размера Ni Ri Q. i 1 Следующая таблица поясняет связь этих форм представления. Формат Аргумент P Cell array Size(P) Size(P{I,1}) Ni1 RiQ Double array Size(P) Ni Ri Q i 1 T Nt1 ViQ Nt Vi Q i 1 Pi NiID RiQ Ni Ri ( ID * Q) i 1 Ai NlLD SiQ Nl Si ( LD * Q) i 1 Y No1 UiQ No U i Q i 1 Pf NiID RiQ Ni Ri ( ID * Q) i 1 Af NlLD SiQ Nl Si ( LD * Q) i 1 Функция [Y, Pf, Af, E, perf] = sim(net, {Q TS}, Pi, Ai, T) применяется для моделирования динамических сетей без входов при последовательном представлении данных. Функция [Y, Pf, Af, E, perf] = sim(net, Q, Pi, Ai, T) применяется для моделирования динамических сетей без входов при групповом представлении данных. 464 Нейронные сети. MATLAB 6 Пример: Создадим нейронную сеть персептрона с одним слоем и двухэлементным входом с диапазоном значений [0 1] и одним нейроном: net = newp([0 1;0 1],1); Теперь можно промоделировать персептрон, подавая различные последовательности векторов входа: 1 вектор с двумя элементами, группа из двух векторов с тремя элементами, последовательность из трех векторов, что соответствует различным формам представления данных: p1 p2 p3 a1 a2 a3 = = = = = = [.2; .9]; a1 = sim(net,p1) [.2 .5 .1 ;.9 .3 .7]; a2 = sim(net,p2) {[.2; .9] [.5; .3] [.1; .7]}; a3 = sim(net,p3) 1 1 1 1 [1] [1] [1] В данном случае в качестве результата выводятся только выходы нейрона. Создадим динамическую однослойную линейную сеть с двумя нейронами, трехэлементным входом с диапазоном значений [0 2] и ЛЗ на входе [0 1]: net = newlin([0 2;0 2;0 2],2,[0 1]); Линейный слой моделируется с последовательностью из двух векторов входа для заданных по умолчанию начальных условия на ЛЗ: p1 = {[2; 0.5; 1] [1; 1.2; 0.1]}; [y1,pf] = sim(net,p1) y1 = [21 double] [21 double] pf = [31 double] Затем этот слой моделируется еще для трех векторов, используя состояния на элементах задержки как новые начальные условия: p2 = {[0.5; 0.6; 1.8] [1.3; 1.6; 1.1] [0.2; 0.1; 0]}; [y2,pf] = sim(net,p2,pf) y2 = [21 double] [21 double] [21 double] pf = [31 double] Создадим двухслойную сеть Элмана с одноэлементным входом с диапазоном значений [0 1], имеющую 3 нейрона с функцией активации tansig в слое 1 и 2 нейрона с функцией активации purelin в слое 2. Сеть Элмана имеет ЛЗ [0 1] при переходе от слоя 1 к слою 2: net = newelm([0 1],[3 2],{'tansig','purelin'}); Сеть моделируется для трехэлементного вектора входа, используя заданные по умолчанию начальные условия на ЛЗ: p1 = {0.2 0.7 0.1}; [y1,pf,af,e,perf] = sim(net,p1) y1 = [21 double] [21 double] pf = Empty cell array: 1–by–0 af = [31 double] 11. Формирование моделей нейронных сетей [21 double] 465 [21 double] e = [21 double] perf = 0.8153 [e{:}] ans = 0.4779 –0.5393 –1.0069 –1.3680 [21 double] [21 double] 1.0238 –0.6627 Выполним еще 1 шаг моделирования, но теперь для четырехэлементного вектора входа, используя состояния на элементах задержки как новые начальные условия: p2 = {0.1 0.9 0.8 0.4}; [y1,pf,af,e,perf] = sim(net,p2,pf,af) y2 = [21 double] [21 double] [21 double] pf = Empty cell array: 1–by–0 af = [31 double] [21 double] e = [21 double] [21 double] [21 double] perf = 0.8560 [e{:}] ans = –0.3919 –0.3637 –0.2766 0.2490 –1.2888 –1.3479 –1.3269 –1.0886 [21 double] [21 double] Cправкa: help network/sim Сопутствующие функции: INIT, ADAPT, TRAIN. 11.9.1. Применение системы Simulink ППП Simulink, входящий в состав программных продуктов фирмы MathWorks, предназначен для моделирования динамических систем, описываемых обыкновенными дифференциальными уравнениями. С описанием этого пакета можно ознакомиться по книгам [51, 52]. Применение Simulink для моделирования нейронных сетей требует расширения библиотеки стандартных модулей моделями блоков, необходимых для сборки нейронных сетей. Это блоки функций взвешивания, накопления и активации, характерные только для нейронных сетей. Эти и другие блоки, необходимые для моделирования нейронных сетей, составляют библиотеку Neural Network Toolbox Block Library. Библиотеки блоков для моделирования нейронных сетей Доступ к библиотеке блоков для моделирования нейронных сетей может быть получен либо из средства просмотра SIMULINK Library Browser (рис. 11.79, а), где имеется доступ к библиотекам блоков всех программных продуктов фирмы MathWorks, установленных на данном компьютере, либо посредством вызова с помощью команды neural библиотеки Neural Network Toolbox Block Library (рис. 11.79, б). 466 Нейронные сети. MATLAB 6 б а Рис. 11.79 Библиотека блоков функций активации. Раскрытие раздела Transfer Functions в окне SIMULINK Library Browser (рис. 11.79, а) либо двойной щелчок левой клавиши мыши в области библиотеки Transfer Functions (рис. 11.79, б) открывают окно, содержащее блоки функций активации (рис. 11.80). Рис. 11.80 Библиотека блоков функций накопления. Раскрытие раздела Net Input Functions в окне SIMULINK Library Browser (рис. 11.79, а) либо двойной щелчок левой клавиши мыши в области библиотеки Net Input Functions (рис. 11.79, б) открывают окно, содержащее блоки функций накопления (рис. 11.81). Рис. 11.81 Библиотека блоков функций взвешивания. Раскрытие раздела Weight Functions в окне SIMULINK Library Browser (рис. 11.79, а) либо двойной щелчок левой клавиши мыши в области библиотеки Weight Functions (рис. 11.79, б) открывают окно, содержащее блоки функций взвешивания (рис. 11.82). 11. Формирование моделей нейронных сетей 467 Рис. 11.82 Эти функции выполняют взвешивание вектора входа, используя формат вектора весов в виде вектор-строки. Поэтому для взвешивания векторов входа с помощью матрицы весов требуется S блоков функций взвешивания, по числу нейронов в слое. Библиотека блоков управляющих устройств для моделирования систем управления. Раскрытие раздела Control Systems в окне SIMULINK Library Browser (рис. 11.79, а) либо двойной щелчок левой клавиши мыши в области библиотеки Control Systems (рис. 11.79, б) открывают окно, содержащее блоки функций для моделирования управляющих устройств систем управления, а также блок осциллографа Graph для построения предельных циклов (рис. 11.83). Рис. 11.83 Подробное описание функций, реализуемых перечисленными блоками, можно найти в соответствующих разделах книги. Построение моделей нейронных сетей GENSIM Формирование S-модели нейронной сети Синтаксис: gensim(net,ST) Описание: Функция gensim(net, ST) формирует S-модель нейронной сети с именем net для ее запуска в среде системы Simulink; аргумент ST задает такт дискретности, который необходим для моделирования динамических сетей. Если сеть не имеет ЛЗ, т. е. является статической системой, то значение ST следует задать равным –1, что соответствует неопределенному такту дискретности. 468 Нейронные сети. MATLAB 6 Пример: Создадим однослойную линейную сеть, реализующую следующее соотношение между входом и целью: P = [1 2 3 4 5]; T = [1 3 5 7 9]; net = newlind(P,T); Для того чтобы сформировать S-модель этой сети, используем команду gensim(net,–1) % Рис.11.84 Рис. 11.84 В результате откроется окно системы Simulink с S-моделью нейронной сети, которая включает блок входа, блок нейронной сети и блок осциллографа (рис. 11.84). Нажатие кнопки Toggle model browser (Включить средство просмотра модели) переводит окно системы Simulink в другое состояние (рис. 11.85). Рис. 11.85 Окно Simulink дополняется средством просмотра модели, расположенным слева от схемы сети. Включение кнопки Show library links и соседней с ней Browse masked subsystems позволяет раскрыть описание структуры нейронной сети и просматривать ее элементы простым выбором того или иного элемента структуры. Рис. 11.86, а–ж, поясняет эту возможность. 11. Формирование моделей нейронных сетей 469 а б в г 470 Нейронные сети. MATLAB 6 д е ж Рис. 11.86 Для подготовки S-модели нейронной сети (см. рис. 11.85) к моделированию следует ввести значение входного сигнала, активизируя двойным щелчком левой клавиши мыши блок Input1. Блок входа позволяет ввести значение некоторой константы; введем значение, равное 2 (рис. 11.87, а). 11. Формирование моделей нейронных сетей 471 а б Рис. 11.87 Теперь можно выполнить моделирование нейронной сети, выбирая опцию Start из меню Simulation либо активизируя кнопку Start simulation на инструментальной панели. После выполнения моделирования активизируем блок Scope, который позволяет увидеть отклик сети на входное воздействие (рис. 11.87, б). Этот отклик равен постоянному значению 3 и свидетельствует о том, что данная нейронная сеть относится к классу статических систем. Теперь рассмотрим пример моделирования динамической сети. Обратимся к сети Элмана, рассмотренной в гл. 8 и связанной с детектированием амплитуды гармонического сигнала. Сформируем и обучим сеть Элмана: 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); R = 1; % Число элементов входа S2 = 1; % Число нейронов выходного слоя S1 = 10; % Число нейронов рекуррентного слоя net = newelm([–2 2],[S1 S2],{'tansig','purelin'},'traingdx'); net.trainParam.epochs = 1000; net.trainParam.show = 25; net.trainParam.goal = 0.01; [net,tr] = train(net,Pseq,Tseq); Создадим S-модель этой сети, дополнив ее блоком To Workspace, который позволяет записать результаты моделирования в виде массива yout в рабочую область системы MATLAB (рис.11.88, а): 472 Нейронные сети. MATLAB 6 gensim(net) а б Рис. 11.88 Структурная схема сети Элмана показана на рис. 11.88, б и представляет двухслойную сеть с обратной связью в первом слое. Задав значение входного сигнала (рис. 11.89, а), выполним моделирование сети и выведем результат в виде графика изменения выхода сети (рис. 11.89, б), используя данные из рабочей области системы MATLAB: stairs(tout(1:5:end),yout) % Рис.11.89,б б а Рис. 11.89 Сеть Элмана приходит в установившееся состояние к 10-му такту времени. Справка: help network/gensim Сопутствующие функции: GENSIMM. GENSIMM Формирование М-файла для моделирования нейронной сети Синтаксис: <имя_файла> = gensimm(net) Описание: Функция <имя_файла> = gensimm(net) генерирует М-файл для моделирования нейронной сети и размещает его в каталоге C:\WINDOWS\TEMP\matlab_nnet\<имя_Мфайла>; этот путь доступа соответствует строковой переменной с именем <имя_файла>. 11. Формирование моделей нейронных сетей 473 Пример: Сформируем М-файл для S-модели сети Элмана: 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); R = 1; % Число элементов входа S2 = 1; % Число нейронов выходного слоя S1 = 10; % Число нейронов рекуррентного слоя net = newelm([–2 2],[S1 S2],{'tansig','purelin'},'traingdx'); netelm = gensimm(net) netelm =C:\WINDOWS\TEMP\matlab_nnet\tp134040.m Выведем на экран терминала текст М-файла: type(netelm) function [perf,El,Ac,N,LWZ,IWZ,BZ] = tp134040(net,Pd,Ai,Tl,Q,TS) %TP134040 Temporary network simulation file. % % [perf,El,Ac,N,LWZ,IWZ,BZ] = tp134040(net,Pd,Ai,Tl,Q,TS) % net – Neural network. % Pd – numInputs–by–numLayers–by–TS cell array of delayed inputs. % Ai – numLayers–by–numLayerDelays cell array of layer delay conditions. % Tl – numLayers–by–TS cell array of layer targets. % Q – number of concurrent simulations. % TS – number of time steps. % returns: % perf – network performance: % El – numLayers–by–TS cell array of layer errors: % Ac – numLayers–by–(numLayerDelays+TS) cell array of layer outputs: % N – numLayers–by–TS cell array of net inputs: % LWZ – numLayers–by–numLayers–by–TS cell array of weighed layer outputs: % IWZ – numLayers–by–numInputs–by–TS cell array of weighed inputs: % BZ – numLayers–by–1 cell array of expanded biases: % Input weights IW1_1 = net.IW{1,1}; % Layer weights LW1_1 = net.LW{1,1}; LW2_1 = net.LW{2,1}; % Biases QOnes = ones(1,Q); B1 = net.b{1}(:,QOnes); B2 = net.b{2}(:,QOnes); BZ = {B1; B2}; 474 Нейронные сети. MATLAB 6 % Signals El = cell(2,TS); Ac = [Ai cell(2,TS)]; N = cell(2,TS); IWZ = cell(2,1,TS); LWZ = cell(2,2,TS); for ts=1:TS; tsc = ts + 1; % Simulate Layer 1 IWZ{1,1,ts} = IW1_1*Pd{1,1,ts}; LWZ{1,1,ts} = LW1_1*Ac{1,tsc–1}; N{1,ts} = IWZ{1,1,ts}+LWZ{1,1,ts}+B1; Ac{1,tsc} = tansig(N{1,ts}); % Simulate Layer 2 LWZ{2,1,ts} = LW2_1*Ac{1,tsc}; N{2,ts} = LWZ{2,1,ts}+B2; Ac{2,tsc} = N{2,ts}; El{2,ts} = Tl{2,ts} – Ac{2,tsc}; end; perf = mse(El,net,net.trainParam); Сформированный М-файл имеет следующие входные и выходные аргументы. Входные аргументы: net – имя нейронной сети; Pd – массив ячеек задержанных входов размера numInputsnumLayersTS; Ai – массив ячеек начальных условий на ЛЗ размера numLayersnumLayerDelays; Tl – массив ячеек векторов целей для слоя размера numLayersTS; Q – число выборок; TS – длина выборки по времени. Выходные аргументы: perf – значение функционала качества; El – массив ячеек ошибок слоя размера numLayersTS; Ac – массив ячеек выходов слоя размера numLayers(numLayerDelays+TS); N – массив ячеек входов размера numLayersTS; LWZ – массив ячеек взвешенных выходов слоя размера numLayersnumLayersTS; IWZ – массив ячеек взвешенных входов слоя размера numLayersnumInputsTS; BZ – массив ячеек для смещений размера numLayers1. Последующие операторы М-файла позволяют видеть, как моделируется нейронная сеть. Сопутствующие функции: SIM. 11. Формирование моделей нейронных сетей 475 ИНДЕКСНЫЙ УКАЗАТЕЛЬ Команды, функции и операторы ППП Neural Network Toolbox Функции формирования сетей Операторы network Назначение Создание шаблона нейронной сети Персептрон newp Создание персептрона Линейные сети newlin Создание линейного слоя newlind Создание линейного слоя путем решения линейного уравнения Многослойные сети newff Создание сети прямой передачи newfftd Создание сети прямой передачи с запаздыванием newcf Создание каскадной сети прямой передачи Радиальные базисные сети newrb Создание радиальной базисной сети newrbe Создание радиальной базисной сети с нулевой ошибкой newgrnn Создание обобщенной регрессионной сети newpnn Создание вероятностной нейронной сети Сети для решения задач классификации newlvq Создание нейронной сети для решения задач классификации Самоорганизующиеся сети netwc Создание конкурирующего слоя Кохонена newsom Создание самоорганизующейся сети Кохонена Рекуррентные сети newhop Создание сети Хопфилда newelm Создание сети Элмана 473 Функции активации и их производные compet Конкурирующая функция активации hardlim Функция активации с жесткими ограничениями hardlims Симметричная функция активации с жесткими ограничениями logsig Логистическая сигмоидальная функция активации poslin Положительная линейная функция активации purelin Линейная функция активации radbas Радиальная базисная функция активации satlin Линейная функция активации с ограничениями satlins Симметричная линейная функция активации с ограничениями softmax Конкурирующая функция активации с мягким максимумом tansig Гиперболическая тангенциальная функция активации tribas Треугольная функция активации dhardlim Производная функции активации с жесткими ограничениями dhardlms Производная симметричной функции активации с жесткими ограничениями dlogsig Производная логарифмической функции активации dposlin Производная положительной линейной функции активации dpurelin Производная линейной функции активации dradbas Производная радиальной базисной функции активации dsatlin Производная линейной функции активации с жесткими ограничениями dsatlins Производная линейной функции активации с симметричными жесткими ограничениями dtansig Производная функции активации гиперболического тангенса dtribas Производная треугольной функции активации типа Функции взвешивания и расстояний boxdist Максимальное координатное смещение dist Евклидово расстояние dotprod Скалярное произведение ddotprod Производная скалярного произведения linkdist Расстояния связи между нейронами слоя 474 Нейронные сети. MATLAB 6 mandist Расстояние суммарного координатного смещения negdist Отрицательное евклидово расстояние normprod Нормированное скалярное произведение Функции накопления netsum Сумма взвешенных входов netprod Поэлементное произведение взвешенных входов dnetsum Производная суммы взвешенных входов dnetprod Производная поэлементного произведения взвешенных входов Функции инициализации init Инициализация нейронной сети initcon Инициализация равных смещений initlay Функция готовности сети к инициализации initnw Функция инициализации слоя по алгоритму NW (Нгуена – Видроу) initwb Функция готовности слоя к инициализации initzero Инициализация нулевых значений весов и смещений midpoint Инициализация матрицы средних значений randnс Инициализация случайной матрицы с нормированными столбцами randnr Инициализация случайной матрицы с нормированными строками rands Инициализация случайных весов/смещений revert Возвращение к ранее установленным значениям весов и смещений Функции адаптации и обучения adapt Адаптация параметров сети adaptwb Функция установки режима адаптации train Обучение нейронной сети trainb Групповое обучение нейронной сети trainbfg Алгоритм обучения Бройтона, Флетчера, Гольдфарба и Шано BFGS) trainbr Алгоритм обучения BR с регуляризацией по Байесу traincgb Алгоритм обучения CGB на основе метода сопряженного градиента с обратным распространением и рестартами в модификации Пауэла – Биеле Индексный указатель 475 trainc Обучение нейронной сети c циклическим представлением входа traincgf Алгоритм Флетчера – Ривса CGF traincgp Алгоритм Полака – Рибейры CGP traingd Алгоритм градиентного спуска GD traingda Алгоритм градиентного спуска с выбором параметра скорости настройки GDA traingdm Алгоритм градиентного спуска с возмущением GDM traingdx Алгоритм градиентного спуска с возмущением и адаптацией параметра скорости настройки GDX trainlm Алгоритм Левенберга – Марквардта LM trainoss Одношаговый алгоритм метода секущей OSS trainr Обучение нейронной сети в режиме случайного представления входа trainrp Пороговый алгоритм обратного распространения ошибки Rprop trains Адаптивное обучение нейронной сети с последовательным представлением входов trainscg Алгоритм обучения SCG Функции оценки качества обучения mae Критерий средней абсолютной ошибки mse Критерий средней квадратичной ошибки msereg Комбинированный критерий качества sse Сумма квадратов ошибок обучения dmae Производная критерия средней абсолютной ошибки dmse Производная критерия средней квадратичной ошибки dmsereg Производная комбинированного критерия качества dsse Производная суммы квадратов ошибок Функции настройки 476 learncon Настройка смещений для слоя Кохонена learngd Настройка методом градиентного спуска learngdm Настройка методом градиентного спуска с возмущением learnh Настройка по правилу Хебба Нейронные сети. MATLAB 6 learnhd Настройка по правилу Хебба с затуханием learnis Настройка по вектору входа learnk Настройка весов для слоя Кохонена learnlv1 Настройка весов LVQ-сети по правилу LVQ1 learnlv2 Настройка весов LVQ-сети по правилу LVQ2 learnos Настройка по вектору выхода learnp Настройка параметров персептрона learnpn Нормированная функция настройки параметров персептрона learnsom Настройка весов карты Кохонена learnwh Настройка методом Видроу – Хоффа maxlinlr Максимальное значение параметра скорости настройки для линейной сети Функции одномерного поиска srchbac Одномерная минимизация на основе метода перебора с возвратами srchbre Одномерная минимизация методом Брента srchcha Одномерная минимизация на основе метода Чараламбуса srchgol Одномерная минимизация методом золотого сечения srchhyb Одномерная минимизация на основе гибридного метода Масштабирование и восстановление данных postmnmx Восстановление данных после масштабирования функцией premnmx postreg Постпроцессорная обработка выхода сети с расчетом линейной регрессии poststd Восстановление данных после применения функции prestd premnmx Приведение данных к интервалу [–1 1] prepca Выделение главных компонентов prestd Приведение данных к нормальному закону распределения tramnmx Масштабирование текущих входов к диапазону [–1 1] trapca Масштабирование текущих входов с учетом факторного анализа trastd Масштабирование текущих входов к нормальному закону распределения Индексный указатель 477 Вспомогательные функции Утилиты вычислений calca Расчет сигналов сети на заданном интервале времени calca1 Расчет сигналов сети на одном шаге по времени calce Расчет ошибок слоя на заданном интервале времени calce1 Расчет ошибок слоя на одном шаге по времени calcgx Расчет градиента функционала качества по объединенному вектору весов и смещений calcjejj Расчет градиента и приближенной функции Гессе для функционала качества calcjx Расчет функции Якоби функционала качества относительно объединенной матрицы весов и смещений calcpd Расчет запаздывающих входов сети calcperf Расчет сигналов и функционала качества слоя formx Формирование объединенного вектора весов и смещений getx Извлечение объединенного вектора весов и смещений из описания сети setx Включение объединенного вектора весов и смещений в описание сети Операции с массивами и матрицами 478 cell2mat Преобразование массива числовых ячеек в массив double combvec Объединение выборок разных размеров concur Создание группы векторов смещений con2seq Преобразование группового представления данных в последовательное ind2vec Преобразование вектора индексов классов в матрицу связности mat2cell Преобразование числового массива в массив ячеек minmax Вычисление минимальных и максимальных элементов векторов входа normc Нормировка матрицы по столбцам normr Нормировка матрицы по строкам pnormc Псевдонормировка столбцов матрицы quant Округление элементов массива до ближайшего кратного базису округления Нейронные сети. MATLAB 6 seq2con Преобразование последовательного представления данных в групповое sumsqr Сумма квадратов элементов массива vec2ind Преобразование матрицы связности в вектор индексов классов Графические утилиты errsurf Вычисление поверхности ошибок для нейрона с одним входом hintonw Диаграмма Хинтона для весов hintonwb Диаграмма Хинтона для весов и смещений plotep Построение траектории обучения на поверхности ошибки plotes Построение графика поверхности ошибки для нейрона с одним входом plotpc Построение разделяющей линии или плоскости в пространстве векторов входа для персептрона plotperf График функции качества обучения plotpv Отображение векторов входов и целей в виде маркеров plotsom Отображение топологии карты Кохонена plotv Отображение векторов в виде линий plotvec Отображение векторов входа в виде маркеров Информация о сети и ее топологии disp Вывод на экран свойств нейронной сети display Вывод на экран имени и свойств нейронной сети gridtop Расчет сетки с прямоугольной топологией hextop Расчет сетки с гексагональной топологией randtop Расчет сетки со случайной топологией Графический интерфейс пользователя nntool Графический интерфейс пользователя ППП Neural Network Tool Моделирование нейронных сетей sim Моделирование нейронной сети gensim Построение S-модели нейронной сети gensimm Формирование М-файла для моделирования нейронной сети Индексный указатель 479 ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ A ADAPT · 320, 475 ADAPTWB · 322, 475 B BOXDIST · 305, 474 C CALCA · 420, 478 CALCA1 · 422, 478 CALCE · 424, 478 CALCE1 · 425, 478 CALCGX · 430, 478 CALCJEJJ · 433, 478 CALCJX · 432, 478 CALCPD · 423, 478 CALCPERF · 429, 478 CELL2MAT · 436, 478 COMBVEC · 437, 478 COMPET · 292, 474 CON2SEQ · 438, 478 CONCUR · 439, 478 DNETSUM · 307, 475 DOTPROD · 298, 474 DPOSLIN · 285, 474 DPURELIN · 284, 474 DRADBAS · 289, 474 DSATLIN · 286, 474 DSATLINS · 288, 474 DSSE · 377, 476 DTANSIG · 296, 474 DTRIBAS · 290, 474 E ERRSURF · 451, 479 F FORMX · 426, 478 G GENSIM · 465, 479 GENSIMM · 470, 479 GETX · 428, 478 GRIDTOP · 457, 479 H D DDOTPROD · 298, 474 DHARDLIM · 282, 474 DHARDLMS · 283, 474 DISP · 454, 479 DISPLAY · 454, 479 DIST · 300, 474 DLOGSIG · 294, 474 DMAE · 381, 476 DMSE · 378, 476 DMSEREG · 379, 476 DNETPROD · 309, 475 480 HARDLIM · 282, 474 HARDLIMS · 283, 474 HEXTOP · 457, 479 HINTONW · 448, 479 HINTONWB · 449, 479 I IND2VEC · 440, 478 INIT · 310, 475 INITCON · 318, 475 INITLAY · 312, 475 INITNW · 313, 475 INITWB · 313, 475 INITZERO · 314, 475 L LEARNCON · 394, 476 LEARNGD · 387, 476 LEARNGDM · 388, 476 LEARNH · 476 LEARNHD · 477 LEARNIS · 395, 477 LEARNK · 392, 477 LEARNLV1 · 389, 477 LEARNLV2 · 391, 477 LEARNOS · 396, 477 LEARNP · 383, 477 LEARNPN · 384, 477 LEARNSOM · 397, 477 LEARNWH · 385, 477 LEARNН · 399 LEARNНD · 401 LINKDIST · 306, 474 LOGSIG · 294, 474 M MAE · 381, 476 MANDIST · 303, 475 MAT2CELL · 441, 478 MAXLINLR · 400, 477 MIDPOINT · 315, 475 MINMAX · 441, 478 MSE · 378, 476 MSEREG · 379, 476 N NEGDIST · 302, 475 NETPROD · 309, 475 NETSUM · 307, 475 NETWC · 271, 473 Предметный указатель NETWORK · 245, 473 NEWCF · 260, 473 NEWELM · 277, 473 NEWFF · 255, 473 NEWFFTD · 258, 473 NEWGRNN · 267, 473 NEWHOP · 280, 473 NEWLIN · 250, 473 NEWLIND · 253, 473 NEWLVQ · 276, 473 NEWP · 248, 473 NEWPNN · 269, 473 NEWRB · 263, 473 NEWRBE · 265, 473 NEWSOM · 273, 473 NNTOOL · 459, 479 NORMC · 442, 478 NORMPROD · 299, 475 NORMR · 442, 478 P PLOTEP · 452, 479 PLOTES · 451, 479 PLOTPC · 446, 479 PLOTPERF · 450, 479 PLOTPV · 445, 479 PLOTSOM · 455, 479 PLOTV · 443, 479 PLOTVEC · 444, 479 PNORMC · 442, 478 POSLIN · 285, 474 POSTMNMX · 413, 477 POSTREG · 415, 477 POSTSTD · 414, 477 PREMNMX · 410, 477 PREPCA · 477 PRESTD · 411, 477 PREРСА · 412 PURELIN · 284, 474 Q QUANT · 443, 478 481 R RADBAS · 289, 474 RANDN · 475 RANDNC · 317 RANDNR · 318, 475 RANDS · 316, 475 RANDTOP · 458, 479 REVERT · 319, 475 S SATLIN · 286, 474 SATLINS · 288, 474 SEQ2CON · 438, 479 SETX · 428, 478 SIM · 459, 479 SOFTMAX · 293, 474 SRCHBAC · 409, 477 SRCHBRE · 405, 477 SRCHCHA · 408, 477 SRCHGOL · 404, 477 SRCHHYB · 406, 477 SSE · 377, 476 SUMSQR · 443, 479 TRAIN · 328, 475 TRAINB · 331, 475 TRAINBFG · 365, 475 TRAINBR · 373, 475 TRAINC · 334, 476 TRAINCGB · 361, 475 TRAINCGF · 356, 476 TRAINCGP · 358, 476 TRAINGD · 344, 476 TRAINGDA · 346, 476 TRAINGDM · 348, 476 TRAINGDX · 351, 476 TRAINGSCG · 476 TRAINLM · 370, 476 TRAINOSS · 368, 476 TRAINR · 337, 476 TRAINRP · 353, 476 TRAINS · 325, 476 trainscg · 363 TRAMNMX · 417, 477 TRAPCA · 418, 477 TRASTD · 417, 477 TRIBAS · 290, 474 V VEC2IND · 440, 479 T TANSIG · 296, 474 482 Нейронные сети. MATLAB 6 ЛИТЕРАТУРА Книги на английском языке: 1. Battiti R. First and second order methods for learning: Between steepest descent and Newton’s method. // Neural Computation. 1992. Vol. 4, N 2. P. 141–166. 2. Beale E. M. L. A derivation of conjugate gradients in F. A. Lootsma.// Numerical methods for nonlinear optimization. London: Academic Press, 1972. 3. Brent R. P. Algorithms for Minimization Without Derivatives. Englewood Cliffs, NJ: Prentice-Hall, 1973. 4. Brent R. P. Introduction to Non-Linear Estimation. 1985. 5. Caudill M. Neural Networks Primer. San Francisco, CA: Miller Freeman Publications, 1989. 6. Caudill M., Butler C. Understanding Neural Networks: Computer Explorations: Vols. 1, 2. Cambridge, MA: MIT Press, 1992. 7. Chen S., Cowan C. F. N., Grant P. M. Orthogonal least squares learning algorithm for radial basis function networks// IEEE Transactions on Neural Networks. 1991. Vol. 2, N 2. P. 302-309. 8. Charalambous C. Conjugate gradient algorithm for efficient training of artificial neural networks// IEEE Proceedings. 1992. Vol. 139, N 3. P. 301–310. 9. Dennis J. E., Schnabel R. B. Numerical Methods for Unconstrained Optimization and Nonlinear Equations. Englewood Cliffs, NJ: Prentice-Hall, 1983. 10. Elman J. L. Finding structure in time// Cognitive Science. 1990. Vol. 14. P. 179-211. 11. Foresee F. D., Hagan M. T. Gauss-Newton approximation to Bayesian regularization// Proceedings of the 1997 International Joint Conference on Neural Networks. 1997. P. 1930-1935. 12. Fletcher R., Reeves C. M. Function minimization by conjugate gradients// Computer Journal. 1964. Vol. 7. P. 149-154. 13. Gill P. E., Murray W., Wright M. H. Practical Optimization. New York: Academic Press, 1981. 14. Grossberg, S. Studies of the Mind and Brain. Drodrecht, Holland: Reidel Press, 1982. 15. Hagan M. T., Demuth H. B. Neural Networks for Control// Proceedings of the 1999 American Control Conference. SanDiego: CA, 1999. P. 1642-1656. 16. Hagan M. T., De Jesus O., Schultz R. Training Recurrent Networks for Filtering and Control. Ch. 12.// Recurrent Neural Networks: Design and Applications, L. Medsker, L.C. Jain, Eds. CRC Press, 1999. P. 311-340. 17. Hagan M.T., Menhaj M. Training feedforward networks with the Marquardt algorithm// IEEE Transactions on Neural Networks.1994. Vol. 5, N 6. P. 989–993. 483 18. Hagan M. T., Demuth H. B., Beale M.H. Neural Network Design. Boston, MA: PWS Publishing, 1996. 19. Hebb D. O. The Organization of Behavior. New York: Wiley, 1949. 20. Himmelblau D. M., Applied Nonlinear Programming. New York: McGraw-Hill, 1972. 21. Hunt K. J., Sbarbaro D., Zbikowski R., Gawthrop P. J. Neural Networks for Control System – A Survey// Automatica. 1992. Vol. 28. P. 1083-1112. 22. Jolliffe I. T. Principal Component Analysis. New York: Springer-Verlag. 1986. 23. Kohonen T. Self-Organization and Associative Memory.2nd ed. Berlin: Springer-Verlag, 1987. 24. Kohonen, T. Self-Organizing Maps, Second Edition. Berlin: Springer-Verlag. 1997. 25. Li J., Michel A. N., Porod W. Analysis and synthesis of a class of neural networks: linear systems operating on a closed hypercube// IEEE Transactions on Circuits and Systems. 1989. Vol. 36, N 11. P. 1405-1422. 26. Lippman R. P. An introduction to computing with neural nets// IEEE ASSP Magazine. 1987. P. 4-22. 27. MacKay D. J. C. Bayesian interpolation// Neural Computation. 1912. Vol. 4. N 3. P. 415-447. 28. McCulloch W. S., Pitts W. H. A logical calculus of ideas immanent in nervous activity// Bulletin of Mathematical Biophysics. 1943. Vol. 5. P. 115-133. 29. Moller M. F. A scaled conjugate gradient algorithm for fast supervised learning// Neural Networks. 1993. Vol. 6. P. 525-533. 30. Murray R. D., Sbarbaro N. D. Neural Networks for Modeling and Control of a Nonlinear Dynamic System// Proceedings of the 1992 IEEE International Symposium on Intelligent Control. 1992. P. 404-409. 31. Narendra K. S., Mukhopadhyay S. Adaptive Control Using Neural Networks and Approximate Models// IEEE Transactions on Neural Networks. 1997. Vol. 8. P. 475-485. 32. Nguyen D., Widrow B. The truck backer-upper: An example of self-learning in neural networks// Proceedings of the International Joint Conference on Neural Networks. 1989. Vol 2. P. 357-363. 33. Nguyen D., Widrow B. Improving the learning speed of 2-layer neural networks by choosing initial values of the adaptive weights// Proceedings of the International Joint Conference on Neural Networks. 1990. Vol 3. P. 21-26. 34. Powell M. J. D. Restart procedures for the conjugate gradient method// Mathematical Programming. 1977. Vol. 12. P. 241-254. 35. Purdie N., Lucas E. A., Talley M. B. Direct measure of total cholesterol and its distribution among major serum lipoproteins// Clinical Chemistry.1992. Vol. 38, N 9. P. 1645-1647. 484 Нейронные сети. MATLAB 6 36. Riedmiller M., Braun H. A direct adaptive method for faster backpropagation learning: The RPROP algorithm// Proceedings of the IEEE International Conference on Neural Networks. 1993. 37. Rosenblatt F. Principles of Neurodynamics. Washington D. C.: Spartan Press, 1961; :Пер. с англ. Розенблатт Ф. Принципы нейродинамики. М.: Мир, 1965. 38. Rumelhart D. E., Hinton G. E., Williams R. J. Learning internal representations by error propagation. Еd. by D. E. Rumelhart, J. L. McClelland// Parallel Data Processing. 1986. Vol.1. Cambridge, MA: The M.I.T. Press. P. 318-362. 39. Rumelhart D. E., Hinton G. E., Williams R. J. Learning representations by backpropagating errors// Nature. 1986. Vol. 323. P. 533–536. 40. Soloway D., Haley P. J. Neural Generalized Predictive Control// Proceedings of the 1996 IEEE International Symposium on Intelligent Control. 1996. P. 277-281. 41. Scales L. E. Introduction to Non-Linear Optimization. New York: Springer-Verlag, 1985. 42. Vogl T.P., Mangis J.K. et al. Accelerating the convergence of the backpropagation method// Biological Cybernetics. 1988. Vol. 59. P. 256-264. 43. Wasserman P. D. Advanced Methods in Neural Computing. New York: Van Nostrand Reinhold, 1993. 44. Widrow B., Hoff M .E. Adaptive switching circuits// 1960 IREWESCON Convention Record. New York IRE. 1960. P. 96-104. 45. Widrow B., Sterns S. D. Adaptive Signal Processing. New York: Prentice-Hall, 1985. Книги на русском языке: 46. Беркинблит М. Б. Нейронные сети. М.: МИРОС, 1993. 47. Уоссерман Ф. Нейрокомпьютерная техника. М.: Мир, 1992. 48. Мишулина О. А., Лабинская А. А., Щербинина М. В. Лабораторный практикум по курсу "Введение в теорию нейронных сетей". М.: МИФИ, 2000. 204 с. 49. Омату С., Халид М., Юсоф Р. Нейроуправление и его приложения. М.: ИПРЖРБ, 2000. 272 с. 50. Тихонов А. Н. О решении некорректно поставленных задач и методе регуляризации// Доклады АН СССР. Т.151, № 3. 1963. 51. Лазарев Ю. Ф. MatLAB 5.x. Киев: Издат. группа BHV, 2000. 384 с. 52. Гультяев А. К. Визуальное моделирование в среде MATLAB: Учеб. курс. СПб: Питер, 2000. 432 с. 53. Потемкин В. Г. Инструментальные средства MATLAB 5.х. М.: Диалог-МИФИ, 2000. 336 с. Литература 485 54. Медведев В. С., Потемкин В. Г. Control System Toolbox. MATLAB 5 для студентов. /Под общ. ред. В.Г. Потемкина. М.:Диалог-МИФИ, 1999. 287 с. (Пакеты прикладных программ; Кн. 1). 55. Рудаков П. И., Сафонов И. В. Обработка сигналов и изображений. MATLAB 5.x /Под общ. ред. В.Г. Потемкина. М.:Диалог-МИФИ, 1999. 287 с. (Пакеты прикладных программ; Кн. 2). 56. Лавров К. Н., Цыплякова Т. П. Финансовая аналитика. MATLAB 6 /Под общ. ред. В. Г. Потемкина. М.: Диалог-МИФИ, 2001. 363 с. (Пакеты прикладных программ; Кн. 3). 57. Галушкин А.И. Теория нейронных сетей. М.: ИПРЖР, 2000. 416 с. 58. Галушкин А.И. Нейрокомпьютеры. М.: ИПРЖР, 2000. 532 с. 486 Нейронные сети. MATLAB 6 ОГЛАВЛЕНИЕ ПРЕДИСЛОВИЕ ............................................................................................................ 3 ВВЕДЕНИЕ ..................................................................................................................... 5 ЧАСТЬ 1. ППП NEURAL NETWORK TOOLBOX .................................................. 9 1. СИСТЕМА MATLAB 6 ............................................................................................. 9 1.1. ОПЕРАЦИОННАЯ СРЕДА MATLAB 6 ...................................................................... 9 1.2. GUI-ИНТЕРФЕЙС ДЛЯ ППП NNT ......................................................................... 19 1.3. ДЕМОНСТРАЦИОННЫЕ ПРИМЕРЫ ППП NNT ....................................................... 33 2. МОДЕЛЬ НЕЙРОНА И АРХИТЕКТУРА СЕТИ .............................................. 33 2.1. МОДЕЛЬ НЕЙРОНА ................................................................................................ 33 2.1.1. Простой нейрон ........................................................................................... 33 2.1.2. Функция активации ..................................................................................... 34 2.1.3. Нейрон с векторным входом ...................................................................... 35 2.2. АРХИТЕКТУРА НЕЙРОННЫХ СЕТЕЙ ....................................................................... 36 2.2.1. Однослойные сети ....................................................................................... 37 2.2.2. Многослойные сети ..................................................................................... 38 2.2.3. Сети с прямой передачей сигнала .............................................................. 41 2.3. СОЗДАНИЕ, ИНИЦИАЛИЗАЦИЯ И МОДЕЛИРОВАНИЕ СЕТИ..................................... 42 3. ОБУЧЕНИЕ НЕЙРОННЫХ СЕТЕЙ ................................................................... 47 3.1. ПРОЦЕДУРЫ АДАПТАЦИИ И ОБУЧЕНИЯ ................................................................ 47 3.1.1. Способы адаптации и обучения ................................................................. 52 3.2. МЕТОДЫ ОБУЧЕНИЯ .............................................................................................. 61 3.2.1. Обучение однослойной сети ....................................................................... 62 3.2.2. Обучение многослойной сети ..................................................................... 63 3.3. АЛГОРИТМЫ ОБУЧЕНИЯ ........................................................................................ 67 3.3.1. Градиентные алгоритмы обучения ........................................................... 67 3.3.2. Алгоритмы метода сопряженных градиентов ........................................ 76 3.3.3. Квазиньютоновы алгоритмы ..................................................................... 82 3.3.4. Алгоритмы одномерного поиска ................................................................ 87 3.3.5. Расширение возможностей процедур обучения ....................................... 89 487 4. ПЕРСЕПТРОНЫ ................................................................................................... 102 4.1. АРХИТЕКТУРА ПЕРСЕПТРОНА ............................................................................. 103 4.2. МОДЕЛЬ ПЕРСЕПТРОНА....................................................................................... 104 4.3. ПРОЦЕДУРЫ НАСТРОЙКИ ПАРАМЕТРОВ .............................................................. 107 5. ЛИНЕЙНЫЕ СЕТИ .............................................................................................. 115 5.1. АРХИТЕКТУРА ЛИНЕЙНОЙ СЕТИ ......................................................................... 116 5.2. СОЗДАНИЕ МОДЕЛИ ЛИНЕЙНОЙ СЕТИ................................................................. 117 5.3. ОБУЧЕНИЕ ЛИНЕЙНОЙ СЕТИ ............................................................................... 118 5.4. ПРИМЕНЕНИЕ ЛИНЕЙНЫХ СЕТЕЙ ........................................................................ 123 6. РАДИАЛЬНЫЕ БАЗИСНЫЕ СЕТИ ................................................................. 131 6.1. СЕТИ GRNN ....................................................................................................... 140 6.2. СЕТИ PNN ........................................................................................................... 144 7. СЕТИ КЛАСТЕРИЗАЦИИ И КЛАССИФИКАЦИИ ДАННЫХ ................. 147 7.1. САМООРГАНИЗУЮЩИЕСЯ НЕЙРОННЫЕ СЕТИ ..................................................... 147 7.1.1. Слой Кохонена............................................................................................ 148 7.1.2. Карта Кохонена ........................................................................................ 156 7.2. LVQ-СЕТИ .......................................................................................................... 168 8. РЕКУРРЕНТНЫЕ СЕТИ ..................................................................................... 175 8.1. СЕТИ ЭЛМАНА .................................................................................................... 175 8.2. СЕТИ ХОПФИЛДА ................................................................................................ 181 9. ПРИМЕНЕНИЕ НЕЙРОННЫХ СЕТЕЙ .......................................................... 188 9.1. АППРОКСИМАЦИЯ И ФИЛЬТРАЦИЯ СИГНАЛОВ ................................................... 188 9.1.1. Предсказание стационарного сигнала ..................................................... 188 9.1.2. Слежение за нестационарным сигналом ................................................ 192 9.1.3. Моделирование стационарного фильтра ................................................ 194 9.1.4. Моделирование нестационарного фильтра ............................................ 197 9.2. РАСПОЗНАВАНИЕ ОБРАЗОВ ................................................................................. 199 9.3. НЕЙРОННЫЕ СЕТИ И СИСТЕМЫ УПРАВЛЕНИЯ..................................................... 207 9.3.1. Регулятор с предсказанием ...................................................................... 209 9.3.2. Регулятор NARMA-L2 ............................................................................... 218 9.3.3. Регулятор на основе эталонной модели .................................................. 223 488 Нейронные сети. MATLAB 6 ЧАСТЬ 2. ОПЕРАТОРЫ, ФУНКЦИИ И КОМАНДЫ ....................................... 228 10. ВЫЧИСЛИТЕЛЬНАЯ МОДЕЛЬ НЕЙРОННОЙ СЕТИ ............................. 228 10.1. ОПИСАНИЕ СЕТИ ............................................................................................... 228 10.2. ОПИСАНИЕ ЭЛЕМЕНТОВ СЕТИ .......................................................................... 232 11. ФОРМИРОВАНИЕ МОДЕЛЕЙ НЕЙРОННЫХ СЕТЕЙ ............................ 245 11.1. МОДЕЛИ СЕТЕЙ ................................................................................................. 245 11.1.1. Однослойные сети ................................................................................... 248 11.1.2. Многослойные сети ................................................................................. 255 11.2. ФУНКЦИИ АКТИВАЦИИ ..................................................................................... 282 11.3. СИНАПТИЧЕСКИЕ ФУНКЦИИ ............................................................................. 299 11.4. ФУНКЦИИ ИНИЦИАЛИЗАЦИИ ............................................................................ 312 11.5. ФУНКЦИИ АДАПТАЦИИ И ОБУЧЕНИЯ ................................................................ 321 11.5.1. Функции оценки качества обучения ....................................................... 377 11.6. ФУНКЦИИ НАСТРОЙКИ ПАРАМЕТРОВ ............................................................... 384 11.6.1. Функции одномерного поиска ................................................................. 405 11.7. МАСШТАБИРОВАНИЕ И ВОССТАНОВЛЕНИЕ ДАННЫХ ....................................... 412 11.8. ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ........................................................................ 422 11.9. МОДЕЛИРОВАНИЕ НЕЙРОННЫХ СЕТЕЙ И СИСТЕМА SIMULINK ......................... 462 11.9.1. Применение системы Simulink ............................................................... 466 ИНДЕКСНЫЙ УКАЗАТЕЛЬ .................................................................................. 473 ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ ............................................................................... 480 ЛИТЕРАТУРА ........................................................................................................... 483 ОГЛАВЛЕНИЕ .......................................................................................................... 487 Оглавление 489