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:
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?)
fonte
Respostas:
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.
fonte
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:
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 :
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á:
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!
fonte
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.
fonte
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/
fonte
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.
fonte
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.
fonte
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!
fonte