We frequently found ourselves wishing for a convenient way to use machine learning to solve simple tasks we had, but could never find the time to set up a dedicated system to solve each one, so we decided to create a system could be used to solve a multitude of problems in a generalized and distributed way.
What it does
The web server creates a population of neural networks and provides them to client machines upon request. The clients will execute a fitness function on these networks (genomes) to judge how effectively they solve the problem, this fitness value is returned to the server. Once all genomes in a generation have been evaluated, the population will mutate. The NEAT (NeuroEvolution of Augmenting Topologies) algorithm can modify both connection weights and network structure, which distinguishes it from other, non-evolutionary, neural networks. Genomes with higher fitness values are more likely to have their traits persist into future generations, evolving to become better. These new networks are then made available to clients for evaluation, and this cycle repeats until the clients are satisfied with the fitness of networks.
The problem we chose to demonstrate our server on is evolving a network to play Super Mario World.
How we built it
The web server is built on the flask python library. We used NEAT-python, a library which implements the NEAT algorithm to evolve our networks.
We used BizHawk, a Lua based TAS emulator to run our neural networks to play Super Mario World.
Challenges we ran into
Utilizing libraries to solve problems that they were not strictly designed for is always a challenge. Significant modification to the functionality of the NEAT library had to be made for it to work with our distributed evaluation framework.
We encountered significant difficulty getting our neural networks to properly run in the emulator.
Accomplishments that we're proud of
Although the demonstration of the server is imperfect, the server itself works excellently, and correctly provides networks for evaluation, and evolves them based on the fitness values returned by the clients.
What's next for NEATWebserver
Writing our own implementation of the NEAT algorithm, or variations such as HyperNEAT will improve performance of the server and allow for faster and more successful evolution.