Search Unity

ML-Agents를 이용하여 에이전트 훈련 속도 7배 향상하기

, 11월 11, 2019

훈련 시간 단축을 위해 ML-Agents의 v0.9 및 v0.10에 비동기 환경, GAIL(Generative Adversarial Imitation Learning, 생성적 적대 모방 학습) 및 SAC(Soft Actor-Critic)를 도입했습니다. 유니티는 이전 포스팅에서 파트너사인 JamCity와 함께 ML-Agents v0.8에 병렬 Unity 인스턴스 기능을 도입하여 버블 슈터 게임 스누피 팝(Snoopy Pop)의 에이전트를 단일 인스턴스보다 7.5 배 빠르게 훈련하는 내용을 다뤘습니다. 이 포스팅에서는 v0.9 및 v0.10이 구축된 과정을 설명하고, 스누피 팝 훈련 시간을 추가로 7배 더 단축하여, 합리적인 시간 내에 보다 우수한 성능의 에이전트를 훈련하는 방법을 이야기합니다.

Unity ML-Agents 툴킷은 게임 개발자가 DRL(Deep Reinforcement Learning, 심층 강화 학습)을 사용하여 플레이 가능한 캐릭터와 플레이 불가능한 캐릭터(NPC) 모두에 복잡하고 흥미로운 행동을 부여할 수 있도록 해줍니다. DRL은 물리 기반 캐릭터부터 퍼즐 게임을 해결하는 캐릭터에 이르기까지 다양한 행동을 학습하는 데 사용할 수 있는 강력한 툴입니다. 그러나 DRL을 이용하여 효과적인 행동을 학습하기 위해서는 많은 양의 게임플레이 데이터가 필요하기 때문에, 일반적으로 속도 향상에 있어 제약을 받는 실제 게임에서는 문제가 될 수 있습니다.

몇 달 전 ML-Agents v0.8 출시를 통해 유니티에서는 ML-Agents가 게임의 여러 Unity 인스턴스를 단일 머신에서 실행할 수 있도록 하는 기능을 지원하고, 훈련 중에 수집할 수 있는 훈련 샘플 처리량(예: 에이전트의 관찰, 행동 및 보상)을 획기적으로 증가시켰습니다. 유니티는 JamCity와 협력하여 에이전트가 스누피 팝 퍼즐 게임의 여러 레벨을 플레이하도록 훈련시켰습니다. v0.8의 병렬 환경을 이용하여, 스누피 팝의 고난이도 레벨에서 훈련 속도를 최대 7.5배 높일 수 있었습니다.

그러나 병렬 환경의 경우, 단일 머신에서 동시에 실행할 수 있는 Unity 인스턴스의 수에 제한이 있습니다. 따라서 리소스가 제한된 머신에서 훈련 시간을 단축하기 위한 다른 방법을 찾아야 했습니다. 일반적으로 훈련 시간을 단축하는 데는 두 가지 방법이 있습니다. 초당 샘플 수집량을 늘리거나(샘플 처리량), 올바른 행동을 학습하는 데 필요한 샘플 수량을 줄이는 것입니다(샘플 효율성). 따라서 v0.9에서는 병렬 트레이너를 개선하여 샘플을 비동기식으로 수집함으로써 샘플 처리량을 늘렸습니다.

또한 실제 사람이 시연을 통해 학습 과정을 안내하는 GAIL을 추가하여, 샘플 효율성을 높였습니다. 마지막으로 v0.10에서는 v0.8의 Proximal Policy Optimization 트레이너보다 샘플 효율성이 훨씬 더 높은 SAC(Soft Actor-Critic) 트레이너를 도입했습니다. 이러한 변경을 통해 단일 머신에서 훈련 시간이 7배 더 단축되었으며, 에이전트가 무사히 레벨을 통과할 뿐 아니라 사람이 플레이할 경우와 동일한 수의 단계를 거쳐 레벨을 통과할 수 있게 되었습니다. 결과적으로 이전에는 여러 대의 머신으로 수일의 훈련이 필요했던 과정이 이제는 샘플 처리량과 효율성이 향상됨에 따라 단일 머신에서 여러 레벨을 훈련할 수 있었습니다. 이번 포스팅에서는 ML-Agents의 후속 버전별로 개선된 사항과 스누피 팝 에이전트 훈련에 미친 영향에 대해 자세히 설명합니다.

ML-Agents 툴킷과 스누피 팝

앞서 ML-Agents v0.8 블로그 포스팅에서 ML-Agents와 스누피 팝의 통합을 소개한 적이 있습니다. 아래는 에이전트가 보게 될 장면과, 가능한 행동 및 보상을 요약한 그림입니다. 유니티는 스누피 팝의 이전 실험에 비해 긍정적 보상의 규모를 줄이고 버블 사용에 대한 페널티를 증가시켜, 사람이 플레이할 때와 마찬가지로 에이전트가 단순히 레벨을 마무리하는 데 집중하기보다 최소 단계를 거쳐 버블을 없애는 데 집중하도록 하였습니다. 이는 단순히 레벨을 통과하는 것보다 훨씬 어렵고, 좋은 방법을 학습하는 데 훨씬 더 오랜 시간이 걸립니다.

그림: 스누피 팝에서 관찰, 행동 및 보상의 정의

ML-Agents 0.8: 스누피 팝의 다중 동시 인스턴스 실행

ML-Agents v0.8에서는 여러 Unity 인스턴스를 동시에 훈련시키는 기능을 도입했습니다. 스누피 팝 단일 인스턴스의 속도를 높이는 데는 한계가 있지만, 멀티 코어 프로세서를 이용하면 단일 머신에서 여러 인스턴스를 실행할 수 있습니다. 게임의 플레이가 각각 독립되어 있으므로, 훈련 데이터 수집을 쉽게 병렬화할 수 있습니다.

 

 

 

 

각 시뮬레이션이 제공하는 데이터는 공통의 훈련 버퍼에 저장된 후, 더 나은 게임 플레이를 위해 정책(policy)을 업데이트하는 트레이너(trainer)에 의해 사용됩니다. 이 새로운 패러다임을 통해 타임스케일이나 게임플레이 메카닉스에 부정적인 영향을 주는 게임 파라미터를 변경할 필요 없이 훨씬 더 많은 데이터를 수집할 수 있습니다.

ML-Agents v0.9: 비동기 환경 및 모방 학습

ML-Agents v0.9에서는 샘플 효율성 및 샘플 처리량이 각각 개선되었습니다.

비동기 환경

병렬 환경으로 구현된 v0.8에서는 각 Unity 인스턴스가 다른 Unity 인스턴스와 동기화하여 단계를 수행하며, 트레이너는 모든 관찰 사항을 수신하고 모든 행동을 동시에 전송합니다. ML-Agents 툴킷이 제공된 일부 환경에서는 에이전트가 거의 동일한 빈도로 결정을 내리므로, 행동의 동시 실행이 문제가 되지 않습니다. 하지만 실제 게임에서는 일부 행동이 다른 행동보다 시간이 더 걸릴 수 있습니다. 예를 들어, 스누피 팝에서 다량의 버블을 없애려면 아무것도 없애지 않는 것보다 애니메이션이 길어집니다. 또한 게임에서 이기고 레벨을 재설정하는 과정은 버블을 슈팅하는 것보다 오래 걸립니다. 즉, 병렬 환경 중 하나라도 시간이 더 오래 걸리는 작업을 수행하면 나머지 환경은 대기해야 합니다.

ML-Agents v0.9에서는 비동기 병렬 환경이 가능해졌습니다. 다수의 환경 중 적어도 하나가 작업을 완료하면, 트레이너는 새 작업을 보내고 다음 단계를 수행할 수 있습니다. 이를 통해 단계별로 소요 시간이 다양한 환경에서 샘플 처리량을 크게 높일 수 있습니다.

생성적 적대 모방 학습

일반적인 DRL 훈련 과정에서 에이전트는 임의의 행동을 하도록 초기화되며, 주어진 환경에서 임의의 행동을 수행하면서 일부 보상을 받기도 합니다. 이후 보상이 더 높게 주어지는 행동을 강화하게 되고, 시간이 지남에 따라 주어진 환경에서 보상을 극대화하는 방향으로 행동이 편중되면서 무작위성이 감소하게 됩니다.

그러나 임의의 행동을 통해 최적의 행동을 찾는 일이 항상 쉬운 것은 아닙니다. 예를 들어, 보상이 드물게 발생하여 에이전트가 보상을 받으려면 올바른 행동을 많이 취해야 하거나 주어진 환경에 local optima(국소 최적화)가 많이 존재할 수도 있습니다. 즉, 에이전트가 최대 보상을 향해 움직이는 것 같지만 실제로는 잘못된 경로인 경우가 있습니다. 이 두 가지 문제는 강제 무작위 검색을 사용하여 해결할 수 있지만 그렇게 하려면 엄청난 양의 샘플이 필요합니다. 따라서 스누피 팝을 훈련시키는 데 수백만 개의 샘플이 필요하지만, 경우에 따라서는 최적의 행동을 찾지 못할 수도 있습니다.

만약 에이전트에게 실제 사람이 게임을 시연하는 데모를 제공하여 좋은 행동을 하도록 유도할 수 있다면 어떨까요? 이 연구 분야를 모방 학습이라고 하며 ML-Agents의 v0.3에 이 단계가 추가되었습니다. ML-Agents(v0.3)에서의 모방 학습의 단점 중 하나는 강화 학습과는 별개로 환경으로부터의 보상 없이 순전히 데모에 대해서만 훈련이 진행된다는 것입니다.

v0.9에서는 Jonathan Ho와 동료들이 연구한 내용을 바탕으로 위 두 가지 문제를 모두 해결하는 GAIL을 도입했습니다. 이 알고리즘에 대한 자세한 사항은 해당 논문에서 확인할 수 있습니다.

ML-Agents에서 모방 학습을 사용하려면, 먼저 사람(또는 봇)이 게임을 여러 번 플레이한 후, 관찰 및 행동을 데모 파일에 저장합니다. 훈련 중에 에이전트는 평소와 같이 주어진 환경에서 행동을 하고 스스로 관찰을 수집할 수 있습니다. 상위 수준에서 보면, GAIL은 두 번째 학습 알고리즘(신경망으로 구현된 판별기)을 훈련하여 특정 관찰(및 필요한 경우, 행동)이 에이전트에서 비롯된 것인지 또는 데모에서 비롯된 것인지 구분합니다. 그런 다음 에이전트가 관찰을 수집할 때마다, 데모의 관찰과 행동과 비교하여 유사도에 따라 보상을 받습니다. 이 과정을 통해 에이전트는 보상을 최대화하는 방법을 배우게 됩니다. 판별기는 에이전트의 새로운 관찰 내용으로 업데이트되고, 차별점을 구분하는 데 더 능숙해집니다. 이를 반복하면서 판별기는 점점 더 강력해지지만 동시에 에이전트는 판별기를 “속이고” 데모를 더 훌륭하게 모방합니다.

GAIL은 단순히 에이전트에게 보상을 제공하며, 학습 프로세스는 변경되지 않은 상태로 유지합니다. 따라서, GAIL에서 부여하는 보상을 게임 자체가 제공하는 보상에 가중치를 부여하여 합산함으로써 GAIL을 보상 기반 DRL과 결합할 수 있습니다. 게임 보상의 규모가 GAIL 보상의 규모보다 크도록 설정하면, 에이전트는 규모가 큰 환경 보상을 찾을 때까지 사람이 플레이한 게임 경로를 따르게 됩니다.

그림: GAIL(Generative Adversarial Imitation Learning, 생성적 적대 모방 학습)

ML-Agents v0.10: Soft Actor-Critic

ML-Agents 툴킷은 최초 릴리스 이후 안정적이고 유연한 DRL 알고리즘인 PPO(Proximal Policy Optimization)를 사용해 왔습니다. v0.10에서는 실제 게임에 대한 훈련 속도를 높이기 위해 Tuomas Haarnoja와 동료들이 수행한 연구에 기반하여 두 번째 DRL 알고리즘인 SAC를 출시했습니다. 원래 실제 로봇에 활용하기 위해 만들어진 SAC의 중요한 기능 중 하나는 샘플 효율성으로, 게임의 경우 좋은 정책(policy)을 학습하기 위해 오랫동안 게임을 실행하지 않아도 됩니다.

DRL 알고리즘은 두 가지 범주인 온-폴리시(on-policy) 알고리즘과 오프-폴리시(off-policy) 알고리즘 중 하나에 속합니다. PPO와 같은 온-폴리시 알고리즘은 몇 가지 샘플을 수집하고, 이를 기반으로 정책을 개선하는 방법을 학습한 다음, 이에 따라 정책을 업데이트합니다. 현재 정책을 사용하여 샘플을 수집함으로써, 스스로 개선하는 방법을 학습하여, 보상을 받는 행동을 취할 확률을 높이고, 보상이 없는 행동을 줄입니다. PPO와 같은 현대적인 온-폴리시 알고리즘의 대부분은 가치 추정(에이전트가 특정 상태인 경우에 에피소드 종료 시 기대되는 보상 감소의 합) 또는 Q-function(특정 상태에서 특정 행동이 수행될 경우에 기대되는 보상 감소의 합)과 같은 일종의 평가 함수도 학습합니다. 온-폴리시 알고리즘에서 평가자 함수(evaluator)는 현재 정책이 적용되었다는 가정하에서 일련의 보상을 추정합니다. 이러한 추정을 통해서 알고리즘이 상세 정보 없이도 더 안정적으로 학습하게 됩니다.

SAC와 같은 오프-폴리시 알고리즘은 약간 다르게 작동합니다. 환경에 정해진 행동 규칙 및 보상 함수가 있다고 가정하면, 주어진 상태에서 특정 조치를 취하는 것과 누적 보상을 얻는 것 사이에는 최적의 관계가 존재합니다(예: 최상의 정책으로 무엇을 얻을 수 있을까?). 이 관계만 알고 있다면, 아주 쉽게 효과적인 정책을 배울 수 있을 겁니다. 오프-폴리시 알고리즘은 현재 정책이 얼마나 좋은지 학습하기보다는 모든 정책에 걸친 최적의 평가 함수를 학습합니다. 이는 온-폴리시의 경우보다 더 어려운 학습 문제이며, 실제 함수가 매우 복잡할 수 있습니다. 그러나 글로벌 함수를 학습시키고 있기 때문에 시작 시점부터 수집한 모든 샘플을 사용하여 평가자 함수를 훈련시키며, 오프-폴리시 알고리즘이 온-폴리시 알고리즘보다 샘플 효율성이 훨씬 높습니다. 이렇게 오래된 샘플을 재사용하는 것을 경험 리플레이(experience replay)라고 하며, 대규모 경험 리플레이 버퍼에 모든 샘플이 저장됩니다. 이 버퍼는 수백 개 이상의 게임 데이터를 저장할 수 있습니다.

본 툴킷은 연속된 행동의 움직임을 처리할 수 있도록 설계된 기존 SAC 알고리즘을 사용하여 순환 신경망(메모리)이산 입력별 분기 행동(branched discrete action)호기심 기반 학습, GAIL 등 ML-Agents에서 익숙한 모든 기능을 지원하도록 설계되었습니다.

그림: 오프-폴리시 vs 온-폴리시 DRL 알고리즘

스누피 팝에서 성능 측정 결과

이전 실험에서는 복잡한 스누피 팝 레벨(레벨 25)의 경우, 단일 환경(예: ML-Agents v0.7)에서 단일 머신의 16개 병렬 환경으로 바꾼 후 훈련 시간이 7.5배 감소했습니다. 즉, 단일 머신을 사용하여 레벨 25까지의 기본 솔루션을 9시간 이내에 찾을 수 있습니다. 유니티에서는 이 기능을 사용하여 에이전트가 더 나아가 레벨 25를 마스터하도록, 즉 인간 수준의 성능으로 레벨 25를 통과하도록 훈련했습니다. 이는 평균 33시간 정도가 소요되어, 단순히 레벨을 통과하는 것보다 훨씬 더 많은 시간이 소요됩니다.

여기서 레벨을 “마스터했다”는 표현은 에이전트가 1,000개 이상의 단계에서 사람이 플레이할 경우의 평균 성과(사람이 플레이할 때 사용하는 버블의 수와 동일하거나 더 적게 들여서 레벨을 통과)에 도달했다는 것을 의미합니다. 레벨 25의 경우 “마스터”는 25.14단계/버블 샷이며 이는 사람이 동일한 레벨을 21회 플레이한 후 결과를 평균한 값입니다.

그런 다음 v0.9 및 v0.10의 각 개선 사항을 점진적으로 테스트하여, 해당 레벨에서 사람이 플레이할 경우의 성과를 초과하는 데 걸리는 시간을 측정하였습니다. 그 결과 레벨을 마스터하는 데 7배 더 빠른 속도를 달성할 수 있게 되었습니다. 훈련 소요 시간은 실행 시 매번 다를 수 있으며, 표시된 값은 3회 실행에 대한 평균값입니다. 때로는 운이 좋아서 에이전트가 좋은 해결책을 신속하게 찾기도 했습니다. 모든 실행은 K80 GPU를 탑재한 16코어 머신에서 이루어졌습니다. 훈련 과정에서는 16개의 인스턴스가 병렬로 실행되었습니다.

GAIL 실험의 경우, 사람이 플레이한 21가지 플레이 기록을 데모로 사용하여 결과를 훈련하였습니다. 레벨 25에서 버블 색상은 임의로 생성되므로, 21개의 플레이 기록은 해당 레벨에서 나올 수 있는 모든 보드 구성을 포함하지는 않습니다. 따라서 에이전트는 플레이어의 행동을 암기하고 모방하여 매우 신속하게 학습하게 됩니다. 이후 GAIL 보상 신호를 스누피 팝 게임에서 제공하는 보상 신호와 혼합하여, 프로세스 초기에는 GAIL을 통해서 에이전트의 학습을 지도하지만, 나중에는 에이전트 스스로 솔루션을 찾을 수 있도록 합니다.

병렬 환경(v0.8) 비동기 환경(v0.9) PPO가 포함된 GAIL(v0.9) SAC (v0.10) SAC가 포함된 GAIL(v0.10)
사람이 플레이한 경우의 성과에 도달하는 데 걸리는 시간

(시간)

34:03 31:08 23:18 5:58 4:44
샘플 처리량(샘플/초) 10.83 14.81 14.51 15.04 15.28

아래에 그래프 형식으로 속도 향상을 시각화해 보았습니다. 비동기 환경을 사용하여 샘플 처리량을 늘리면, 알고리즘을 변경하지 않고도 훈련 시간이 단축됩니다. 그러나 훈련의 샘플 효율을 향상시켜야 훈련 시간이 더 많이 감소하게 됩니다. ML-Agents v0.9와 v0.10 간에는 샘플 처리량이 크게 변하지 않았습니다. 데모를 추가하고 GAIL을 사용하여 훈련하면, 에이전트가 동일한 행동에 도달하기 위해 샘플을 26% 더 적게 사용하게 되며, 이에 따라 훈련 시간이 단축됩니다. 오프-폴리시 알고리즘인 SAC(Soft Actor-Critic)로 전환한 결과, 에이전트가 vanilla PPO보다 샘플 수를 81% 더 적게 들여서 해당 레벨을 통과하였으며, GAIL을 SAC에 추가하여 추가 개선을 달성할 수 있었습니다.

이러한 개선은 새로운 보상 함수와 사람이 플레이한 경우의 성과에 도달하려는 목표에만 한정되지 않습니다. 이전 실험에서처럼 SAC+GAIL이 레벨을 단순히 통과만 하도록 한다면, 8시간 24분이 아니라 1시간 11분만에 완료할 수 있습니다.

향후 계획

게임에 머신러닝을 적용하는 흥미로운 분야에 도전하고 싶다면, 유니티에서 진행하는 채용 공고를 확인하여 지원하시기 바랍니다!

이번 릴리스에서 제공하는 기능을 사용해 보시고, 많은 의견을 주시기 바랍니다. ML-Agents 툴킷에 관한 의견은 다음 설문 조사에 참여하거나, 이메일을 통해 보내주셔도 됩니다. 사용 과정에서 발생하는 문제나 질문 사항은 ML-Agents GitHub 이슈 페이지에서 문의해 주시기 바랍니다.

3 replies on “ML-Agents를 이용하여 에이전트 훈련 속도 7배 향상하기”

Re: parallelization of SAC or usage with GAIL – To the best of my knowledge, SAC hasn’t been used in a parallel/asynchronous setting or with GAIL in literature. However, SAC belongs to a family of algorithms (off-policy Q learning) that have been used in both applications, and the same principles apply. See: R2D2 (https://openreview.net/pdf?id=r1lyTjAqYX) for a highly parallelized Q learning algorithm, and Discriminator-Actor-Critic (https://arxiv.org/pdf/1809.02925.pdf) and Sample-Efficient Imitation Learning (https://arxiv.org/pdf/1809.02064.pdf) for use of GAIL with TD3 and DDPG (both continuous off-policy Q learning algorithms), respectively. For the latter case (GAIL), we saw similar sample efficiency gains with SAC as the authors do with TD3 and DDPG, vs. TRPO or PPO.

Good stuff. Out of curiosity: are there any publications or other materials (other than ml-agents code) on the parallelization of SAC or usage with GAIL (as the original version was with TRPO)?

Comments are closed.