MeetAgain 프로젝트에서 제작할 AI 모델은 2종류입니다.
Chase AI : Target을 향해 불확실하게 향해 가는 AI
Stay AI : Target 주위를 벗어나지 않는 AI
이번 게시글에선 Chase AI 모델의 생성 과정을 작성하겠습니다.
Chase AI
Chase AI는 Ml-Agent에서 가장 기본적인 추적 Agent입니다. 강화학습의 원리와, Ml-Agent의 사용법 그리고 Reward의 설정을 익히기 위해 가장 기본적인 모델부터 구현 시작했습니다. Chase Agent 스크립트는 CollectObservations() 함수를 통해 관찰 정보를 조절하거나 OnActionReceived() 함수에서 SetReward() 함수를 통해 보상을 조절하며 개선했습니다. 아래는 Chase AI 모델의 버전 관리를 통해 모델을 개선하는 과정입니다.
2023/12/20 18:22 ButterFlyMovement_V1
//ButterflyAgentChase Script when using BFM_V4 Model
public override void OnEpisodeBegin()
{
//Agent가 너무 멀리 떨어지면 angularVelocity/velocity=0으로, 위치를 초기 좌표로 리셋
if (isEndByBreak)
{
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
isEndByBreak = !isEndByBreak;
}
// Target을 Random.value함수를 활용해서 새로운 무작위 위치에 이동
this.transform.localPosition = new Vector3(Target.localPosition.x + Random.value * 30 - 15, Random.value * 3 + 0.3f, Target.localPosition.z + Random.value * 30 - 15);
Target.localPosition = new Vector3(Random.value * 5, Random.value * 1 + 2.5f, Random.value * 8 - 3);
this.spawnPoint = transform.localPosition;
}
public override void CollectObservations(VectorSensor sensor) // ml 에이전트의 환경 관찰 및 정보를 주는 함수
{
sensor.AddObservation(transform.localPosition);
sensor.AddObservation(spawnPoint);
// Agent의 velocity 정보 수집
sensor.AddObservation(rBody.velocity.x);
sensor.AddObservation(rBody.velocity.y);
sensor.AddObservation(rBody.velocity.z);
}
public override void OnActionReceived(ActionBuffers actionBuffers)
{
//controlSignal 벡터의 X,Z축으로 -1 ~ 1의 값을 호출 및 대입한다. 단 Y의 힘은 크게 줄인다.
Vector3 controlSignal = Vector3.zero;
controlSignal.x = actionBuffers.ContinuousActions[0];
controlSignal.y = actionBuffers.ContinuousActions[1] * 0.1f;
controlSignal.z = actionBuffers.ContinuousActions[2];
rBody.AddForce(controlSignal * forceMultiplier);
// Agent와 Target사이의 거리를 측정
float distanceToTarget = Vector3.Distance(this.transform.position, Target.position);
if (distanceToTarget <= 1.42f)
{
SetReward(1.0f);
EndEpisode();
}
// 플랫폼 밖으로 나가면 Episode 종료
if (distanceToTarget >= 100.0f || this.transform.position.y <= - 0.1f || this.transform.position.y >= 15.0f)
{
isEndByBreak = !isEndByBreak;
SetReward(-0.01f);
EndEpisode();
}
}
Agent 스크립트 업데이트
StartEpisode : Target localPosition 랜덤 배치 , Agent 초기화 및 localPosition 랜덤 배치
Observation 9개 : Agent의 localPosition , Agent의 SpawnPoint , rigidBody
Reward : Target에 도달하면 SetReward(1) , 멀리 벗어나면 SetReward(-0.01f)
EndEpisode : Target에 도달하거나 멀리 벗어나면 호출
Result
목표 Reward = 0.99 , Training의 평균 Reward = 0.12
리뷰 : SetReward를 사용하여 평균 Reward가 0.99에 수렴하면 교육 성공으로 판단하려 했습니다. Agent가 보상을 얻는 로컬좌표를 관찰 정보로 넘겨 그것을 바탕으로 Target의 위치를 특정하려 했으나 실패했습니다. Target은 랜덤하게 이동하지만 Target의 좌표를 관찰 정보로 받지 못하기 때문에 Agent가 Reward를 얻는 방법이 모호했습니다.
2023/12/21 21:12 ButterflyMovementChase_V4
public override void CollectObservations(VectorSensor sensor)
{
// Target/Agent의 위치 정보 수집
sensor.AddObservation(Vector3.Distance(this.transform.position, Target.position));
sensor.AddObservation(transform.localPosition);
// Agent의 velocity 정보 수집
sensor.AddObservation(rBody.velocity.x);
sensor.AddObservation(rBody.velocity.y);
sensor.AddObservation(rBody.velocity.z);
}
public override void OnActionReceived(ActionBuffers actionBuffers)
{
.
.
if (distanceToTarget >= 100.0f || this.transform.position.y <= - 0.1f || this.transform.position.y >= 15.0f)
{
isEndByBreak = !isEndByBreak;
SetReward(-1.0f);
EndEpisode();
}
.
.
}
Agent 스크립트 업데이트
Observation 추가 :타겟과 에이전트 사이의 거리(Distance).
Observation 삭제 : Agent의 SpawnPoint
* Observation 7개 : Agent의 localPosition , rigidBody , Distance
* Reward 수정 : SetReward(-0.05f) -> SetReward (-1.0f)
Result
목표 Reward = 0.99 , Trainging의 평균 Reward : 0.99
리뷰 : Agent와 Target 사이의 거리(Distance)를 관찰 정보로 추가시켜 거리가 가까울 때 Reward를 얻는다는 규칙을 추가시켰습니다. SpawnPoint 관찰 정보는 특성 벡터에서 가중치가 크지 않은 것으로 판단하여 최적화를 위해 삭제했습니다. 거리가 너무 멀어질 때의 Reward를 -1.0으로 강력하게 설정했습니다. 이는 모델의 행동 범위를 분리하는데 도움을 주었습니다. 그러나 Mean Reward가 1에 수렴할 정도로 Target에 너무 잘 접근하는 Chase AI는 제가 바라는 불확실하게 추적하는 모델이 아니기 때문에 Reward의 불확실성을 높여야 했습니다.
2023/12/21 23:07 ButterflyMovementChase_V8
public override void OnActionReceived(ActionBuffers actionBuffers)
{
.
.
if (distanceToTarget >= 100.0f || this.transform.position.y <= - 0.1f || this.transform.position.y >= 15.0f)
{
isEndByBreak = !isEndByBreak;
SetReward(-0.05f);
EndEpisode();
}
.
.
}
Agent 스크립트 업데이트
* Reward 수정 : SetReward (-1.0f) -> SetReward(-0.05f)
Result
목표 Reward = 0.99 Training의 평균 Reward : 0.8
리뷰 : Mean Reward가 1.0에 수렴하기 전에 강제로 교육을 중단시켰습니다. Chase 모델은 Reward를 잃는 영역(Distance가 50이상일 때)을 학습했기 때문에 일정 영역을 벗어나지 않습니다. 그러나 해당 케이스에서 Reward를 많이 잃지 않으므로, 제한된 영역안에서 비교적 자유롭게 행동합니다. 이러한 Chase 모델이 제가 바라는 혼란스럽게 추적하는 AI 모델입니다. 때문에 평균 리워드는 비교적 낮지만 이 모델을 최종적으로 선택했습니다.
최종 결과
모델 선정 : ButterflyMovementChase_V8
이러한 불확실한 Reward 체계는 추후에 다른 모델을 설계할 때 큰 도움을 주었습니다.
보상을 얻는 행동을 확실하게 수행하는 AI를 채용하지 않은 이유는, 제 프로젝트 MeetAgain에 담긴 개인적인 의미 때문입니다. Chase 모델이 Target을 향해 어렵게 접근하길 원했습니다. MeetAgain 프로젝트에 담긴 의미는 프로젝트 마무리 단계에 텍스트로 적겠습니다.
'개발 프로젝트 > Unity - Individual Museum' 카테고리의 다른 글
Unity 강화 학습 ML-Agent (3) - GitBash로 학습 진행 (0) | 2023.12.27 |
---|---|
Unity 강화학습 ML-Agent (2) - Agent 클래스와 딥러닝 구조 (1) | 2023.12.26 |
Unity 강화학습 ML-Agent (1) - Meet Again (0) | 2023.12.19 |