본문 바로가기

개발 프로젝트/Unity - Individual Museum

Unity 강화 학습 ML-Agent (3) - GitBash로 학습 진행

이번 게시글에선 GitBash를 통해 Ml-Agent를 작동하여 신경망 모델을 제작하겠습니다.

Ml-Agent가 Pytorch의 딥러닝 모델을 활용하는 과정은 아래와 같습니다.

  1. 환경 설정: ML-Agents로 훈련하려는 환경을 설정. Unity에서 에이전트들이 상호 작용하는 게임 환경이나 시뮬레이션을 구성합니다.
  2. 에이전트 정의: 각 에이전트는 훈련되어야 할 개체를 나타냅니다. 에이전트는 환경과 상호 작용하며 관찰(observation)을 수집하고, 행동(action)을 수행합니다
  3. 결정 주기: 학습된 에이전트는 환경에서 일정 주기마다 행동을 선택해야 합니다. 이 결정 주기는 DecisionRequester 등의 메커니즘을 사용하여 관리됩니다.
  4. 모델 학습: ML-Agents는 강화 학습 알고리즘을 사용하여 에이전트를 훈련시킵니다. 이번 프로젝트에선 Proximal Policy Optimization (PPO) 알고리즘이 사용됩니다. 에이전트는 환경과의 상호 작용을 통해 행동을 학습하고, 보상 신호를 기반으로 정책을 개선합니다.
  5. 보상과 학습: 에이전트는 환경에서 받은 보상을 기반으로 행동의 품질을 평가하고, 이를 통해 정책을 개선합니다. 목표는 높은 보상을 얻는 정책을 학습하는 것입니다.

지금까지 준비된 과정은 1,  2 , 5번 과정입니다.

이번 포스팅에선 나머지 과정 (3,4)을 준비하여 실제로 모델을 생성하는 방법에 대해 작성하겠습니다.

모델을 추출하기 위해선 Agent 오브젝트의 Component에 결정 주기(3번 과정)를 관리하는 스크립트를 추가해야 합니다.


3)  Decision Requester 스크립트와 Behavior Parameter 스크립트 적용

 

3- 1) Decision Requester

Decision Requester를 추가한 모습

// In DecisionRequester.cs

 /// <summary>
 /// The DecisionRequester component automatically request decisions for an
 /// <see cref="Agent"/> instance at regular intervals.
 /// </summary>
 public class DecisionRequester : MonoBehaviour {
 .
 .
 .
 /// <summary>
/// The frequency with which the agent requests a decision. A DecisionPeriod of 5 means
/// that the Agent will request a decision every 5 Academy steps. /// </summary>

 public int DecisionPeriod = 5;
 
 }

Decision Requster 스크립트는 Ml-Agent 프레임 워크에 포함되어 있는 스크립트로, Agent의 행동을 언제 결정할지를 제어하는 결정 주기(Decision Period)를 가지고 있습니다. 결정 주기에 따라 DecisionRequester는 연결된 에이전트의 결정을 내리도록 요청합니다. Agent는 정의된 관찰을 기반으로 신경망 모델이나 Policy를 사용하여 행동을 선택하고 환경에 반영합니다.

DecisionPeriod 주기만큼 Agent는  CollectObservations 함수를 통해 관찰 정보를 수집하고, OnActionReceived 함수를 통해 Action을 취합니다. 선택된 Action은 환경에 적용되어 다음 Action으로 진행됩니다. 이로써 에이전트는 환경과의 상호 작용을 통해 학습하고 Policy을 개선할 수 있습니다.


3 - 2) Behavior Parameters

Behavior Parameter는 인공 신경망의 Brain과 직접적으로 상호작용하는 스크립트입니다.

이는 앞으로 뒤에서 설명할 pytorch가 사용할 PPO 알고리즘의 설정이 명시된 yaml 파일과 깊게 연관되어 있습니다.

이 중에서 특히 신경써야 하는 변수는 3개로 Behavior Name , Space Size , Continuous Actions입니다.

 

BehaviorName 변수는 yaml 파일을 불러옵니다. 

Vector Observation - Space Size 변수는 Brain으로 전달할 Feature Vector(관찰 정보의 개수)의 차원을 설정합니다.

Actions - Continous Action 변수는 Action의 개수를 설정합니다. 이번 프로젝트에선 3차원 공간(x, y, z)에서 이동이 필요하기 때문에 3개로 설정했습니다.


 

4) 모델 학습

 

4-1) Git으로 Colne한 ml-agents 폴더에 접근합니다. 그리고 ppo 폴더에 접근하여 yaml 파일을 생성합니다.

YourOwnDirectory\ml-agents\config\ppo

기본으로 제공되는 3DBall.yaml 파일

yaml 파일에는 ppo 알고리즘 즉 강화학습을 설정할 수 있는 파라미터가 작성되어 있습니다.

인공지능에 깊이 관여하지 않는다면, max_steps과 behavior name(3DBall)만 변형해서 사용해도 괜찮습니다.

 

ButterflyMovementChase.yaml 파일

 

yaml의 특정 파라미터는 강화학습을 이해하는데 반드시 필요하므로

스스로 공부한 것 , 실제로 사용해보며 알게 된 것을 작성하겠습니다.

batch_size :  batch의 크기를 조절합니다.batch란 학습 데이터 전체를 묶음으로 나눈 것으로 PPO 알고리즘에서 정책을 안정적으로 개선하는데 사용 됩니다. 이는 Ml-Agent에서 보상의 표준 편차를 계산하고 Policy를 수정하는데 활용 됩니다.


buffer size : 경험 데이터를 저장하는 버퍼의 크기를 나타냅니다. Buffer size는 학습 중에 얼마나 많은 데이터를 사용할지 결정하며, 이는 PPO 알고리즘의 안정성과 학습 효율성에 영향을 미칩니다. 단  큰 버퍼 크기가 항상 좋은 것은 아니며, 적절한 크기를 선택해야 합니다. 큰 버퍼는 더 많은 메모리를 요구하고, 환경이 동적으로 변할 때 빠르게 적응하는 데는 한계가 있을 수 있습니다.


learning rate : 모델 파라미터를 얼마나 크게 업데이트할지를 결정하는 파라미터입니다. 각 업데이트 단계에서 경사 하강법(Gradient Descent)을 사용하여 최적화되는 신경망 그래프의 기울기를 제어합니다. Learning rate가 크면 훈련 중에 튀는(그래프가 발산하는) 현상이 발생할 수 있고, 작으면 학습이 느려질 수 있습니다.


num_epoch : epoch는전체 데이터셋을 몇 번 반복해서 사용할 것인지를 결정하는 파라미터입니다. PPO에서 이전 Episode의 관찰 정보를 재사용 하는데 사용되며, 훈련의 효율성을 증가 시킵니다. Epoch를 통해 데이터가 재사용 될 때 손실 함수 (MSE , MAE)를 적용시켜 정확한 오차를 계산할 수 있습니다.

 

파라미터에 대한 자세한 설명은 아래 링크에 나타나있습니다.

https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Training-Configuration-File.md


4-2 ) Git Bash로 ppo 폴더에 접근


4-3 ) 강화학습 시작 

mlagents-learn ButterflyMovementChase.yaml --run-id=ButterFlyMovementChase_V8_1

Git Bash로 명령하는 모습
명령이 제대로 수행되면, Unity의 Play 버튼을 눌러 진행하라고 표시된다.
Unity의 Agent 오브젝트-Behavior Parameter - Behavior Name을 수정하고 Unity를 Play 한다

 

훈련이 시작될 때 yaml 파일의 정보가 나타나며, 훈련이 시작된다.

 


마지막으로 교육이 종료되면 ppo 폴더에 result 폴더가 생성됩니다.

result 폴더에서 교육의 로그와 함께 신경망 모델을 확인할 수 있습니다.

 

이 때 GitBash에 해당 명령을 입력하여 Tensorboard에서 신경망 모델을 자세하게 확인할 수 있습니다.