DQN을 통한 mario게임 학습

Categories: Tags:


서론

*참고

생각

CartPole 게임에서 구현한 DQN을 토대로 흔히 알려진 Mario 게임을 RL을 통해서 Clear 해보려고 했으나 실패했습니다. env를 받아들이고 DQN을 구현은 했지만, 학습이 제대로 되지 않았습니다. 생각해볼 부분이 많은 것 같습니다. 잘 되진 않았지만, 코드를 분석하고, 며칠간 RL에 관해서 공부하면서 배운 게 많아서 왜 잘되지 않았을까에 대한 고찰을 개인기록용으로 적어놓도록 하겠습니다. 다음에 시간이 되면 다시 한번 도전해보도록 하겠습니다.

CNN

CartPole과 Mario 게임의 가장 큰 차이점은 CartPole의 경우는 state가 (4,)의 형태로 아주 간단했지만 Mario 게임은 (3,240,256)로 이미지 형태를 띤다는 것입니다. 따라서 DQN내부를 구현할 때도 FC가 아닌 CNN으로 구현을 해야 합니다.

  1. 처음에는 무작정 (3,240,256)을 다 받아서 CNN에 넣었는데 학습이 엄청 오래 걸리고 잘 안 되었습니다. 후에 검색을 통해서 policy에 color가 영향을 주지 않는 것, (240,256)은 게임상에서 보이는 이미지일 뿐, 컴퓨터가 판단하기에는 넘치는 정보라는 것 등을 확인하고 이미지를 grayscale로 바꾸고 down sampling 하여 (1,84,84)로 만들어서 학습시켜보았지만 잘되지 않았습니다.

  2. CNN의 구조도 처음에는 convolution 레이어 두 개를 사용해서 구현했지만 잘되지 않았고, FC레이어를 추가하는 등 실험을 했지만, 학습이 잘되지 않았습니다. 모델 자체를 설계하는 건 어떤 식으로 하는 건지 한번 공부해보고 싶습니다. torch에서 CNN 예제로 된 흔히 쓰이는 레이어들로 구현했었는데도 잘 안 되었었는데 Mario 게임에 적합한 모델은 어떻게 설계하는 건지 궁금합니다.

  3. CNN의 레이어 구조뿐만 아니라 하이퍼 파라미터도 마찬가지입니다.

DQN

  1. 가장 크게 의문점이 들었던 건 epsilon에 대한 값입니다. CartPole에서와 마찬가지로 epsilon 값을 8% => 1%로 바꾸어가며 사용을 했는데 Mario 게임에서도 이게 타당한지를 잘 모르겠습니다. Explore를 8% 정도로 할 때 Mario 게임의 다양한 env에서 새로운 경로를 개척할 수 있는지 잘 모르겠습니다. 학습시킨 DQN으로 실제 마리오 게임을 플레이 해봤는데 파이프에 계속 부딪히는 모습을 자주 보여줬는데 이게 Explore를 하지 못해서 기존 경로를 못 벗어난 게 아닐까 추측을 해봤었습니다.

  2. epsilon과 마찬가지로 ReplayBuffer의 크기나, sampling size 등의 하이퍼파라미터 최적값도 찾아야 할 것 같습니다. gamma에 대한값도 생각해 봐야겠습니다.

GPU

최종적으로 혼자서 코드를 수정하는 정도로는 잘 안돼서 결국엔 pytorch에서 제공하는 Mario tutorial을 도움받아서 구현했습니다. 하지만 GPU memory 관련 오류가 계속 나는데 이 부분은 도저히 감이 안 옵니다. GPU 프로그래밍이나 torch에서 GPU를 어떻게 쓰는지 공부를 하고 다시 도전해보도록 하겠습니다.

*참고

Mario게임 RL로 클리어 하기


ML내 다른 글 보기

댓글남기기