segunda-feira, 1 de junho de 2015

Neuroevolução



Em posts anteriores vimos que uma rede neural é capaz de responder problemas onde se busca aprender uma resposta que é conhecida. Para isso, a rede é treinada com um algoritmo como o BackPropagation, por exemplo, comparando os resultados esperados com os resultados obtidos e assim fazendo um ajuste incremental. Mas e se a resposta não for conhecida? E se o desafio for descobrir uma forma de resolver um problema? Neste caso, para treinar a rede, ao invés do BP poderíamos usar um algoritmo genético. Algoritmos genéticos também foram discutidos em um post anterior, e neste vimos que eles buscam encontrar uma solução ótima para um problema, criando e aplicando um ambiente de seleção evolutiva. Considerando tudo isso: e se nós usássemos um algoritmo genético para encontrar o conjunto de pesos ideal da rede? É exatamente isso que a neuroevolução faz!

Neuroevolução é um método de aprendizado de máquina que treina redes neurais artificiais através de algoritmos evolutivos, como algoritmos genéticos, e que tem sido muito aplicado em jogos eletrônicos. Algoritmos evolutivos tratam o problema do aprendizado como uma tarefa de otimização, onde podemos definir uma medida de sucesso, chamada  fitness, para ser maximizada ou minimizada, tentando alcançar o melhor resultado possível em um tempo experimental a se determinar. Desta forma, os conjuntos de pesos e símbolos que configuram a população de soluções são representados por genomas, onde cada gene pode representar um peso.

Os genomas passam pelo processo de seleção, cruzamento e mutação por diversas gerações, sendo selecionados pelo seu fitness. O fitness de cada genoma (genótipo) é calculado através da performance de sua rede neural (fenótipos) em resolver o problema proposto (se adaptar) usando os pesos de seu genoma.

A neuroevolução pode ser implementada do modo simples, evoluindo apenas os pesos das conexões, mas também pode ser implementada de forma completa, evoluindo a topologia da rede inteiramente (neurônios e conexões).
Existe um conceituado método de neuroevolução chamado Neuro Evolution of Augmenting Topologies (NEAT). NEAT aumenta o tamanho dos genomas de modo incremental. Quando uma rede neural sofre alguma mutação, esta tende a sobreviver apenas se essa mutação trouxer algum benefício significante para o fitness da rede (genoma do jogador), evitando dessa forma neurônios e conexões inapropriadas que não têm utilidade, assim evitando "trabalho manual" humano em experimentar diferentes topologias. Isso comumente permite encontrar soluções melhores que as dos algoritmos que evoluem somente os pesos.

Através da neuroevolução é possível não apenas resolver os mesmos problemas de antes (onde a resposta era conhecida), como ainda desenvolver controladores inteligentes que aprendem a interagir com um determinado ambiente de forma apropriada.


Abraços miningnoobs!


Nenhum comentário:

Postar um comentário