W298.dev
ProjectsPostsAbout Me
youtube
Pages
ProjectsPostsAbout Me
Posts
TAGS
All
RL-Obstacle-Avoid
RL-Competitive
Robot-Escape
Assembly Definition
ML-Agent
RL-Obstacle-Avoid
RL-Competitive
Unity
RL-Obstacle-Avoid
RL-Competitive
Robot-Escape
Assembly Definition
SERIES
RL-Obstacle-Avoid
RL-Competitive
Robot-Escape

Knight Battle

/imgs/post_imgs/mlagent_09/thumnail_big.png
이번에는 근접 전투를 학습시켜 보았다. 방패, 검을 들고 제한된 공간에서 제한 시간까지 전투를 진행하는 시나리오로 구성했다.
Hp, 스테미나가 있으며 공격 Action 을 취하게 되면 스테미나를 일정 소비한다.
먼저 일대일 전투를 학습시킨 뒤 이를 응용해 다대다 전투를 협동 학습을 통해 진행할 것이다.

Action

RayPerceptionSensor 를 이용할 것이고, 움직임은 다음과 같이 구성했다. (Predator & Prey 때와 동일)
DiscreteAction 4개를 사용할 것이며, 구성은 다음과 같다.
  • 앞뒤 움직임 (2)
  • 좌우 회전 (2)
  • 좌우 움직임 (2)
  • 액션 (0 - None, 1 - 방패 사용, 2 - 검으로 공격)
방패 사용과 검으로 공격이 한 액션으로 묶여있기 떄문에 공격과 방어는 동시에 할 수 없다.

Observation

sensor.AddObservation
자신의 Hp
자신의 스태미나
현재 공격이 가능한지 여부

1 vs 1 Train (Back Shield Enabled)

일대일 전투는 두 Agent 의 Team-Number 는 다르게 설정하고, Behaviour Name 은 같게 하여 모델은 공유하게 만들었다.
둘 중 하나가 사망하거나 제한 시간이 지날 경우 에피소드가 종료된다. 이때 남은 Hp 에 따라서 Reward 를 다르게 주었다.
제한 시간은 1000 Step 이다.

Policy

SituationRewardEndEpisode
매 Action 마다 (Living)틱당 -1 / (MaxStep)
장애물에 닿았을 시틱당 -5 / (MaxStep)
공격에 성공했을 시0.2f
공격을 받았을 시-0.2f
제한 시간 종료 시 (승리)남은 Hp (0~1)이후 종료
제한 시간 종료 시 (패배)남은 Hp (0~1) - 1이후 종료
제한 시간 종료 시 (무승부)0이후 종료
본인이 사망-1O
적을 킬1 + 남은 Hp (0~1)O

Hyperparameter

접기/펼치기
1behaviors:
2  KnightAgent:
3    trainer_type: ppo
4    hyperparameters:
5      batch_size: 1024
6      buffer_size: 10240
7      learning_rate: 3.0e-4
8      beta: 1e-3
9      epsilon: 0.15
10      lambd: 0.95
11      num_epoch: 4
12      learning_rate_schedule: constant
13    network_settings:
14      normalize: false
15      hidden_units: 512
16      num_layers: 2
17    reward_signals:
18      extrinsic:
19        gamma: 0.99
20        strength: 1.0
21    keep_checkpoints: 25
22    checkpoint_interval: 250000
23    max_steps: 6000000
24    time_horizon: 1000
25    summary_freq: 10000
26    self_play:
27      save_steps: 50000
28      team_change: 100000
29      swap_steps: 2000
30      window: 10
31      play_against_latest_model_ratio: 0.5
32      initial_elo: 1200.0
33

Result

/imgs/post_imgs/mlagent_09/2.png
/imgs/post_imgs/mlagent_09/1.png

3M vs 3M

꽤 성공적으로 학습이 되었다.
적절한 타이밍에 방패를 사용하여 적의 공격을 막거나, 빙글빙글 돌면서 회피하며 공격 타이밍을 재는 모습을 볼 수 있다.

3M vs 200K

200K 도 생각보다 잘 피하는 모습을 보인다.
다만 공격에 있어서 3M 이 우위에 있기 때문에 거의 모든 에피소드에서 3M 이 승리했다.

추가 학습

방패를 앞에 들고 있지 않을 때, 뒤에 방패를 집어넣는데,
조금 더 학습을 시켜 보았더니, 이를 이용해 자신의 뒤를 공격하는 것을 막는 모습을 보였다.

1 vs 1 Train (Back Shield Disabled)

방패를 집어넣으면 Agent 뒤에 위치하게 되는데, 이게 다양한 플레이를 보여줄 수 있긴 하나...
일단 기습과 같은 플레이가 불가능하고, 특히 다대다 상황에서 뒷 방패 때문에 기습이 전부 막혀버리는 상황이 발생하였다.
그래서 방패를 집어넣을 시 뒤에 위치하는 것이 아닌 그냥 없어지는 것으로 변경하였고,
또한 너무 무분별하게 공격을 진행하는 것 같아 스테미나 시스템을 도입하였다.
공격을 진행할 때마다 일정 스테미나가 소모되고, 천천히 자연 회복되게 만들었다.
이번 학습에서 미리 이후 진행할 다대다 학습을 위해 trainer type 을 POCA 로 변경하였고, 이에 맞게 Group Reward 도 정의해 주었다.
이후 다대다 학습에서는 단순히 Agent 수만 늘려서 학습시키면 되게 하였다.

Policy

SituationRewardEndEpisode
매 Action 마다 (Living)틱당 -1 / (MaxStep)
장애물에 닿았을 시틱당 -5 / (MaxStep)
공격에 성공했을 시0.3f, 0.45f (백어택)
공격을 받았을 시-0.2f, -0.3f (백어택)
적을 킬3 - currentTimeStepRatio-
사망-3 + currentTimeStepRatio-
모든 적을 제거했을 시 (Win)1 + allyHpMean * 2fO
아군이 모두 제거되었을 시 (Lose)-1 - hostileHpMean * 2fO
Timeover 시 아군 팀의 HP 가 더 많이 남았을 경우 (Win)allyHpMeanO
Timeover 시 적팀의 HP 가 더 많이 남았을 경우 (Lose)-1 + allyHpMeanO
currentTimeStepRatio = CurrentTimeStep / MaxEnvStep;

Hyperparameter

접기/펼치기
1behaviors:
2  KnightAgent:
3    trainer_type: poca
4    hyperparameters:
5      batch_size: 2048
6      buffer_size: 20480
7      learning_rate: 0.0003
8      beta: 0.005
9      epsilon: 0.2
10      lambd: 0.95
11      num_epoch: 3
12      learning_rate_schedule: constant
13    network_settings:
14      normalize: false
15      hidden_units: 512
16      num_layers: 2
17      vis_encode_type: simple
18    reward_signals:
19      extrinsic:
20        gamma: 0.99
21        strength: 1.0
22    keep_checkpoints: 12
23    checkpoint_interval: 500000
24    max_steps: 6000000
25    time_horizon: 1000
26    summary_freq: 10000
27    self_play:
28      save_steps: 50000
29      team_change: 200000
30      swap_steps: 20000
31      window: 10
32      play_against_latest_model_ratio: 0.5
33      initial_elo: 1200.0
34

Result

/imgs/post_imgs/mlagent_09/4.png
/imgs/post_imgs/mlagent_09/3.png
중간에 Policy 를 한번 수정해서 Reward 가 떨어졌지만, 그래도 위처럼 잘 학습되었다.

3 vs 3 Train (Back Shield Disabled)

Policy, Hyperparameter

위와 동일

Result

/imgs/post_imgs/mlagent_09/5.png
/imgs/post_imgs/mlagent_09/6.png
/imgs/post_imgs/mlagent_09/7.png
확실히 제대로 학습이 되지는 않은 것 같다.
꽤 오랫동안 학습을 돌려 보았으나, Reward, Group Reward 값이 특정 값에 수렴하지 않고 계속 진동하는 모습을 보였다.
ELO Rate 도 들쭉날쭉한 모습을 보인다.
위 영상은 그 중에서도 가장 ELO Rate 와 Reward 가 높았던 3M 에서의 checkpoint 를 적용하여 테스트해본 것이다.
3명이 적 한명을 둘러싸 공격하는 모습이 조금씩 보이긴 하는데, 이게 모든 상황에서 그러한 것이 아니라 명확하게 학습이 되었다고 말하긴 어렵다고 볼 수 있다.