Unity Machine Learning: ensinando agentes do MO a pular muros

Houve grandes avanços no aprendizado por reforço (RL) nos últimos anos: desde o primeiro uso bem-sucedido no treinamento de pixels brutos até o treinamento de roboristas de IA aberta, e ambientes cada vez mais sofisticados são necessários para progresso adicional, para o qual ajudar A unidade vem.

A ferramenta Unity ML-Agents é um novo plug-in no mecanismo do jogo Unity, permitindo que você use o Unity como um construtor de ambiente para treinar agentes de MO.

Desde jogar futebol a caminhar, pular de paredes e treinar cães de IA para jogar bengalas, o Unity ML-Agents Toolkit fornece uma ampla gama de condições para os agentes de treinamento.

Neste artigo, veremos como os agentes do Unity MO funcionam e, em seguida, ensinaremos um desses agentes a pular muros.

imagem


O que são os agentes ML da Unity?


O Unity ML-Agents é um novo plug-in para o mecanismo de jogo Unity, que permite criar ou usar ambientes prontos para o treinamento de nossos agentes.

O plug-in consiste em três componentes:



O primeiro - um ambiente de aprendizado ( o Ambiente de Aprendizado ), contendo cenas do Unity e de elementos ambientais.

A segunda é a API Python , que contém os algoritmos RL (como PPO - Proximal Policy Optimization e SAC - Soft Actor-Critic). Usamos essa API para iniciar treinamentos, testes, etc. Ela é conectada ao ambiente de aprendizado através do terceiro componente - um comunicador externo .


Em que consiste o ambiente de aprendizagem


O componente de treinamento consiste em vários elementos:



O primeiro agente é o ator de palco. É ele quem treinaremos otimizando um componente chamado "Cérebro", no qual são registradas as ações que devem ser executadas em cada um dos estados possíveis.

O terceiro elemento, a Academy, gerencia agentes e seus processos de tomada de decisão e solicitações de processos da API do Python. Para entender melhor seu papel, vamos relembrar o processo de RL. Pode ser representado como um ciclo que funciona da seguinte maneira:



Suponha que um agente precise aprender a jogar um jogo de plataformas. O processo RL neste caso será parecido com o seguinte:

  • O agente recebe o estado S 0 do ambiente - este será o primeiro quadro do nosso jogo.
  • Com base no estado S 0, o agente executa a ação A 0 e muda para a direita.
  • O ambiente entra em um novo estado S 1 .
  • O agente recebe recompensa R 1 por não estar morto ( recompensa positiva +1).

Esse ciclo de RL forma uma sequência de estado, ação e recompensa. O objetivo do agente é maximizar a recompensa total esperada.



Assim, a Academy envia instruções aos agentes e fornece sincronização em sua execução, a saber:

  • Coleção de observações;
  • A escolha da ação de acordo com as instruções estabelecidas;
  • Execução de ação;
  • Redefina se o número de etapas foi atingido ou a meta foi alcançada.


Ensinamos o agente a pular através das paredes


Agora que sabemos como os agentes da Unity funcionam, treinaremos um para pular paredes.

Modelos já treinados também podem ser baixados no GitHub .

Ambiente de aprendizagem Wall Jumping


O objetivo desse ambiente é ensinar o agente a chegar ao ladrilho verde.

Considere três casos:

1. Não há paredes e nosso agente só precisa chegar ao ladrilho.

imagem

2. O agente precisa aprender a pular para alcançar o ladrilho verde.

imagem

3. O caso mais difícil: a parede é muito alta para o agente pular, então ele precisa pular primeiro no bloco branco.

imagem

Ensinaremos ao agente dois cenários de comportamento, dependendo da altura do muro:

  • SmallWallJump em caixas sem paredes ou em baixas alturas;
  • BigWallJump no caso de muros altos.

É assim que o sistema de recompensa será:



Em nossas observações, não estamos usando um quadro regular, mas 14 reykast, cada um dos quais pode detectar quatro objetos possíveis. Nesse caso, o reykast pode ser percebido como raios laser que podem determinar se eles passam por um objeto.

Também usaremos a posição de agente global em nosso programa.

imagem

Quatro opções são possíveis em nosso espaço:



O objetivo é obter um ladrilho verde com uma recompensa média de 0,8 .

Então vamos começar!


Primeiro de tudo, abra o projeto UnitySDK .

Entre os exemplos, você precisa encontrar e abrir a cena do WallJump .

Como você pode ver, existem muitos agentes no palco, cada um deles retirado da mesma pré-fabricada, e todos eles têm o mesmo "cérebro".

imagem

Como no caso do clássico Deep Reinforcement Learning, depois de lançarmos várias instâncias do jogo (por exemplo, 128 ambientes paralelos), agora apenas copiamos e colamos os agentes para ter estados mais diferentes. E como queremos treinar nosso agente do zero, precisamos primeiro remover o "cérebro" do agente. Para fazer isso, vá para a pasta prefabs e abra Prefab.

Em seguida, na hierarquia de Prefab, você precisa selecionar o agente e ir para as configurações.

Nos Parâmetros de comportamento, você precisa excluir o modelo. Se tivermos várias GPUs à nossa disposição, você poderá usar o Dispositivo de Inferência da CPU como uma GPU.

imagem

No componente Agente de salto em parede, você deve remover o cérebro para uma caixa sem paredes, bem como para paredes baixas e altas.

imagem

Depois disso, você pode começar a treinar seu agente do zero.

Para nosso primeiro treinamento, simplesmente alteramos o número total de etapas de treinamento para dois cenários de comportamento: SmallWallJump e BigWallJump. Para que possamos atingir a meta em apenas 300 mil etapas. Para fazer isso, em config / trainer config.yaml, altere max_steps para 3e5 para os casos SmallWallJump e BigWallJump.

imagem

Para treinar nosso agente, usaremos o PPO (Proximal Policy Optimization). O algoritmo inclui o acúmulo de experiência em interagir com o ambiente e usá-lo para atualizar políticas de tomada de decisão. Após atualizá-lo, os eventos anteriores são descartados e a coleta de dados subsequente já é realizada sob os termos da política atualizada.

Então, primeiro, usando a API Python, precisamos chamar um comunicador externo para instruir a Academia a iniciar agentes. Para fazer isso, abra o terminal onde o ml-agents-master está localizado e digite:

mlagents-learn config/trainer_config.yaml — run-id=”WallJump_FirstTrain” — train

Este comando solicitará que você inicie a cena do Unity. Para fazer isso, pressione ► na parte superior do editor.

imagem

Você pode assistir ao treinamento de seus agentes no Tensorboard com o seguinte comando:

tensorboard — logdir=summaries

Quando o treinamento terminar, você precisará mover os arquivos de modelo salvos contidos em ml-agents-master / models para UnitySDK / Assets / ML-Agents / examples / WallJump / TFModels . Em seguida, abra o editor do Unity novamente e selecione a cena WallJump , onde abrimos o objeto WallJumpArea finalizado .

Depois disso, selecione o agente e, em seus parâmetros de comportamento, arraste o arquivo SmallWallJump.nn para o Espaço reservado para modelo.

imagem

Mova também:

  1. SmallWallJump.nn no espaço reservado no cérebro da parede.
  2. SmallWallJump.nn no espaço reservado do cérebro de parede pequena.
  3. BigWallJump.nn no espaço reservado para o cérebro sem parede.

imagem

Depois disso, pressione o botão ► na parte superior do editor e pronto! O algoritmo de configuração de treinamento do agente agora está completo.

imagem

Tempo da experiência


A melhor maneira de aprender é constantemente tentar trazer algo novo. Agora que já alcançamos bons resultados, tentaremos colocar algumas hipóteses e testá-las.


Reduzindo o coeficiente de desconto para 0,95


Então sabemos que:

  • Quanto maior a gama, menor o desconto. Ou seja, o agente está mais preocupado com recompensas de longo prazo.
  • Por outro lado, quanto menor a gama, maior o desconto. Nesse caso, a prioridade do agente é a compensação de curto prazo.

A idéia desse experimento é que, se aumentarmos o desconto diminuindo a gama de 0,99 para 0,95, a recompensa de curto prazo será uma prioridade para o agente - o que pode ajudá-lo a abordar rapidamente a política de comportamento ideal.



Curiosamente, no caso de um salto através de um muro baixo, o agente lutará pelo mesmo resultado. Isso pode ser explicado pelo fato de que este caso é bastante simples: o agente só precisa passar para o ladrilho verde e, se necessário, pular se houver uma parede na frente.



Por outro lado, no caso do Big Wall Jump, isso funciona pior, porque nosso agente se preocupa mais com a recompensa de curto prazo e, portanto, não entende que ele precisa subir no bloco branco para pular o muro.

Maior complexidade da rede neural


Finalmente, hipotetizamos se nosso agente se tornará mais inteligente se aumentarmos a complexidade da rede neural. Para fazer isso, aumente o tamanho do nível oculto de 256 para 512.

E descobrimos que, nesse caso, o novo agente funciona pior que o nosso primeiro agente. Isso significa que não faz sentido aumentar a complexidade da nossa rede, porque, caso contrário, o tempo de aprendizado também aumentará.



Então, treinamos o agente para pular os muros, e isso é tudo por hoje. Lembre-se de que para comparar os resultados, os modelos treinados podem ser baixados aqui .

imagem

All Articles