2017년 12월 18일 월요일

④테트리스 강화학습 - DQN으로 50시간 학습시키기

Github https://github.com/lyzqm123/Tetris-Reinforcement-Learning-with-Python3-keras

이전 포스팅에서 부족한 설명을 이 포스팅에서 약간 메꾸고 시작하겠다.

우선 강화학습의 원리는 간단하다.
어떤 환경(environment)이 주어지고 그 환경에서 학습하는 인공지능(agent)이 
현재 상태(state)에서 보상(reward)을 받아 행동(action)해 실력이 느는 방식이다.

여기서 해결해야할 아주 중요한 문제가 있다.
바로 '순차적 행동 결정 문제'이다.

이건 내가 기존의 오목 로봇 프로젝트에서 직접 겪었던 문제다.
agent는 현재 state에서 다음 결정을 위해 action을 취해야한다.

하지만 이 결정을 어떻게 내려야 되는가?
만약 현재 state를 수치화할 수 있는 명백한 요건이 있다면 해결되겠지만  
바둑, 오목, 테트리스에서 현재 state를 완벽하게 수치화를 판단하긴 굉장히 힘들것이다.
여기서는 이러한 문제점을 해결하기위해 Markov Decision Process(MDP)를 사용한다.

MDP는 한마디로 순차적 행동 결정문제를 해결하기위해 문제를 수학적으로 정의한 것이다.
MDP에는 앞서말한 state, action, reward가 포함되있고 추가로 정책(policy)로 구성된다.
이 프로젝트에서 MDP는 다음과 같이 될것이다. (물론 블록은 일정 시간마다 자동으로 내려간다.)

MDP를 해결했다는 것은 결국 agent가 가장 좋은 policy를 얻었다는 소리다.

이제 (Deep Q Network)DQN에대해 알아보자.
DQNDeepMind에서 사용된 알고리즘이다.
Q Learning은 오프폴리시(현재 행동하는 정책과는 독립적으로 학습함)알고리즘이다.
Q Learning에서 행동은 $\varepsilon$-greedy policy에 의해 결정된다.
(이게 무엇이냐면 강화학습의 중요 문제중 '탐색-이용의 딜레마(Explore-Exploit dilemma)'가 있다.
현재 우리가 학습한 방법을 고수(exploit)하면 탐험(explore)을 해서 얻을 수 있는 방법보다 보상을 덜 받을 수도 있다.
이것을 해결하기위해 $\varepsilon$의 확률을 사용하여 탐험을 시킨다.)

Q Learning과 인공신경망을 사용한게 DQN이다.
여기서 이 둘 사이를 이어주기위해 경험 리플레이(Experience Replay)를 사용한다.
리플레이 메모리에 지속적으로 $s$,$a$,$r$,$s'$를 넣어주고 무작위로 추출하여 
인공신경망 업데이트에 사용한다. (각각 state,action,reward,next state이다.)
나는 리플레이 메모리를 20000 Byte크기로 제한하였다.

그리고 Q Learning의 핵심 수식 큐함수 업데이트 공식은 다음과 같다.
$Q(S_{t},A_{t}) \leftarrow Q(S_{t},A_{t})+\alpha(R_{t+1}+\gamma \underset{a'}{max} Q(S_{t+1},a')-Q(S_{t},A_{t}))$
간단하게 설명하자면 다음 행동으로부터 큐함수의 가장 큰 값을 $\gamma$만큼 감소시키고 행동으로 얻은 
보상과 현재 큐함수의 값을 $\alpha$만큼 감소시켜 현재 큐함수와 더한값으로 업데이트 시키는 것이다. 

신경망은 다양한 종류가 있지만 DeepMind처럼 Convolution Neural Network(CNN)을 사용했다.
이때 처음 알았는데 이미지자체를 학습시키는 방법이였다.
이미지는 RGB채널이 있는데 굳이 색을 넣어 학습시킬 필요가없으므로 
흑백으로 전처리하고 신경망에 넣는다.

나는 애초에 20X8배열에 테트리스를 저장해서 이 배열로 keras에 맞는 크기인 
84X84로 확장시켜 넣어줬다. 
또한 책에서와 유사하게 세 개의 컨볼루션 층을 쌓고 50개의 노드 층을 형성시켰다.
(책에서는 512개의 노드 층을 형성시켰는데 컴퓨터가 좋지않아 줄였다)

이렇게 프로젝트를 구성하였고 50시간을 학습시킨 결과는 위의 영상에 나와있다.

위의 그래프는 큐함수 가장 큰 값의 평균그래프이고 아래는 점수 그래프이다.
점수그래프 또한 위의 그래프처럼 나올줄 알았는데 학습이 온전하게 되진 않은거 같다.
아래서부터 6칸 위로부터는 사실상 제대로 학습되진 않았다.
아마도 explore을 더 많이 하고 더 심층 신경망을 사용하고 좋은보상을 써야 해결될것 같다.

다음에는 온전한 테트리스 강화학습을 진행하도록 하겠다.



댓글 1개:

  1. 안녕하세요 저도 지금 테트리스를 dqn을 이용한 강화학습을 하려하는데 20x8을 굳이 84x84로 바꿔준 이유가 자세히 왜일까요?

    답글삭제