Aprendizado por Reforço #4— Gym

A caixa de areia da Inteligência Artificial

Enzo Cardeal Neves
Turing Talks
10 min readMar 22, 2020

--

Bem-vindos à mais uma edição do Turing Talks! Nessa semana abordaremos a primeira ferramenta que irá auxiliá-lo a montar um modelo de Reinforcement Learning.

Um dos empecilhos iniciais para se aplicar ou desenvolver um algoritmo de RL é a necessidade de um ambiente (virtual ou real) para a atuação do agente. A tarefa de construir esse espaço de trabalho é dispendiosa, muitas vezes sendo a etapa mais difícil do projeto, o que pode acabar desmotivando entusiastas a aprender mais a fundo sobre o tema. A biblioteca Gym se propõem a sanar exatamente esse problema, fornecendo vários ambientes diferentes para o treinamento de um agente.

Introdução

A OpenAI é uma instituição sem fins lucrativos, fundada em 2015 pelo Elon Musk, Sam Altman e outros investidores, que tem como missão pesquisar e desenvolver novas tecnologias na área de IA e disponibilizar esses novos conhecimentos de forma gratuita para o uso de todos. Um de seus primeiros projetos foi a criação da Gym, uma biblioteca de Python feita para encurtar o caminho entre a ideia de algum modelo de Aprendizado por Reforço e a sua implementação. Ela fornece diversos ambientes diferentes para você testar um agente, sendo necessário apenas o desenvolvimento da lógica do algoritmo em questão.

Imagine um boneco de ação articulado em vários pontos diferentes. Essas articulações permitem uma infinidade de posições para o brinquedo. A criança que brinca com ele é quem irá ditar os estados atingidos. O boneco, portanto, apresenta um comportamento diferente para cada brincadeira da criança. Podemos então, estabelecer uma analogia entre o boneco e a Gym e entre a criança e o algoritmo de RL que se deseja implementar.

Quais ambientes a biblioteca oferece?

Além de ser possível adicionar ambientes feitos por terceiros (inclusive feito por você!), os oferecidos nativamente são divididos em categorias, sendo as principais: Atari, controle clássico, MuJoCo, robóticos , jogos de texto e Box2D. Vamos ver a seguir um exemplo de cada uma delas.

Atari

Jogos clássicos convertidos para um formato que é possível treinar o agente.

MsPacman-v0

Controle clássico

Problemas clássicos de mecânica que estão presentes na literatura de RL há bastante tempo. Uma das vantagens de usar Gym para esses problemas é que, como há uma consistência do meio utilizado, fica mais fácil comparar os resultados de estudos diferentes desenvolvidos no mesmo ambiente.

No exemplo a seguir, tem-se um veículo com um motor que não é forte o suficiente para subir o morro maior sem um auxílio externo. O agente deve, portanto, aprender a aumentar sua energia potencial subindo o morro menor para assim ter energia mecânica suficiente para subir o morro maior.

MountainCar-v0

Box2D

Ambientes feitos com base no simulador de física bidimensional Box2D. As tarefas em questão são contínuas, ou seja, não possuem um fim bem definido.

No exemplo a seguir, ensinamos um robô bípede a andar.

BipedalWalker-v2

MuJoCo

baseados em uma engine física com foco em simulações de biomecânica, articulações, gráficas e animação. Aqui também temos tarefas contínuas.

No exemplo a seguir, temos um ambiente tridimensional no qual ensinamos um robô de 4 patas a andar.

Ant-v2

Robóticos

Ambiente que simula membros robóticos (uma mão ou uma garra) motivados por tarefas com metas bem definidas.

No exemplo a seguir, uma mão robô manipula um bloco de madeira.

HandManipulateBlock-v0

Jogos de texto

Jogos simples com gráficos feito a partir de texto apenas.

Aqui temos o jogo do táxi. O objetivo é recolher um passageiro num determinado ponto e deixá-lo em outro. Caso o passageiro for deixado em um local errado, o jogador é penalizado.

Taxi-v3

Botando a mão na massa

Para nosso exemplo prático, vamos ensiná-lo a aplicar Q-learning no jogo do táxi. Caso você não saiba do que estamos falando, recomendamos o post anterior que introduz o tópico:

Escolhemos esse algoritmo pois, além de já ter sido explicado anteriormente, é o mais básico de RL, o que facilitará o entendimento e a aplicação. Utilizaremos o jogo do táxi pois conseguimos mapear todos os estados possíveis, característica essencial para a aplicação de Q-learning.

Regras do jogo

“Há 4 localizações (nomeadas por letras diferentes), e nosso trabalho é pegar um passageiro em um local e deixá-lo em outro. Nós recebemos +20 pontos por destino correto e -1 ponto para cada passo tomado. Há também -10 pontos de penalidade para tentativas de embarque e desembarque erradas.”

Taxi-v3
  • Na representação do ambiente, o retângulo colorido é o táxi, amarelo quando estiver vazio e verde quando estiver com passageiro.
  • As barras (“|”) representam paredes as quais o táxi não pode atravessar.
  • R, G, B e Y representam os pontos de embarque e desembarque. A letra azul representa a origem do passageiro e a letra roxa representa o destino.

Espaço de estados

Definimos aqui o universo de todos os estados (situação atual e imediata do jogo) possíveis do agente no ambiente. Como foi dito anteriormente, esse número é finito, então vamos calculá-lo. O tabuleiro é uma malha 5x5, o que permite 25 posições diferentes para o veículo. Há 4 locais (R, G, B e Y) de embarque e ainda o próprio carro como localização disponível para o passageiro habitar, o que contabiliza 5 lugares possíveis. Para finalizar a viagem, há 4 destinos diferentes (R, G, B e Y), portanto, vem:

5 x 5 x 5 x 4 = 500 estados possíveis!

Podemos representar qualquer sequência de eventos imaginável com esses 500 estados. Surpreso com o resultado?

Espaço de ações

As ações que podem ser tomadas em cada estado são:

  • 0 = sul
  • 1 = norte
  • 2 = leste
  • 3 = oeste
  • 4 = embarcar
  • 5 = desembarcar

Note que sempre que o carro tentar atravessar uma parede o agente receberá uma penalidade de -1 e continuará no mesmo estado que estava anteriormente.

Implementando com a biblioteca

Para começar nosso projeto vamos precisar de um ambiente de trabalho. Recomendamos o Jupyter Notebook, mas você pode usar o de sua preferência.

Posteriormente, fazemos as importações necessárias.

Pronto, temos nosso espaço de trabalho configurado e pronto para uso. Mas antes de continuarmos, vamos entender melhor alguns dos métodos e objetos principais da Gym.

A primeira linha do código carrega o ambiente que vamos usar, no nosso caso “Taxi-v3”. Ele fica salvo na variável env.

Com o método .render(), renderizamos o estado atual do ambiente.

Primeiro estado renderizado

Outros métodos também muito importantes são:

  • env.reset: Reseta o ambiente e retorna um estado inicial aleatório.
  • env.step (action): Executa uma ação (passo). Retorna:

* observation: observações do ambiente.

* reward: recompensa recebida após a ação tomada.

* done: indica se foi o fim de um episódio. Acontece quando um passageiro embarca no táxi e desembarca no local correto.

* info: informação adicional para debbuging. O agente não tem acesso a elas.

Podemos também conferir as dimensões do espaço de ações e espaço de estados, como segue:

O que condiz com o que calculamos anteriormente.

Q-learning

Vamos agora recordar das recompensas para cada ação. Elas já estão pré-definidas na biblioteca da seguinte maneira:

  • +20 para um desembarque correto.
  • -10 para um embarque ou desembarque incorreto.
  • -1 para ações que não sejam as duas anteriores.

A recompensa de -1 é importante pois garante que o carro evite paredes (caso fique tentando entrar em uma, irá receber -1 indefinidamente) e que o agente busque se otimizar de forma a performar o menor caminho possível até o ponto de desembarque.

Como dito antes, caso não saiba o que é Q-learning, leia o nosso post anterior. Precisamos determinar os q-values para cada tupla (estado, ação), que irão orientar a política do nosso agente, ou seja 500 x 6 = 3.000 valores. A partir da equação de Bellman, determinamos os q-values como segue:

Onde:

  • α é a taxa de aprendizado (0 < α ≤ 1), que representa o quanto nosso q-value está sendo atualizado em cada iteração.
  • γ é o fator de desconto (0 < γ ≤ 1), que representa a importância que damos para recompensas futuras. γ próximo de 1 favorece as recompensas mais distantes enquanto gama perto de 0 praticamente às desconsidera.

O que estamos fazendo é atualizar o q-value da ação tomada no estado atual. Tomamos o valor antigo com um peso de (1- α) e adicionamos o novo valor aprendido, que é a combinação da recompensa por realizar a ação tomada no estado atual, com recompensa máxima, descontada (γ), do próximo estado que estaremos assim que tomarmos a ação.

Essa política fará com que o agente tome a rota que fornecerá a maior soma de recompensas possível.

Tabela-Q

Para guardar esses valores vamos criar uma tabela Estados x Ações:

Iniciamos a tabela preenchida com zeros e a cada iteração atualizamos os valores.

Passo-a-passo, fica:

  • Inicializar a tabela-Q preenchida com zeros.
  • Para as ações seguintes, há uma chance do agente tomá-las de forma aleatória ou seguir a política da tabela Estados x Ações.
  • Após episódios suficientes, é esperado que o agente atinja uma política ótima e a tabela Estados x Ações esteja com os valores o mais próximo do ideal possível.

Implementação em código

Vamos então testar o nosso agente. Será que ele atingiu uma política ótima?

Dos 100 episódios testados, nosso agente não recebeu nenhuma penalidade, o que é um ótimo parâmetro para medirmos o sucesso de seu treinamento. Em relação a média de passos, também obtemos um bom valor (metade das casas do tabuleiro percorridas) tendo em vista a existência dos obstáculos.

Conclusão

Neste post apresentamos a Gym, uma ferramenta poderosa que facilita muito a vida de quem quer iniciar os estudos em Reinforcement Learning. Apresentamos aqui seus diferentes tipos de ambientes e suas principais funcionalidades fazendo a aplicação em um exemplo prático.

Além de ser essa ótima ferramenta para iniciantes, ela também é de grande valor no meio acadêmico. Isso porque, ao normalizar o espaço de trabalho que as pesquisas são desenvolvidas, ou seja estudos diferentes desenvolvidos no mesmo ambiente, torna-se mais fácil e de maior confiabilidade se comparar os resultados obtidos.

Trabalhamos para implementar o Q-learning, um dos algoritmos mais simples de RL, ideal para os propósitos didáticos do post. Sua aplicação se limita a cenários com um número de estados finito e suficientemente pequeno. Caso esse valor se torne muito grande ou indefinido, devemos procurar outros métodos mais complexos de implementação de RL.

Atualmente, para resolver os problemas mais abstratos costuma-se usar as Deep Neural Networks que recebem na camada de entradas informações do estado e ações para poder aproximar um valor bom o suficiente para o q-value, mesmo sem levar em consideração todos os estados posteriores possíveis (até porque podem existir infinitos), aprendendo a retornar as ações corretas após treinamento suficiente.

Esse é o tipo de abordagem que se usa para treinar braços robóticos, jogos sem finais definidos como Flappy Bird, decidir preços praticados por uma empresa de acordo com as flutuações do mercado, gerenciamento de estoques ou realizar previsões no mercado financeiro. Note, portanto, que apesar da maior complexidade, a ideia central é a mesma apresentada em Q-learning.

Por fim, vamos voltar nossa atenção aos hiperparâmetros(α, γ e ε). Para decidi-los, tomamos uma abordagem de tentativa e erro. O ideal seria os ajustarmos de forma a diminuí-los com o passar do tempo, porém, por termos um espaço de estados tão pequeno, conseguimos atingir uma política ótima com valores estáticos. A justificativa para a diminuição de cada um é:

  • α: quanto mais próximo do fim do treino, com uma base de conhecimento sobre o ambiente já consolidada, uma alta taxa de aprendizado torna-se menos relevante.
  • γ: Quanto mais próximo do final do treinamento, o comportamento do agente para os finais dos episódios já estão bem definido e, se estiver aprendendo de forma correta, estará de acordo com o esperado. É interessante então melhorar o comportamento para as situações mais iniciais.
  • ε: Quanto mais atualizada a tabela-q, menos o agente precisa explorar ações aleatórias.

Para os aficionados em RL que chegaram até aqui, nossos mais profundos agradecimentos. Não se esqueçam de conferir nossas redes: Medium, Facebook, Instagram e LinkedIn. Caso tenha interesse, você pode encontrar o notebook completo do post aqui.

Até a próxima!

--

--

Enzo Cardeal Neves
Turing Talks

Graduando em Engenharia da Computação pela Poli-USP