|
| 1 | +--- |
| 2 | +layout: project_single |
| 3 | +title: "데드 바이 데이라이트 스킬 체크" |
| 4 | +slug: "skill_check_env" |
| 5 | +use_math: true |
| 6 | +--- |
| 7 | + |
| 8 | +# Skill Check 환경 및 DQN 에이전트 |
| 9 | + |
| 10 | +- 제목: Skill Check 환경 및 DQN 에이전트 |
| 11 | +- 기간: 1주일 |
| 12 | +- 링크: [https://github.com/HiddenBeginner/skill_check_env](https://github.com/HiddenBeginner/skill_check_env) |
| 13 | +- 프로젝트 설명: 게임 Dead by Daylight의 quick time event (QTE) 요소 중 하나인 스킬 체크를 모방하여 환경을 만들고 DQN 에이전트로 환경 해결 |
| 14 | + |
| 15 | +<br> |
| 16 | + |
| 17 | +--- |
| 18 | + |
| 19 | +## 환경 설명 |
| 20 | + |
| 21 | +Dead by Daylight에서 생존자가 발전기 수리나 회복 등을 수행할 때 낮은 확률로 quick time event인 스킬 체크가 발동한다. |
| 22 | +생존자가 스킬 체크를 성공하면 진척도 보너스를 받지만, 만약 실패하면 진척도 감소 뿐만 아니라 살인마에게 알림이 가게 되기 때문에 생존하기 위해서는 반드시 성공해야 하는 요소이다. |
| 23 | + |
| 24 | +<br> |
| 25 | + |
| 26 | +스킬 체크 발동시 생존자 화면 가운데에 12시 방향에 빨간 바늘이 놓여져 있는 원이 하나 생긴다. |
| 27 | +빨간 바늘은 약 1.0초 동안 시계 방향으로 360도를 빠르게 회전하며, 생존자는 원 위의 임의의 위치에 생긴 성공 구간에 빨간 바늘이 들어오면 스페이스바를 눌러 스킬 체크를 해야 한다. |
| 28 | +성공 구간의 길이는 약 55도이며, 그 중 첫 10도에서 스킬 체크를 성공하면 스킬 체크 대성공으로 간주되어 진척도 보너스를 받게 된다. |
| 29 | +나머지 45도 안에서 스킬 체크를 성공하면 일반 성공으로 간주되며 진척도 보너스는 없다. |
| 30 | +만약, 성공 구간 이전에 스킬 체크를 하거나, 성공 구간을 지날 때까지 스킬 체크를 하지 못하게 되면 스킬 체크 실패로 간주되며 진척도 패널티를 받게 된다. |
| 31 | + |
| 32 | +<br> |
| 33 | + |
| 34 | +이에 영감을 받아 Skill Check 환경을 만들게 되었다. 한 에피소드를 한 번의 스킬 체크 상황으로 간주했다. 매 에피소드마다 길이 55도의 성공 구간이 90도 ~ 360도 사이에서 임의로 생성되며, 성공 구간의 첫 10도를 대성공 구간, 나머지 45도를 일반 성공 구간으로 구분하였다. 에피소드 시작시 빨간 바늘이 12시 방향을 가리키고 있으며, 120 FPS을 가정하여 360도 회전을 120 프레임으로 나누었으며 따라서 1 프레임이 지날 때마다 빨간 바늘이 3도씩 움직이게 된다. |
| 35 | + |
| 36 | +<br> |
| 37 | + |
| 38 | +Observation space는 $\mathcal{S} \subseteq \mathbb{R}^{84 \times 84 \times 1}$이며, 현재 프레임의 이미지를 observation으로 받게 된다. |
| 39 | +Atari 환경 등에서는 Markov property를 만족시키기 위하여 과거 $t$개의 프레임을 합쳐서 observation을 사용하지만, |
| 40 | +이 환경의 경우 바늘의 회전 속도가 항상 동일하기 때문에 1장의 프레임만으로도 Markov property를 만족하게 되기 때문에 stacked 프레임을 사용하지 않았다. |
| 41 | +Action space는 $\mathcal{A}= \{ 0, 1\}$이며, 0은 아무 행동을 하지 않으며, 1은 스킬 체크를 하는 행동이다. |
| 42 | + |
| 43 | +<br> |
| 44 | + |
| 45 | +0의 행동을 하면 0의 보상을 받으며 바늘이 3도 회전하게 된다. |
| 46 | +바늘이 대성공 구간에 위치했을 때 1의 행동을 하면, +10.0 보상을 받으며 에피소드가 종료된다. |
| 47 | +성공 구간에 위치했을 때 1의 행동을 할경우 +1.0 보상을 받으며 에피소드가 종료된다. |
| 48 | + |
| 49 | +<br> |
| 50 | + |
| 51 | +성공 구간 이전에 1의 행동을 하면 -5.0의 보상을 받으며 에피소드가 종료된다. |
| 52 | +다음 상태에서 바늘이 성공 구간을 넘어서면 -5.0의 보상을 받으며 에피소드가 종료된다. |
| 53 | + |
| 54 | +<br> |
| 55 | + |
| 56 | +--- |
| 57 | + |
| 58 | +## DQN 에이전트 |
| 59 | + |
| 60 | +위에서 만든 Skill Check 환경에 DQN 알고리즘을 직접 구현하여 적용해보았다. |
| 61 | +처음에는 DQN 논문에 있는 네트워크 구조와 하이퍼파라미터를 그대로 따라서 실험을 했다. |
| 62 | +환경이 쉬운 환경임에도 에이전트는 학습이 종료될 때까지 내내 -5.0 보상만 받았다. |
| 63 | + |
| 64 | +<br> |
| 65 | + |
| 66 | +### 학습 실패 원인 분석 |
| 67 | + |
| 68 | +생각해볼 수 있는 원인 한 가지는 다음과 같다. |
| 69 | +에이전트가 양수 보상 신호를 받기 위해서는 바늘이 성공 구간에 도달하기 전까지 반드시 0 행동을 해야 한다. |
| 70 | +이를 프레임으로 환산해보면 최소 30 프레임까지는 0의 행동을 해야만 한다는 것이다. |
| 71 | +완전 랜덤 행동을 하는 에이전트의 경우, 30 프레임 동안 0의 행동만 취할 확률은 $\frac{1}{2^{30}}$이 된다. |
| 72 | +따라서 학습 초기에 완전 랜덤 탐색 동안에는 양수 보상을 받을 확률이 굉장히 낮다. |
| 73 | +하지만 다행히도 성공 구간 이전에 1의 행동을 할 경우 -5.0 보상을 받기 때문에, |
| 74 | +에이전트는 성공 구간 이전에는 0의 행동을 하는 것이 더 좋다는 것을 학습하고 0의 행동만 수행하게 된다. |
| 75 | + |
| 76 | +<br> |
| 77 | + |
| 78 | +하지만 에이전트가 성공 구간 이전에 항상 0의 행동을 수행한다고 해도 $\epsilon$의 확률로 랜덤 탐색을 수행하며 여기서 1의 확률을 취할 확률이 $\frac{1}{2}$이다. |
| 79 | +즉, $\frac{\epsilon}{2}$의 확률로 1의 행동이 수행된다. |
| 80 | +기존 DQN 논문에서는 $\epsilon=1$에서 시작하여 이후 1백만 steps 동안 $\epsilon=0.1$로 선형적으로 감소시킨다. |
| 81 | +$\epsilon=0.1$이라고 할 때 1의 행동을 취할 확률은 $0.05$가 된다. |
| 82 | +30 프레임 동안 1의 행동을 한번이라도 할 확률은 1 빼기 30 프레임 동안 모두 0의 행동을 취할 확률이며, 이는 $1 - (0.95)^{30}=0.78$이다. |
| 83 | +따라서 기존의 $\epsilon$ 관련 하이퍼파라미터로는 성공 구간에 도달하기 조차 힘들다는 것을 확인했다. |
| 84 | + |
| 85 | +<br> |
| 86 | + |
| 87 | +### 문제 해결 결과 |
| 88 | + |
| 89 | +문제 분석을 바탕으로, 초기 $\epsilon=0.1$로 설정하고 이후 1백만 steps 동안 $\epsilon=0.005$로 선형적으로 감소시키게 수정했더니 에이전트가 성공적으로 환경을 해결하는 것을 확인할 수 있었다. 환경과 상호작용 횟수에 따른 에이전트의 Return 곡선은 다음과 같다. |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | +<br> |
| 94 | + |
| 95 | +학습이 종료된 후 10번의 에피소드에 대해서 테스트했을 때, 1번만 일반 성공을 한 것을 제외하고 9번은 대성공을 하였다. |
| 96 | +애니메이션은 아래와 같다. 회전 속도가 많이 느려보이는데, 환경을 120 FPS로 만들다보니 프레임 수가 많아져서 그렇다. |
| 97 | + |
| 98 | + |
| 99 | + |
| 100 | +<br> |
| 101 | + |
0 commit comments