2017년 12월 14일 목요일

③테트리스 강화학습 - 테트리스 환경 만들기 (Python3)

Github https://github.com/lyzqm123/Tetris-Reinforcement-Learning-with-Python3-keras
책이 도착했다.
책내용이 알차고 쉽게 알려줘서 좋은 것 같다.

앞서서는 C++로 프로젝트를 진행하려 했으나 Python의 유틸성과 keras연동이 매우 쉽고
책또한 Python으로 설명이 되어있어 Python으로 바꾸었다.

강화학습의 종류는 꽤 많이 있는데 내가 할 강화학습은 Deep Q Learning(DQN)과 
Convolution Neural Network(CNN)으로 진행을 할 것이다.

책에서는 DeepMind의 브레이크아웃 게임을 가지고 설명이 되어있는 부분이 있다.

Python에는 유틸기능이 기본적으로 많이 깔려있는데 C++로는 콘솔창에서 직접 출력하며 그려준 반면
Python으로는 tkinter 모듈을 이용해 GUI를 쉽게 그려서 좀 더 화려하게 만들 수 있다.
사실 화려한것이 목적이아니라 CNN을 위해 이미지로 학습시키기 위해 사용한 것이다.

강화학습이다 보니 환경에 대한 보상이 어느정도 필요하다.
이 보상정도를 잘 맞추기위해서는 전문적인 지식이 필요하지만 
어쩔수없이 대략적으로 만들어보려한다.

보상은 3가지로 만들었다.
1. 특정 높이에 해당하는 위치에 블럭이 쌓일 때
테트리스의 배열은 20X10으로 정해주었다.
테트리스의 배열은 20X8로 수정 ($\varepsilon$이 클 경우 가로 10일 때 한줄채우기가 잘 안됨)

여기서 높이를 $h$라 두고 그 높이에 $n$개가 쌓였을 때 보상을 $f(h^2)$*$n$으로 주었다.
여기서 $f(h)$ 함수는 테트리스 배열의 높이를 [0, 2]로 차등분배한 값을 반환하는 함수이다. 
$f(h^{2})$함수는 $h^{2}$*$0.0008276$를 반환하는 함수 (보상의 기준을 낮춤)


차등 분배는 높이 3부터 시작하였고 제곱의 형태이다 보니 마지막은 4에 가까워진다.
즉, 마지막 줄을 다 채운다면 약 4*10인 40점이 부여된다.
즉, 마지막 줄에 한칸이 쌓인다면 약 0.3점 정도가 부여된다.
학습을 보다 아래쪽에 많이 쌓게끔 하면 기본적인 테트리스플레이가 나올것 같았다.

2. 줄마다 블록이 모두 찰 때
당연히 한줄마다 블록이 찰 때 보상을 해줘야지 인공지능이 줄에 블럭을 넣어 깰 것이다.
$t$개의 줄을 깰 때 보상을 $t$*$10$으로 주었다.

3. 일정 시간이 지날 때 
테트리스를 오랜 시간 유지하기위해 일정시간이 지날 때 보상을 주는것을 생각했다.

하지만 시간측정을 코드가 돌아가는 시간을 측정하는데 학습시간이 오래되다보면 데이터가 많이 쌓여
코드가 돌아가는 시간이 앞에 보다 자연히 늘어날 것이다.
이렇게 되면 기존의 틀에 결함이 생길 수 있어 아직은 구현하지 않았다.



현재는 랜덤으로 블럭을 낙하하고 종료될때 환경에 대한 보상을 확인하는 용도로 촬영했다.

댓글 없음:

댓글 쓰기