Ensine uma Rede Neural a jogar um jogo de cartas

10

Atualmente, estou escrevendo um mecanismo para jogar um jogo de cartas, pois ainda não existe um mecanismo para esse jogo em particular.

Espero poder introduzir uma rede neural no jogo depois e fazer com que ela aprenda a jogar.

Estou escrevendo o mecanismo de forma que seja útil para um jogador de IA. Existem pontos de escolha e, nesses pontos, é apresentada uma lista de opções válidas. A seleção aleatória seria capaz de jogar o jogo (embora não esteja bem).

Aprendi muito sobre redes neurais (principalmente NEAT e HyperNEAT) e até construí minha própria implementação. Ainda não tenho certeza da melhor maneira de criar uma IA que possa levar em conta todas as variáveis ​​em um desses tipos de jogos. Existe uma abordagem comum? Sei que Keldon escreveu uma boa IA para o RftG, que possui uma complexidade decente, não sei como ele conseguiu criar uma IA desse tipo.

Algum conselho? Isso é viável? Existem bons exemplos disso? Como as entradas foram mapeadas?

EDIT: Procurei on-line e aprendi como as redes neurais funcionam e, geralmente, como elas pertencem ao reconhecimento de imagens ou à orientação de um agente simples. Não tenho certeza se ou como o aplicaria para fazer seleções com cartões com uma sinergia complexa. Qualquer direção em que eu deveria estar olhando seria muito apreciada.

Sobre o jogo: O jogo é semelhante ao Magic: The Gathering. Há um comandante que tem saúde e habilidades. Os jogadores têm um pool de energia que eles usam para colocar lacaios e feitiços no tabuleiro. Lacaios têm vida, valores de ataque, custos, etc. Os cards também possuem habilidades, que não são facilmente enumeradas. Cartas são jogadas da mão, novas cartas são retiradas de um baralho. Todos esses aspectos seriam úteis para a rede neural considerar.

pcaston2
fonte
Ei, bem-vindo ao AI.SE! Como está atualmente, parece um pouco amplo demais para que possamos responder bem. Você acha que poderia editá- lo para reduzi-lo um pouco? Obrigado!
Mithical
Embora a questão seja ampla, é uma pergunta óbvia e comum para alguém novo no campo. Também em que é difícil encontrar respostas usando o Google (como a maioria dos tutoriais sobre NN parece focar no reconhecimento de imagens e exemplos de idiomas). Eu acho que merece uma resposta apontando bons recursos sobre abordagens e técnicas para usar o NN para jogar, neste caso, em particular, nos jogos de cartas.
user12889
Obrigado pelo feedback. Eu editei minha pergunta um pouco. Qualquer direção para o material de aprendizagem seria útil. Acho principalmente reconhecimento de imagem como você mencionou. Estou ansioso para aprender e estou feliz por ter um grande conjunto de leituras recomendadas, em vez de apenas uma resposta simples.
Pcaston2

Respostas:

3

Eu acho que você levanta uma boa pergunta, especialmente o WRT, sobre como as entradas e saídas de NNs são mapeadas para a mecânica de um jogo de cartas como o MtG, onde as ações disponíveis variam muito de acordo com o contexto.

Não tenho uma resposta realmente satisfatória para oferecer, mas joguei a IA de Keldon's Race for the Galaxy NN - concordo que é excelente - e observei como ele resolveu esse problema.

O código mais recente da IA ​​do Keldon agora é pesquisável e navegável no github .

O código ai está em um arquivo . Ele usa 2 NNs distintos, um para "avaliar cartas de mão e ativas" e outro para "prever escolhas de papéis".

O que você notará é que ele usa uma quantidade razoável de código não NN para modelar a mecânica do jogo. Muito uma solução híbrida.

O mapeamento do estado do jogo na avaliação NN é feito aqui . Vários recursos relevantes são codificados com um código a quente, por exemplo, o número de mercadorias que podem ser vendidas nesse turno.


Outro excelente estudo de caso no mapeamento de um jogo complexo para um NN é o Starcraft II Learning Environment criado por Deepmind em colaboração com a Blizzard Entertainment. Este artigo fornece uma visão geral de como um jogo de Starcraft é mapeado em um conjunto de recursos que um NN pode interpretar e como ações podem ser emitidas por um agente do NN para a simulação do jogo.

Ben Hutchison
fonte
2

Isso é completamente viável, mas a maneira como as entradas são mapeadas dependeria muito do tipo de jogo de cartas e de como é jogado.

Vou levar em consideração algumas possibilidades:

  1. O tempo importa neste jogo? Um movimento passado influenciaria um futuro? Nesse caso, seria melhor usar redes neurais recorrentes (LSTMs, GRUs etc.).
  2. Deseja que a Rede Neural aprenda com os dados coletados ou aprenda por conta própria? Se por si só, como? Se você coletar dados de si mesmo jogando o jogo dezenas ou centenas de vezes, alimentá-lo na Rede Neural e aprender com você, então você está fazendo algo chamado "Clonagem Comportamental". No entanto, se você quiser que o NN aprenda por conta própria, você pode fazer isso de duas maneiras:

    a) Aprendizado por Reforço - RL permite que a Rede Neural aprenda jogando contra si mesma muitas vezes.

    b) NEAT / Algoritmo Genético - O NEAT permite que a Rede Neural aprenda usando um algoritmo genético.

No entanto, novamente, para ser mais específico sobre como as entradas e saídas da Rede Neural devem ser codificadas, eu precisaria saber mais sobre o jogo de cartas em si.

TajyMany
fonte
Olá, obrigado pela resposta! Vou investigar essas áreas para ver o que se aplica. Eu adicionei uma breve descrição do jogo na esperança de que isso diminua para você. Meu mecanismo suporta desfazer para que possa ser útil em conjunto com o NN. Como o mecanismo está inacabado, não tenho um conjunto de amostras, mas planejo manter todos os históricos de jogos do servidor de hospedagem entre 2 jogadores. Eu estava pensando em usar a propagação traseira para acelerar o processo.
Pcaston2
Se o estado do jogo importa, mas não como você chegou a esse estado , você diria que o tempo importa? Você pode dar exemplos de jogos em que o tempo importa e alguns em que o tempo não importa? No momento, só consigo pensar em situações em que o estado atual é importante (quem é a vez, quais são as cartas ou peças conhecidas de jogos), mas não como você chegou lá (a única coisa que importa é onde elas estão agora , não onde estão). foram duas voltas atrás)
Simon Forsberg
2

Você definitivamente gostaria que sua rede soubesse informações cruciais sobre o jogo, como quais cartões o agente de IA tem (seus valores e tipos), pool de mana, quantas cartas na mesa e seus valores, número de turno e assim por diante. Essas coisas você deve descobrir por si mesmo, a pergunta que você deve fazer é "Se eu adicionar esse valor para inserir como e por que ele melhorará meu sistema". Mas a primeira coisa a entender é que a maioria dos NNs é projetada para ter um tamanho de entrada constante, e eu diria que isso é importante neste jogo, pois os jogadores podem ter uma quantidade diferente de cartas na mão ou na mesa. Por exemplo, você deseja que o NN saiba quais cards possui, vamos assumir que o jogador pode ter no máximo 5 cards em sua mão e cada card pode ter 3 valores (mana, ataque e saúde), para que você possa codificá-lo como 5 * 3 vetores, onde os três primeiros valores representam o cartão número um e assim por diante. Mas e se o jogador tiver atualmente 3 cartas, uma abordagem simples seria atribuir zeros às últimas 6 entradas, mas isso pode causar problemas, já que algumas cartas podem ter 0 custo de mana ou 0 ataque. Então, você precisa descobrir como resolver esse problema. Você pode procurar modelos NN que possam lidar com tamanho de entrada variável ou descobrir como codificar entrada como um vetor de tamanho constante.

Em segundo lugar, as saídas também são vetores de tamanho constante. No caso desse tipo de jogo, pode ser um vetor que codifica as ações que o agente pode executar. Então, digamos que temos três ações: colocar uma carta, pular a vez e conceder. Portanto, pode ser um codificador quente, por exemplo, se você tiver 1 0 0 de saída, isso significa que o agente deve colocar algum cartão. Para saber qual cartão ele deve colocar, você pode adicionar outro elemento à saída que produzirá um número no intervalo de 1 a 5 (5 é o número máximo de cartões na mão).

Mas a parte mais importante do treinamento de uma rede neural é que você precisará criar uma função de perda adequada para sua tarefa. Talvez as funções de perda padrão, como perda ao quadrado médio ou L2, sejam boas; talvez você precise alterá-las para atender às suas necessidades. Esta é a parte em que você precisará fazer uma pesquisa. Eu nunca trabalhei com o NEAT antes, mas, como entendi corretamente, ele usa algum algoritmo genético para criar e treinar NN, e o GA usa alguma função de aptidão para selecionar um indivíduo. Então, basicamente, você precisará saber qual métrica usará para avaliar o desempenho do seu modelo e, com base nessa métrica, alterará os parâmetros do modelo.

PS. É possível resolver esse problema com a rede neural, no entanto, as redes neurais não são mágicas e não são a solução universal para todos os problemas. Se seu objetivo é resolver esse problema, eu também recomendo que você explore a teoria dos jogos e sua aplicação na IA. Eu diria que resolver esse problema exigiria conhecimento complexo de diferentes campos da IA.

No entanto, se seu objetivo é aprender sobre redes neurais, recomendo executar tarefas muito mais simples. Por exemplo, você pode implementar o NN que funcionará no conjunto de dados de referência, por exemplo, NN que classificará dígitos do conjunto de dados MNIST. A razão para isso é que muitos artigos foram escritos sobre como fazer a classificação neste conjunto de dados e você aprenderá muito e aprenderá mais rapidamente ao implementar coisas simples.

Andrew
fonte
1

Sim. Isso é viável.

Visão geral da questão

O objetivo do projeto do sistema parece obter uma vantagem estratégica vencedora ao empregar uma ou mais redes artificiais em conjunto com um mecanismo de jogo de cartas.

A pergunta mostra um conhecimento geral dos conceitos básicos do jogo, conforme descrito em Morgenstern e na teoria dos jogos de von Neuman .

  • Em pontos específicos durante o jogo, pode ser necessário que um jogador execute uma jogada.
  • Há um conjunto de opções de movimentação de acordo com as regras do jogo.
  • Algumas estratégias para selecionar uma jogada produzem recordes de vitórias mais altos em várias jogadas do que outras estratégias.
  • Uma rede artificial pode ser empregada para produzir estratégias de jogo vitoriosas com mais freqüência que a seleção de movimentos aleatórios.

Outras características do jogo podem ou não ser tão óbvias.

  • Em cada ponto de movimento, há um estado de jogo, necessário para qualquer componente envolvido na melhoria do sucesso do jogo.
  • Além de não saber quando o oponente blefar, nos jogos de cartas, a ordem secreta das cartas embaralhadas pode introduzir o equivalente a um jogador virtual cujos movimentos se aproximam da aleatoriedade.
  • Em três ou mais jogos de jogadores, a sinalização de parceiros ou parceiros em potencial pode adicionar um elemento de complexidade à determinação da estratégia do jogo vencedor a qualquer momento. Com base nas edições, não parece que este jogo tenha essas complexidades.
  • Fatores psicológicos, como a intimidação, também podem desempenhar um papel na vitória do jogo. Se o mecanismo apresenta ou não uma face para o oponente é desconhecido, então essa resposta pulará isso.

Dicas de abordagem comum

Existe uma abordagem comum para o mapeamento de entradas e saídas, mas há muito a explicar em uma resposta do Stack Exchange. Estes são apenas alguns princípios básicos.

  • Toda a modelagem que pode ser feita explicitamente deve ser feita. Por exemplo, embora uma rede artificial possa, teoricamente, aprender a contar cartões (mantendo o controle dos possíveis locais de cada um dos cartões), um algoritmo simples de contagem pode fazer isso; portanto, use o algoritmo conhecido e alimente esses resultados na rede artificial, como entrada.
  • Use como entrada qualquer informação correlacionada com a saída ideal, mas não use como entradas qualquer informação que não possa ser correlacionada com a saída ideal.
  • Codifique dados para reduzir a redundância no vetor de entrada, durante o treinamento e durante o jogo automatizado. Abstração e generalização são as duas maneiras comuns de conseguir isso. A extração de recursos pode ser usada como ferramentas para abstrair ou generalizar. Isso pode ser feito em entradas e saídas. Um exemplo é que, neste jogo, J> 10 da mesma maneira que A> K, K> Q, Q> J e 10> 9, codifique os cartões como um número inteiro de 2 a 14 ou 0 a 12 por subtraindo um. Codifique os naipes como 0 a 3 em vez de quatro cadeias de texto.

O trabalho de reconhecimento de imagem é apenas remotamente relacionado, muito diferente do jogo de cartas para ser usado diretamente, a menos que você precise reconhecer os cartões de uma imagem visual. Nesse caso, pode ser necessário o LSTM para ver o que os outros jogadores escolheram para os movimentos. Aprender estratégias vencedoras mais do que provavelmente se beneficiaria dos projetos MLP ou RNN, ou de um de seus projetos derivativos de redes artificiais.

O que uma rede artificial faria e exemplos de treinamento

O principal papel das redes artificiais desses tipos é aprender uma função a partir de dados de exemplo. Se você tem as seqüências de movimentação de jogos reais, esse é um ótimo trunfo para o seu projeto. Um número muito grande deles será muito útil para o treinamento.

Como você organiza os exemplos e se e como os rotula vale a pena considerar, no entanto, sem as regras do jogo de cartas, é difícil dar uma direção confiável. Se há parceiros, se é baseado em pontuação, se o número de movimentos para uma vitória e uma dúzia de outros fatores fornecem os parâmetros do cenário necessário para tomar essas decisões.

Estudar-se

O principal conselho que posso dar é ler, não muitos artigos gerais na Web, mas ler alguns livros e alguns dos documentos que você entender sobre os tópicos acima. Em seguida, encontre um código que você possa baixar e tente depois de entender a terminologia o suficiente para saber o que baixar.

Isso significa que as pesquisas de livros e acadêmicas têm muito mais probabilidade de direcioná-lo na direção certa do que as pesquisas gerais na Web. Existem milhares de posers no espaço geral da web, explicando os princípios da IA ​​com um grande número de erros. Os editores de livros e artigos acadêmicos são mais exigentes com a devida diligência em seus autores.

Douglas Daseeco
fonte