본문 바로가기

유니티 ML Agents/ML Agents 개념

12. ML Agents 기본 예제 - Ball3DAgent 분석

Ball3DAgent


3DBalls에서는 에이전트로 Platform을 사용했다. 계층 뷰에서 Gamexx 오브젝트 아래에 묶여있는 것을 볼 수 있다. 에이전트 에서 가장 유심히 봐야할 것은 Agent 컴포넌트이다. Brain속성은 은 에이전트에서 사용하는 브레인을 지정한다. 현재 Ball3DBrain 객체를 사용하도록 지정되어 있다.


Agent Cameras 속성은 에이전트에 카메라를 설치해서 이미지를 입력으로 처리할 수 있는 기능을 지원한다. 현재는 Vector Observation을 사용하기 때문에 카메라를 추가하지 않는다.


Max Step은 학습을 진행할 횟수를 지정한다. 5000이 지정되어 있어 5000회 학습을 진행해야 하지만 Academy에서 Max Step 0으로 지정되어 있기 때문에 상위 속성을 따라 강제로 종료할 때까지 계속 학습하게 된다.

Reset On Done 속성은 학습이 완료됐을 때 모든 속성을 초기화할 지를 결정한다.


On Demand Decisions 속성은 브레인을 통한 행동 결정을 자동으로 할 지 아니면 명시적으로 요청한 경우에만 수행할지를 결정한다. On Demand Decision을 사용할 경우 RequestDecision함수와 RequestAction 함수를 사용해 행동을 제어한다. 현재 체크되어 있지 않기 때문에 자동으로 브레인에게 행동 결정을 요청하게 된다.


Decision Frequency 속성은 얼마나 자주 행동 결정을 요청할지 지정한다. 5로 지정된 경우 학습이 5번 진행 (FixedUpdate함수가 5번 호출) 될 때마다 CollectObservations 함수를 호출해서 관찰 값을 수집한 이후 브레인에게 어떤 행동을 해야할 지 물어보게 된다.

마지막으로 Script 속성은 에이전트를 제어할 스크립트를 지정한다. 현재 Ball3DAgent 가 지정되어 있다.


Ball3DAgent 클래스 구성


Ball3DAgent 클래스는 Agent 클래스를 상속받고 Agent 클래스는 MonoBehavior 클래스를 상속받는다.


Ball3DAgent 클래스 기본적인 동작은 MonoBehavior 클래스를 따라가고 에이전트에 필요한 기능은 Agent 클래스에서 가져온다. Ball3Agent 클래스에는 Ball3D 게임에 필요한 기능만 정의한다.


Ball3DAgent 클래스가 활성화되면 가장 먼저 호출되는 것이 InitializeAgent 함수이다. 게임 오브젝트가 활성화될 때 호출되는 OnEnable 함수에서 호출되도록 정의되어 있다.


CollectObservations 함수는 에이전트가 환경에서 관찰 값을 수집하는 기능을 한다. 이 관찰 값은 강화학습에 기초자료로 활용된다. CollectObservations 함수에 의해 수집된 관찰값은 브레인으로 전달된다.


AgentAction 함수는 에이전트가 매 스텝마다 수행해야할 일들을 정의하고 있다. 기본적인 기능은 Agent 클래스의 AgentStep 함수에 정의되어 있고 그 함수 내부에서 AgentAction 함수가 호출된다. Ball3D 게임 학습에 필요한 기능을 Ball3DAgent 클래스의 AgentAction 함수 안에 정의하면 된다.


AgentReset 함수는 에이전트가 처음 시작되거나 종료될 때 호출된다. 주로 에피소드가 종료될 때 에이전트 초기화에 사용된다.

앞에서 살펴봤듯이 Ball3DAcademy 클래스의 실행 주기는 FixedUpdate함수 호출 시간에 맞춰져 있다. CollectObservations, AgentAction, AgentReset 함수는 Ball3DAcademy 클래스가 상속받는 Academy 클래스의 EnvironmentStep 함수 안에 호출되도록 코딩되어 있으며 EnvironmentStep 함수는 FixedUpdate 함수 안에서 호출된다.


Agent 클래스의 동작은 Academy 클래스에 의해 제어되는 것을 알 수 있다


Ball3DAgent CollectObservations 함수


Ball3DAgent 클래스에서 관찰 값 수집을 담당하는 CollectObservations 함수의 기능을 살펴보자. 먼저 Ball3DAgent 객체의 z축과 x회전률 두 개의 변수를 설정했고 다음으로 Ball 객체와 Ball3DAgent 객체의 거리 차 (x, y, z) 값 세 개를 설정했다. 다음으로 Ball 객체의 물리적 특성을 정의하는 리지드바디 컴포넌트의 속도(x, y, z) 값 세 개를 설정했다. 모두 8개의 관찰 값을 추출해서 브레인으로 전달하기 위해 AddVectorDbs 함수를 사용해서 AgentInfo 구조체의 vectorObservation 변수에 값을 설정했다.


Ball3DBrain 객체의 Brain 컴포넌트에 설정된 값을 다시 살펴보면 Space Size 8로 동일하게 설정된 것을 확인할 수 있다.


어떤 변수가 학습을 위해 브레인으로 전달되야 하는지에 대한 명확한 정의는 없다. 학습을 위한 충분한 정보를 전달할 수 있도록 변수를 설계해야 지만 효율적인 강화학습 모델을 만들 수 있다.


Ball3DAgent AgentAction 함수


Ball3DAgent 클래스에서 동작을 결정하는 AgentAction 함수를 살펴보자. AgentAction 함수는 Academy 클래스에 정의된 FixedUpdate 함수가 호출될 때 같이 실행되는데 인자로 전달되는 vectorAction 배열은 브레인이 에이전트로 전달하는 값이다. 브레인 객체는 Space Size 속성을 통해 몇 개의 변수가 에이전트로 전달될 지 정의하고 있다.


브레인 객체에서 전달받은 vectorAction 배열을 가지고 에이전트가 x축과 z축으로 얼마나 회전할 지 결정한다.


마지막으로 보상을 결정하는데 브레인으로부터 전달 받은 숫자만큼 판을 움직였을 때 공(Ball 객체)이 판(에이전트)에서 떨어지면 -1점을 감점하고 판 위에 있으면 0.1점을 올려준다. 보상을 몇 점으로 할지는 정해진 값이 없으며 학습을 반복하면서 최적의 값을 찾아야 한다. 하지만 보상의 절대 값이 1을 넘으면 안된다.

반응형