pkalivas / radiate

A genetic programming engine which evolves solutions through asynchronous speciation.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Linear Algebra

luiswirth opened this issue · comments

Was it an active decision to not use linear algebra for neural network forward-propagation and the like? I would assume it would speed up the computations significantly.
Crates like nalgebra would present themselves as good candidates for such an implementation.

If it was a decision, what was the motivation?
Could it be that you can't really use linear algebra for NEAT (I'm not really familiar with how NEAT works)?

For NEAT yes that's an active decision, the dense layer of this project (models/layers/dense.rs) follows the algorithm described in the original paper here. Using any sort of matrix math in NEAT is not possible, although it is possible to evolve traditional neural networks (checkout radiate-matrix-tree, the nodes in the tree use traditional matrix neural networks for forward propagation). The main goal of NEAT is to evolve efficient neural networks through adding/removing nodes and connections from the network which is only possible through the sort of neural network graph.

The main motivations were:

  • Its a cool/fun algorithm to implement
  • Neat is a great form of reinforcement learning you just can't get with traditional neural networks
  • In traditional neural networks you can only stack layers one by one meaning each node is connected to each node in in the next/previous layer. But with neat a single layer can connect anywhere from a single node to a single node, a single node to multiple, multiple to single, or multiple to multiple, all within the same layer. This means the network figures out the best combination of weights, nodes, and connections to solve your problem with the minimum size needed. The size and number of layers is often an issue when creating a neural network and involves a lot of trial and error, neat completely avoids this problem often times, within a single layer.

This project adds a few layers of abstraction on top of the NEAT algorithm (dense layer) so different types of neural networks can be built using the same algorithm (LSTM, Recurrent, ect). If you're interested in Neat and how it works, there are some really great resources online that probably do a better job of describing it than I am, its super interesting.

Okay, very interesting. Do you know how the performance of NEAT is compared to a normal neural-network which uses matrix math?
Because I'm currently implementing a simulation using neuroevolution to evolve living agents, and I'm considering implementing NEAT too.
I assume that I'm unable to use radiate because I'm using the amethyst game engine, which already uses a concurrent ECS which probably conflicts with your parallelization. Do you think so too?

Honestly it would depend on the type of problem you are tying to solve and the size of the dataset. I haven't done any side by side comparisons.

You could use radiate I'm sure, I'm not familiar with that game engine, but radiate uses rayon for the main engine's concurrency and you can set a global (possibly a scoped too) thread variable which controls how many threads rayon is allowed to use. If possible, you can use radiate to train a network on a separate machine too (examples/radiate-web) meaning you could run the game engine on one computer and evolve the network on another which would resolve that problem all together. I've found in some cases evolving an agent using radiate takes a matter of seconds so its definitely possibly you could use radiate and run your game with minimal or no notice.

Okay thanks for your support. I'll try using radiate for my own project. I hope it works out.
amethyst (game engine) also uses rayon so I think they will play together nicely.

I'm not doing traditional neuroevolution, where I have some fitness function, but instead I'm evolving agents which can reproduce (mutation) and die (selection) and therefore do evolution. So that's why I'm using a game engine, because my agents live in a rather complex environment.
Is it even possible to use radiate without a clear fitness function / Problem?

Sorry for abusing this issue. If you want we can move our discussion somewhere else :).

I'm really getting the feeling that radiate is not the thing I'm looking for. Can you maybe point me in the right direction?

I want to create artificial life (at least that's what I think it's called). I want to do neuroevoltion on agents without having a fitness function but instead relying on natural selection and mutation.

You can certainly do that with radiate... just return a 0 or some base number from the problem. However, I think you'll find it difficult to optimize any sort of neuroevolution without some sort of fitness function or grading material. You would end up with a population just randomly selecting and mutating and without some sort of way to tell which genomes are doing better, your program will most likely fail to find an optimal solution.

Okay thanks :)