Como lidar com movimentos inválidos no aprendizado por reforço?

20

Eu quero criar uma IA que possa jogar cinco em linha / gomoku. Como mencionei no título, quero usar o aprendizado por reforço para isso.

Eu uso o método gradiente de política , ou seja, REFORÇAR, com a linha de base. Para a aproximação das funções de valor e política, eu uso uma rede neural . Possui camadas convolucionais e totalmente conectadas. Todas as camadas, exceto a saída, são compartilhadas. A camada de saída da política possui 8×8=64 (o tamanho da placa) e uma unidade de saída macia . Então é estocástico. Mas e se a rede produzir uma probabilidade muito alta de uma movimentação inválida? Uma jogada inválida ocorre quando o agente deseja verificar um quadrado com um "X" ou "O". Eu acho que pode ficar preso nesse estado de jogo.

Você poderia recomendar alguma solução para este problema?

Meu palpite é usar o método ator-crítico . Para uma jogada inválida, devemos dar uma recompensa negativa e passar o turno para o oponente.

Molnár István
fonte

Respostas:

10

Apenas ignore os movimentos inválidos.

Para exploração, é provável que você não execute apenas o movimento com a maior probabilidade, mas escolha movimentos aleatoriamente com base na probabilidade gerada. Se você apenas punir movimentos ilegais, eles ainda manterão alguma probabilidade (por menor que seja) e, portanto, serão executados de tempos em tempos (por mais que raramente). Portanto, você sempre manterá um agente que ocasionalmente faz movimentos ilegais.

Para mim, faz mais sentido apenas definir as probabilidades de todos os movimentos ilegais para zero e renormalizar o vetor de saída antes de escolher o seu movimento.

BlindKungFuMaster
fonte
Obrigado. provavelmente não estava claro, mas escolhi o movimento aleatoriamente pelas probabilidades permitidas. Vou tentar o seu conselho para definir a probabilidade de movimentos ilegais como zero e ver o que acontecerá. Tenha um bom dia.
Molnár István 14/03
8

Normalmente, os métodos softmax em métodos de gradiente de política que usam aproximação de função linear usam a seguinte fórmula para calcular a probabilidade de escolher a ação a . Aqui, os pesos são θ , e as características ϕ é uma função do estado atual s e uma ação do conjunto de ações A .

π(θ,uma)=eθϕ(s,uma)bUMAeθϕ(s,b)

euegumaeu(UMA)

π(θ,uma)=eθϕ(s,uma)beuegumaeu(UMA)eθϕ(s,b),umaeuegumaeu(UMA)

No pseudocódigo, a fórmula pode ser assim:

action_probs = Agent.getActionProbs(state)
legal_actions = filterLegalActions(state, action_probs)
best_legal_action = softmax(legal_actions)

Seja usando aproximação de função linear ou não linear (sua rede neural), a idéia é usar apenas os movimentos legais ao calcular seu softmax. Esse método significa que apenas movimentos válidos serão dados pelo agente, o que é bom se você quiser mudar seu jogo mais tarde e que a diferença de valor entre a escolha limitada de ações será mais fácil de ser discriminada pelo agente. Também será mais rápido à medida que o número de ações possíveis diminuir.

Jaden Travnik
fonte
Muito útil. Obrigado por postar as equações e o pseudocódigo!
DukeZhou
1
A matemática e o pseudocódigo não correspondem aqui. O Softmax sobre as probabilidades de movimentação legal ajustará as probabilidades relativas. Por exemplo, (0,3, 0,4, 0,2, 0,1) filtrado com o primeiro e o terceiro item removidos seria (0,0, 0,8, 0,0, 0,2) com a sua fórmula, mas seria (0,0, 0,57, 0,0, 0,42) usando o pseudocódigo. O pseudocódigo precisa fazer os logits, antes dos cálculos de probabilidade da ação.
Neil Slater
4
Como calcular o gradiente da versão filtrada do Softmax? Parece que isso seria necessário para a retropropagação funcionar com êxito, sim?
Brianberns 22/03/19
@brianberns Você conseguiu encontrar uma resposta? Parece que seria o caso para mim, mas de alguma forma no meu exemplo brinquedo Eu só estou recebendo a resposta certa ao usar as probabilidades de log do softmax unfilitered ...
tryingtolearn
5

IMHO a idéia de movimentos inválidos é inválida. Imagine colocar um "X" nas coordenadas (9, 9). Você pode considerar uma jogada inválida e dar uma recompensa negativa. Absurdo? Certo!

Mas, na verdade, seus movimentos inválidos são apenas uma relíquia da representação (que por si só é direta e correta). O melhor tratamento para eles é excluí-los completamente de qualquer cálculo.

Isso fica mais aparente no xadrez:

  • Em uma representação posicional, você pode considerar a jogada a1-a8, que só pertence ao jogo se houver uma Torre ou uma Rainha em a1(e algumas outras condições se mantiverem).

  • Em uma representação diferente, você pode considerar a mudança Qb2. Novamente, isso pode ou não pertencer ao jogo. Quando o jogador atual não tem rainha, certamente não.

Como os movimentos inválidos estão relacionados à representação e não ao jogo, eles não devem ser considerados.

maaartinus
fonte
1
Ótimo ponto. Nos jogos [M], jogados no Sudoku, as restrições tornam muitas posições (coordenadas + valor) ilegais após a primeira colocação. Não vale a pena considerar essas posições ilegais do ponto de vista da veiculação, mas uma importante camada estratégica é reconhecer quais veiculações minimizam o valor das posições restantes não reproduzidas. (ou seja, se eu colocar um 8 aqui, ele impede que meu oponente coloque um 8 nessa linha, coluna ou região. Essencialmente, "quantas posições estratégicas esse posicionamento remove do
tabuleiro de
5

Recentemente, enfrentei um problema semelhante com o Campo Minado.

O jeito que eu resolvi foi ignorando completamente os movimentos ilegais / inválidos.

  1. Use a rede Q para prever os valores Q para todas as suas ações (válidas e inválidas)
  2. Pré-processe os valores Q, definindo todos os movimentos inválidos para um valor Q de número zero / negativo (depende do seu cenário)
  3. Use uma política de sua escolha para selecionar uma ação a partir dos valores Q refinados (por exemplo, ganancioso ou Boltzmann)
  4. Execute a ação selecionada e retome sua lógica DQN

Espero que isto ajude.

Sanavesa
fonte
1
A única coisa que gostaria de acrescentar a isso é que você deve se lembrar de fazer um backprop no DQN ao definir os valores Q para pares ilegais (s, a) com um valor negativo grande, sendo treinado para não escolher esse estado, ação pares da próxima vez.
SN
Mas eu me pergunto o que a definição de valores-alvo Q de grande porte faz com a continuidade ou o formato da função de perda / erro (afetando assim a pesquisa de gradiente). Qual foi sua experiência?
SN
1
@ SN Entendo o seu ponto. A ideia é escolher a ação com o valor Q mais alto que não seja uma ação inválida . Em seguida, você executa essa ação e a usa em sua regra de atualização (ou seja, treina seu DQN para favorecer essa ação a longo prazo). O que isso faz é tornar os valores Q futuros da ação selecionada mais altos e, portanto, mais favoráveis. Porém, NÃO reduzirá o valor Q das ações ilegais, o que não importa, porque elas sempre são filtradas (não consideradas). Deixe-me saber se você quer que eu elabore mais com um exemplo. :)
Sanavesa
1
@Sanavesa com certeza faz sentido, você está basicamente contando com o DQN, eventualmente aprendendo quais são as escolhas corretas através da escola de batidas fortes. Mas em situações em que há apenas uma ou poucas opções legais, você acabará com um aprendizado muito lento. A abordagem que estou sugerindo é uma maneira de incorporar o domínio K ao problema para acelerar esse aprendizado. É também o que eu pensei que você estava fazendo em seu post original onde você escreveu sobre "a criação movimentos inválidos para um Q-valor do número zero / negativa"
SN
1
@SNPrecisely! Ambas as abordagens têm seus méritos. Depende do aplicativo, se for mais fácil aprender os movimentos legais ou simplesmente ignorá-los. Para aplicativos grandes e complexos, acho que ignorar as jogadas inválidas é muito mais rápido para o agente aprender, mas não me cite.
Sanavesa