- •В. Г. Потемкин
- •Предисловие
- •Введение
- •Используемые обозначения
- •Часть 1. Ппп Neural Network Toolbox
- •1. Система matlab 6
- •1.1. Операционная среда matlab 6
- •Командное окно
- •Окно предыстории
- •Окно запуска
- •Окно текущего каталога
- •Окно рабочей области
- •Справочная подсистема
- •1.3. Демонстрационные примеры ппп nnt
- •2. Модель нейрона и архитектура сети
- •2.1. Модель нейрона
- •2.1.1. Простой нейрон
- •2.1.2. Функция активации
- •2.1.3. Нейрон с векторным входом
- •2.2. Архитектура нейронных сетей
- •2.2.1. Однослойные сети
- •2.2.2. Многослойные сети
- •2.2.3. Сети с прямой передачей сигнала
- •2.3. Создание, инициализация и моделирование сети Формирование архитектуры сети
- •Инициализация сети
- •Моделирование сети
- •3. Обучение нейронных сетей
- •3.1. Процедуры адаптации и обучения
- •Явление переобучения
- •Свойство обобщения
- •3.1.1. Способы адаптации и обучения
- •Адаптация нейронных сетей
- •Xlabel(''), ylabel('Выходыa(I)'),grid
- •Xlabel(''), ylabel('Весавходовw(I)'),grid
- •Xlabel(' Циклы'), ylabel('Ошибка'),grid
- •Xlabel(''), ylabel('Выходыa(I)'),grid
- •Xlabel(''), ylabel('Весавходовw(I)'),grid
- •Xlabel('Циклы'), ylabel('Ошибка'),grid
- •Xlabel(''), ylabel('Выходыa(I)'),grid
- •Xlabel(''), ylabel('Весавходовw(I)'),grid
- •Xlabel('Циклы'), ylabel('Ошибка'),grid
- •Обучение нейронных сетей
- •3.2. Методы обучения
- •3.2.1. Обучение однослойной сети
- •3.2.2. Обучение многослойной сети
- •Метод обратного распространения ошибки
- •Характеристика методов обучения
- •3.3. Алгоритмы обучения
- •3.3.1. Градиентные алгоритмы обучения Алгоритм gd
- •Алгоритм gdm
- •Алгоритм gda
- •Алгоритм Rprop
- •3.3.2. Алгоритмы метода сопряженных градиентов
- •Алгоритм cgf
- •Алгоритм cgp
- •Алгоритм cgb
- •Алгоритм scg
- •3.3.3. Квазиньютоновы алгоритмы Алгоритм bfgs
- •Алгоритм oss
- •Алгоритм lm
- •3.3.4. Алгоритмы одномерного поиска
- •Алгоритм gol
- •Алгоритм bre
- •Алгоритм hyb
- •Алгоритм cha
- •Алгоритм bac
- •3.3.5. Расширение возможностей процедур обучения
- •Переобучение
- •Метод регуляризации
- •Формирование представительной выборки
- •Предварительная обработка и восстановление данных
- •Пример процедуры обучения
- •4. Персептроны
- •4.1. Архитектура персептрона
- •4.2. Модель персептрона
- •Моделирование персептрона
- •Инициализация параметров
- •4.3. Процедуры настройки параметров
- •Правила настройки
- •Процедура адаптации
- •5. Линейные сети
- •5.1. Архитектура линейной сети
- •5.2. Создание модели линейной сети
- •5.3. Обучение линейной сети
- •Процедура настройки
- •Процедура обучения
- •5.4. Применение линейных сетей Задача классификации векторов
- •Фильтрация сигнала
- •Предсказание сигнала
- •Подавление шумов
- •Многомерные цифровые фильтры
- •6. Радиальные базисные сети
- •Модель нейрона и архитектура сети
- •Создание сети
- •Радиальная базисная сеть с нулевой ошибкой
- •Итерационная процедура формирования сети
- •Примеры радиальных базисных сетей
- •6.1. Сети grnn
- •Архитектура сети
- •Синтез сети
- •6.2. Сети pnn
- •Архитектура сети
- •Синтез сети
- •7. Сети кластеризации и классификации данных
- •7.1. Самоорганизующиеся нейронные сети
- •7.1.1. Слой Кохонена
- •Архитектура сети
- •Создание сети
- •Правило обучения слоя Кохонена
- •Правило настройки смещений
- •Обучение сети
- •7.1.2. Карта Кохонена
- •Топология карты
- •Функции для расчета расстояний
- •Архитектура сети
- •Создание сети
- •Обучение сети
- •Одномерная карта Кохонена
- •Двумерная карта Кохонена
- •Архитектура сети
- •Создание сети
- •Обучение сети Правила настройки параметров
- •Процедура обучения
- •8. Рекуррентные сети
- •8.1. Сети Элмана
- •Архитектура
- •Создание сети
- •Обучение сети
- •Проверка сети
- •8.2. Сети Хопфилда
- •Архитектура сети
- •Синтез сети
- •9. Применение нейронных сетей
- •9.1. Аппроксимация и фильтрация сигналов
- •9.1.1. Предсказание стационарного сигнала Постановка задачи
- •Синтез сети
- •Проверка сети
- •9.1.2. Слежение за нестационарным сигналом
- •Инициализация сети
- •Проверка сети
- •9.1.3. Моделирование стационарного фильтра
- •Постановка задачи
- •Синтез сети
- •Проверка сети
- •9.1.4. Моделирование нестационарного фильтра
- •Постановка задачи
- •Инициализация сети
- •Проверка сети
- •9.2. Распознавание образов
- •Постановка задачи
- •Нейронная сеть
- •Архитектура сети
- •Инициализация сети
- •Обучение
- •Обучение в отсутствие шума
- •Обучение в присутствии шума
- •Повторное обучение в отсутствие шума
- •Эффективность функционирования системы
- •9.3. Нейронные сети и системы управления
- •9.3.1. Регулятор с предсказанием
- •9.3.2. Регулятор narma-l2
- •9.3.3. Регулятор на основе эталонной модели
- •Часть2. Операторы, функции и команды
- •10. Вычислительная модель нейронной сети
- •10.1. Описание сети Описание архитектуры
- •Функции инициализации, адаптации и обучения
- •10.2. Описание элементов сети
- •Описание входов
- •Описание слоев
- •Описание выходов
- •Описание целей
- •Описание смещений
- •Описание весов входа
- •Описание весов слоя
- •Матрицы весов и векторы смещений
- •Информационные поля
- •11. Формирование моделей нейронных сетей
- •11.1. Модели сетей
- •11.1.1. Однослойные сети Персептрон
- •Линейные сети
- •11.1.2. Многослойные сети
- •Радиальные базисные сети
- •Самоорганизующиеся сети
- •Сети – классификаторы входных векторов
- •Рекуррентные сети
- •11.2. Функции активации
- •Персептрон
- •Линейные сети
- •Радиальные базисные сети
- •Самоорганизующиеся сети
- •Рекуррентные сети
- •11.3. Синаптические функции
- •Функции взвешивания и расстояний
- •Функции накопления
- •11.4. Функции инициализации
- •11.5. Функции адаптации и обучения Функции адаптации
- •Функции обучения
- •Градиентные алгоритмы обучения
- •Алгоритмы метода сопряженных градиентов
- •Квазиньютоновы алгоритмы обучения
- •11.5.1. Функции оценки качества обучения
- •11.6. Функции настройки параметров
- •11.6.1. Функции одномерного поиска
- •11.7. Масштабирование и восстановление данных
- •11.8. Вспомогательные функции
- •Утилиты вычислений
- •Операции с массивами данных
- •Графические утилиты
- •Информация о сети и ее топологии
- •11.9. Моделирование нейронных сетей и система Simulink Функции моделирования сети
- •11.9.1. Применение системы Simulink
- •Библиотеки блоков для моделирования нейронных сетей
- •Построение моделей нейронных сетей
- •Индексный указатель Команды, функции и операторы ппп Neural Network Toolbox
- •Предметный указатель
- •Литература Книги на английском языке:
- •Книги на русском языке:
- •Оглавление
11.8. Вспомогательные функции
Ниже представлены различные утилиты, которые составляют ядро ППП NeuralNetworkToolbox. В первую очередь это утилиты для вычисления сигналов в различных точках нейронной сети, а также функционала качества обучения сети и связанных с ним вычислений градиента, а также функций Якоби и Гессе. Значительное место занимают реализации операций с массивами и матрицами, а также утилиты графики, позволяющие отображать входные данные, топологию сетей, строить поверхности ошибок и тректории обучения в пространстве параметров нейронной сети.
Утилиты вычислений
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};
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] = calca(net,Pd,Ai,1,8)
Ac =
Columns 1 through 4
[31 double] [31 double] [31 double] [31 double]
[31 double] [31 double] [31 double] [31 double]
Columns 9 through 10
[31 double] [31 double]
N =
Columns 1 through 4
[31 double] [31 double] [31 double] [31 double]
Columns 5 through 8
[31 double] [31 double] [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]
Сопутствующие функции: 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, которые требуют вычисления реакции сети на каждом шаге по времени.
Входные аргументы:
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)
A2 = [31 double]
N2 = [31 double]
LWZ2 = [31 double]
IWZ2 = [31 double]
BZ2 = [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
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);
Определим цели слоя для двух нейронов для каждого из пяти временных шагов и рассчитаем ошибки слоя:
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)
Определим цели слоя для двух нейронов для каждого из пяти временных шагов и рассчитаем ошибки слоя на первом шаге:
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]);
Выведем значения массивов весов и смещений:
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 0.5653
3.5899 1.6304
–0.6304 2.4043
net.b{1}
ans =
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.
Входные аргументы:
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{:})
ans =
0.1000 0.3000 0.5000 0.8000 0.5000
0.2000 0.1000 0.6000 0.9000 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};
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 – якобиан функционала качества относительно объединенной матрицы весов и смещений.
Пример:
Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 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.1000 0 –0.3000 0 –0.6000 0 0 0 –0.1000 0 –0.3000 0 –0.4000 0 0.1000 0 0 0 –0.1000 0 –0.4000 0 –0.1000 0 0 0 –0.2000 0 –0.3000 0 –0.4000 0 –0.1000 0 –0.2000 0 –0.30 0 –0.4000 0 –0.6000 0 0 0 0 0 0 0 –0.6000 0 0 0 0 0 –0.5000 0 0 0 0 0 0 0 –0.5000 0 0 0 0 0 –0.5000 0 –0.6000 0 0 0 0 0 –0.5000 0 –0.6000 0 0 0 –0.1000 0 –0.5000 0 0 0 0 0 –0.1000 0 –0.5000 0 0 0 –1.0000 0 –1.0000 0 –1.0000 0 –1.0000 0 –1.0000 0 –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.
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)
а гессиан может быть приближенно вычислен как
, (11.11)
где J– матрица Якоби производных функционала качества по настраиваемым параметрам; e – вектор ошибок сети.
Вычисление якобиана может потребовать больших объемов памяти для хранения матриц. Поэтому, как это часто делается при работе с матрицами, выполним ее декомпозицию, т. е. представим матрицу в виде разбиения на несколько подматриц.
Если выделить 2 подматрицы; то соотношение (11.11) может быть записано в виде
. (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
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.2100 0 0 0 0 0 0.0600 0 0.0500 0 1.4000 0
0 0.6200 0 0.1900 0 0.2100 0 0 0 0 0 0.0600 0 0.0500 0 1.4000
0.1900 0 0.2700 0 0.1200 0 0.2400 0 0.2000 0 0.2600 0 0.0900 0 0.9000 0
0 0.1900 0 0.2700 0 0.1200 0 0.2400 0 0.2000 0 0.2600 0 0.0900 0 0.9000
0.2100 0 0.1200 0 0.3000 0 0.1200 0 0.1000 0 0.2800 0 0.1700 0 1.0000 0
0 0.2100 0 0.1200 0 0.3000 0 0.1200 0 0.1000 0 0.2800 0 0.1700 0 1.0000
0 0 0.2400 0 0.1200 0 0.3600 0 0.3000 0 0.3000 0 0.0600 0 0.6000 0
0 0 0 0.2400 0 0.1200 0 0.3600 0 0.3000 0 0.3000 0 0.0600 0 0.6000
0 0 0.2000 0 0.1000 0 0.3000 0 0.2500 0 0.2500 0 0.0500 0 0.5000 0
0 0 0 0.2000 0 0.1000 0 0.3000 0 0.2500 0 0.2500 0 0.0500 0 0.5000
0.0600 0 0.2600 0 0.2800 0 0.3000 0 0.2500 0 0.6100 0 0.3500 0 1.1000 0
0 0.0600 0 0.2600 0 0.2800 0 0.3000 0 0.2500 0 0.6100 0 0.3500 0 1.1000
0.0500 0 0.0900 0 0.1700 0 0.0600 0 0.0500 0 0.3500 0 0.2600 0 0.6000 0
0 0.0500 0 0.0900 0 0.1700 0 0.0600 0 0.0500 0 0.3500 0 0.2600 0 0.6000
1.4000 0 0.9000 0 1.0000 0 0.6000 0 0.5000 0 1.1000 0 0.6000 0 5.0000 0
0 1.4000 0 0.9000 0 1.0000 0 0.6000 0 0.5000 0 1.1000 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.