Machine Learning

Ensine seu computador a jogar Super Mario Bros entendendo como funciona o Machine Learning, ou, no bom português: Aprendizado de Máquina!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.


1. Introdução

Hoje o tema é Machine Learning, o assunto do momento!

Um assunto em pauta desde…. 2005? Não… 2001? Não! Na verdade, desde idos de 1959, quando Arthur Samuel definiu aprendizado de máquina como o “campo de estudo que dá aos computadores a habilidade de aprender sem serem explicitamente programados” (livre tradução).

2. Senta que lá vem hist… digo, teoria!

Machine Learning ou Aprendizado de Máquina é um método de análise de dados que automatiza o desenvolvimento de modelos analíticos. Usando algoritmos que aprendem interativamente a partir de dados, o aprendizado de máquinas permite que os computadores encontrem insights ocultos sem serem explicitamente programados para procurar algo específico.

O aspecto interativo do aprendizado de máquinas é importante porque, conforme os modelos são expostos a novos dados, eles são capazes de se adaptar de forma independente. Eles aprendem com os cálculos anteriores para produzir decisões e resultados confiáveis e reproduzíveis. É uma ciência que não é nova, mas que está ganhando um novo impulso.

Por causa das novas tecnologias de computação, o aprendizado de máquina de hoje não é como o aprendizado de máquina do passado. Enquanto muitos algoritmos de machine learning estiveram por aí por bastante tempo, a capacidade de aplicar automaticamente cálculos matemáticos complexos a big data – cada vez mais e cada vez mais rápido – é um desenvolvimento recente. Aqui estão alguns exemplos amplamente divulgados de aplicações do machine learning com os quais você pode já estar familiarizado:

  • Os carros autônomos do Google que dirigem sozinhos? A essência do aprendizado de máquina.
  • Ofertas de recomendações on-line como as da Amazon e Netflix? Aplicações de aprendizado de máquina na vida cotidiana.
  • Saber o que os clientes estão dizendo sobre você no Twitter? Aprendizado de máquina combinado com a criação de regra linguística.
  • Detecção de fraudes? Um dos usos mais óbvios e importantes em nosso mundo de hoje.
Carro autônomo do Google utiliza aprendizado de máquina para aprender e se guiar no nosso mundo!

3. Por que o interesse por Machine Learning aumentou?

O interesse no aprendizado de máquina ressurgiu devido aos mesmos fatores que tornaram a mineração de dados e a análise Bayesiana mais populares do que nunca. Coisas como o crescente volume e variedade de dados disponíveis, o processamento computacional que está mais barato e mais poderoso, e o armazenamento de dados de forma acessível.

Tudo isso significa que é possível produzir de forma rápida e automática modelos que permitam analisar dados maiores e mais complexos e fornecer resultados mais rápidos e mais precisos – mesmo em uma escala muito grande. O resultado? Previsões de alto valor que podem levar a melhores decisões e ações inteligentes em tempo real sem a intervenção humana.

Um segredo para a produção de ações inteligentes em tempo real é o desenvolvimento de modelo automatizados. O líder de ideias inovadoras em analytics Thomas H. Davenport escreveu no The Wall Street Journal que, com os volumes de dados em rápida evolução e em crescimento, “(…) você precisa de fluxos de modelagem de rápida evolução para ser capaz de acompanhar”. E você pode obter isso com machine learning. Segundo ele, “as pessoas podem normalmente criar um ou dois bons modelos por semana; o aprendizado de máquina pode criar milhares de modelos por semana”.

4. Tipos de Aprendizado de Máquinas

Quando falamos em aprendizado de máquinas, podemos nos referir a alguns tipos:

  • Algoritmos de aprendizado supervisionado: são treinados usando exemplos rotulados, como uma entrada onde a saída desejada já é conhecida.
  • O aprendizado não supervisionado: é usado contra a dados que não possuem rótulos históricos. O sistema não sabe a “resposta certa”. O algoritmo deve descobrir o que está sendo mostrado. O objetivo é explorar os dados e encontrar alguma estrutura neles.
  • O aprendizado semi supervisionado: é usado para as mesmas aplicações que o aprendizado supervisionado. Mas ele usa tanto dados rotulados quanto não marcados para o treinamento – normalmente uma pequena quantidade de dados rotulados com uma grande quantidade de dados não rotulados.
  • O aprendizado por reforço: é muitas vezes usado para a robótica, jogos e navegação. Com o aprendizado por reforço, o algoritmo descobre pela tentativa e erro quais ações geram as maiores recompensas.

E é o Aprendizado por Reforço o foco deste post.

5. Google DeepMind’s

Um tipo de inteligência artificial desenvolvido pelo Google DeepMind veio adicionar algo que pode ser extremamente importante para aumentar a eficiência dos algoritmos de aprendizado de máquinas. Segundo um artigo publicado por pesquisadores da gigante das buscas, essa IA seria capaz de “imaginar” para planejar suas ações.

Como isso funcionaria? De maneira bastante simples, na verdade. O I2A, como é chamado, conta com um codificador que analisa vários possíveis cenários de acordo com suas ações; a partir disso, por sua vez, o software tem menores chances de desempenhar a ação errada – o que é bem útil em situações quando uma falha pode custar bem caro.

Uma das primeiras demonstrações do Google DeepMind’s lá em 2013 foi feita aplicando-o para jogar games do  Atari; A ideia era aprender por tentativa e erro qual a melhor estratégia para encarar os inimigos. Acontecem muitos Game Overs no processo mas a máquina aprende um caminho curto e direto para chegar á vitória!

Centipede, do Atari, é um dos games usados no treino do Google DeepMind’s

Mais informações sobre o Google DeepMind’s pode ser encontrada clicando aqui.

6. Super Mario Bros®

Ehren J. Brav é um rapaz que fez um feito curioso: Fez um fork do código do Google DeepMind’s usado para jogar Atari e o adaptou para jogar Super Mario Bros, tornando as coisas visivelmente mais interessantes!

O tipo de aprendizado de máquinas que Ehren usou do Google DeepMind’s aqui foi usado o Aprendizado por Reforço, com um algoritmo chamado NEAT.

7. NEAT

NeuroEvolution of Augmenting Topologies (NEAT) é um algoritmo genético (GA) para a geração de redes neurais artificiais em evolução (uma técnica de neuroevolução).
Em suma, a máquina aprende um pouco mais a cada erro e evolui em cima disso.

A máquina segue rapidamente várias rotas diferentes para resolver um problema; depois, filtra as soluções exatas e bem sucedidas, prosseguindo seu aprendizado a partir dali. Essa metodologia é a “tentativa e erro”.

Foi desenvolvida por Ken Stanley em 2002, enquanto na Universidade do Texas, em Austin. Isso altera os parâmetros de ponderação e as estruturas das redes, tentando encontrar um equilíbrio entre a adequação das soluções evoluídas e sua diversidade.

Baseia-se na aplicação de três técnicas-chave: rastreamento de genes com marcadores de histórico para permitir cruzamento entre topologias, aplicação de especiarias – a evolução das espécies – para preservar inovações e desenvolvimento de topologias de forma incremental a partir de estruturas iniciais simples, conhecido como complexificação.

8. Tutorial

O sistema de Machine Learning é relativamente simples aqui:
O código, escrito em Lua, acessa o emulador FCEUX.

Ele utiliza esse emulador em vez do ZSNES por exemplo, porque ele permite que o jogo seja mapeado pela inteligencia artificial e saiba o que está na tela, como uma emulação interativa. (Os olhos da máquina).

Então o emulador vai começar a mover o Mário pelo cenário almejando o alvo (Chegar vivo ao fim do jogo).

Ehren notou logo de cara que a máquina ainda não estava aprendendo como deveria. Isso porque o Super Mario é muito mais complexo que o jogo do Atari. Temos inimigos de todos os tipos e outras ameaças, como cair em buracos no chão.

Então ele teve que fazer alterações substanciais no código original do Google DeepMind’s, resumindo todas em:

  • Mudou o Deep Q Nework para uma rede Double Deep Q.
  • Alterar o Atari Learning Environment ao NES, usando o emulador FCEUX.
  • Concedeu recompensas iguais aos pontos obtidos por etapa, além de uma recompensa por se mover para a direita, adicionando uma penalidade para mover para a esquerda. (Isso incentiva a máquina a avançar a fase e não perder tempo voltando)
  • Implementou uma penalidade por morrer. (Assim a máquina é incentivada a tentar manter o Mário vivo, como um jogador faria)
  • Cortou as recompensas para +/- 10.000 por etapa.
  • Reduziu as recompensas para [-1,1]. (Comparado ao Atari)
  • Dobrou a quantidade de repetição da ação (o número de quadros que uma ação é repetida) para 8. Foi feito isso porque o ritmo do Super Mario Bros. pode ser um pouco mais lento do que muitos jogos Atari. Sem isso, Mario parece um pouco hiperativo e, no início, soa como louco sem ir a lugar nenhum.
  • Aumentou o tamanho da terceira camada convolucional de 64 para 128. Esta foi uma tentativa de lidar com a maior complexidade do Super Mario Bros. mas definitivamente retarda as coisas; Ehren garante que as vantagens superam os riscos aqui.

8.1 Instalação

Seu sistema deve ser baseado no Debian, pois o instalador busca pacotes via apt automaticamente.
De preferencia, SEJA O PRÓPRIO DEBIAN! Em Ubuntu há sérios problemas de dependências.

Execute esses comandos nessa ordem:

$ sudo apt-get install git 
$ git clone https://github.com/ehrenbrav/DeepQNetwork.git 
$ cd DeepQNetwork 
$ sudo ./install_dependencies.sh

O ultimo comando vai instalar uma série de dependências que o Google DeepMind’s exige aqui. E demora! Relaxe e aguarde.

Observação 1:
Durante a instalação desse script no Ubuntu MATE 16.04, tive problemas com a versão do libcairo2-dev que deu como pacote quebrado. Com o aptitude eu resolvi isso. Basta dar:

$ sudo aptitude install libcairo2-dev

E o aptitude vai te fazer uma pergunta; responda N.
Na segunda pergunta, responsa S.
Ele vai reverter seu pacote libcairo2 permitindo que o libcairo2-dev seja instalado. Isso não vai afetar em nada o funcionamento do sistema.

Infelizmente e tristemente: Não roda em Ubuntus!
Somente no Debian. Você pode até treinar seu “Mario”, mas no momento em que ele vai gerar o arquivo neural, ele dá esse erro: qlua: ./TransitionTable.lua:97: assertion failed!

Se alguém que ler este post e souber como debugar o script Lua pra faze-lo rodar no Ubuntu, poste nos comentários e saiba que serei grato; vou colocar seu nome nos créditos aqui da postagem!

Observação 2: Se você quiser executar o treinamento e testar com sua GPU com suporte a CUDA, você precisará instalar o kit de ferramentas CUDA. Se você fez isso e o script não instala automaticamente o cutorch e o cunn (ele procura a presença do Nvidia CUDA Compiler NVCC que pode não estar instalado nos sistemas Debian, por exemplo), descomente as linhas no final do script install_dependencies.sh e tente novamente.

Para prosseguir, obtenha uma ROM para o Super Mario Bros. em algum lugar na internet, coloque-a no diretório DeepQNetwork/roms e renomeie-o “smb.zip”.

Execute o seguinte para iniciar o treinamento da DeepQNetwork, supondo que você tenha uma GPU offboard com suporte a CUDA.

$ ./train_gpu.sh smb

Se você não tem uma GPU que suporte CUDA, ou tiver uma GPU onboard como a Intel Graphics, você deve executar o “train_cpu.sh” em vez disso:

$ ./train_cpu.sh smb

Se tudo estiver devidamente configurado, você vai ver o Mario saltando ao acaso no início. Lentamente ele começa a avançar no nível!

Meu computador, quando executei o treinamento do Mario! Note o considerável consumo de recursos de hardware.

O aprendizado dele vai demorar – sugiro que você, pelo menos, deixe passar por 4 milhões de etapas de treinamento para ver realmente algumas melhorias. O progresso é logado no diretório de logs no caso de você querer comparar os resultados enquanto ajusta os parâmetros.

8.2 Explicação

O emulador vai executar ele acelerado e o computador vai treinando, tentativa e erro, diversas possibilidades; a cada 50.000 passos, ele faz uma pausa (no terminal surge escrito “Epsilon: 1” ) e então ele processa o que foi aprendido. Assim ele elimina o que for redundante ou informação inútil deixando uma opção mais direta ao objetivo. O mapeamento do caminho percorrido segue os parâmetros de morte e progresso. Sempre que o Mario foi para trás, essa rota é eliminada. Sempre que ele morre, também.
Por eliminação o melhor caminho é, aos poucos, traçado.

Depois de processar esses primeiros 50.000 passos, retoma o ciclo de treinamento em cima do que foi aprendido. Assim ele vai progressivamente aprendendo e passando a fase com seu progresso anterior.
Uma vez concluído, você pode executar o que foi aprendido desse treino quando quiser (explicado mais abaixo.)

Essa etapa demora muito se você utilizar o treino via CPU!
Aqui foi uma madrugada inteira ligado. Atentos a isso.

Se você ficar sem paciência, pressione Control-C para terminá-lo. (Ou apenas feche a janelinha do jogo). A rede neural é guardada no diretório dqn/ com um nome de arquivo com final *.t7. Guarde-o em algum lugar seguro se você quiser salvá-lo, porque ele é substituído cada vez que você treina mais.

Se você quiser assistir o computador jogar com o que foi aprendido, (digamos ver o progresso de aprendizado), use a rede que você gerou, executando o seguinte (novamente, use o script “_cpu” se você não tiver uma GPU compatível):

$ ./test_gpu.sh smb *.t7

OBS: Considerando que esse arquivo esteja dentro de dqn/.

Para quem tiver pressa e quiser ver algo mais sólido, Ehren publicou uma rede neural do Mario já com 4 Milhões de passos (mais de 1GB) – com ela você apenas vê como funciona; ou use-o como um ponto de partida para seu próprio treinamento (editando o arquivo ./train_*pu.sh), assim você não precisa começar do zero. Clique aqui para baixar.

Use-o descomentando a linha de rede guardada no script do treino e especificando o caminho completo para este arquivo.

Observação: Esse arquivo compartilhado por Ehren só funciona com quem tem GPU CUDA! Se você possui um computador com GPU onboard, como o Intel HD Graphics, deverá passar pelo processo normalmente iniciando do inicio.

9. Considerações Finais

O jogo vai executar acelerado em aprox. 3200.0%
Vai ser esquisito assistir ele acelerado tanto, mas entenda que, se o jogo rodasse em velocidade normal, seria um tédio danado e demoraria semanas pra ele aprender alguma coisa.

Recomendo deixar sua máquina “em stand by”, sem mexer em Chrome, etc, pra ele ter um bom desempenho do processamento. Deixei por aprox. 3h e o treino do Mário fez o emulador consumir aprox. 10Gb dos meus 16Gb de RAM. Considerando que eu despejo minha /tmp na RAM, isso tudo pode ser conteúdo da /tmp, então espero não ser um problema pra quem tem pouca RAM mas muito espaço em disco.

Machine Learning ainda está engatinhando para ser algo palpável para se tornar devidamente popular dentre os entusiastas. Sua sintaxe pode ser programada sob qualquer linguagem de programação; no caso dos games, o Lua foi escolhido por melhor conversar com os games dentro dos emuladores. Esperamos que mais projetos como este surjam e que o Machine Learning seja algo mais sólido, e não meramente uma brincadeira.

#UrbanCompassPony

Fontes:
Aprendizado de Máquinas por SAS
Tecmundo: Google’s DeepMind’s
Google DeepMind’s jogando Atari
Google DeepMind’s sobre Super Mario Bros por Ehren

Deixe um comentário