Нормируйте ошибки нескольких Выходных параметров

Наиболее распространенная функция производительности, используемая, чтобы обучить нейронные сети, является среднеквадратической ошибкой (mse). Однако с несколькими выходными параметрами, которые имеют различные области значений значений, обучение со среднеквадратической ошибкой имеет тенденцию оптимизировать точность на выходном элементе с более широкой областью значений значений относительно выходного элемента с меньшей областью значений.

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

x = -1:0.01:1;
t1 = 100*sin(x);
t2 = 0.01*cos(x);
t = [t1; t2];

Область значений t1 200 (от минимума-100 максимум к 100), в то время как область значений t2 - только 0,02 (от-0.01 до 0,01). Область значений t1 в 10,000 раз больше, чем область значений t2.

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

net = feedforwardnet(5);
net1 = train(net,x,t);
y = net1(x);

Здесь вы видите, что сеть училась соответствовать первому выходному элементу очень хорошо.

figure(1)
plot(x,y(1,:),x,t(1,:))

Однако функция второго элемента не является подходящей почти также.

figure(2)
plot(x,y(2,:),x,t(2,:))

Чтобы соответствовать обоим выходным элементам одинаково хорошо в относительном смысле, установите эксплуатационный параметр normalization на 'standard'. Это затем вычисляет ошибки для критериев качества работы, как будто каждый выходной элемент имеет область значений 2 (т.е. как будто каждый вывод значения элемента колеблется от-1 до 1 вместо их отличающихся областей значений).

net.performParam.normalization = 'standard';
net2 = train(net,x,t);
y = net2(x);

Теперь два выходных элемента обе подгонки хорошо.

figure(3)
plot(x,y(1,:),x,t(1,:))

figure(4)
plot(x,y(2,:),x,t(2,:))