Backprop
Priklad výsledku
Program
// prejde cez vsetky iteracie
for(var k=0; k < max_iterations; k++)
{
educate();
}
// sigmoidalna funkcia
function getOut(a)
{
return 1 / (1 + Math.exp(- a));
}
// prejde cez vsetky vstupy
function educate()
{
for(i = 0; i < num_nets; i++)
{
// normalizacia vstupov
var x = getOut(10 * (nets[i].x / 500) - 5);
var y = getOut(10 * (nets[i].y / 500) - 5);
var z = nets[i].z;
// ziska vystup
var out = getOutput(x, y);
// ak je nespravny vystup, tak zmen vahy
if(!(out[0] < 0.1 && out[1] > 0.9 && z == 0) && !(out[0] > 0.9 && out[1] < 0.1 && z == 1))
changeWeights(out, x, y, z);
}
}
// zmena vah
function changeWeights(out, x, y, z)
{
var error = new Array(2);
// error nz vystupe
error[0] = out[0] * (1 - out[0]) * (z - out[0]);
error[1] = out[1] * (1 - out[1]) * (((z == 0) ? 1 : 0) - out[1]);
// error pre 2. skrytu vrstvu
for(var j=0; j < num_hidden_2 + 1; j++)
{
var sum = 0;
for(var k=0; k < num_outputs; k++)
{
sum += error[k] * w_o[j][k];
}
h_err_2[j] = sum * (1 - h_out_2[j]) * h_out_2[j];
}
// error pre 1. skrytu vrstvu
for(var j=0; j < num_hidden_1 + 1; j++)
{
var sum = 0;
for(var k=0; k < num_hidden_2; k++)
{
sum += h_err_2[k] * w_h_2[j][k];
}
h_err_1[j] = sum * (1 - h_out_1[j]) * h_out_1[j];
}
// zmena vah medzi 2. skrytou vrstvou a vystupom
for(var k=0; k < num_outputs; k++)
{
for(var j=0; j < num_hidden_2 + 1; j++)
{
w_o[j][k] += learning_rate * error[k] * h_out_2[j];
}
}
// zmena vah medzi 1. a 2. skrytou vrstvou
for(var k=0; k < num_hidden_2; k++)
{
for(var j=0; j < num_hidden_1 + 1; j++)
{
w_h_2[j][k] += learning_rate * h_err_2[k] * h_out_1[j];
}
}
// zmena vah medzi vstupom a 1. skrytou vrstvou
for(var k=0; k < num_hidden_1; k++)
{
w_h_1[0][k] += learning_rate * h_err_1[k] * x;
w_h_1[1][k] += learning_rate * h_err_1[k] * y;
w_h_1[2][k] += learning_rate * h_err_1[k] * in_bias;
}
}
// vypocita vystup
function getOutput(x, y)
{
var out = new Array(2);
// vystupy pre 1. skrytu vrstvu
for(var j=0; j < num_hidden_1; j++)
{
h_out_1[j] = getOut(w_h_1[0][j] * x + w_h_1[1][j] * y + w_h_1[2][j] * in_bias);
}
// vystupy pre 2. skrytu vrstvu
for(var k=0; k < num_hidden_2; k++)
{
var sum = 0;
for(var j=0; j < num_hidden_1 + 1; j++)
{
sum += h_out_1[j] * w_h_2[j][k];
}
h_out_2[k] = getOut(sum);
}
// vystup
for(var k=0; k < num_outputs; k++)
{
var sum = 0;
for(var j=0; j < num_hidden_2 + 1; j++)
{
sum += h_out_2[j] * w_o[j][k];
}
out[k] = getOut(sum);
}
return out;
}