본문 바로가기

유니티 ML Agents/ML Agents 개념

13. ML Agents 기본 예제 - Ball3D 스크립트 호출구조 분석

Ball3D 호출 구조


ML 에이전트의 이해를 돕기 위해 스크립트 호출 구조를 분석해 보자. 주요 스크립트는 ML 에이전트에 내장된 클래스에 모두 코딩되어 있다. Academy, Agent, Brain 클래스를 살펴보는 것이 좋다. Ball3DAcademy 클래스는 Academy 클래스를 상속받아 구현되는데 Academy를 선택하고 F12 버튼을 누르면 클래스를 스크립트 에디터에서 살펴볼 수 있다.


앞에서 언급했듯이 아카데미는 에이전트와 브레인을 제어하는 역할을 한다. 이 것을 Academy 클래스의 EnvironmentStep 함수 내부에서 Agent Brain 클래스에 선언된 함수를 차례대로 호출하면서 동작을 제어한다.


(1)   AgentSetStatus 함수는 Agent 클래스의 SetStatus 함수를 호출한다. Max Step 도달 여부, 현재 몇번째 스탭(Step)에 해당하는지, 에이전트 종료 여부 등 에이전트 상태를 설정하는 기능을 수행한다.


(2)   AgentResetIfDone 함수는 Agent 클래스의 ResetIfDone 함수를 호출한다. 초기화가 필요할 때 에이전트를 리셋하는 기능을 수행한다.


(3)   AgentSendState 함수는 Agent 클래스의 SendInfo 함수를 호출한다. 내부에서 SendInfoToBrain, ResetReward 함수를 호출한다. SendInfoToBrain 함수는 관찰 값을 수집하는 CollectObservations 함수를 호출하고 AgentInfo 구조체에 값(이 전 행동에 따른 보상 값은 미리 설정되어 있음)을 설정해 브레인에 전달한다. ResetReward는 현재 스탭의 보상 값을 초기화(누적 보상 값은 보존)하는 역할을 한다.


(4)    BrainDecideAction 함수는 Brain 클래스의 BrainDecideAction 함수를 호출한다. External API, Internal 모델, Heuristic 클래스 등 외부 모듈로부터 에이전트 행동 결정에 필요한 정보를 받아 AgentAction 구조체에 저장한다.


(5)   AcademyStep 함수는 사용자가 필요한 코드를 수행하는 함수로써 Ball3DAcademy 클래스에서 재정의 해서 사용한다.


(6)   AgentAct 함수는 Agent 클래스의 AgentStep 함수를 호출하는데 이 함수는 사용자가 에이전트 행동을 지정하는 함수인 AgentAction 함수를 다시 호출한다. AgentAction 함수는 Ball3DAgent 내부에 재 정의되는데 브레인이 설정한 AgentAction 구조체 정보에 따라 어떤 행동을 취할지 결정한다. Ball3DAgent에서는 에이전트를 x축과 z축으로 각각 몇도 정도 회전할지 결정하고, 회전에 따른 공의 위치에 따라 보상 값(Reword)을 설정한다. 보상 값은 다음 스텝에서 SendInfoToBrain 함수가 호출될 때 브레인으로 전달되고 초기화 된다.


ML 에이전트의 동작을 잘 이해하기 위해서는 Agent 클래스에 정의된 AgentInfo AgentAction 구조체에 어떤 정보가 들어가 있는지 확인해보는 것이 좋다. 에이전트와 브레인 사이에 주고받는 핵심 정보들이 들어있기 때문이다.


*누적 보상 값(Cumulative Reword) AgentInfo 구조체에 들어있지 않기 때문에 브레인에 전달되지 않는다. 하지만 강화 학습의 목적이 누적 보상 값을 최대화하는 정책을 찾는 것에 있기 때문에 학습 모델은 현재까지의 누적 보상 값이 얼마인지 알고 있어야 한다. 따라서 누적 보상 값은 학습 환경과 학습 모델이 주고 받은 것이 아니라 각자 계산하고 학습이 종료될 때까지 값을 유지하고 있다는 것을 알 수 있다.