Como treinar uma rede neural artificial para jogar Diablo 2 usando entrada visual?

139

Atualmente, estou tentando conseguir uma RNA para jogar um videogame e esperava obter ajuda da maravilhosa comunidade aqui.

Eu decidi pelo Diablo 2. O jogo é, portanto, em tempo real e de um ponto de vista isométrico, com o jogador controlando um único avatar no qual a câmera está centrada.

Para tornar as coisas concretas, a tarefa é obter o seu personagem x pontos de experiência sem que sua saúde caia para 0, onde o ponto de experiência é obtido através da matança de monstros. Aqui está um exemplo da jogabilidade:

aqui

Agora, como eu quero que a rede opere com base apenas nas informações que obtém dos pixels na tela, ela deve aprender uma representação muito rica para poder jogar com eficiência, pois isso provavelmente exigiria que ela soubesse (pelo menos implicitamente) como divida o mundo do jogo em objetos e como interagir com eles.

E todas essas informações devem ser ensinadas à rede de alguma forma. Pela minha vida, não consigo pensar em como treinar isso. Minha única idéia é que um programa separado extraia visualmente algo inatamente bom / ruim do jogo (por exemplo, saúde, ouro, experiência) da tela e use essa estatística em um procedimento de aprendizado por reforço. Eu acho que isso fará parte da resposta, mas não acho que seja suficiente; existem muitos níveis de abstração, desde informações visuais brutas até comportamentos orientados a objetivos, para que um feedback tão limitado treine uma rede durante a minha vida.

Então, minha pergunta: de que outras maneiras você pode pensar em treinar uma rede para realizar pelo menos uma parte dessa tarefa? de preferência sem fazer milhares de exemplos rotulados.

Só para um pouco mais de orientação: estou procurando outras fontes de aprendizado por reforço e / ou métodos não supervisionados para extrair informações úteis nessa configuração. Ou um algoritmo supervisionado, se você puder pensar em uma maneira de obter dados rotulados de um mundo de jogo sem precisar rotulá-los manualmente.

ATUALIZAÇÃO (27/04/12):

Estranhamente, ainda estou trabalhando nisso e parece estar progredindo. O maior segredo para que um controlador de RNA funcione é usar as arquiteturas de RNA mais avançadas apropriadas para a tarefa. Portanto, eu tenho usado uma profunda rede de crenças composta por máquinas Boltzmann restritas condicionais fatoradas que treinei de maneira não supervisionada (no vídeo de mim jogando o jogo) antes de ajustar com a propagação da diferença temporal (isto é, aprendizado por reforço com o padrão). RNAs feed-forward).

Ainda estamos procurando informações mais valiosas, especialmente sobre o problema da seleção de ações em tempo real e como codificar imagens coloridas para o processamento da RNA :-)

ATUALIZAÇÃO (21/10/15):

Lembrei-me de que fiz essa pergunta no passado e pensei em mencionar que isso não é mais uma ideia maluca. Desde a minha última atualização, o DeepMind publicou seu artigo sobre a natureza de redes neurais para jogar jogos da Atari a partir de entradas visuais . De fato, a única coisa que me impede de usar a arquitetura deles para jogar, um subconjunto limitado do Diablo 2, é a falta de acesso ao mecanismo de jogo subjacente. Renderizar na tela e depois redirecioná-la para a rede é muito lento para ser treinado em um período de tempo razoável. Portanto, provavelmente não veremos esse tipo de bot jogando Diablo 2 tão cedo, mas apenas porque ele estará reproduzindo algo de código aberto ou com acesso API ao destino de renderização. (Terremoto, talvez?)

zergylord
fonte
1
Confira este documento. : D ri.cmu.edu/pub_files/pub2/pomerleau_dean_1992_1/…
zergylord
Uma grande diferença entre o problema de direção no papel e o jogo é que, no problema de direção, a entrada visual é uma representação de estado suficientemente completa: se houver um obstáculo à direita - vire à esquerda, se houver um obstáculo à esquerda - vire certo. No entanto, em um jogo, você geralmente precisa tomar decisões com base em coisas que não são exibidas na tela. Sempre que você entra em uma loja, pode parecer o mesmo, mas você precisa comprar itens diferentes.
Don Reba
1
Para ser o melhor da minha lembrança, o Diablo 2 usa folhas de sprite facilmente extraídas. Deve ser bastante simples amarrar objetos (jogador, inimigos etc ...) a uma lista de sprites associados. Não resolve o problema dos objetos serem obscurecidos um pelo outro, mas é um começo.
21719 Ryan Jenkins
@zergylord Seria bom se você pudesse dizer com que firmeza deseja manter seus critérios de a) Jogando Diablo 2 eb) usando pixels desenhados na tela como sua única fonte de entrada. Se você quiser facilitar as coisas para si mesmo, acho que terá que relaxar um (ou ambos) um pouco - você está disposto a fazer isso?
Stompchicken
1
A votação para fechar como muito ampla.
Ciro Santilli escreveu:

Respostas:

54

Percebo que você está preocupado com a forma de treinar a RNA, mas este projeto oculta uma complexidade que talvez você não saiba. O reconhecimento de objetos / personagens em jogos de computador através do processamento de imagens é uma tarefa altamente desafiadora (não enlouquece em jogos de FPS e RPG). Não duvido de suas habilidades e também não estou dizendo que isso não pode ser feito, mas você pode gastar 10 vezes mais tempo trabalhando no reconhecimento de coisas do que na implementação da própria RNA (supondo que você já tenha experiência com técnicas de processamento de imagem digital) )

Penso que a sua ideia é muito interessante e também muito ambiciosa . Nesse ponto, convém reconsiderar. Eu sinto que esse projeto é algo que você está planejando para a universidade, portanto, se o foco do trabalho é realmente a RNA, você provavelmente deve escolher outro jogo, algo mais simples.

Lembro-me de que alguém veio procurar dicas sobre um projeto diferente, mas de alguma forma semelhante, não faz muito tempo. Vale a pena conferir.

Por outro lado, pode haver abordagens melhores / mais fáceis para identificar objetos no jogo se você estiver aceitando sugestões. Mas primeiro, vamos chamar esse projeto do que você quer que seja: um robô inteligente .

Um método para implementar bots acessa a memória do cliente do jogo para encontrar informações relevantes, como a localização do personagem na tela e sua saúde. Ler a memória do computador é trivial, mas descobrir exatamente onde procurar na memória não é. Scanners de memória como o Cheat Engine podem ser muito úteis para isso.

Outro método , que funciona no jogo, envolve manipular informações de renderização. Todos os objetos do jogo devem ser renderizados na tela. Isso significa que os locais de todos os objetos 3D serão enviados à placa de vídeo para processamento. Esteja pronto para alguma depuração séria.

Nesta resposta, descrevi brevemente 2 métodos para realizar o que você deseja através do processamento de imagens. Se você estiver interessado neles, poderá encontrar mais informações sobre eles em Explorar jogos on-line (capítulo 6), um excelente livro sobre o assunto.

karlphillip
fonte
43

ATUALIZAÇÃO 26/07/2018: É isso aí! Agora estamos chegando ao ponto em que esse tipo de jogo será solucionável! Usando o OpenAI e baseado no jogo DotA 2, uma equipe poderia criar uma IA capaz de vencer jogadores semi-profissionais em um jogo 5v5 . Se você conhece o DotA 2, sabe que este jogo é bastante semelhante aos jogos do tipo Diablo em termos de mecânica, mas pode-se argumentar que é ainda mais complicado por causa do jogo em equipe.

Como esperado, isso foi alcançado graças aos mais recentes avanços no aprendizado por reforço com aprendizado profundo e usando estruturas de jogos abertas como o OpenAI, que facilitam o desenvolvimento de uma IA, uma vez que você obtém uma API pura e também porque pode acelerar o jogo (a IA foi reproduzida o equivalente a 180 anos de jogo contra si mesmo todos os dias!).

No dia 5 de agosto de 2018 (em 10 dias!) , Está previsto colocar essa IA contra os melhores jogadores do DotA 2. Se isso der certo, espere uma grande revolução, talvez não tão mediatizada quanto a solução do jogo Go, mas será um grande marco para a IA dos jogos!

ATUALIZAÇÃO 2017-01: O campo está se movendo muito rapidamente desde o sucesso do AlphaGo, e há novas estruturas para facilitar o desenvolvimento de algoritmos de aprendizado de máquina em jogos quase todos os meses. Aqui está uma lista dos mais recentes que encontrei:

  • OpenAI's Universe : uma plataforma para jogar virtualmente qualquer jogo usando aprendizado de máquina . A API está em Python e executa os jogos atrás de um ambiente de área de trabalho remota VNC, para que possa capturar as imagens de qualquer jogo! Você provavelmente pode usar o Universe para jogar Diablo II através de um algoritmo de aprendizado de máquina!
  • Academia da OpenAI : semelhante ao universo, mas direcionada especificamente aos algoritmos de aprendizado por reforço (por isso é uma generalização da estrutura usada pelo AlphaGo, mas para muitos outros jogos). Há um curso na Udemy que aborda a aplicação de aprendizado de máquina em jogos como breakout ou Doom usando o OpenAI Gym.
  • TorchCraft : uma ponte entre o Torch (estrutura de aprendizado de máquina) e o StarCraft: Brood War.
  • pyGTA5 : um projeto para construir carros autônomos no GTA5 usando apenas capturas de tela (com muitos vídeos online ).

Tempos muito emocionantes!

ATUALIZAÇÃO IMPORTANTE (2016-06): Conforme observado pelo OP, esse problema de treinar redes artificiais para jogar usando apenas entradas visuais agora está sendo abordado por várias instituições sérias, com resultados bastante promissores, como o DeepMind Deep-Qlearning-Network (DQN ) .

E agora, se você quiser enfrentar o desafio de próximo nível, pode usar uma das várias plataformas de desenvolvimento de jogos de visão de IA , como o ViZDoom , uma plataforma altamente otimizada (7000 fps) para treinar redes para jogar no Doom usando apenas entradas visuais :

O ViZDoom permite o desenvolvimento de bots de IA que reproduzem o Doom usando apenas as informações visuais (o buffer da tela). Destina-se principalmente à pesquisa em aprendizado visual de máquina e aprendizado de reforço profundo, em particular. O ViZDoom é baseado no ZDoom para fornecer a mecânica do jogo.

E os resultados são surpreendentes, veja os vídeos em sua página da Web e o bom tutorial (em Python) aqui!

Também existe um projeto semelhante para o Quake 3 Arena, chamado Quagents , que também fornece fácil acesso da API aos dados subjacentes do jogo, mas você pode descartá-los e usar apenas capturas de tela e a API apenas para controlar seu agente.

Por que essa plataforma é útil se usamos apenas capturas de tela? Mesmo se você não acessar os dados subjacentes do jogo, essa plataforma fornecerá:

  • implementação de jogos de alto desempenho (você pode gerar mais dados / peças / gerações de aprendizado com menos tempo, para que seus algoritmos de aprendizado possam convergir mais rapidamente!).
  • uma API simples e responsiva para controlar seus agentes (ou seja, se você tentar usar entradas humanas para controlar um jogo, alguns de seus comandos poderão ser perdidos; portanto, você também lidará com a falta de confiabilidade de suas saídas ...).
  • configuração fácil de cenários personalizados .
  • renderização personalizável (pode ser útil para "simplificar" as imagens obtidas para facilitar o processamento)
  • reprodução sincronizada ("turn-by-turn") (para que você não precise que seu algoritmo funcione em tempo real no início, é uma enorme redução de complexidade).
  • recursos adicionais de conveniência, como compatibilidade de plataforma cruzada, retrocompatibilidade (você não corre o risco de seu bot não trabalhar mais com o jogo quando houver uma nova atualização), etc.

Para resumir, o melhor dessas plataformas é que elas aliviam muitos dos problemas técnicos anteriores com os quais você teve que lidar (como manipular as entradas do jogo, como configurar cenários etc.), para que você apenas tenha que lidar com o algoritmo de aprendizado em si.

Então agora, comece a trabalhar e faça de nós o melhor bot visual de IA de todos os tempos;)


Post antigo descrevendo os problemas técnicos do desenvolvimento de uma IA confiando apenas em entradas visuais:

Ao contrário de alguns dos meus colegas acima, não acho que esse problema seja intratável. Mas certamente é muito difícil!

O primeiro problema, como apontado acima, é o da representação do estado do jogo : você não pode representar o estado completo com apenas uma imagem, é necessário manter algum tipo de memorização(saúde, mas também objetos equipados e itens disponíveis para uso, missões e objetivos, etc.). Para buscar essas informações, você tem duas maneiras: acessando diretamente os dados do jogo, que é o mais confiável e fácil; ou você pode criar uma representação abstrata dessas informações implementando alguns procedimentos simples (abrir inventário, tirar uma captura de tela, extrair os dados). Obviamente, a extração de dados de uma captura de tela exige que você faça algum procedimento supervisionado (que você define completamente) ou não supervisionado (por meio de um algoritmo de aprendizado de máquina, mas aumentará bastante a complexidade ...). Para o aprendizado de máquina não supervisionado, você precisará usar um tipo bastante recente de algoritmos chamado algoritmos de aprendizado estrutural (que aprendem a estrutura dos dados em vez de classificá-los ou prever um valor).http://techtalks.tv/talks/54422/

Então, outro problema é que, mesmo quando você busca todos os dados necessários, o jogo é apenas parcialmente observável . Assim, você precisa injetar um modelo abstrato do mundo e alimentá-lo com informações processadas do jogo, por exemplo, a localização do seu avatar, mas também a localização dos itens da missão, objetivos e inimigos fora da tela. Talvez você deva procurar em Filtros de Partículas de Mistura da Vermaak 2003 para isso.

Além disso, você precisa ter um agente autônomo , com objetivos gerados dinamicamente. Uma arquitetura conhecida que você pode tentar é o agente BDI, mas provavelmente precisará ajustá-la para que essa arquitetura funcione no seu caso prático. Como alternativa, há também a Rede de Petri Recursiva, que você provavelmente pode combinar com todos os tipos de variações das redes de petri para alcançar o que deseja, uma vez que é uma estrutura muito bem estudada e flexível, com ótimos procedimentos de formalização e provas.

E, finalmente, mesmo se você fizer tudo o que precede, será necessário encontrar uma maneira de emular o jogo em velocidade acelerada (usar um vídeo pode ser bom, mas o problema é que seu algoritmo só será exibido sem controle e poderá tentar por si só é muito importante para aprender). De fato, é sabido que o algoritmo atual de última geração leva muito mais tempo para aprender a mesma coisa que um ser humano pode aprender (ainda mais com o aprendizado por reforço), portanto, se não puder acelerar o processo ( ou seja, se você não puder acelerar o tempo do jogo), seu algoritmo nem convergirá em uma única vida ...

Para concluir, o que você deseja obter aqui está no limite (e talvez um pouco além) dos algoritmos atuais de última geração . Eu acho que pode ser possível, mas mesmo que seja, você vai gastar muito tempo , porque esse não é um problema teórico, mas um problema prático que você está abordando aqui e, portanto, você precisa implementar e combinar muito de diferentes abordagens de IA para resolvê-lo.

Várias décadas de pesquisa com uma equipe inteira trabalhando nela podem não ser suficientes; portanto, se você estiver sozinho e trabalhando em meio período (como provavelmente tem um emprego para viver), poderá passar a vida inteira sem chegar perto uma solução de trabalho.

Portanto, meu conselho mais importante aqui é que você diminua suas expectativas e tente reduzir a complexidadedo seu problema, usando todas as informações possíveis e evitar o máximo possível de capturas de tela (por exemplo, tente se conectar diretamente ao jogo, procure por injeção de DLL) e simplifique alguns problemas implementando procedimentos supervisionados. o algoritmo aprende tudo (por exemplo, elimine o processamento de imagens por enquanto o máximo possível e confie nas informações internas do jogo; posteriormente, se o algoritmo funcionar bem, você poderá substituir algumas partes do seu programa de IA pelo processamento de imagens, atingindo, assim, de maneira objetiva seu objetivo completo, por exemplo, se você conseguir que algo funcione muito bem, tente complexificar seu problema e substituir procedimentos supervisionados e dados de jogos de memória por algoritmos não-supervisionados de aprendizado de máquina em capturas de tela).

Boa sorte e, se funcionar, não se esqueça de publicar um artigo, você certamente será conhecido por resolver um problema prático tão difícil!

laborioso
fonte
27

O problema que você está enfrentando é intratável da maneira que você o definiu. Geralmente, é um erro pensar que uma rede neural "magicamente" aprende uma rica representação de um problema. Um bom fato a ter em mente ao decidir se a RNA é a ferramenta certa para uma tarefa é que é um método de interpolação. Pense se você pode enquadrar o seu problema como encontrar uma aproximação de uma função, onde você tem muitos pontos dessa função e muito tempo para projetar a rede e treiná-la.

O problema que você propõe não passa neste teste. O controle do jogo não é uma função da imagem na tela. Há muitas informações que o player precisa manter na memória. Para um exemplo simples, geralmente é verdade que toda vez que você entra em uma loja em um jogo, a tela parece a mesma. No entanto, o que você compra depende das circunstâncias. Não importa quão complicada seja a rede, se os pixels da tela forem sua entrada, ela sempre executará a mesma ação ao entrar na loja.

Além disso, há o problema de escala. A tarefa que você propõe é simplesmente muito complicada para aprender em um período de tempo razoável. Você deve ver aigamedev.com sobre como a IA do jogo funciona. As redes neurais artificiais foram usadas com sucesso em alguns jogos, mas de maneira muito limitada. A IA do jogo é difícil e muitas vezes cara de desenvolver. Se houvesse uma abordagem geral de construção de redes neurais funcionais, a indústria provavelmente teria se apoderado dela. Eu recomendo que você comece com exemplos muito mais simples, como o jogo da velha.

Don Reba
fonte
Justo. Você poderia chamar quase tudo de uma rede ANN, mas isso dificilmente poderia levar a uma discussão substantiva. :)
Don Reba
Heh sim ... Eu deveria ter explicado minha motivação com mais profundidade. Eu sei que existem maneiras melhores de criar IAs de jogos, mas estou fazendo isso para aumentar os limites do simulador de RNA que estou atualizando. Veja: stanford.edu/group/pdplab/pdphandbook
zergylord
1
De qualquer forma, Don Reba está certo, também não acho que seja viável aprender uma estratégia para algo como Diablo sem incorporar muito conhecimento prévio e extrair recursos úteis nos quais uma abordagem de aprendizado por reforço poderia se basear. Apenas aprender com a entrada de vídeo será extremamente difícil, se não impossível, usando os computadores atuais.
ahans
18

Parece que o coração deste projeto está explorando o que é possível com uma RNA, então eu sugiro escolher um jogo em que você não precise lidar com o processamento de imagens (o que, a partir das respostas de outros aqui, parece uma tarefa realmente difícil em um jogo em tempo real). Você pode usar a API do Starcraft para criar seu bot, eles dão acesso a todo o estado relevante do jogo.

http://code.google.com/p/bwapi/

tstramer
fonte
2

Como primeiro passo, você pode observar a diferença de quadros consecutivos. Você precisa distinguir entre sprites de fundo e monstros reais. Eu acho que o mundo também pode conter animações. Para encontrar aqueles, eu faria o personagem se mover e coletar tudo o que se move com o mundo em uma grande imagem / animação de fundo.

Você pode detectar e identificar inimigos com correlação (usando FFT). No entanto, se as animações repetirem exatamente o pixel, será mais rápido observar apenas alguns valores de pixel. Sua principal tarefa será escrever um sistema robusto que identificará quando um novo objeto aparecer na tela e gradualmente todos os quadros do sprite em um banco de dados. Provavelmente você também precisa criar modelos para efeitos de armas. Essas podem ser subtraídas para que não bagunçam o banco de dados do oponente.

whoplisp
fonte
2
Por estar familiarizado com o jogo Diablo II, posso dizer que ele usa 256 cores (a menos que algum modo use cores altas ou verdadeiras). Também faz uso pesado de sprites para exibir objetos diferentes. Se você é capaz de extrair alguns sprites (mesmo da captura de tela), você pode treinar sua ferramenta para reconhecer objetos com base no sprite (por exemplo, uma 'Minor Healing Potion' descartada sempre será a mesma). Se eu me aprofundar nas coisas específicas do Diablo II, no entanto, surgirão mais perguntas também. Boa sorte
Ivaylo Slavov
1

Bem, supondo que a qualquer momento você possa gerar um conjunto de 'resultados' (pode envolver probabilidades) a partir de um conjunto de todos os 'movimentos' possíveis, e que haja alguma noção de consistência no jogo (por exemplo, você pode jogar o nível X repetidamente novamente), você pode começar com redes neurais com pesos aleatórios e fazer com que cada uma jogue o jogo da seguinte maneira:

1) Para cada 'movimento' possível, gere uma lista de possíveis 'resultados' (com probabilidades associadas) 2) Para cada resultado, use sua rede neural para determinar um 'valor' associado (pontuação) do 'resultado' (por exemplo, um número entre -1 e 1, 1 sendo o melhor resultado possível, -1 sendo o pior) 3) Escolha o 'lance' que leva ao maior prob * score 4) Se o lance levou a uma 'vitória' ou 'derrota', parar, caso contrário, volte para a etapa 1.

Após um certo período de tempo (ou uma 'vitória' / 'perda'), avalie o quão perto a rede neural estava do 'objetivo' (isso provavelmente envolverá algum conhecimento do domínio). Em seguida, jogue fora os 50% (ou alguma outra porcentagem) de NNs que estavam mais distantes da meta, faça o cruzamento / mutação dos 50% principais e execute o novo conjunto de NNs novamente. Continue executando até que um NN satisfatório saia.

tstramer
fonte
Ah, adicionando um GA na mistura, interessante. Infelizmente, como estou tendo a rede realmente enviando pressionamentos de teclas / movimentos do mouse como ações, eu precisaria de um computador físico por rede>. <Outro problema é que o espaço de estado do ambiente não é discreto (bem, tecnicamente é, mas em um grão muito fino). Por exemplo, imagine o possível resultado associado a um clique do mouse: Um personagem sob o controle da rede pode se mover ou atacar, mas os inimigos também podem se mover e haveria diferenças de pixel no ambiente em relação a coisas como sombras e efeitos climáticos .
Zergylord 01/07/19
Bem, da minha perspectiva, há muito que você pode fazer com uma rede neural. Parece que, na melhor das hipóteses, poderia ser usado como uma função heurística aprendível de alguma noção de um espaço de estado discreto. Para incorporar a variabilidade do inimigo, você provavelmente precisaria usar alguma outra heurística, para criar um conjunto de possíveis estados de resultado por jogada com probabilidades associadas. Além disso, desde que haja uma noção estática de configuração inicial e final, você pode executar cada rede neural uma de cada vez.
Tstramer # 01/07
1

Penso que a sua melhor aposta seria uma arquitetura complexa que envolva algumas redes: talvez uma que reconheça e responda a itens, uma para a loja e outra para combate (talvez aqui você precise de uma para reconhecimento do inimigo, outra para ataques), etc. .

Então tente pensar na jogabilidade mais simples possível do Diablo II, provavelmente um bárbaro. Em primeiro lugar, mantenha-o simples, como o Ato I, apenas a primeira área.

Então eu acho que 'objetivos' valiosos seriam o desaparecimento de objetos inimigos e a diminuição da barra de vida (pontuada inversamente).

Depois de ter resolvido essas tarefas 'simples' separadas, você pode usar uma RNA principal 'para decidir qual sub-RNA deve ser ativada.

Quanto ao treinamento, vejo apenas três opções: você pode usar o método evolutivo descrito acima, mas precisa selecionar manualmente os 'vencedores', a menos que codifique um programa separado inteiro para isso. Você pode fazer com que as redes assistam a alguém jogar. Aqui eles aprenderão a imitar um jogador ou grupo do estilo do jogador. A rede tenta prever a próxima ação do jogador, é reforçada para um palpite correto, etc. Finalmente, você pode deixar a rede jogar, tendo mortes de inimigos, subir de nível, recuperar a saúde, etc. como reforço positivo e mortes de jogadores, saúde perdida, etc. como reforço negativo. Porém, vendo como uma rede simples exige milhares de etapas concretas de treinamento para aprender até tarefas simples,

Em suma, seu projeto é muito ambicioso. Mas eu acho que isso poderia "em teoria ser feito", com tempo suficiente.

Espero que ajude e boa sorte!

Vincent Courtemanche
fonte