Como implementar um espaço de ação restrito no aprendizado por reforço?

12

Estou codificando um modelo de aprendizado por reforço com um agente de PPO, graças à muito boa biblioteca Tensorforce , construída sobre o Tensorflow.

A primeira versão era muito simples e agora estou mergulhando em um ambiente mais complexo, onde nem todas as ações estão disponíveis a cada etapa.

Digamos que existem 5 ações e sua disponibilidade depende de um estado interno (que é definido pela ação anterior e / ou pelo novo estado / espaço de observação):

  • 2 ações (0 e 1) estão sempre disponíveis
  • 2 ações (2 e 3) estão disponíveis apenas quando internal_state == 0
  • 1 ação (4) está disponível apenas quando internal_state == 1

Portanto, há 4 ações disponíveis quando internal_state == 0 e 3 ações disponíveis quando internal_state == 1.

Estou pensando em algumas possibilidades para implementar isso:

  1. Altere o espaço de ação em cada etapa, dependendo do internal_state. Presumo que isso seja um absurdo.
  2. Não faça nada: deixe o modelo entender que a escolha de uma ação indisponível não tem impacto.
  3. Não faça quase nada: impacte levemente negativamente a recompensa quando o modelo escolher uma ação indisponível.
  4. Ajude o modelo: incorporando um número inteiro no espaço de estado / observação que informa ao modelo qual é o valor internal_state + bullet point 2 or 3

Existem outras maneiras de implementar isso? De sua experiência, qual seria o melhor?

Máx.
fonte

Respostas:

5

A solução mais direta é simplesmente tornar todas as ações "legais", mas implementando um mapeamento consistente e determinístico de ações potencialmente ilegais para diferentes ações legais. Sempre que a implementação do PPO que você estiver usando selecionar uma ação ilegal, basta substituí-la pela ação legal para a qual ele mapeia. Seu algoritmo PPO ainda pode se atualizar como se a ação ilegal fosse selecionada (a ação ilegal simplesmente se torna como ... um "apelido" para a ação legal).

Por exemplo, na situação que você descreve:

  • 2 ações (0 e 1) estão sempre disponíveis
  • 2 ações (2 e 3) estão disponíveis apenas quando internal_state == 0
  • 1 ação (4) está disponível apenas quando internal_state == 1

Nos casos em que internal_state == 0, se uma ação 4foi selecionada (uma ação ilegal), você sempre pode trocá-la por uma das outras ações e executá-la. Realmente não importa (teoricamente) qual você escolher, desde que seja consistente. O algoritmo não precisa saber que escolheu uma ação ilegal; sempre que escolher a mesma ação ilegal no futuro novamente em estados semelhantes, ele será mapeado consistentemente para a mesma ação legal, portanto, você apenas reforça de acordo com esse comportamento.


01


Para a primeira "solução", escrevi acima que não importa "teoricamente" como você escolhe o seu mapeamento. Eu absolutamente espero que suas escolhas aqui tenham um impacto na velocidade de aprendizado na prática. Isso ocorre porque, nos estágios iniciais do seu processo de aprendizado, você provavelmente terá uma seleção de ações quase aleatória. Se algumas ações "aparecerem várias vezes" nas saídas, elas terão uma maior probabilidade de serem selecionadas com a seleção inicial da ação close-to-andom. Portanto, haverá um impacto no seu comportamento inicial, que terá um impacto na experiência que você coletará, o que, por sua vez, também terá um impacto no que você aprenderá.

Eu certamente espero que seja benéfico para o desempenho se você puder incluir recursos de entrada para a internal_statevariável.

Se algumas ações legais puderem ser identificadas de alguma forma "semanticamente próximas" de certas ações ilegais, também poderá ser benéfico para o desempenho conectar especificamente essas ações "semelhantes" no "mapeamento" de ações ilegais para ações legais, se você optar por continuar com essa solução. Por exemplo, se você tiver uma ação de "avançar" que se torna ilegal em estados onde o teto é muito baixo (porque você bateria na cabeça), talvez seja melhor mapear essa ação para uma ação de "avançar" (que ainda é meio parecido, os dois estão avançando), do que seria mapeá-lo para uma ação "retroceder". Essa idéia de ações "semelhantes" será aplicável apenas a determinados domínios, porém, em alguns domínios, pode não haver semelhanças entre essas ações.

Dennis Soemers
fonte
1

O objetivo é projetar um componente de otimização de política proximal que tenha restrições específicas no espaço de ação dependente de regras orientadas pelo estado, usando uma estrutura como o Tensorforce.

Opções de design listadas na pergunta

Essas opções estão listadas aqui para referência rápida ao ler a análise inicial abaixo.

  • Altere o espaço de ação em cada etapa, dependendo do internal_state. Presumo que isso seja um absurdo.
  • Não faça nada: deixe o modelo entender que a escolha de uma ação indisponível não tem impacto.
  • Não faça quase nada: impacte levemente negativamente a recompensa quando o modelo escolher uma ação indisponível.
  • Ajude o modelo: incorporando um número inteiro no espaço de estado / observação que informa ao modelo qual é o valor internal_state + bullet point 2 or 3

Análise inicial

É realmente sensato alterar o espaço de ação para cada movimento. Essa é, de fato, uma representação adequada para o problema, conforme declarado, e a maneira normal como os seres humanos jogam e a maneira como os computadores vencem os seres humanos no Chess and Go.

A aparente falta de sentido dessa idéia é apenas um artefato do progresso ao longo do roteiro do projeto Tensorforce e do progresso ao longo da teoria do reforço, ambos jovens no cenário geral. Lendo a documentação e as Perguntas frequentes do Tensorforce, não parece que a estrutura foi projetada para conectar um mecanismo de regras para determinar o espaço de ação. Isso não é uma falha do código aberto. Não parece haver nenhum artigo que forneça teoria ou proponha algoritmos para decisões em cadeia de Markov condicionadas por regras.

A opção de não fazer nada é a que se encaixa nas estratégias disponíveis atualmente representadas na literatura. Provavelmente o quase-nada é provavelmente a abordagem que produzirá um comportamento desejável mais confiável e talvez mais imediato.

O problema com o conceito de ajudar o modelo é que não é uma idéia tão forte quanto estender o modelo. Em código aberto, isso seria feito estendendo as classes que representam o modelo, o que exigiria algum trabalho teórico antes da codificação para

    a. Represent rule-conditioned learning in nomenclature
    b. Represent convergence mathematically using the new nomenclature
    c. Determining a method of convergence
    d. Proving convergence
    e. Rechecking
    f. Defining a smooth and efficient algorithm
    g. Providing PAC learning information for planning
    f. Peer review
    g. Extending the classes of the library
    h. Proof of concept with the current problem above
    i. Additional cases and metrics comparing the approach with the others
    j. Extending the library flexibility to support more such dev

A extensão dos sistemas de aprendizado para cobrir o caso restrito a regras é uma ótima idéia para uma tese de doutorado e pode ser utilizada em laboratórios de pesquisa como uma proposta de projeto com muitas aplicações possíveis. Não deixe que todas as etapas dissuadam o pesquisador. Eles são essencialmente uma lista de etapas para qualquer tese de doutorado ou projeto de laboratório de IA financiado.

Para uma solução de curto prazo, ajudar o modelo pode funcionar, mas não é uma estratégia sólida para promover as idéias da IA ​​ao longo do caminho do aprendizado por reforço. Como solução de curto prazo para um problema específico, pode funcionar bem. A idéia de quase nada pode ser mais sólida, pois se encaixa nas provas de convergência que levaram à implementação específica que o Tensorforce provavelmente está usando.

Renomeá-lo de fazer quase nada para ajudar na convergência pode ajudar a desenvolver a perspectiva correta antes de tentar. Você pode achar que precisa atenuar a assistência à medida que se aproxima da convergência para evitar ultrapassagens, assim como com uma taxa de aprendizado.

Douglas Daseeco
fonte
3
O que normalmente acontece, por exemplo, no AlphaGo, é que a representação de baixo nível na Rede Neural representa um espaço de ação muito grande, a maioria dos quais é impossível no estado atual (isso ocorre devido às limitações de NNs simples que produzem vetores de tamanho fixo ) Outra parte do código aplica um filtro para selecionar e normalizar probabilidades apenas para movimentos permitidos. O NN e o filtro combinados fazem parte do agente. Portanto, é justo dizer que o agente como um todo "mudará o espaço de ação para cada movimento" - não sei como isso pode ser alcançado dentro da biblioteca do Tensorforce.
Neil Slater
1

Normalmente, o conjunto de ações que o agente pode executar não muda com o tempo, mas algumas ações podem se tornar impossíveis em diferentes estados (por exemplo, nem todos os movimentos são possíveis em qualquer posição do jogo TicTacToe).

Dê uma olhada, por exemplo, na parte do código https://github.com/haje01/gym-tictactoe/blob/master/examples/base_agent.py :

ava_actions = env.available_actions()
action = agent.act(state, ava_actions)
state, reward, done, info = env.step(action)
madpower2000
fonte