Treine seus agentes 7 vezes mais rápido com ML-Agents

Nas versões 0.9 e 0.10 do ML-Agents, introduzimos uma série de recursos destinados a diminuir o tempo de treinamento, a saber: Ambientes Assíncronos, Aprendizagem de Imitação Adversarial Generativa (GAIL) e Ator-Crítico Suave. Com nosso parceiro JamCity, mostramos anteriormente que o recurso de instância paralela do Unity introduzido na v0.8 do ML-Agents nos permitiu treinar agentes para seu jogo de tiro em bolhas, Snoopy Pop, 7,5x mais rápido do que com uma única instância. Nesta postagem do blog, explicaremos como as versões 0.9 e 0.10 se baseiam nesses resultados e mostraremos que podemos diminuir o tempo de treinamento do Snoopy Pop em mais 7 vezes, permitindo que agentes com melhor desempenho sejam treinados em um tempo razoável.
O objetivo do Unity ML-Agents Toolkit é permitir que desenvolvedores de jogos criem comportamentos complexos e interessantes para personagens jogáveis e não jogáveis usando Deep Reinforcement Learning (DRL). DRL é uma ferramenta poderosa e geral que pode ser usada para aprender uma variedade de comportamentos, desde personagens baseados em física até solucionadores de jogos de quebra-cabeça. No entanto, o DRL requer um grande volume de dados de jogabilidade para aprender comportamentos eficazes — um problema para jogos reais que normalmente são limitados em quanto podem ser acelerados.
Vários meses atrás, com o lançamento do ML-Agents v0.8, introduzimos a capacidade dos ML-Agents de executar várias instâncias do Unity de um jogo em uma única máquina, aumentando drasticamente o rendimento das amostras de treinamento (ou seja, observações, ações e recompensas do agente) que podemos coletar durante o treinamento. Fizemos uma parceria com a JamCity para treinar um agente para jogar níveis do jogo de quebra-cabeça Snoopy Pop . Usando o recurso de ambiente paralelo da versão 0.8, conseguimos atingir uma velocidade de treinamento de até 7,5x em níveis mais difíceis do Snoopy Pop.
Mas ambientes paralelos só vão até certo ponto: há um limite para quantas instâncias simultâneas do Unity podem ser executadas em uma única máquina. Para melhorar o tempo de treinamento em máquinas com recursos limitados, tivemos que encontrar outra maneira. Em geral, há duas maneiras de melhorar o tempo de treinamento: aumentar o número de amostras coletadas por segundo (rendimento da amostra) ou reduzir o número de amostras necessárias para aprender um bom comportamento (eficiência da amostra). Consequentemente, na v0.9, melhoramos nosso treinador paralelo para coletar amostras de forma assíncrona, aumentando assim o rendimento das amostras.
Além disso, adicionamos o Generative Adversarial Imitation Learning (GAIL), que permite o uso de demonstrações humanas para orientar o processo de aprendizagem, melhorando assim a eficiência da amostra. Por fim, na v0.10, introduzimos o Soft Actor-Critic (SAC), um treinador que tem eficiência de amostra substancialmente maior do que o treinador Proximal Policy Optimization da v0.8. Essas mudanças juntas melhoraram o tempo de treinamento em outras 7 vezes em uma única máquina. Para o Snoopy Pop, isso significava que não só podíamos criar agentes que resolvessem níveis, mas também agentes que os resolvessem no mesmo número de passos que um jogador humano. Com o aumento da produtividade e da eficiência da amostra, conseguimos treinar vários níveis do Snoopy Pop em uma única máquina, o que antes exigia vários dias de treinamento em um cluster de máquinas. Esta postagem do blog detalhará as melhorias feitas em cada versão subsequente do ML-Agents e como elas afetaram os resultados no Snoopy Pop.
Apresentamos pela primeira vez nossa integração de ML-Agents com o Snoopy Pop em nossa postagem de blog sobre ML-Agents v0.8 . A figura abaixo resume o que o agente pode ver, o que pode fazer e as recompensas que recebeu. Observe que, em comparação com nossos experimentos anteriores com o Snoopy Pop, diminuímos a magnitude da recompensa positiva e aumentamos a penalidade por usar uma bolha, forçando o agente a concentrar sua atenção menos em simplesmente terminar o nível e mais em limpar as bolhas no menor número de passos possível, assim como um jogador humano faria. Este é um problema muito mais difícil do que simplesmente vencer o nível e leva muito mais tempo para aprender uma boa política.

No ML-Agents v0.8, introduzimos a capacidade de treinar várias instâncias do Unity ao mesmo tempo. Embora estejamos limitados em quanto podemos acelerar uma única instância do Snoopy Pop, os processadores multi-core nos permitem executar várias instâncias em uma única máquina. Como cada jogada do jogo é independente, podemos paralelizar trivialmente a coleta de nossos dados de treinamento.
Cada ambiente de simulação alimenta dados em um buffer de treinamento comum, que é então usado pelo treinador para atualizar sua política a fim de jogar melhor. Esse novo paradigma nos permite coletar muito mais dados sem precisar alterar a escala de tempo ou quaisquer outros parâmetros do jogo, o que pode ter um efeito negativo na mecânica do jogo.
No ML-Agents v0.9, introduzimos duas melhorias na eficiência da amostra e no rendimento da amostra, respectivamente.
Ambientes Assíncronos
Na implementação v0.8 de ambientes paralelos, cada instância do Unity dá um passo em sincronia com as outras, e o treinador recebe todas as observações e envia todas as ações ao mesmo tempo. Para alguns ambientes, como aqueles fornecidos com o kit de ferramentas ML-Agents, os agentes tomam decisões aproximadamente na mesma frequência constante, e executá-las em sincronia não é um problema. Entretanto, em jogos reais, certas ações podem demorar mais que outras. Por exemplo, no Snoopy Pop, limpar um grande número de bolhas gera uma animação mais longa do que limpar nenhuma, e vencer o jogo e reiniciar o nível leva mais tempo do que dar um tiro. Isso significa que se pelo menos um dos ambientes paralelos realizar uma dessas ações mais longas, os outros deverão esperar.
No ML-Agents v0.9, habilitamos ambientes paralelos assíncronos. Desde que pelo menos um dos ambientes tenha terminado de executar sua ação, o treinador pode enviar uma nova ação e dar o próximo passo. Para ambientes com tempos de etapa variáveis, isso pode melhorar significativamente o rendimento da amostra.

Aprendizagem de imitação adversária generativa (GAIL)
Em um processo típico de treinamento de DRL, o agente é inicializado com um comportamento aleatório, executa ações aleatórias no ambiente e pode receber algumas recompensas. Em seguida, ele reforça comportamentos que produzem recompensas maiores e, com o tempo, o comportamento tende a maximizar a recompensa no ambiente e se torna menos aleatório.
Entretanto, nem todo comportamento ótimo é fácil de encontrar por meio de comportamento aleatório. Por exemplo, a recompensa pode ser escassa, ou seja, o agente deve tomar muitas ações corretas antes de receber uma recompensa. Ou o ambiente pode ter muitos ótimos locais, ou seja, lugares onde o agente poderia ir que parecem levá-lo à recompensa máxima, mas na verdade é um caminho incorreto. Ambos os problemas podem ser resolvidos usando busca aleatória de força bruta, mas isso exigirá muitas, muitas amostras. Eles contribuem para os milhões de amostras necessárias para treinar o Snoopy Pop. Em alguns casos, ele pode nunca encontrar o comportamento ideal.
Mas e se pudéssemos fazer um pouco melhor, orientando o agente para um bom comportamento, fornecendo-lhe demonstrações humanas do jogo? Esta área de pesquisa é chamada de Aprendizagem por Imitação e foi adicionada ao ML-Agents na versão0.3. Uma das desvantagens do aprendizado por imitação em agentes de ML era que ele só podia ser usado independentemente do aprendizado por reforço, treinando um agente puramente em demonstrações, mas sem recompensas do ambiente.
Na versão 0.9, introduzimos o GAIL, que aborda esses dois problemas, com base na pesquisa de Jonathan Ho e seus colegas. Você pode ler mais sobre o algoritmo no artigo deles.
Para usar o aprendizado por imitação com agentes de ML, primeiro você tem um jogador humano (ou um bot) jogando o jogo várias vezes, salvando as observações e ações em um arquivo de demonstração. Durante o treinamento, o agente pode agir no ambiente normalmente e coletar observações próprias. Em um nível alto, o GAIL funciona treinando um segundo algoritmo de aprendizagem (o discriminador, implementado com uma rede neural) para classificar se uma observação específica (e ação, se desejada) veio do agente ou das demonstrações. Então, para cada observação que o agente coleta, ele é recompensado pela proximidade de suas observações e ações com aquelas nas demonstrações. O agente aprende como maximizar essa recompensa. O discriminador é atualizado com as novas observações do agente e melhora sua discriminação. Dessa forma iterativa, o discriminador fica cada vez mais forte, mas o agente fica cada vez melhor em "enganar" o discriminador e imitar as demonstrações.
Como o GAIL simplesmente dá ao agente uma recompensa, deixando o processo de aprendizagem inalterado, podemos combinar o GAIL com o DRL baseado em recompensa simplesmente ponderando e somando a recompensa do GAIL com aquelas dadas pelo próprio jogo. Se garantirmos que a magnitude da recompensa do jogo seja maior que a recompensa do GAIL, o agente será incentivado a seguir o caminho do jogador humano pelo jogo até que consiga encontrar uma grande recompensa ambiental.

Desde seu lançamento inicial, o ML-Agents Toolkit usa Proximal Policy Optimization (PPO) – um algoritmo DRL estável e flexível. Na versão 0.10, com o objetivo de acelerar seu treinamento em jogos reais, lançamos um segundo algoritmo DRL, o SAC, baseado no trabalho de Tuomas Haarnoja e seus colegas. Um dos recursos essenciais do SAC, que foi criado originalmente para aprender com robôs reais, é a eficiência da amostra. Para jogos, isso significa que não precisamos executá-los por tanto tempo para aprender uma boa política.
Os algoritmos DRL se enquadram em uma de duas categorias: dentro da política e fora da política. Um algoritmo de política como o PPO coleta um certo número de amostras, aprende como melhorar sua política com base nelas e, então, atualiza sua política adequadamente. Ao coletar amostras usando sua política atual, ele aprende como se aprimorar, aumentando a probabilidade de tomar ações gratificantes e diminuindo aquelas que não são gratificantes. A maioria dos algoritmos modernos de acordo com a política, como o PPO, também aprende uma forma de função de avaliação, como uma estimativa de valor (a soma esperada com desconto de recompensas até o final do episódio, dado que o agente está em um estado específico) ou uma função Q (a soma esperada com desconto de recompensas se uma determinada ação for tomada em um estado específico). Em um algoritmo de acordo com a política, esses avaliadores estimam a série de recompensas assumindo que a política atual seja adotada. Sem entrar em muitos detalhes, essa estimativa ajuda o algoritmo a treinar de forma mais estável.
Algoritmos fora da política, como o SAC, funcionam de forma um pouco diferente. Supondo que o ambiente tenha dinâmica fixa e função de recompensa, existe alguma relação ótima entre tomar uma ação específica em um determinado estado e obter alguma recompensa cumulativa (ou seja, qual seria a melhor política possível para obter?) Se conhecêssemos essa relação, aprender uma política eficaz seria muito fácil! Em vez de aprender o quão boa é a política atual, os algoritmos fora da política aprendem essa função de avaliação ótima em todas as políticas. Este é um problema de aprendizagem mais difícil do que no caso da política: a função real pode ser muito complexa. Mas como você está aprendendo uma função global, pode usar todas as amostras que coletou desde o início dos tempos para ajudar a aprender seu avaliador, tornando os algoritmos fora da política muito mais eficientes em termos de amostragem do que os dentro da política. Essa reutilização de amostras antigas é chamada de repetição de experiência, e todas as amostras são armazenadas em um grande buffer de repetição de experiência que pode armazenar centenas (se não milhares) de dados de jogos.
Para nosso kit de ferramentas, adaptamos o algoritmo SAC original, que foi projetado para executar tarefas de locomoção de ação contínua, para oferecer suporte a todos os recursos que você está acostumado em ML-Agents - Redes Neurais Recorrentes (memória), ações discretas ramificadas, curiosidade, GAIL e muito mais.

Em nossos experimentos anteriores, demonstramos que, para um nível complexo do Snoopy Pop (nível 25), observamos uma redução de 7,5x no tempo de treinamento ao passar de um único ambiente (ou seja, v0.7 do ML-Agents) para 16 ambientes paralelos em uma única máquina. Isso significava que uma única máquina poderia ser usada para encontrar uma solução básica para o Nível 25 em menos de 9 horas. Usando essa capacidade, treinamos nossos agentes para ir mais longe e dominar o Nível 25, ou seja, resolver o Nível 25 para desempenho humano. Observe que isso leva um tempo consideravelmente maior do que simplesmente resolver o nível — uma média de cerca de 33 horas.
Aqui, declaramos que um agente “dominou” um nível se ele atingir o desempenho humano médio (resolver o nível no número de bolhas que um humano usa ou abaixo dele) em mais de 1000 etapas. Para o nível 25, isso corresponde a 25,14 passos/bolhas disparadas, com média de 21 jogadas humanas do mesmo nível.
Em seguida, testamos cada melhoria da v0.9 e v0.10 incrementalmente, medindo o tempo necessário para exceder o desempenho humano no nível. No total, elas resultam em uma aceleração adicional de 7x para dominar o nível! Cada valor mostrado é uma média de três execuções, pois os tempos de treinamento podem variar entre as execuções. Às vezes, o agente tem sorte e encontra uma boa solução rapidamente. Todas as execuções foram feitas em uma máquina de 16 núcleos com treinamento acelerado por uma GPU K80. 16 instâncias foram executadas em paralelo durante o treinamento.
Para os experimentos GAIL, usamos 21 jogadas humanas do Snoopy Pop como demonstrações para treinar os resultados. Observe que as cores das bolhas no Nível 25 são geradas aleatoriamente, então as 21 jogadas não cobrem de forma alguma todas as configurações de tabuleiro possíveis do nível. Se assim for, o agente aprenderia muito rápido memorizando e copiando o comportamento do jogador. Em seguida, misturamos um sinal de recompensa GAIL com aquele fornecido pelo jogo Snoopy Pop, para que o GAIL possa orientar o aprendizado do agente no início do processo, mas permitir que ele encontre sua própria solução mais tarde.
Ambientes paralelos (v0.8) Ambientes assíncronos (v0.9) GAIL com PPO (v0.9) SAC (v0.10) GAIL com SAC (v0.10) Tempo para atingir o desempenho humano
(horas)
34:03 31:08 23:18 5:58 4:44 Taxa de transferência de amostra (amostras/segundo) 10,83 14,81 14,51 15,04 15,28
Vamos visualizar a aceleração em formato de gráfico abaixo. Vemos que o aumento no rendimento da amostra usando ambientes assíncronos resulta em uma redução do tempo de treinamento sem nenhuma alteração no algoritmo. As maiores reduções no tempo de treinamento, no entanto, vêm da melhoria da eficiência da amostra do treinamento. Observe que o rendimento da amostra não mudou substancialmente entre o ML-Agents v0.9 e v0.10. Adicionar demonstrações e usar o GAIL para orientar o treinamento significou que o agente usou 26% menos amostras para atingir o mesmo comportamento de treinamento, e vemos uma queda correspondente no tempo de treinamento. A mudança para o Soft Actor-Critic, um algoritmo fora da política, significou que o agente resolveu o nível com 81% menos amostras do que o PPO vanilla, e uma melhoria adicional foi vista ao adicionar GAIL ao SAC.
Essas melhorias não são exclusivas da nova função de recompensa e do objetivo de atingir o desempenho humano. Se encarregarmos SAC+GAIL de simplesmente resolver o nível, como fizemos em nossos experimentos anteriores, seremos capazes de fazê-lo em 1 hora e 11 minutos, em vez de 8 horas e 24 minutos.

Se você gostaria de trabalhar nessa emocionante intersecção de aprendizado de máquina e jogos, estamos contratando para várias posições. Inscreva-se!
Se você usar algum dos recursos fornecidos nesta versão, gostaríamos de saber sua opinião. Para qualquer feedback sobre o Unity ML-Agents Toolkit, preencha a pesquisa a seguir e sinta-se à vontade para nos enviar um e-mail diretamente. Caso você encontre algum problema ou tenha dúvidas, entre em contato conosco na página de problemas do ML-Agents no GitHub.