(실패) QWOP 게임을 Reinforcement Learning으로 해결해보자


요약

QWOP-RL을 Human agent 없이 학습시켜보면 더 좋은 성능이 나오지 않을까? 싶어 도전해 봤지만, 결과가 영 좋지 않았다.

배경

QWOP을 빠르게 뛰는 ML 모델은 47초 정도의 기록을 보였는데, 인간 최고 플레이어는 그것보다 빠른 45초 정도의 기록을 보유하고 있다. 바꿔말하면 모델이 아주 최적해를 찾지는 못했다는 뜻이 된다. 과연 어떻게 개선할 방법이 있지 않을까 하고 들여다보게 되었다.

사실은 그냥 RL 공부를 하고 싶었는데 이미 Gym 환경도 잘 구현되어 있겠다 이걸 가지고 도전해보면 재밌을 것 같아서 이것저것 해 봤다.

접근

Human agent를 가지고 학습을 하면 인간 플레이어의 습관이나 단점도 복사되는 것 아닐까 싶어서, 어떻게든 reward 만 가지고 학습을 진행하는 방향으로 해 보려고 했다. 사실 예전 연구가 이미 human agent를 가지고 학습하는 것은 잘 구현했기 때문에 또해봤자 의미가 없을 것 같았다.

구현

그냥 Keras의 DQN 예제 코드를 가져와서 조금 수정해서 사용했다. 다만 Tensorflow는 그냥 망한 프로젝트 같은 느낌이다. 물론 keras가 tensorflow의 핵심 패키지는 아니고 곁다리 같은 느낌이긴 한데, 어쨌든 keras 사용자도 흡수해보겠다고 패키지 안에 포함시켜 놓은 주제에 import tensorflow.keras를 타입체킹 하나 되지 않는 반쪽짜리로 만들어놓을 필요가 있었을까? 덕분에 타입도 어렵고, 도움말도 나오지 않는 어정쩡한 상태에서 구현해야 해서 스트레스가 많이 올라갔다.

도전 1

일단 넘어지지나 말자는 느낌으로 넘어졌을 때에만 페널티를 주는 방식으로 구현해 봤다.

왜인지 모르게 여전히 넘어지긴 넘어지는데, 그래도 학습을 꽤 하고 나자 어쨌든 넘어지지 않는 전략은 수립한 것 같이 보였다. 모델 결과값을 봐도, 자기가 넘어지고 있다는 것은 확실하게 인지하는 모습을 보였다.

도전 2

이제 보상값을 조금 바꿔서 앞으로 나가는 쪽에 좀 더 보상을 줘 봤는데, 이부분이 잘 적용되지 않았다.

넘어지는 것에 페널티를 준 상태에서는 아예 넘어지지 않으려 사력을 다하기 때문에 앞으로 잘 나가지 못한다. 그렇다고 넘어지는 것에 페널티를 빼 버리면 아예 처음부터 마구 넘어진다. 넘어지지 않고 오래 가야 장기적인 보상이 기다리고 있다는 사실을 아예 인지하지 못하는 것이다.

거기다가 어떤 페널티를 줘도 넘어지는 것 자체를 막지 못하는 상황이 계속됐다. 어떻게 보면 물리엔진을 제대로 이해하지 못하는 것 같은 느낌이기도 했다. (발이 바닥에 닿아야 마찰이 작용해서 앞으로 나갈 수 있다던지 하는 기본적인 이해에 도달하지 못한 것 같은 느낌?)

결론

일단 여기서 멈췄는데, 시간이 여유가 되면 한번 다른 라이브러리들:

을 이용해서 코드를 다시 작성해보려고 한다. 가장 큰 문제는 Gym 환경이 실시간 시뮬레이션 기준이기 때문에 학습 데이터가 너무 천천히 쌓인다는 것이다. 이부분을 개선하면 모델이 학습하는 것도 많이 빨라질 수 있을 것 같은데 게임 내의 물리엔진까지 다루고 싶지는 않기 때문에 조금 검토해 봐야 할 것 같다.