Ensinamos uma IA a jogar Mario Kart e Mega Man!

Conheça nosso projeto que ensina IAs a jogarem jogos antigos!

Bernardo Coutinho
Turing Talks
6 min readFeb 13, 2022

--

Projeto desenvolvido por: Nelson Yamashita, Rafael Coelho, Stephanie Urashima, Matheus Rezende, Fernando Matsumoto e Bernardo Coutinho.

Introdução

Bem-vindo a mais uma edição do Turing Talks! Hoje iremos divulgar um pouco de um projeto que temos realizado no último ano, o TuringRetro!

O TuringRetro é um projeto da área de Aprendizado por Reforço no qual utilizamos Inteligência Artificial para ganhar jogos retrô, como o Super Mario Kart e o Mega Man 2.

Ele está disponível neste link no nosso Github:

O que é Aprendizado por Reforço?

O Aprendizado por Refoço, em inglês Reinforcement Learning (RL), é uma subárea do Aprendizado de Máquina que estuda programas que aprendem a realizar tarefas complexas por tentativa e erro, a partir do feedback que recebe de suas ações.

Esse tipo de aprendizado se assemelha muito ao processo de aprendizado intuitivo dos seres humanos, no qual o indivíduo experimenta algo e, com base na resposta desse experimento, decide se ele vale a pena ou não. Quando uma criança encosta o dedo em uma superfície quente, por exemplo, ela recebe uma resposta negativa e não repete a mesma ação.

As técnicas de Aprendizado por Reforço são muito poderosas, já que conseguem gerar comportamentos extremamente complexos, muito difíceis de serem programados, como fazer um robô caminhar ou até correr sem cair.

Por que decidimos fazer esse projeto?

Nosso principal objetivo foi o de aplicar os conhecimentos que obtivemos estudando diversos algoritmos de RL em ambientes diferentes dos convencionais. Decidimos que jogos antigos poderiam oferecer resultados interessantes, além de que jogos, por sua natureza, têm uma boa base para serem aplicados em ambientes de RL, já que possuem recompensas para feedback (pontos) e objetivos bem definidos.

Além disso, jogos historicamente foram usados para testar algoritmos de RL, como no artigo em que apresentaram o algoritmo Rainbow, uma combinação de técnicas em aprendizado por reforço profundo que conseguiu resultados espetaculares em jogos de Atari. Outros exemplos são o Five da OpenAi com Dota 2 e AlphaZero para Go, Xadrez e Shogi.

Super Mario Kart

Um dos dois jogos iniciais que utilizamos para o projeto foi o Super Mario Kart. Este é um jogo de corrida no qual o jogador compete com sete outros corredores controlados pelo computador, podendo acelerar, dar ré, pular e até usar itens. Neste desafio, tentamos ensinar nosso programa a completar cinco pistas diferentes.

Para o treinamento da IA, estabelecemos três regras principais:

  1. O jogador perde sempre que sair da pista. Isso torna as corridas bem mais difíceis, mas também as torna bem rápidas, já que o jogador pode recomeçar facilmente uma pista em vez de ficar batendo contra uma parede;
  2. O jogador ganha quando completar todas as 5 voltas;
  3. O jogador ganha pontos para cada checkpoint que ele ultrapassa. Cada pista do Super Mario Kart possui alguns checkpoints, como ilustrado na figura abaixo. Ao dar feedback positivo a cada checkpoint, conseguimos ensinar a IA a completar a pista de forma rápida.

Com essas regras, apesar de tornamos o jogo muito mais difícil para o programa, também criamos um bom ambiente para seu aprendizado.

Resultados

Após o treinamento dos jogadores, eles conseguiram terminar todas as cinco voltas em duas das pistas escolhidas, como mostrado abaixo:

Já nas pistas mais complexas, como a Rainbow Road, o programa consegue completar algumas voltas, mas acaba saindo da pista em algum momento:

Apesar de não conseguir concluir todas as pistas, o resultado do agente foi bem positivo, com um desempenho melhor que a maioria dos participantes do grupo.

Mega Man 2

Mega Man 2 é um jogo de ação e plataforma de grande sucesso do console NES, conhecido no Brasil como Nintendinho. Originalmente o objetivo do jogo era que o personagem passasse por 8 fases, derrotando um inimigo final poderoso chamado de Robot Master no fim da cada uma delas.

Primeiramente tentamos treinar a IA para que conseguisse chegar ao final da fase, tendo que aprender a passar por diversos obstáculos, como buracos, espinhos e inimigos, e depois conseguisse derrotar esse chefe final, ou seja, uma IA bem generalizada. Rapidamente vimos que isso não daria certo, então focamos em um dos objetivos, que foi o de aprender a derrotar cada um desses chefes.

Normalmente, no jogo, você pode optar por utilizar diversos tipos de equipamentos diferentes, ao invés do tiro convencional do personagem, e alguns chefes possuem fraquezas — ou seja, levam mais dano — de certos equipamentos. Para tornar a IA mais desafiadora, fizemos com que o personagem só pudesse usar seu equipamento básico.

Para fazer a engenharia das recompensas, fizemos com que o agente seja punido (receba um feedback negativo) toda vez que recebe dano e quando morre, sendo que, quando ele morre, a simulação do episódio é terminada. Analogamente, ele recebe uma recompensa toda vez que consegue causar dano ao inimigo. Ajustamos as recompensas de maneira que ele recebesse mais pontos ao acertar o inimigo do que perdesse quando receber dano, dando à IA uma característica mais agressiva.

Os resultados foram bem positivos, sendo que, dos 8 chefes, a IA conseguiu aprender a derrotar consistentemente 6, incluindo o infame Airman ;).

Tecnologias Utilizadas

Como o TuringRetro foi um dos nossos projetos mais complexos, optamos por nos basear em algumas ferramentas de Aprendizado de Máquina para auxiliar o desenvolvimento:

Para treinar as IAs, utilizamos a biblioteca de Aprendizado por Reforço do Ray chamada RLLib, que disponibiliza diversos algoritmos de Aprendizado Profundo e de fácil uso.

Já para a interação da IA com os ambientes de jogos retrô, utilizamos a biblioteca da OpenAI chamada Gym Retro, especializada justamente nessa funcionalidade.

Por fim, para treinar os jogadores de maneira rápida, utilizamos os créditos da AWS concedidos pela Amigos da Poli para alugar máquinas na nuvem.

Como rodar o projeto

O TuringRetro possui dois scripts principais: um para treinar um jogador e outro para rodar um jogador já treinado. Para rodar o projeto, é necessário primeiro instalar as ferramentas necessárias, que pode ser feito por meio do Docker, como explicado nesta seção do repositório. Em seguida, para rodar o projeto, basta utilizar os comandos explicitados nesta seção.

Não se esqueça de nos acompanhar em nossas redes sociais! No Facebook, Linkedin, Instagram e, claro, nossos posts do Medium! Também temos um servidor no Discord no qual divulgamos e discutimos assuntos de Inteligência Artificial.

--

--

Bernardo Coutinho
Turing Talks

Computer Engineering undergraduate at Poli-USP. Interested in Machine Learning and Robotics. https://github.com/Berbardo