Наиболее распространенная функция производительности, используемая, чтобы обучить нейронные сети, является среднеквадратической ошибкой (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,:))