-
Notifications
You must be signed in to change notification settings - Fork 0
5. Experiments
Brain에서는 Unreal Engine 제어와 DQN 알고리즘을 수행하고 Python 구현하였다.
UR Game은 벽에 부딪치면 게임이 종료되는 자동차 게임이고 Unreal Engine을 이용하였다.
Brain과 UR Game은 socket을 이용해 통신한다. 이런 환경으로 실험을 진행하였다.
액션은 좌, 우, 그대로 있기로 설정하였고
state는 자동차 앞부분을 기준으로 9개의 센서 측정값이다.
action이 오면 0.1초간 action을 수행한 후 현재 state를 float배열로 가공 후 byte로 시리얼라이즈 해서 brain으로 보낸다.
DQN은 state를 4 프레임 쌓아 Q network의 input으로 활용하였는데 4 프레임마다 Action을 하고 나머지 프레임은 나온 Action을 그대로 진행하였다.
하지만 0.1 초 마다 통신을 하였기 때문에 DQN Algorithm그대로 진행을 하면 0.4초마다 Action을 하기 때문에 제대로 game 을 play할 수 없었다.
대안으로 state_buffer 를 이용하였다. state_buffer는 모든 state를 저장하였고 queue를 사용한다.
길이가 4 인 큐에 받는 모든 state를 집어 넣고 그 데이터를 Q network의 입력 데이터로 하였다. 초기 비어있는 state_buffer에는 처음 받는값으로 모두 채웠다.
이런 UR Game과의 통신은 Game Master 라는 Class를 이용하였는데 gym의 environment와 비슷한 역할을 한다.
RL Algorithm은 2015 DQN 방법을 이용하였고 Dueling DQN, Actor-Critic 등 다양한 방법을 적용시킬 수 있다.
byte데이터를 받은 Brain은
- float list로 변환 후 노말라이즈 시킨다.
- state_buffer에 변환한 데이터를 stack 시킨다.
- Q network에서 나온 결과값을 URGame에 보내고 약속한 시간동안 대기한다.
- 돌아온 결과값을 memory에 저장시키고 특정 주기마다 Q network를 학습시킨다.