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