Neste vídeo amosan a evolución de redes neuronais con algoritmos xenéticos para xogaren ao Flappy Bird. O proceso chámase NEAT e xa ten un tempo, pero é realmente fascinante. A ver se consigo que vos entusiasmedes tanto coma min.
Unha rede neuronal é un algoritmo composto por un monte de neuronas interconectadas distribuídas en capas. As redes modernas teñen millóns de neuronas e de conexións entre elas, este último número é o que adoita ser máis relevante.
Nunha rede neuronal, unha neurona non é máis ca unha caixiña que colle números e os transforma noutro. Cada neurona produce un valor segundo o valor das súas entradas e o ‘peso’ asignada a cada unha e unhas funcións matemáticas de seu. As neuronas da primeira capa obteñen como entrada os datos do problema e pasan a súa saída á seguinte capa interna. As neuronas das capas internas reciben como entrada os resultados das capas anteriores e pasan a súa saída á seguinte capa. Na capa final, as neuronas recollen valores da capa penúltima e xeran a saída final da rede.
Cando lle das un problema á rede pódeslle dicir que tal o fixo, e con iso axusta matemáticamente todos os seus pesos internos para mellorar. Tras dunha boa chea de exemplos, todo os pesos van ficando atinados e a rede neuronal responde de marabilla. Soa un pouco a maxia, seino. Lévanse usando arreo en moitas cousas, sendo a máis sobranceira o recoñocemento de imaxes (caras, OCR)… mais con capas abondas, fan de todo.
Por outro lado, os algoritmos xenéticos úsanse para desenvolver estratexias de resolución. Funcionan de xeito máis transparente. Explicareino cun labirinto. Comézase cun feixe de solucións aleatorias. Por exemplo: xirar á esquerda tres veces; esquerda, logo dereita, e outra á esquerda; etc. Próbanse todas e puntúanse segundo o perto que quedaron do final do labirinto. Logo elimínanse as que peor o fixeron.
As mellores crúzanse para dar novas. Por exemplo, se son secuencias de 50 pasos, cóllense os primeiros 25 dunha e os seguintes 25 doutra. Tamén se engaden mutacións, coma trocar aleatoriamente un paso da secuencia. Isto axuda a probar camiños novos. A nova xeración próbase de novo. Puntúanse, mátanse, crúzanse, mútanse. E así até dar coa resolución do labirinto. Os algoritmos xenéticos son moi bos para resolveren puzles ou videoxogos. Neste paper úsanos para xogar ao Lemmings.
Ben, no vídeo do comezo empregaron NEAT, unha combinación de ambas cousas, redes neuronais e máis algoritmos xenéticos. No Flappy Bird, a decisión é cando aletexar. Moi rápido subes, devagar manteste, non aletexas, vas caendo. Perdes cando bates contra o chan ou contra unha das tuberías. Así que definen a entrada da rede neuronal como a distancia do paxaro á tubería, a altitude á que está, e a altitude á que está o buraco. A decisión que ten que tomar a rede neuronal, en cada momento de xogo, é se aletexar ou non.
Poderíase adestrar unha soa rede, partida a partida, mais refinaríase moi lentamente: velaí a vantaxe de a combinar co algoritmo xenético. O que fan é empregar cada rede neuronal como individuo da poboación sobre a que aplican o algoritmo xenético. No vídeo, cada rede neuronal é representada por un dos paxariños que vedes. Primeiro xeran un feixe de redes sinxelas de todo. Proban e anotan o lonxe que chega cada unha antes do paxaro morrer. Despois desbotan as redes que peor o fan. Pero neste caso as mellores non as cruzan entre elas, o método é algo distinto.
O que fan é copiar as mellores redes cunha mutación: engaden neuronas, quítanas, ou reconducen as conexións entre elas. Logo, volven pór a nova xeración de redes a xogar (nova vaga de paxariños) e repiten o proceso todo, varias veces. De cada volta van obtendo redes máis e máis depuradas, que reaccionan mellor aos obstáculos. Coma se criasen os animais mellor adestrados. Ao cabo, obtense unha rede neuronal que sabe perfectamente como responder perante as tuberías: aletexa cando cómpre e deixa caer cando non.
É simple mais máxico ao tempo. Unha réplica dixital da evolución xenética dos cerebros humanos… orientada cara xogar ao Flappy Bird. O código todo está en Github e é ben sinxelo de seguirdes.
Se gostastes de NEAT, aquí tedes outro vídeo explicando a mesma técnica aplicada ao Super Mario por Seth Bling:
Publicado orixinalmente en Twitter.
Podes interaxir con esta entrada de moitas formas: con pingbacks, con webmentions… ou simplemente respondendo a través do Fediverso, por exemplo visitándoa en Mastodon.