Deep Reinforcement Learning - Aprendendo a jogar Atari

Entenda como é possível treinar agentes usando Deep Q-Networks que são capazes de jogar Atari.

Lucas Oliveira
Mar 20 · 11 min read

“We were supposed to make AI do all the work and we play games but we do all the work and the AI is playing games!”

- Andrey Karpathy

Seria possível computadores jogarem vídeo games melhores que humanos? Em 2015, um modelo de Deep Reinforcement Learning venceu humanos na maioria dos jogos de Atari. Isso não fica restrito apenas ao Atari, em muitos jogos complexos de estratégia, DRL mostrou resultados superiores contra as melhores equipes profissionais.

Graças aos avanços significativos em Deep Learning, alguns campos como, computação visual, análise de sentimento e predição de séries temporais estão em constante crescimento. Recentes progressos em Deep Learning, tornaram possível extrair recursos de alto nível de dados, levando à avanços na maioria das áreas. Algumas novas tarefas foram surgindo na área da Inteligência Artificial e houve a combinação de Deep Learning com Reinforcement Learning, que resultou no que conhecemos hoje como Deep Reinforcement Learning.

Nesse post, vamos nos atentar em reproduzir alguns conceitos do artigo escrito pelo pessoal do DeepMind: Playing Atari with Deep Reinforcement Learning, no qual introduz as primeiras noções de Deep Q-Network e utilizar a implementação dos códigos do livro: Hands-On Machine Learning with Scikit-Learn & TensorFlow.

Vamos aplicar os conceitos no jogo MS. Pac-Man. O código completo você encontra no meu repositório do GitHub.

Alguns assuntos introdutórios de Reinforcement Learning e Deep Reinforcement Learning não serão abordados, por conta disso, recomendo você ler:

1. Introdução

1.2. Reinforcement Learning

RL é atualmente um dos melhores campos a ser explorado em Machine Learning. Começou a ser observado em 1950 e já produziu diversas aplicações, em particular na área de jogos. Trata-se de tomar medidas adequadas para maximizar a recompensa em uma situação particular. É empregado por vários softwares e máquinas para encontrar o melhor comportamento ou caminho possível em uma situação específica. RL apresenta diversos desafios comparado com a aprendizagem utilizada em DL. Aplicações em DL exigem grandes quantidades de dados para treinamento. Os algoritmos de RL, por outro lado, não necessitam de tantos dados e devem ser capazes de aprender através de uma recompensa.

RL difere da aprendizagem supervisionada de forma que na aprendizagem supervisionada os dados de treinamento já possuem a resposta para que o modelo seja treinado com o output correto, enquanto que, em RL, não há resposta, mas o agente de reforço decide o que fazer para executar uma tarefa determinada. Em 2013, houve uma revolução na área quando pesquisadores de uma startup chamada DeepMind demonstraram um sistema que poderia aprender a jogar qualquer jogo de Atari, usando apenas pixels como entrada para o modelo e sem nenhum conhecimento prévio do cenário. O modelo realizou uma performance melhor que os humanos.

1.2.1. Definições em Reinforcement Learning

Agente: O agente realiza ações. No nosso caso, queremos programar um agente capaz de jogar Pac-Man.

Ambiente: Para treinar um agente, é necessário ter um ambiente para o agente poder tomar decisões.

Ação: São todas as possibilidades de ações que o agente pode desempenhar no ambiente;

Estado: Um estado é uma situação concreta e imediata em que o agente se encontra. É uma específica circunstância que contém um momento e uma configuração própria;

Política: O algoritmo usado pelo agente para determinar as ações é chamado de política. A política pode ser qualquer algoritmo que possua uma regra que você desejar. Mapeia os estados para ações que prometer a maior recompensa.

1.2.2. Aprendendo a ganhar recompensas

Em RL, o agente realiza observações e executa ações com o ambiente e como retorno, recebe uma recompensa. Caso a ação tenha sido correta, a recompensa será um valor positivo, caso contrário, um valor negativo.

1.2.3. Processos de Decisão de Markov

Processos de Decisão de Markov é um processo aleatório sem memória, conhecido como correntes de Markov. O processo constitui um número fixo de estados e aleatoriamente muda de um estado para outro.

No exemplo acima, temos estados diferentes com sucessores diferentes, por exemplo, na Classe 1, você pode ir para a Classe 2 com probabilidade 0,5 ou ir para o Facebook com probabilidade também de 0,5.

Em cada passo realizado na corrente de Markov, o agente pode escolher diversas ações e a probabilidade de transição de um passo para o outro depende da ação escolhida pelo agente. É possível notar que em cada transição é retornado alguma recompensa, podendo ser positiva ou negativa.

O processo de Markov possui um sistema de recompensas, dizendo quantas recompensas foram acumuladas através de alguma sequência particular que foi tomada.

1.3. Deep Reinforcement Learning

DRL é a combinação de RL e DL. Se baseia em treinar um agente capaz de realizar ações que gere recompensas. As ações são realizadas em ambientes e tem como meta atingir um objetivo específico. Por meio de recompensas ou punições, o agente irá aprender quais ações deve executar para aumentar a recompensa e atingir o objetivo mais rapidamente.

Este campo de pesquisa foi capaz de resolver uma ampla gama de tarefas complexas de tomada de decisões que antes estavam fora do alcance de uma máquina. Assim, DRL abre novas aplicações em domínios como saúde, robótica, redes inteligentes, finanças e muito mais. O RL clássico usa o método de Monte Carlo para resolver o problema de controle, já DRL usa as redes neurais para aproximar a melhor função de recompensa.

2. Desafio

Nosso desafio é criar e treinar uma rede neural convolucional capaz de aprender políticas através de pixels brutos em ambientes complexos de RL. O objetivo principal é arquitetar um agente capaz de jogar o maior número de jogos possíveis sem conhecimento prévio do ambiente. A rede não recebeu nenhuma informação prévia específica do jogo ou recursos visuais e também não possui conhecimento interno do emulador.

A arquitetura de rede e todos os parâmetros usados ​​para o treinamento serão mantidos constantes nos jogos, para realizar a aplicação em diversos outros jogos, utilizando a mesma estrutura.

Nosso objetivo é conectar um algoritmo de Reinforcement Learning a uma rede neural profunda que opera diretamente em imagens RGB e processar com eficiência os dados de treinamento usando atualizações de gradiente estocásticas.

3. Conhecendo o jogo

Como vamos treinar nosso agente em um jogo do Atari, precisamos do ambiente completo do Atari para o agente poder realizar todas as ações possíveis. Portanto, vou utilizar a biblioteca OpenAI Gym, uma das mais utilizadas atualmente. Com a biblioteca OpenAI Gym, é possível renderizar os frames do jogo.

Bem vindo a 1980! No jogo Pac-Man, o conceito do agente interagir com um ambiente é bastante autoexplicativo, já que o agente terá nove ações que poderão ser tomadas(esquerda, direita, frente…) e de acordo com o comportamento realizado, uma recompensa é atribuída(a pontuação do jogo aumenta). De forma geral, em cada etapa, o agente seleciona uma ação a partir do conjunto de ações legais do jogo.

Se executarmos esse código, obtemos:

Você deve estar se perguntando — “Como o agente aprende sobre o ambiente?”. Não adianta ter um excelente Processo de Decisão de Markov se não sabemos quais são os futuros passos que serão melhores recompensados. Entretanto, existem políticas randômicas capazes de visitar todos os estados do ambiente. Para uma melhor performance, é usado o e-greedy policy.

No caso em que o agente interage com o ambiente, ele recebe apenas as imagens da tela atual. Entenda isso como se o agente não tivesse como saber quais foram as situações anteriores. Por exemplo, se usarmos essa mesma ideia e aplicarmos no jogo Breakout, o agente não é capaz de dizer se a bola está subindo ou descendo.

4. Pré-processamento dos dados

O ambiente de desenvolvimento utilizado pelo DeepMind usa um ambiente de aprendizado do Atari 2600 que apresenta agentes com uma entrada visual de alta dimensionalidade (vídeo RGB de 210 × 160 a 60Hz).

DeepMind não usa a biblioteca OpenAI Gym, mas como é uma biblioteca de fácil entendimento, iremos utilizar. Na biblioteca OpenAI Gym as imagens são representadas como matrizes. Podemos verificar as dimensões da seguinte forma:

O código acima deve retornar uma tupla com valores (210, 160, 3). Esses valores exigem muito recurso computacional e o treinamento acaba levando mais tempo, portanto, vamos aplicar um pré-processamento básico.

Trabalhar diretamente com os frames originais, que têm 210 × 160 pixels de imagem com 12 cores paleta, pode ser computacionalmente exigente, por isso aplicamos uma etapa básica de pré-processamento destinada a reduzir a dimensionalidade de entrada. Os quadros brutos são pré-processados ​​pela primeira conversão de sua representação RGB para escala de uma dimensão(preto e branco) e amostragem descendente em uma imagem de 110 × 84. A representação final é obtida com o corte de uma região de 84 × 84 da imagem que captura aproximadamente a área de jogo.

O artigo do DeepMind utiliza uma escala final de 84 x 84. A implementação do código utilizada nesse artigo irá usar uma escala final de 88 x 80, já que estamos nos baseando na implementação do livro: Hands-On Machine Learning with Scikit-Learn & TensorFlow.

5. DQN

Nossa DQN vai receber um par de ações e estados do jogo e como saída irá estimar uma probabilidade do que será tomado como ação.

Como DQN usa redes neurais, a entrada de nossa rede neural será um estado inicial, e sua saída será sua estimativa que servirá como previsão da função para o próximo estado usando nosso modelo atual. Essa será a estrutura da nossa rede neural:

De acordo com a implementação da DQN usada pelo DeepMind, precisamos especificar duas DQNs com a mesma arquitetura:

Online DQN: Aprende a movimentar o agente do jogo.

Target DQN: Usado para construir os valores de Q-Values para treinar a online DQN.

Sabendo disso, vamos desenvolver uma função dqn() que irá criar nossas DQNs.

A função recebe como parâmetro o estado atual do jogo, note que passamos apenas o estado imediato do ambiente. Como dito acima, alguns jogos precisam de um histórico de estados para saber, por exemplo, qual será a direção de um determinado objeto. No jogo Pac-Man, esse conceito seria aplicado para determinar quais foram as últimas posições dos fantasmas.

Com as DQNs criadas, o processo de aprendizado da rede neural será utilizando o algoritmo de Nesterov para diminuir o custo da função.

Para a fase de construção do modelo, isso já seria o suficiente para o funcionamento.

6. Experience Replay

Essa é a uma parte fundamental da nossa DQN. Esse é o método chave que impede a nossa rede de divergir. Experience Replay guarda todas as experiências realizadas pelo agente em cada passo ocorrido.

Durante o loop do algoritmo, aplicamos atualizações de Q-learning, ou atualizações de minibatch, a amostras de experiência, e ∼ D, retirado aleatoriamente do conjunto de amostras armazenadas. Depois de realizar o Experience Replay, o agente seleciona e executa uma ação de acordo com uma política de distribuição.

A razão pela qual o Experience Replay é útil, tem a ver com o fato de que, em RL, estados sucessivos são altamente similares. Isso significa que há um risco significativo de a rede esquecer completamente o que é estar em um estado que não vê há algum tempo. Experience Replay impede isso e ainda pode mostrar quadros antigos para a rede.

Para a aplicação em código, podemos utilizar um deque, já que é muito eficiente em colocar itens em um queue e consegue remover as experiências mais antigas que não servem mais para o agente.

Esses são alguns resultados em jogos que utilizam Experience Replay.

7. Percorrendo o cenário

Como dito mais acima, é importante saber qual ação realizar no estado certo. Quando nosso modelo está sendo treinado, ele não sabe qual ação tomar, já que não conhece o ambiente. Portanto, enquanto nossa DQN não está treinada, precisamos explorar o máximo de ações possíveis que podem ser realizadas.

A estratégia mais simples é utilizar o algoritmo ε-greedy. Com a probabilidade ε, escolhemos uma ação aleatória e, caso contrário, escolhemos a ação mais “gananciosa” (ou seja, aquela que tem o valor Q máximo para esse estado). É comum começar com um ε alto e reduzir seu valor à medida que a DQN passa por mais iterações.

8. Experimentos

Acredito que um dos maiores avanços em DRL é a capacidade de usar a mesma estrutura de rede em diversos jogos e obter resultados significativos. Foi apenas mudando a forma de recompensa, pois alguns jogos obtêm pontuação diferenciada. Por conta disso, de acordo com o DeepMind, foram fixadas as recompensas positivas 1 e todas as recompensas negativas -1.

Nestes experimentos, usamos o algoritmo RMSProp com minibatches de tamanho 32. A política de comportamento durante o treinamento foi e-greedy com valor linear de 1 a 0,1 sobre o primeiro milhão quadros, e fixado em 0,1 depois disso. Nós treinamos para um total de 10 milhões de quadros e usamos uma experience replay de um milhão de quadros mais recentes.

Foram obtidos resultados em seis dos sete jogos em que foram testados - Beam Rider, Breakout, Enduro, Pong, Q*bert, Seaquest, Space Invaders - sem ajuste da arquitetura ou dos parâmetros.

9. Conclusão

Interessante! Mas como faço para juntar todos esses conceitos e treinar um agente?

Tentei tonar esse post um guia fácil utilizando o artigo do DeepMind para você ter uma ideia de como implementar seu próprio agente. Recomendo fortemente que você leia o artigo completo que usei como base. DRL é um campo muito novo em Inteligência Artificial, por conta disso, talvez você encontre poucos exemplos de implementação de código(principalmente em português). Falando a verdade, as implementações de código usando DQN são bem parecidas, portanto, é necessário que você entenda como Q-Value determina o estado e a ação recebida e compreenda DL(principalmente redes neurais convolucionais). Entendendo esses conceitos, você será capaz de construir sua DQN.

Vou deixar como recomendação o livro gratuito sobre RL: Reinforcement Learning An Introduction — escrito por Sutton e Barto. Esse livro incorpora todos as técnicas necessárias que você precisa para RL.

A maior parte do códigos que são usados nesse artigo fazem parte do livro: Hands-On Machine Learning with Scikit-Learn & TensorFlow.

Até a próxima!

Data Hackers

Blog oficial da comunidade Data Hackers

Lucas Oliveira

Written by

Books and Beer

Data Hackers

Blog oficial da comunidade Data Hackers