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 |