Normalize Errors of Multiple Outputs
The most common performance function used to train neural networks is mean squared error (mse). However, with multiple outputs that have different ranges of values, training with mean squared error tends to optimize accuracy on the output element with the wider range of values relative to the output element with a smaller range.
For instance, here two target elements have very different ranges:
x = -1:0.01:1; t1 = 100*sin(x); t2 = 0.01*cos(x); t = [t1; t2];
The range of t1
is 200 (from a minimum of
-100 to a maximum of 100), while the range of t2
is
only 0.02 (from -0.01 to 0.01). The range of t1
is
10,000 times greater than the range of t2
.
If you create and train a neural network on this to minimize mean squared error, training favors the relative accuracy of the first output element over the second.
net = feedforwardnet(5); net1 = train(net,x,t);
y = net1(x);
Here you can see that the network has learned to fit the first output element very well.
figure(1) plot(x,y(1,:),x,t(1,:))
However, the second element’s function is not fit nearly as well.
figure(2) plot(x,y(2,:),x,t(2,:))
To fit both output elements equally well in a relative sense,
set the normalization
performance parameter to 'standard'
.
This then calculates errors for performance measures as if each output
element has a range of 2 (i.e., as if each output element’s
values range from -1 to 1, instead of their differing ranges).
net.performParam.normalization = 'standard';
net2 = train(net,x,t);
y = net2(x);
Now the two output elements both fit well.
figure(3) plot(x,y(1,:),x,t(1,:))
figure(4) plot(x,y(2,:),x,t(2,:))