게임프로젝트

ML-Agents 사용 및 기능 설명

ckhyeok 2020. 5. 12. 01:52

1. 아카데미 추가하기.

Academy 기능을 할 새로운 스크립트를 하나 만들고 Academy를 상속 받는다.

 

Max Stpes = 현재 에피소드를 종료하고 다음 에피소드로 강제로 리셋하는 간격이자 최대 실행 횟수

Training Configuration = 엔진 수준에서의 렌더링 품질과 훈련 속도 설정로 순서대로 가로세로 해상도, 그래픽 퀄리티, 시간배속, 프레임제한(-1이면 제약이 없다는 뜻)이 존재한다.

Inference Configuration = 이미 강화학습이 진행 된 결과를  실시간으로 실행할 때 사용하는 옵션.

2. Agent 스크립트 작성하기.

Agent 기능을 할 새로운 스크립트를 하나 만들고 Agent를 상속 받는다

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MLAgents;

public class BallAgent : Agent
{
    private Rigidbody ballRigid;            // 볼 리지드바디
    public Transform pivotTransform;    // 훈련 유닛의 기준 위치
    public Transform target;                // 목표의 위치

    public float moveForce = 10f;        // 이동시키는 힘
    private bool targetEaten = false;    // 타겟을 잡았는지 여부
    private bool dead = false;             // 플로어에서 벗어났는지 여부

    private void Awake()
    {
        ballRigid = GetComponent<Rigidbody>();
    }
    
    // 에이전트가 타겟을 잡았을 경우 타겟을 리셋시키는 함수.
    void ResetTarget()
    {
        targetEaten = false;
        // x와 z가 -5 ~ 5 사이에 임의의 좌표를 생성한다.
        Vector3 randomPos = new Vector3(Random.Range(-5f, 5f), 0.5f, Random.Range(-5f, 5f));
        // 타겟의 위치는 기준 위치에서 임의의 좌표를 더한 랜덤한 곳에 위치한다.
        target.position = randomPos + pivotTransform.position;
    }

    // 에이전트가 죽었다가 다시 시작할 때 리셋시키는 함수
    public override void AgentReset()
    {
        Vector3 randomPos = new Vector3(Random.Range(-5f, 5f), 0.5f, Random.Range(-5f, 5f));
        transform.position = randomPos + pivotTransform.position;

        dead = false;                                     // 사망 상태 초기화
        ballRigid.velocity = Vector3.zero;          // 플레이어 속도 초기화

        ResetTarget();                                    // 타겟 초기화
    }

    // 에이전트가 수집하는 데이터 x, z 좌표에 대한 위치 및 속도
    public override void CollectObservations()
    {
        // 타겟과의 거리 계산
        Vector3 distanceToTarget = target.position - transform.position;

        // 정규화 된 값( -5~+5 -> -1~+1 압축하면 정규화 = 퍼포먼스가 올라감).
        AddVectorObs(Mathf.Clamp(distanceToTarget.x / 5f, -1f, 1f));
        AddVectorObs(Mathf.Clamp(distanceToTarget.z / 5f, -1f, 1f));

        // 훈련 유닛 기준 에이전트 위치
        Vector3 realtivePos = transform.position - pivotTransform.position;

        // 정규화된 값
        AddVectorObs(Mathf.Clamp(realtivePos.x / 5f, -1f, 1f));
        AddVectorObs(Mathf.Clamp(realtivePos.z / 5f, -1f, 1f));

        // 에이전트의 속도를 정규화한 값
        AddVectorObs(Mathf.Clamp(ballRigid.velocity.x / 10f, -1f, 1f));
        AddVectorObs(Mathf.Clamp(ballRigid.velocity.z / 10f, -1f, 1f));
    }

    // 브레인이 에이전트에게 지시를 내리는 함수
    public override void AgentAction(float[] vectorAction, string textAction)
    {
        AddReward(-0.001f);  // 아무런 액션을 하지 않는 것을 방지 하기 위한 벌점

        float horizontalInput = vectorAction[0];
        float verticalInput = vectorAction[1];

        ballRigid.AddForce(horizontalInput * moveForce, 0f, verticalInput * moveForce);

        if (targetEaten)
        {
            AddReward(1.0f);
            ResetTarget();
        }
        else if (dead)
        {
            AddReward(-1.0f);
            Done();
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("dead"))
            dead = true;
        else if (other.CompareTag("goal"))
            targetEaten = true;
    }
}

3. 테스트용 브레인 생성하기

Vector Observation의 Space Size = Agent를 구현 할 때 당시 사용 된 AddVectorObs의 갯수만큼 적으면 된다.

Stacked Vectors = 신명망에게 우리가 관측한 벡터공간을 몇개를 겹쳐서 보낼지를 결정함.

숫자가 높을 수록 다양한 경우의 수를 통한  관측이 만들어지지만 성능이 안좋아짐.(목표 도달에 시간이 더 걸림)

Visual Observations = 카메라 화상을 통해 관측 하는 것.

Vector Action = Brain이 Agent에게 어떻게 입력을 줄 것인지 결정함.

Space Size = 입력값의 갯수(x와 y를 사용하면 2개, x,y,z를 사용하면 3개)

 

완성 된 Brain은 위 Academy의 Add Brain to Broadcast Hub 버튼을 눌러서 추가해준다.

또한 위 Agent에도 Brain을 넣어준다. 이로써 Agent는 Brain의 통제를 받게 된다.

여기까지 테스트를 한 뒤 잘 작동하는 것을 보았다면 위와 같은 방법으로 Learning Brain을 생성해준다.

단 LearningBrain의 같은 경우에 Control에 체크를 해 둬야 외부에서 접근이 가능하다.

또한 Agent의 Brain도 LearningBrain으로 바꿔 준다.

4. 강화학습 실행 시키기

우리가 처음에 Clone 했던 ML-Agents 폴더로 들어가서

config->trainer_config.yaml 파일을 복사해서 우리의 프로젝트에 넣어준다.

그 뒤 Anaconda prompt를 실행한 후 작업한 프로젝트의 경로로 이동 한 후에

mlagents-learn trainer_config.yaml --run-id=firstRun --train --slow 를 입력한다.

그리고 유니티로 돌아가 Play 버튼을 눌러준다.

Ctrl+C를 누르면 강화학습과 유니티의 플레이가 모두 종료 된다.

또한 지금까지 진행 된 정보가 Model 파일로 저장돼 있다.

5. 하이퍼 파라미터 이용하기

프로젝트 폴더를 열어 trainer_config.yaml 파일에 들어간 후에 우리가 아까 만든 Brain과 같은 이름으로 설정한다.

여기서 우리가 설정하지 않는 것들은 default 값으로 자동으로 설정 된다.

 

normalize: true로 해준다.(입력되는 벡터 관측값들이 정규화가 되어있는지 물어 보는 것.) 우리가 정규화 시킨 상태에서 true로 설정하면 학습성능이 향상된다.

gamma: 0.90로 한다.(미래의 보상을 현재 평가할 때 적용하는 할인률). 감마값이 적을수록 먼 미래의 보상을 현재에서는 낮게 평가하기 때문에 즉각적인 보상이 상대적으로 높게 평가 됨.

lamdda: 0.99로 한다.(미래의 보상을 평가할 때 이전까지의 보상을 기준으로 하는 정도). 람다값이 적을수록 지금까지의 보상을 기준으로 미래의 보상을 평가하게 됨. 지금까지의 경향을 유지하는 방향으로 굳어짐.

buffer_size: 4096로 한다.(모델을 갱신하기 전에 수집해야 될 스텝 수)

batch_size: 256로 한다.(gradient, decent의 각 반복에 대한 경험 수) 단, batch_size는 buffer_size의 약수여야한다.

max_steps: 2.0e4로 한다.(2만번, 트레이닝을 완전히 종료하는 시점)

6. 강화 학습 완료 및 모델 사용하기

앞서 만든 Training Room을 여러개 복사 붙여넣기 해준 뒤

4번에서 진행했던 거와 같이 경로를 prompt를 실행시킨 후 경로까지 지정한다.

그 후 mlagents-learn trainer_config.yaml --run-id="(우리가 지정 할 이름)" --train 을 입력해준다.

그러면 아까 하이퍼 파라미터에서 우리가 입력했던 값들이 잘 적용 돼있는지를 확인할 수 있다.

이렇게 훈련을 종료하고 나면 아까와 마찬가지로 .nn 파일이 생성된다.

이 nn 파일을 우리 프로젝트에 드로그 앤 드롭을 해준다.

그 후 Ball Brain에 Model 칸에 넣어준다.

그다음 마지막으로 Academy에서 이미 완성 된 모델을 사용할 것이기 떄문에 Control 체크박스를 해제해준다.

그 후 Play 혹은 Build를 하면 우리가 학습시킨 모델을 토대로 동작을 한다.

7. 훈련 이어하기

다시 훈련을 이어하기 위해 위 사진에 Control 체크박스를 다시 체크해준다.

그 다음 trainer_config.yaml 파일을 다시 연 뒤 max_steps의 값을 늘려준다.

주의! 단 max_steps을 제외한 다른 값을 변경하면 이어하기가 불가능해진다.

그 후 다시 prompt를 실행시킨 후 mlagents-learn trainer_config.yaml --run-id="(전과 동일하게)" --train --load을 입력해준다.

학습 결과
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 16255. Time Elapsed:
5.966 s Mean Reward: -1.164. Std of Reward: 0.235. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 17255. Time Elapsed:
9.743 s Mean Reward: -1.070. Std of Reward: 0.379. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 18255. Time Elapsed:
13.761 s Mean Reward: -1.044. Std of Reward: 0.499. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 19255. Time Elapsed:
17.224 s Mean Reward: -1.121. Std of Reward: 0.252. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 20255. Time Elapsed:
20.879 s Mean Reward: -1.073. Std of Reward: 0.275. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 21255. Time Elapsed:
24.335 s Mean Reward: -1.063. Std of Reward: 0.339. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 22255. Time Elapsed:
28.019 s Mean Reward: -0.995. Std of Reward: 0.417. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 23255. Time Elapsed:
31.934 s Mean Reward: -0.958. Std of Reward: 0.643. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 24255. Time Elapsed:
35.741 s Mean Reward: -1.074. Std of Reward: 0.400. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 25255. Time Elapsed:
39.522 s Mean Reward: -1.044. Std of Reward: 0.449. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 26255. Time Elapsed:
43.121 s Mean Reward: -0.986. Std of Reward: 0.410. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 27255. Time Elapsed:
46.905 s Mean Reward: -0.911. Std of Reward: 0.655. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 28255. Time Elapsed:
50.467 s Mean Reward: -1.186. Std of Reward: 0.061. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 29255. Time Elapsed:
54.283 s Mean Reward: -1.071. Std of Reward: 0.357. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 30255. Time Elapsed:
58.244 s Mean Reward: -1.118. Std of Reward: 0.401. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 31255. Time Elapsed:
62.466 s Mean Reward: -0.988. Std of Reward: 0.568. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 32255. Time Elapsed:
66.057 s Mean Reward: -0.901. Std of Reward: 0.540. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 33255. Time Elapsed:
69.674 s Mean Reward: -1.023. Std of Reward: 0.370. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 34255. Time Elapsed:
73.495 s Mean Reward: -1.101. Std of Reward: 0.425. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 35255. Time Elapsed:
77.037 s Mean Reward: -1.148. Std of Reward: 0.296. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 36255. Time Elapsed:
80.953 s Mean Reward: -1.265. Std of Reward: 0.202. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 37255. Time Elapsed:
84.448 s Mean Reward: -1.066. Std of Reward: 0.373. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 38255. Time Elapsed:
88.132 s Mean Reward: -0.931. Std of Reward: 0.485. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 39255. Time Elapsed:
91.716 s Mean Reward: -1.057. Std of Reward: 0.446. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 40255. Time Elapsed:
95.354 s Mean Reward: -0.769. Std of Reward: 0.570. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 41255. Time Elapsed:
98.798 s Mean Reward: -1.035. Std of Reward: 0.389. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 42255. Time Elapsed:
102.452 s Mean Reward: -0.873. Std of Reward: 0.467. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 43255. Time Elapsed:
105.832 s Mean Reward: -1.089. Std of Reward: 0.408. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 44255. Time Elapsed:
109.418 s Mean Reward: -1.157. Std of Reward: 0.418. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 45255. Time Elapsed:
113.077 s Mean Reward: -1.128. Std of Reward: 0.394. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 46255. Time Elapsed:
116.471 s Mean Reward: -0.921. Std of Reward: 0.655. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 47255. Time Elapsed:
120.112 s Mean Reward: -0.957. Std of Reward: 0.499. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 48255. Time Elapsed:
123.815 s Mean Reward: -1.088. Std of Reward: 0.374. Training.
INFO:mlagents.trainers: Brain Train 1-0: Ball Brain: Step: 49255. Time Elapsed:
127.528 s Mean Reward: -0.902. Std of Reward: 0.597. Training.

Reward의 값이 미세하지만 조금씩 나아지고 있는 결과를 보여준다.

'게임프로젝트' 카테고리의 다른 글

1차 정리된 데모  (0) 2020.06.30
ML-Agents 에이전트, 브레인, 아카데미 란?  (0) 2020.05.11
ML-Agents 개발 환경 세팅  (0) 2020.05.09