Unity ML Agent를 위한 환경 설정(Python, PyTorch 설치 등등)을 하고 타겟을 따라 이동하는 Mummy Example을 구현하여 감을 잡는다.

Unity ML Agent를 위한 환경 설정을 하고

타겟을 따라 이동하는 Mummy Example을 구현하여 감을 잡는다.

Unity ML-Agent

머신러닝 및 ML-Agent 소개

학습 모델

  • 비지도 학습 (Unsupervised Learning)

    이 학습 기법에서는 자체적으로 데이터셋을 검사하고 분류작업을 수행한다.

    분류는 특정 측정 기준(metrics)을 기반으로 할 수 있으며 학습 자체에서 발견 할 수 있다.

  • 지도 학습 (Supervised Learing)

    데이터 과학 분야의 일반적인 훈련 기법. 입력 및 출력 데이터에 레이블(lable)을 지정해야 하는 학습 기법이다.

  • 강화 학습 (Reinforcement Learing)

    환경에 대한 초기 상태나 모델 없이 학습하는 기법을 제공한다. 에이전트는 환경속에서 모델링되고 그들의 행동(Action)을 기준으로 보상 (Rewards)를 받는다.

  • 모방 학습 (Imitation Learning)

    바람직한 행동을 보여주면 그것을 에이전트가 모방하는 식으로 훈련하는 기술이다.

  • 커리큘럼 학습 (Curriculum Learning)

    문제를 복잡도에 따라 쪼개서 처리하는 진일보한 학습 형태로, 에이전트 또는 머신러닝이 차원 높은 활동으로 이동하기 전에 각 수준의 복잡성을 극복할 수 있게 한다. ( ex. 웨이터 에이전트 : 쟁반 균형잡기 > 쟁반에 음식을 담고 걷기 > 음식을 식탁에 전달하기)

  • 딥러닝 (Deep Learning)

    다양한 형태의 내부 훈련 메커니즘을 사용해 다층 신경망을 훈련한다.

게임에서 사용되는 머신러닝

대다수 개발자가 게임에 머신러닝을 사용해보려고 시도하지만 게임 개발 시에는 확실히 다음과 같은 영역에서 도움이 된다.

  • 맵 레벨 생성
  • 텍스처/셰이더 생성
  • 모델 생성
  • 오디오 생성
  • 인공 플레이어
  • NPC 또는 게임 인공지능

Mummy Example

참고자료

Unity ML-Agent 블로그를 참고하였다.

상세한 설명은 이 글보다는 위의 참고자료가 더욱 정확하다.

본 내용은 나의 정리 목적으로 요약해서 작성하였다.

환경 설정

Mummy Example을 사용하기 전 다음과 같은 환경 설정이 필요하다

  • Python 3.7.x
  • Unity ML Agent Asset
  • Tensorflow
  • Pytorch

유니티 프로젝트를 만들고,

image

ML Agent를 임포트 한다.

image

그 후, 캐릭터로 사용할 Mummy 리소스를 다운로드 받는다. Asset store의 Free asset을 사용한다.

image

그 다음, 위 사진처럼 Agent 환경을 만든다. 다음과 같은 행동을 해 주었다.

  • 걸어 다닐 수 있는 Plane 설치
  • 닿으면 죽는 DeadZone Collider 설치
  • Goal인 Target 오브젝트 설치
  • 돌아다니는 Mummy 오브젝트 설치

또한, 학습을 위해 Mummy Agent 스크립트를 만들어주었다.

Mummy Agent는 Unity.MLAgent의 Agent를 상속받았으며, 다음과 같은 메소드들이 있다.

기억해두는 편이 좋을 것 같다.

using UnityEngine;
using Unity.MLAgents;

public class MummyAgent : Agent
{
    //초기화 작업을 위해 한번 호출되는 메소드
    public override void Initialize()
    {

    }

    //에피소드(학습단위)가 시작할때마다 호출
    public override void OnEpisodeBegin()
    {

    }

    //환경 정보를 관측 및 수집해 정책 결정을 위해 브레인에 전달하는 메소드
    public override void CollectObservations(Unity.MLAgents.Sensors.VectorSensor sensor)
    {

    }

    //브레인(정책)으로 부터 전달 받은 행동을 실행하는 메소드
    public override void OnActionReceived(float[] vectorAction)
    {

    }

    //개발자(사용자)가 직접 명령을 내릴때 호출하는 메소드(주로 테스트용도 또는 모방학습에 사용)
    public override void Heuristic(float[] actionsOut)
    {

    }
}

완성된 코드는 여기에 있다.

ML-Agent가 관찰 할 수 있는 항목들을 잘 선택하는 것이 중요하다.

이 예제에서는 다음과 같은 8개 항목을 넘겨주었다.

  • Mummy의 Transform (x,y,z)
  • Target의 Transform (x,y,z)
  • Mummy의 속도(x,z)

그 후 이런저런 Machine Learning에 필요한 여러 환경 설정을 해주고 (Reward설정, 종료 설정 등등)

Agent의 Max Step을 설정해준다.

Agent의 Max Step 속성은 에이전트가 한 에피소드 내에서 무작위로 액션을 시도해보는 최대 횟수를 의미한다.

이 횟수 동안 액션을 취했지만 아무런 보상이 없다면 더 이상 학습의 의미가 없기에 에피소드를 종료하고 다시 시작한다.

(본 예제에서는 1000으로 둔다.)

그 후, ML 환경에 대한 설정파일인 mummy.yaml을 만들어준다.

behaviors:
  Mummy:
    trainer_type: ppo
    hyperparameters:
      batch_size: 64
      buffer_size: 2048
      learning_rate: 0.0003
      beta: 0.001
      epsilon: 0.2
      lambd: 0.99
      num_epoch: 3
      learning_rate_schedule: linear
    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 200000
    time_horizon: 1000
    summary_freq: 10000
    threaded: true

이것으로 환경설정은 끝났다.

학습

윈도우 사용자는 명령 프롬프트(또는 GitBash, PowerShell)를 , 맥 사용자는 터미널을 오픈한 후 ml-agents 폴더로 이동한 후 다음 명령을 입력한다.

mlagents-learn {학습환경설정파일.yaml} –run-id={Behaviour 명}

mlagents-learn mummy.yaml --run-id=Mummy

포트가 열리면 Unity Play버튼을 누른다.

학습이 진행되며, 조금 기다리면 아래와 같이 학습이 완료되었음을 알 수 있다.

image

결과

Mummy_01

Mummy_02

귀여운 미라 친구가 잘 움직인다.

가끔씩 타겟 앞에서 이상한 무빙을 치는(?) 걸 볼 수 있는데, 이는 Try 횟수를 늘리면 해결될 것 같다.

다음은 조금 더 어려운 Example을 테스트해보도록 한다.