Neuroevolução com Crescimento Topológico Ivan Medeiros Monteiro Instituto de Informática – Universidade Federal do Rio Grande do Sul (UFRGS) Caixa Postal 15.064 – 91.501-970 – Porto Alegre – RS – Brazil {immonteiro}@inf.ufrgs.br Resumo. Este trabalho apresenta a neuroevolução com crescimento topológico baseando-se no funcionamento do NEAT (NeuroEvolution of Augmenting Topologies) e do rtNEAT, sua variante utilizada para evolução em tempo-real. 1- Introdução A evolução das redes neurais artificiais usando algoritmos genéticos tem se mostrado bastante promissora em problemas complexos de aprendizagem por reforço (Floreano and Mondada 1994; Gomez 2003). Nesta abordagem os algoritmos genéticos realizam uma busca em direção à configuração dos parâmetros ótimos da rede, inspirados na genética e no mecanismo de seleção natural. As abordagens convencionais de neuroevolução utilizam algoritmos genéticos para ajustar os pesos sinápticos da rede neural. Esses métodos fazem uso de topologia fixa, ou seja, assume-se que a topologia da rede é adequada, realizando apenas busca no espaço de pesos. Entretanto, os pesos não são os únicos parâmetros de uma rede neural que contribui com o seu comportamento, pois sua estrutura topológica também afeta como a mesma funciona. Neste trabalho são apresentados o NEAT e sua variante para tempo real, o rtNEAT, como métodos utilizados para neuroevolução com ajustes na estrutura topológica da rede neural juntamente com os pesos. Para isto, uma breve revisão de algoritmos genéticos é vista na sessão 2 e a citação de alguns outros métodos de neuroevolução aparecem na sessão 3. O NEAT e o rtNEAT são apresentados nas sessões 4 e 5 respectivamente, na sessão 6 é vista uma aplicação para o rtNEAT e as considerações finais são feitas na sessão 7. 2 - Algoritmos Genéticos Algoritmos genéticos são algoritmos de otimização global, baseados nos mecanismos de seleção natural e da genética. Eles empregam uma estratégia de busca paralela e estruturada, embora aleatória, direcionada à busca de pontos de 'alta aptidão', ou seja, pontos nos quais a função a ser minimizada ou maximizada tem valores relativamente baixos ou altos (Rezende 2002). A busca é feita por meio de processos interativos, onde cada interação é chamada de geração. Para cada geração, os princípios da seleção natural e da reprodução são aplicados a uma população. A seleção determina os indivíduos da população que irão se reproduzir, criando descendentes para a próxima geração. Os algoritmos genéticos processam indivíduos de uma população através da representação genômica desse indivíduo. Em geral, são utilizados nos algoritmos genéticos os genomas contendo apenas um cromossomo. O cromossomo representa o conjunto de parâmetros da função objetivo que se deseja otimizar e o conjunto de todas as formas que o cromossomo pode assumir constitui o seu espaço de busca. Para identificar os indivíduos mais aptos dentro da população, cada genoma é avaliado por uma função de fitness. Esta função recebe os genes do cromossomo e atribui um valor de aptidão a este indivíduo. Uma vez associada uma nota a cada indivíduo, o processo de seleção escolhe, então, um subconjunto de indivíduos da população atual, gerando uma população intermediária. Diversos métodos podem ser utilizados para a seleção como o método da roleta, o método do torneio e o método da amostragem universal. Utilizando da inspiração genética, um indivíduo pode ser visto de duas formas. Através do seu genótipo, que é toda a codificação genética do indivíduo que define quais serão suas características, e pelo seu fenótipo, que são as características do indivíduo já traduzidas do genótipo. A avaliação do indivíduo é feita sobre seu genótipo, mas normalmente o que se busca é alcançar um determinado fenótipo. A geração sucessiva de populações que melhoram a aptidão com o tempo é feita através de operadores genéticos. Estes operadores são: crossover e mutação. O operador de mutação é necessário para a introdução e manutenção da diversidade genética da população, alterando arbitrariamente um ou mais componentes de uma estrutura escolhida. O crossover é o operador responsável pela recombinação de características dos pais, permitindo que as próximas gerações herdem essas características. 3 – Neuroevolução Neuroevolução é a combinação de redes neurais e algoritmos genéticos onde as redes são os fenótipos a serem alcançados. Os cromossomos na neuroevolução podem representar qualquer parâmetro da rede, desde pesos, passando por função de ativação, até a topologia. A maioria dos sistemas de neuroevolução envolve topologia fixa, ou seja, eles aperfeiçoam apenas os pesos das conexões. Neste modelo é necessário chegar inicialmente a uma topologia adequada, para só então aplicar o método. Três desses sistemas se destacam por seu desempenho em comparação a outros, são eles: SANE (Moriarty 1997), ESP (Gomez and Miikkulainem 1997; Gomez 2003) e CMA-ES (Igel 2003). Os métodos que consideram a evolução topológica são conhecidos como TWEANNs (Topology and Weight Evolving Neural Networks). Neles o genoma codifica tanto a topologia como os pesos das conexões de uma rede. Estes métodos podem descobrir sozinhos a topologia adequada para a rede. Assim a evolução da topologia pode ser usada para aumentar a eficiência, deixando a rede menor possível. 4 – NEAT NEAT (NeuroEvolution of Augmenting Topologies) é uma técnica que utiliza algoritmo evolutivo para definir as configurações de uma rede neural. Esta técnica combina a usual busca por pesos da rede com o crescimento da topologia. Ela é formada pela solução de três desafios fundamentais envolvendo evolução topologia em redes neurais, que são: Como fazer crossover de topologias diferentes? Que é solucionado com registro histórico das inovações para permitir o alinhamento dos genes. Como proteger inovações ainda não otimizadas? Que é solucionado com a separação de cada inovação em diferentes espécies. Como obter uma topologia minimizada? Que é conseguido a partir da evolução incremental, adicionando nodos e conexões a uma estrutura mínima. 4.1 - Codificação genética A representação da codificação genética da rede precisa ser flexível para permitir o crescimento da sua estrutura. No NEAT o genoma é representado como uma lista de genes de conexão, onde cada gene refere-se a uma conexão entre dois nodos direcionada, com um peso, um número de inovação (innovation number) e um marcador de ativo ou não, como visto na figura 1. Figure 1: Codificação Genética O aumento da complexidade da estrutura topológica da rede ocorre através de mutações de duas maneiras. A primeira é adicionando conexões, onde uma nova conexão liga dois nodos não conectados. A segunda forma é adicionando um nodo entre dois nodos conectados, neste caso uma conexão existente é desativada e um novo nodo é colocado no lugar da conexão desativada. Duas novas conexões ligam o novo nodo aos nodos que participam da conexão desativada. É dado o peso um para a conexão entre a origem e novo nodo e passado o peso da conexão desabilitada para a conexão que vai do novo nodo ao destino, como visto na figura 2. Cada mutação expande o tamanho de genoma adicionando genes. A adição de um novo nodo acrescenta não linearidade (ex. função sigmóide) em relação a conexão desativada, entretanto essa não linearidade, inicialmente, modifica pouco a função anterior, mantendo qualitativamente o mesmo comportamento e permitindo o desenvolvimento de um comportamento original. Figure 2: Mutação com adição de conexão e nodo. 4.2 - Seguindo genes através de marcos históricos A origem histórica de cada gene pode ser usada para alinhar os genes de qualquer indivíduo na população. Assim, dois genes de mesma origem histórica representam a mesma estrutura (possivelmente com diferentes pesos), uma vez que eles tenham sido herdados do mesmo ancestral em algum momento no passado. Quando uma mutação estrutural gera um novo gene, um innovation number global é incrementado e atribuído ao gene. Assim, este innovation number representa uma cronologia de todo gene na população, o que leva ao conhecimento da origem histórica de todos os genes ao longo da evolução. No momento da operação de crossover são conhecidos quais genes se alinham através de seus innovation number, como pode ser visto na figura 3. Os genes que não estão alinhados são chamados de disjoint ou de excess. Os genes disjoint são aqueles que não existem no segundo pai, mas sua ordem cronológica se encaixa entre os genes deste segundo. Já os genes excess, são aqueles que não existe no segundo pai e sua ordem cronológica é maior que a de todos os genes do segundo. No momento do crossover os genes com os mesmos innovation numbers são alinhados para a geração da prole. No NEAT a prole pode ser gerada de duas formas. A primeira é através de crossover uniforme, onde os genes alinhados são escolhidos aleatoriamente dos pais. A segunda forma é o blended crossover, onde são calculadas as médias dos pesos das conexões para os genes alinhados. Os genes disjoint e excess são herdados do pai mais ajustado, caso ambos os pais tenham o mesmo desempenho, são herdados dos dois pais. Figure 3: Crossover usando innovation number para alinhar os cromossomos. 4.3 - Protegendo novas gerações No NEAT as espécies competem inicialmente dentro do seu próprio nicho ao invés de com toda a população. Desta forma, as inovações topológicas são protegidas e têm tempo de aperfeiçoarem seus parâmetros antes de competir com outros nichos. A idéia por trás disso é que novas estruturas necessitam de tempo para alcançar seu potencial para só então poderem ser eliminadas. Genomas mais simples vivem tanto o quanto competitivo seja seu desempenho, isto garante que redes menores não sejam trocadas por redes maiores desnecessariamente. A classificação da população em espécies é baseada na similaridade topológica. Esta similaridade é definida por uma função de distância d que é expressa abaixo. Nesta função, E representa o número de excess, D o número de disjoint, W a diferença média de pesos, N o número de genes no maior genoma e c1,c2,c3 coeficientes de ajuste que pondera cada um dos parâmetros. Para a verificação de pertinência de um genoma no grupo é verificada a distância dele a um membro aleatório do grupo, caso essa distância seja menor que um δt, que é um limiar de compatibilidade, o indivíduo é colocado no grupo. Caso um genoma não seja alocado em nenhuma espécie, uma nova espécie é criada. No NEAT, organismos de uma mesma espécie possuem um fitness compartilhado que é usado para calcular o desempenho do seu nicho. Isso evita que um nicho cresça muito caso muitos dos seus indivíduos estejam com bom desempenho. Assim, é calculado um fitness ajustado f' para cada genoma de acordo com sua distância para os restantes no grupo. Onde sh(δ(i,j)) é 1 caso j seja da mesma espécie que i e 0 caso contrário. Ou seja, o denominador representa o número de indivíduos de uma espécie. Assim, para cada espécie é atribuído um número de prole diferente, que é proporcional a soma dos fitness ajustados de cada membro. A média do fitness ajustado da população é dado por Fk , sendo k uma espécie. A soma de todas as médias é dada por Ftot. Com isto, é expresso quantitativamente o número de indivíduo da prole para uma espécie k como: Como principal efeito da divisão da população em espécies tem-se a proteção das inovações topológicas da rede, que tem um período para evoluir antes de ser avaliada com o restante da população. 5 - Real-time NEAT (rtNEAT) O NEAT foi projetado inicialmente para executar offline, entretanto, algumas aplicações necessitam interagir com indivíduos (agentes) enquanto eles evoluem. O NEAT avalia toda uma geração de indivíduos antes de criar uma nova, isto torna inviável a aplicação dele em tempo-real. Uma alternativa para isso seria executar toda a população ao mesmo tempo, coletando constantemente estatísticas de desempenho enquanto os indivíduos executam. Nesse princípio que se baseia o rtNEAT (Real Time NeuroEvolution of Augmenting Topologies). Ele modifica o clico de reprodução produzindo apenas uma nova prole por vez. Abaixo são descritos os passos do algoritmo. Passo 1 - Cálulo do fitness ajustado - Como visto na sessão anterior, o fitness ajustado fi’ é dado por fi/|S|, onde S é a quantidade de indivíduos no nicho. Passo 2 - Removendo o pior indivíduo: - Um indivíduo com um desempenho ruim é removido na esperança de que um melhor o substitua. Entretanto, os indivíduos só são removidos a partir de uma quantidade especificada de tempo. Passo 3 - Re-estimando F: - F precisa ser mantido atualizado para que seja usado na escolha dos pais da espécie no próximo passo. Passo 4 - Criando prole: - Como só é criada uma prole por ciclo, a equação do número de prole não pode ser utilizada. Neste caso, a probabilidade de escolher a espécie para gerar prole é proporcional ao fitness médio da espécie comparado com o fitness médio total. Passo 5 - Reatribuindo agentes para espécies: - Toda a população precisa ser reatribuída para uma espécie existente baseado no novo δ t. Passo 6 - Substituição de um agente antigo por um novo O algoritmo do rtNEAT é uma adaptação do NEAT original para atender requisitos de tempo-real. Ele prevê que todo o loop seja executado em intervalos regulares, ou seja, a cada n ciclos de simulação. 6 - Aplicando rtNEAT ao NERO O NERO(NeuroEvolving Roboctic Operatives) é um jogo que representa um novo gênero voltado à aprendizagem de máquina. Seu objetivo é colocar o jogador como um treinador que ensina comportamentos para times de agentes para que eles atuem em combate militar. Os agentes, que são os personagens do jogo, começam apenas com habilidade de aprender, e para se prepararem para combater o jogador deve projetar uma seqüência de exercícios de treinamento. O jogador cria os exercícios de treinamento colocando objetos no ambiente e especificando os objetivos que devem ser atingidos. Esses objetos podem ser inimigos estáticos, torres inimigas, tanques, bandeiras e paredes. Para determinar os objetivos os jogadores podem premiar ou punir os agentes por diversos fatores: atacar o alvo, ser atingido, seguir um amigo, dispersar, abordar o inimigo, etc. Assim, o jogador cria os exercícios de treinamento e especifica o comportamento desejado. Cada rede neural controla um agente tanto no treinamento quanto na batalha. No modo de treinamento, o processo de evolução dos indivíduos ocorrem em tempo-real, com indivíduo menos aptos sendo substituídos por indivíduos melhor ajustados, como visto na figura 4. Figure 4: Evolução dos agentes. O agente possui diversos tipos de sensores como é visto na figura 5. Os radares de inimigos são dispostos ao redor do agente e ativam com intensidade proporcional a distância do inimigo. O sensor identificador de alvo em mira é ativado quando existe um inimigo na linha de tiro do agente. Os sensores de tamanho do objeto identificam objetos longos e contínuos, diferente do radar de inimigo que identifica objetos discretos. Já sensor de linha de fogo detecta o percurso de um projétil e possibilita que o agente evite ser atingido. Figure 5: Sensores dos agentes. No NERO, o jogador pode salvar o estado de seu time em arquivo. Isso possibilita que um mesmo time seja testado com diversos exercícios, sempre gravando o time atual quando ele atinge um desempenho satisfatório naquele exercício. No modo de batalha, quando o jogador inicia o jogo, as redes neurais passam a controlar os agentes, que atuam conforme o treinamento. Em batalha, diferente do treinamento, quando um agente é atingido ele leva dano e após ser atingido algumas vezes o agente é removido do campo de batalha. O jogo termina quando ou um time destrói todos os agentes do outro time ou quando os dois times chegam do lado oposto, neste último caso vence a equipe com maior número de personagens no campo de batalha. 7 – Considerações Finais A neuroevolução com crescimento topológico baseado no NEAT mostra-se bastante promissora como técnica de aprendizagem por reforço, visto que soluciona desafios da área e permite utilização em problemas complexos do mundo real. O registro de marcos históricos nos genes, a divisão em espécies para proteção de inovações e a evolução topológica a partir de estruturas singulares são inovações introduzidas pelo NEAT que o torna um método rápido e eficiente. Este método também é bastante expansível, como é visto em sua variante de tempo-real, onde populações inteiras evoluem e são avaliadas simultaneamente de forma assíncrona. O rtNEAT torna possível a construção de jogos eletrônicos e simuladores sobre o paradigma da aprendizagem de máquina, onde o personagem pode se adaptar, em tempo-real, em resposta as ações do jogador. O NERO já é um jogo construído sobre esse paradigma, possibilitando uma co-evolução massivamente paralela de uma população inteira, e onde o jogador exerce a função de treinador, criando cenários de treino para times de agentes. Assim, a neuroevolução, além de promissora para a solução de problemas difíceis do mundo real, dá mais um passo para a expansão dos domínios de aplicações para o paradigma de aprendizagem de máquina. Referências Floreano, D., and Mondada, F. (1994). "Automatic creation of an autonomous agent: Genetic evolution of a neural-network driven robot". In From Animals to Animals 3: Proceeding of the Third International Conference on Simulation of Adaptive Behavior. Gomez, F. and Miikkulainen, R (1997). "Incremental evolution of complex general behavior". Adaptive Behavior, 5:317-342 Gomez, F. J. (2003). "Robust non-linear control through neuroevolution". PhD thesis, Department of Computer Sciences, The University of Texas at Austin. Technical Report AI-TR-03-303. Igel, C. (2003). Neuroevolution for reinforcement learning using evolution strategies. In Sarker, R., Reynolds, R., Abbass, H., Tan, K.C., McKay, B., Essam, D., and Gedeon, T., editors, Congress on Evolutionary Computation 2003 (CEC 2003), 2588-2595. Piscataway, NJ: IEEE Press. Moriaty, D. E. (1997). Symbolic Evolution of Neural Networks in Sequential Decision Tasks. PhD thesis, Department of Computer Sciences, The University of Texas as Autin. Technical Report UT-AI97-257. Rezende, S. O, (2002). “Sistemas Inteligentes – Fundamentos e Aplicações”, Ed. Manole. Stanley, K. O. , Bryant, B.D., Miikkulainen, R.(2005) "Real-Time Neuroevolution in the NERO Video Game". in IEEE Transactions on Evolutionary Computation, Vol. 9, No. 6. Stanley, K. O. (2004) "Efficient Evolution of Neural Networks Complexification", PhD thesis, The University of Texas at Austin through