Introdução à Reinforcement Learning com Deep Q-Learning

Assim como a utilização de Redes Neurais (NN) são populares para resolução de problemas de visão computacional, regressão e classificação, outra vertente do Machine Learning com grande destaque é o Aprendizado por Reforço, ou Reinforcement Leaning (RL).

Reinforcement Learning

Para explicar o funcionamento do RL podemos fazer uma analogia com o processo de aprendizado dos animais. Vamos imaginar uma pessoa que desconhece o sabor de determinado alimento e que o experimenta pela primeira vez. Esse indivíduo pode identificar o alimento como algo ruim ou bom e este conhecimento será utilizado para decidir em uma próxima vez se ele deve ou não aceitar o alimento.

Esse mesmo conceito é aplicado no RL, o algoritmo possui certo conhecimento sobre a tarefa que deve realizar e com isso faz as melhores escolhas para poder completá-la.

Nesse contexto, temos alguns componentes que fazem parte dos algoritmos de RL, sendo eles: o agente, o ambiente, o estado, a ação e a recompensa. A imagem abaixo mostra a relação entre essas partes.

Relação entre o agente e o ambiente. Fonte: https://devblogs.nvidia.com/train-reinforcement-learning-agents-openai-gym/

A ideia principal é que o agente possa escolher qual a melhor ação a ser tomada para um determinado estado, isto é, qual gera a maior recompensa. O desafio do RL é criar algoritmos que consigam escolher essas ações da melhor forma possível.

Neste artigo, o foco é a solução conhecida como Deep Q-Learning, proposta pelos pesquisadores do DeepMind Technologies.

Deep Q-Learning

Antes de entendemos o significado do “deep”, vamos entender o que é Q-Learning.

O Q-Learning é um algoritmo que utiliza uma tabela (Q-Table) que mapeia qual o valor (ou qualidade) de uma ação em determinado estado. Assim o nosso agente precisa apenas consultar a tabela para escolher uma ação.

Os valores da Q-Table são calculados realizando uma fase de exploração dos estados. Nessa etapa, o agente escolhe ações aleatórias e com base nas recompensas recebidas a tabela é atualizada seguindo a equação:

Onde:

  • Q(s, a) é a Q-Function;
  • s é o estado
  • a é ação
  • α é a taxa de aprendizagem;
  • r é a recompensa recebida;
  • γ é um desconto aplicado aos valores das ações do novo estado, já que essas ações não têm garantia de acontecerem.

A fase de exploração, mencionada anteriormente, serve para que o agente não se aproveite de ações que produzam recompensas positivas, mas sem que existam mudanças para novos estados que poderiam oferecer recompensas ainda melhores. Pense nisso como escolher pratos em um restaurante que você já conhece, é mais provável escolher um prato conhecido do que um novo que pode não lhe agradar. A relação entre a exploração dos estados e o uso do conhecimento para se aproveitar deles é definida como Exploration/Exploitation em ML.

Nas soluções que utilizam Q-Table, um ponto negativo é que para problemas com uma grande variedade de estados o custo computacional para gerar a tabela é alto. Imagine jogos em que cada frame é considerado um estado diferente, dependendo do número de pixels no frame podemos ter um número alto de estados.

Com isso em mente foi proposto o chamado Deep Q-Learning, que utiliza Redes Neurais como substitutas para as Q-Tables e permite entradas dimensionalmente maiores.

O princípio é que a NN receba como entrada um estado e suas saídas sejam os valores associados à cada uma das ações possíveis, assim a de maior valor será escolhida.

O que nós queremos com a NN é minimizar o erro entre o valor da Q-Function para o estado atual e o próximo estado:

A seguir vamos implementar uma solução simples de Deep Q-Learning.

Implementação

Para o exemplo que vamos seguir, utilizaremos o Gym do OpenAI que possui diversos problemas de reinforcement learning. Em particular vamos utilizar o ambiente “CartPole-v1”

Nesse desafio o ideia é manter um pêndulo invertido na posição vertical, para isso podemos mover sua base para a esquerda ou direita. Uma regra imposta é que se o pêndulo estiver a mais de 15º do eixo vertical o episódio é encerrado.

O código pode ser encontrado no repositório a seguir:

Como pode ser visto no código, uma otimização sugerida é chamada de Experience Replay, que basicamente é um buffer que grava os estados, ações, recompensas e próximos estados cada vez que o agente realiza uma ação, então para o treinamento são escolhidos conjuntos aleatórios desse buffer que servirão para atualizar os pesos da rede. Isso evita que a rede "esqueça" comportamentos mais antigos.

O resultado do treinamento está respresentado no GIF abaixo:

Agente treinado

Conclusão

Com uma Rede Neural simples, fomos capazes de treinar um agente que consegue jogar o ambiente “CartPole-v1” do OpenAI Gym.

Como o algoritmo Deep Q-Learning é genérico, ele pode ser aplicado em outros ambientes sem muitas modificações. O DeepMind, por exemplo, já testou o seu funcionamento em jogos do Atari 2600, como está no artigo citado anteriormente.

Referências

https://medium.freecodecamp.org/an-introduction-to-reinforcement-learning-4339519de419
https://medium.freecodecamp.org/diving-deeper-into-reinforcement-learning-with-q-learning-c18d0db58efe
https://medium.freecodecamp.org/an-introduction-to-deep-q-learning-lets-play-doom-54d02d8017d8
https://medium.freecodecamp.org/improvements-in-deep-q-learning-dueling-double-dqn-prioritized-experience-replay-and-fixed-58b130cc5682
https://arxiv.org/pdf/1312.5602.pdf
https://github.com/mgbellemare/Arcade-Learning-Environment
https://www.youtube.com/watch?v=79pmNdyxEGo