liquidcarrot / carrot

🥕 Evolutionary Neural Networks in JavaScript
https://liquidcarrot.io/carrot/
MIT License
295 stars 34 forks source link

Weird results #234

Open clive-g-brown opened 4 years ago

clive-g-brown commented 4 years ago

Description

When running the vanilla xor, I get widly varying results after training, yet with a very low measured error. almost random results with low error, both in debugger and when printing to console.

Screenshots

5 consecutive runs (error is line 1):

-0 [ 1 ] [ 1 ] [ -1 ] [ 1 ]

-0 [ 0 ] [ 1 ] [ 0 ] [ 0 ]

0.00019156340528790638 [ 0.5116388521017431 ] [ 0.3428954069380361 ] [ 0.5116388521017431 ] [ 0.3428954069380361 ]

-0 [ 0.34173701088298947 ] [ 0.005307673690185314 ] [ 0.0017903267041861595 ] [ 6.842180212331013e-7 ]

-0 [ 1 ] [ 0 ] [ 0 ] [ 0 ]

Files

A list of relevant files for this issue. This will help people navigate the project and offer some clues of where to start.

To Reproduce

const chai = require('chai') const assert = chai.assert

let { Network, methods } = require('@liquid-carrot/carrot');

// this network learns the XOR gate (through neuro-evolution) async function execute () { // no hidden layers... var network = new Network(2,1);

// XOR dataset var trainingSet = [ { input: [0,0], output: [0] }, { input: [0,1], output: [1] }, { input: [1,0], output: [1] }, { input: [1,1], output: [0] } ];

const results = await network.evolve(trainingSet, { mutation: methods.mutation.FFW, equal: true, error: 0.0003, elitism: 10, mutation_rate: 0.3, threads: 5 }); console.log(results.error) assert.isBelow(results.error, 0.0003); // and it works! console.log(network.activate([0,0])); // 0.2413 console.log(network.activate([0,1])); // 1.0000 console.log(network.activate([1,0])); // 0.7663 console.log(network.activate([1,1])); // 0.008 }

execute();

/// threads 1, 1000 iterations -- logging

teration 100 fitness -0.0011220021193443105 error 0.0005220021193443104 iteration 200 fitness -0.0006363003302362967 error 0.0000363003302362966 iteration 300 fitness -0.0006277835038999049 error 0.00002778350389990485 iteration 400 fitness -0.0006250023524746145 error 0.00002500235247461448 iteration 500 fitness -0.0006244568900950992 error 0.000024456890095099146 iteration 600 fitness -0.0006058503711863999 error 0.00000585037118639982 iteration 700 fitness -0.0006041840989964885 error 0.000004184098996488483 iteration 800 fitness -0.0006020429427010222 error 0.0000020429427010221213 iteration 900 fitness -0.0006014404264906937 error 0.000001440426490693686 iteration 1000 fitness -0.0006014404264906937 error 0.000001440426490693686 0.000001440426490693686 [ 0.99596362676882 ] [ 0.496402339649377 ] [ 0.41957367383984256 ] [ 0.034813165252755914 ] neon_carrot % node test1.js iteration 100 fitness -0.0012000000000000001 error -0 iteration 200 fitness -0.0012000000000000001 error -0 iteration 300 fitness -0.0012000000000000001 error -0 iteration 400 fitness -0.0012000000000000001 error -0 iteration 500 fitness -0.0012000000000000001 error -0 iteration 600 fitness -0.0012000000000000001 error -0 iteration 700 fitness -0.0011 error -0 iteration 800 fitness -0.0011 error -0 iteration 900 fitness -0.0011 error -0 iteration 1000 fitness -0.0011 error -0 -0 [ 0.27516382951966845 ] [ 0.3855840206635007 ] [ 0.27516382951966845 ] [ 0.3855840206635007 ] neon_carrot % node test1.js iteration 100 fitness -0.0006000000000000001 error -0 iteration 200 fitness -0.0006000000000000001 error -0 iteration 300 fitness -0.0006000000000000001 error -0 iteration 400 fitness -0.0006000000000000001 error -0 iteration 500 fitness -0.0006000000000000001 error -0 iteration 600 fitness -0.0006000000000000001 error -0 iteration 700 fitness -0.0006000000000000001 error -0 iteration 800 fitness -0.0006000000000000001 error -0 iteration 900 fitness -0.0006000000000000001 error -0 iteration 1000 fitness -0.0006000000000000001 error -0 -0 [ 1 ] [ -1 ] [ 1 ] [ 1 ]

// then after many tries it gets it right

iteration 100 fitness -0.0004567252593608716 error 0.0002567252593608716 iteration 200 fitness -0.00021686014209889781 error 0.000016860142098897805 iteration 300 fitness -0.00020795225452568586 error 0.000007952254525685855 iteration 400 fitness -0.0002029582806041947 error 0.0000029582806041947003 iteration 500 fitness -0.0002029582806041947 error 0.0000029582806041947003 iteration 600 fitness -0.00020277357041923415 error 0.0000027735704192341406 iteration 700 fitness -0.00020082334109185242 error 8.233410918524102e-7 iteration 800 fitness -0.00020082334109185242 error 8.233410918524102e-7 iteration 900 fitness -0.00020082334109185242 error 8.233410918524102e-7 iteration 1000 fitness -0.00020082334109185242 error 8.233410918524102e-7 8.233410918524102e-7 [ 0.0002002736795891913 ] [ 0.9990157960831416 ] [ 1.0006023497616376 ] [ 0.0013862799989068364 ]

clive-g-brown commented 4 years ago

Hi all. I tried this again, using the example given in the docs (same as above), just with console outputs. Its still generating basically random outputs, only occasionally right.