최근 ML-Agents에 MA-POCA 알고리즘이 추가되어 누구든지 에이전트 그룹에게 협동형 동작을 가르칠 수 있습니다. 이 새로운 알고리즘은 분산형 실행을 통해 중앙집중형 학습을 구현합니다. 중앙집중형 크리틱(신경망)은 그룹 내 모든 에이전트의 상태를 처리하여 에이전트들의 행동이 얼마나 바람직한지 평가하는 한편, 다수의 분산형 액터(에이전트당 하나)가 에이전트를 제어합니다. 이로써 각 에이전트는 국지적으로 인식한 정보를 바탕으로 의사 결정을 내리는 동시에, 전체 그룹의 맥락에서 자신의 행동이 적절한지 평가할 수 있습니다. 아래 다이어그램은 MA-POCA의 중앙집중형 학습 및 분산형 실행을 설명합니다.
MA-POCA 알고리즘의 새로운 특징 중 하나는 고정되지 않은 수의 입력을 처리할 수 있는 주의망(attention network)이라는 특수한 유형의 신경망 아키텍처를 사용한다는 점입니다. 따라서 중앙집중형 크리틱이 모든 에이전트를 그 수에 상관없이 처리할 수 있으므로, MA-POCA는 게임 내 협동형 동작에 특히 적합합니다. MA-POCA를 사용하면 언제든지 에이전트를 그룹에서 제거하거나 추가할 수 있으며, 이는 마치 비디오 게임의 캐릭터가 팀 대항전 중에 제거되거나 생성될 수 있는 것과 같습니다. 아울러 MA-POCA는 에이전트가 자신에게 불리하더라도 팀에게 이로운 결정을 내릴 수 있도록 설계되었습니다. 직접 작성된 코드로는 이끌어 내기 어려운 이러한 이타적인 동작은 에이전트의 마지막 행동이 그룹 전체의 승리에 얼마나 일조했는지를 통해 학습될 수 있습니다. 마지막으로, 다중 에이전트 강화 학습 알고리즘의 상당수는 모든 에이전트가 동시에 다음 행동을 결정한다고 가정하지만, 많은 에이전트가 참여하는 실제 게임에서는 프레임 드롭을 피하기 위해 에이전트들이 서로 다른 때에 결정을 내리도록 하는 것이 좋습니다. 따라서 MA-POCA는 이러한 가정을 하지 않으며, 단일 그룹에 속한 에이전트들의 의사결정이 동기화되지 않은 상태에서도 계속 작동합니다. MA-POCA가 게임에서 얼마나 잘 작동하는지 선보이기 위해 유니티에서는 ML-Agents만으로 훈련된 Al를 이용하여 재미있는 팀대항 게임인 DodgeBall 환경을 만들었습니다.
DodgeBall 환경은 플레이어가 최대한 많은 공을 집어 상대에게 던지는 3인칭 슈팅 게임입니다. 게임은 Elimination과 Capture the Flag라는 두 가지 모드로 구성됩니다. Elemination 모드로 게임을 할 경우 각 그룹은 상대 그룹의 모든 멤버를 제거해야 합니다. 공에 두 번 맞으면 게임에서 제외됩니다. Capture the Flag 모드의 경우 플레이어는 상대 팀의 깃발을 훔쳐 자신의 기지로 가져가야 합니다(기지에 자기 팀 깃발이 안전하게 있어야만 점수를 올릴 수 있음). 이 모드에서는 공에 맞으면 깃발을 떨어뜨리고 10초간 기절하며, 이후에 기지로 소환됩니다. 두 가지 모드 모두 플레이어는 최대 4개의 공을 가질 수 있고, 날아오는 공을 피하기 위해 돌진하거나 울타리를 돌파할 수 있습니다.
강화 학습에서 에이전트는 환경을 관찰하고 보상을 극대화하는 행동을 취합니다. 에이전트에게 DodgeBall 플레이를 가르치는 데 필요한 관찰과 행동, 보상은 아래에서 확인할 수 있습니다.
DodgeBall에서 에이전트는 다음 세 가지 정보 소스를 통해 환경을 관찰합니다.
DodgeBall 환경은 연속 행동과 이산 행동이 혼합된 하이브리드 행동도 활용합니다. 에이전트는 앞으로 이동, 옆으로 이동, 회전 등 세 가지 연속 행동으로 이동합니다. 동시에 공 던지기 및 돌진의 두 가지 이산 행동을 합니다. 이러한 행동 공간은 Capture the Flag 및 Elimination 시나리오에서 사람 플레이어가 수행할 수 있는 행동과 일치합니다.
한편, 보상에 관해서는 의도적으로 에이전트에게 다소 단순한 보상이 주어지도록 설정했습니다. 승패에 따라 큰 규모의 최종 보상을 제공하고, 게임 방법의 학습을 위해 몇 차례의 중간 보상을 제공합니다.
Elimination 모드:
Capture the Flag 모드:
에이전트에게 작은 보상을 여러 번 부여하여 바람직한 행동을 장려하고 싶더라도 에이전트가 추구해야 할 전략을 과도하게 규정하는 것은 피해야 합니다. 예를 들어 Elimination에서 공을 줍는 행위에 대해 보상한다면, 에이전트가 상대를 맞추기보다 공 줍기에 더 열중하게 될 수 있습니다. 보상을 최대한 '드물게' 제공하면 훈련 기간은 길어질 수 있지만, 에이전트가 게임 내에서 고유의 전략을 자유롭게 강구할 수 있습니다.
에이전트에게 이러한 보상을 안기는 승리 전략은 매우 다양하므로, 최적의 행동이 무엇인지 파악해야 했습니다. 예를 들어 공을 비축해두는 것과 나중에 사용하기 편하도록 여기저기 옮겨 놓는 것 중 무엇이 좋은 전략일까요? 팀원들이 뭉쳐 있는 것이 현명할까요, 아니면 흩어져서 적을 빨리 찾는 것이 좋을까요? 이와 같은 질문에 대해서는 게임을 어떻게 디자인하느냐에 따라 답이 달라졌습니다. 만약 공이 부족하다면 에이전트는 적이 공을 차지하지 못하도록 공을 더 오래 가지고 있으려 합니다. 만약 적의 위치를 항상 알 수 있도록 설정하면 에이전트는 최대한 서로 모여 있으려 합니다. 따라서 게임에 변화를 주고 싶을 때에도 AI의 코드를 수정할 필요가 없었습니다. 단지 새로운 환경에 적합한 새로운 행동을 다시 교육하기만 하면 됩니다.
에이전트 그룹이 협동하도록 훈련시키는 것은 단일 에이전트가 과제를 해결하도록 훈련시키는 것에 비해 복잡합니다. 유니티는 에이전트 그룹 관리에 도움을 제공하기 위해 DodgeBallGameController.cs 스크립트를 만들었습니다. 이 스크립트는 운동장을 초기화하고 재설정합니다(공을 생성하고 에이전트의 위치를 재설정하는 것도 포함). 또한 에이전트를 SimpleMultiAgentGroup에 할당하고 각 그룹이 받는 보상을 관리합니다. 예를 들어 DodgeBallGameController.cs 스크립트는 에이전트가 다른 에이전트를 공으로 맞추면 다음과 같이 처리합니다.
이 코드에 따르면 공을 던져 상대를 맞춘 에이전트는 작은 보상을 받습니다. 하지만 전체 그룹은 상대팀의 마지막 구성원이 제거된 이후에만 함께 노력한 결과에 대한 보상을 받게 됩니다.
MA-POCA는 개별 에이전트를 관리하는 방식과 다르게 SimpleMultiAgentGroup에 속한 에이전트들을 관리합니다. MA-POCA는 중앙집중형 훈련을 위해 관찰한 내용을 종합합니다. 아울러 그룹에 들어오거나 나가는 에이전트의 수에 관계없이 개별 보상과 전체 그룹에 대한 보상도 관리합니다. TensorBoard에서 에이전트 그룹이 받는 누적 보상을 모니터링할 수 있습니다.
Elimination과 Capture the Flag 모두 대항 게임이므로, 유니티는 MA-POCA와 셀프 플레이(self-play)를 결합하여 에이전트가 자신의 이전 버전과 대항하면서 이전 버전을 이기는 방법을 학습하도록 했습니다. ML-Agents에서 셀프 플레이를 실행할 때는 ELO가 계속 증가하는지 확인하여 에이전트의 학습 진행률을 모니터링할 수 있습니다. 수천만 번의 단계를 거치면 에이전트가 사람처럼 플레이할 수 있게 됩니다.
이 동영상은 Elemination 플레이를 학습하는 에이전트가 시간이 지나며 발전하는 모습을 보여줍니다. 훈련 초기의 에이전트는 공을 던질 줄은 알지만 조준 정확성이 떨어지고 무작위로 던지는 경향이 있음을 확인할 수 있습니다. 4,000만 번의 타임 스텝을 거치자, 에이전트는 여전히 다소 아무렇게나 배회하며 적을 찾지만 조준력은 향상되었습니다. 상대와 마주치면 보통 일대일로 맞붙습니다. 다시 1억 2,000만 번의 타임 스텝을 추가로 훈련한 이후, 에이전트는 훨씬 더 공격적이고 자신만만하게 되며, 그룹을 지어 상대 진영으로 돌격하는 등 정교한 전략을 전개합니다.
다음은 Capture the Flag 플레이를 학습하는 에이전트입니다. 타임 스텝이 1,400만 번인 훈련 초기에는 에이전트가 실제로 깃발을 잡지는 않고 서로에게 공을 던지는 법만 학습합니다. 3,000만 번 째에 에이전트는 상대의 깃발을 들고 기지로 복귀하는 법을 배우지만, 깃발을 든 에이전트를 제외한 나머지 에이전트가 어떻게 팀에 일조하는지는 명확하지 않습니다. 하지만 타임 스텝이 8,000만 번이 되자 에이전트들이 흥미로운 전략을 보입니다.
상대팀의 깃발을 들고 있지 않은 에이전트는 기지를 지키기도 하고, 자기 팀의 깃발을 든 상대 팀원을 추격하기도 하고, 상대팀의 기지에서 기다리다가 깃발을 들고 귀환하는 상대 팀원을 공으로 맞추기도 합니다. 자기 팀이 깃발을 차지하면 에이전트는 팀 구성원이 상대팀의 깃발을 가지고 돌아와 득점할 때까지 기지에서 대기하기도 합니다. 다음 동영상은 에이전트가 우연히 학습한 몇 가지 흥미로운 전략을 보여줍니다. 이는 명시적으로 지정한 행동이 아니며, 수백 번의 셀프 플레이를 반복하는 과정에서 학습된 것입니다.
DodgeBall 환경은 오픈 소스이며 여기에서 다운로드할 수 있습니다. 직접 실행해 보시기 바랍니다. 머신러닝과 게임이 만나는 이 흥미로운 분야를 연구하고 싶다면, 당사에서 진행 중인 채용 공고를 참고하여 여기에서 지원하세요.
새로운 Dodgeball 환경에 대한 피드백을 공유해주세요. Unity ML-Agents 툴킷에 대한 피드백이 있다면 다음 설문조사에 참여하거나 ml-agents@unity3d.com으로 직접 이메일을 보내주세요. 사용 중 문제가 발생할 경우 ML-Agents GitHub 이슈 페이지로 문의하세요. 기타 의견이나 질문이 있다면 Unity ML-Agents 포럼을 통해 공유해 주시기 바랍니다.