Утилиты вычислений

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) = [3´1 double]

Pd(:,:,2) = [3´1 double]

...

Pd(:,:,8) = [3´1 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

[3´1 double] [3´1 double] [3´1 double] [3´1 double]

[3´1 double] [3´1 double] [3´1 double] [3´1 double]

Columns 9 through 10

[3´1 double] [3´1 double]

N =

Columns 1 through 4

[3´1 double] [3´1 double] [3´1 double] [3´1 double]

Columns 5 through 8

[3´1 double] [3´1 double] [3´1 double] [3´1 double]

LWZ(:,:,1) = [3´1 double]

LWZ(:,:,2) = [3´1 double]

...

LWZ(:,:,8) = [3´1 double]

IWZ(:,:,1) = [3´1 double]

IWZ(:,:,2) = [3´1 double]

...

IWZ(:,:,8) = [3´1 double]

BZ = [3´1 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) = [3´1 double]

Pd(:,:,2) = [3´1 double]

Pd(:,:,3) = [3´1 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 = [3´1 double]

N1 = [3´1 double]

LWZ1 = [3´1 double]

IWZ1 = [3´1 double]

BZ1 = [3´1 double]

Теперь можно вычислить новые состояния на ЛЗ, используя массивы Ai и A, и рассчитать сигналы слоя на втором шаге по времени:

Ai2 = [Ai(:,2:end) A1];

[A2,N2,LWZ2,IWZ2,BZ2] = calca1(net,Pd(:,:,2),Ai2,1)

A2 = [3´1 double]

N2 = [3´1 double]

LWZ2 = [3´1 double]

IWZ2 = [3´1 double]

BZ2 = [3´1 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) = [3´1 double]

Pd(:,:,2) = [3´1 double]

Pd(:,:,3) = [3´1 double]

Теперь можно просмотреть значения запаздывающих входов для двух первых шагов:

Pd{1,1,1}

ans =

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 = [2´1 double] [2´1 double] [2´1 double] [2´1 double] [2´1 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 = [2´1 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 – массив ячеек размера Nl´1, включающий векторы смещений для Nl слоев;

IW – массив ячеек размера Nl´1, включающий матрицы весов входа;

LW – массив ячеек размера Nl´Nl, состоящий из весовых матриц Nl слоев.

Выходные аргументы:

X – объединенный вектор весов и смещений.

Примеры:

Создадим однослойную сеть с тремя нейронами и двухэлементным вектором входа
со значениями из диапазонов [0 1] и [–1 1]:

net = newff([0 1; –1 1],[3]);

Выведем значения массивов весов и смещений:

b = net.b

b = [3´1 double]

b{1}

ans =

3.7981

–0.9154

–1.6816

iw = net.iw

iw = [3´2 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 = [3´2 double]

ans = [3´1 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 = [2´3 double]

net.lw

ans = [2´4 double]

net.b

ans = [2´1 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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: