💯Problem Solving
슈팅게임 현재 발생한 Issues
date
Aug 5, 2023
slug
ml-agent-shooting-issus
author
status
Public
tags
Unity
ML-Agent
Game
summary
Ml-agent 슈팅게임 이슈 입니다
type
Post
thumbnail
category
💯Problem Solving
updatedAt
May 9, 2024 07:56 AM
슈팅게임 ML-Agent 개발중에 현재까지 발생한 간단한 Issues 입니다.
Agent의 Reset Episode 문제
- 이 슈팅게임을 강화학습을 위해 만들어진 게임이 아니여서 Scene을 기준으로 게임이 동작하거나 끝나거나 합니다. 제가 사용하려는 ML-Agent는 기본적으로 Multi-Agent를 지원하며, 공개되고 있는 Example들 모두 웬만하면 환경자체를 Prefabs로 만들어 Multi-Agent를 적극적으로 차용하고 있습니다.
제 환경도 마찬가지로 Multi-Agent로 접근하기 위해, 게임의 모든 Initialize하는 부분을 OnEpisodeBegin()으로 옮겨서 SceneManger.LoadScene없이 EndEpisode()만으로 에피소드가 재시작되도록 구현하려고 합니다.
여기서 문제가, Example이나 구글링을 통해 OnEpisodeBegin()이나 환경 재시작하는 부분의 코드를 보면, 대부분 Transform, AngleSpeed 등 간단한 GameObject에 대해서만 초기화를 시키는데, 이 슈팅게임의 특성상 적 기체의 랜덤 위치 출현, 주기적으로 날아오는 적 투사체, 보스 설정 같은 것들이 들어가서 어디 부분을 어떻게 초기화 해주면 좋을지 모르곘습니다. 특히 Corutine이 사용되고 있어서 조금 더 헷갈리는 감이 있는 것 같습니다.
기본적으로 게임에 적용되는 모든 Start, Initialize, Awake 부분의 코드중에 게임환경에 직접적으로 영향을 주는 부분을 모두 확인해서, 이를 모두 제거하고 Agent코드에 OnEpisodeBegin()에 적어넣어보려고 합니다. 이렇게 접근하는게 좋을까요?
학습 속도, 물리 판정 문제
- 기존 예제들이 Rigidbody를 사용해, AddForce로 힘을주어 이동하는 방식과는 다르게, 슈팅게임에서는 Transform을 특정 시간 Update() 함수에 Deltatime을 곱해주는 방식으로 진행하고 있습니다. 이때 기본적으로 ML-Agent는 학습 명령어 파라미터에 Time-scale 설정을 적어주지 않으면 20배로 적용시켜 게임을 진행하게 되는데, 이때 Agent의 적 충돌 판정이 적절하게 적용되지 않거나, 투사체가 기존보다 20배 더 많이 이동해 끊기게 보이곤 합니다. 이런 경우에
--time-scale=1 --capture-frame-rate=0 --target-frame-rate=-1
를 통해서 강제로 속도를 게임배속과 동일하게 만든 후 진행했을 때 상기 문제는 발생하지 않았습니다. 하지만 게임 속도가 느려지니 Episode에 오랜 시간이 걸렸고, Reset Episode 문제와 겹처 Agent를 1개밖에 사용할 수 없어 학습 효율성에도 문제가 생겼습니다. 이런 물리적 상호작용이 Time-Scale에 종속되는 경우 속도를 기존 게임의 배속과 동일시하고, Reset Episode문제를 해결해 Multi-Agent 환경을 구축하여 속도를 향상시키는 방법밖에 없을까요?
역시나 발생한 Observation, Reward문제
Observation, Reward 모두 제가 Heuristic하게 주었습니다.
Observation
- 플레이어 캐릭터의 위치
- 적들의 위치, HP
- BufferSensor 사용
- 아이템의 위치와 종류
- BufferSensor를 사용
- observation space - 5 (x,y, [종류]:PBH)) [x,y, OneHot[3] ]
- 보스의 위치와 체력
- 보스 여부에 따라 [x,y,HP, 1], [0,0,0,0] 으로 넣어주기
- 현재 점수
- 현재 점수 (정규화) 몬스터 점수 10000 + 보스 점수 10000 + Clipping(0,1) [완료]
Reward
- 적 처치 시 보상 부여
- + 1f
- 보스 처치 시 대량의 보상 부여
- + 100f
- 아이템 획득 시 소량의 보상 부여
- +5f
훈련이 지남에따라 Reward는 20~50 사이로 증가하기는 하지만, 제가 직접 플레이 했을때 기본적으로 100은 나와야하며, Agent가 적을 처치하거나, 아이템을 획득하도록 움직여야하는데 한 방향으로 움직여서 적을 처치하거나 아이템을 얻지 못합니다. 몇번 반복해봐도 같은 결과가 나오고 보스를 처치해야하는 경우에도 전혀 처치할 수 없는 경로로 이동하거나 행동하거나 합니다. 아무래도 Observation이나 Reward를 재설정해야 되는 것 처럼 보이는데, 여기서 더 간단하게 줄이고 Reward도 좋을까요?
+ 아니면 보스 때와 일반 때의 Agent를 다르게 두어야 할까요?
이렇게 ML-Agent로 훈련 한 번 해보고, Python에 다른 라이브러리 (Pytorch, ray) 같은 걸로 훈련을 해보려고 하는데 학습 환경만드는 것 만으로도 많이 어렵네요 ㅠㅠ 저번에 세미나 참가해서 들었을 때는 간단하게 보였는데 실제로 해보니까 괴리감을 많이 느끼고 있습니다. 이번 슈팅게임 훈련에 성공해서 더 많은 게임에 적용 해보고 싶어요!