한달 전에 스탠포드 비전 랩의 안드레이 카패시(Andrej Karpathy)가 블로그에 강화학습에 대한 글인 ‘Deep Reinforcement Learning: Pong from Pixels‘를 올렸었습니다. 조금 늦었지만 블로그의 글을 따라가 보려고 합니다. 안드레이는 스탠포드 뿐만이 아니라 구글과 OpenAI에서도 여러 프로젝트에 참여했고 강화학습과 관련된 여러 도서를 읽고 관련 강의도 들었다고 합니다. 강화학습을 쉽게 소개하기 위해 글을 썼다고 하는데 말처럼 쉽지는 않은 것 같습니다.
OpenAI 짐(Gym)은 강화학습 알고리즘을 훈련시키고 평가할 수 있는 프레임워크입니다. 짐에 포함된 퐁(Pong) 게임은 아타리(Atari) 2600에 포함된 간단한 컴퓨터 게임의 시뮬레이션 버전입니다. 두사람이 오른쪽과 왼쪽에 있는 자기 막대를 움직여 공을 받아 넘겨야 하고 상대방이 놓쳐서 화면 옆으로 사라지면 점수를 1점 얻게 됩니다(이를 편의상 한 판이라고 부르겠습니다). 이렇게 점수를 획득하여 가장 먼저 21점을 얻는 쪽이 이기는 게임입니다. 짐에서는 화면의 왼쪽 편이 하드 코딩되어 있는 컴퓨터 에이전트이고 오른쪽 편이 강화학습을 통해 우리가 학습시켜야할 에이전트입니다.
짐 라이브러리에서는 공이 위치가 이동되었을 때를 한 스텝(step)이라고 표현합니다. 게임 화면에서 공이 이동할 때 마다 스크린샷을 찍는다고 생각하면 비슷합니다. 매 스텝마다 짐은 우리에게 리워드(reward)를 줍니다. 이겼을 때는 1, 졌을 때는 -1, 이도저도 아닌 공이 게임 판 위를 여전히 돌아다니고 있는 중간에는 0을 리턴합니다. 우리는 매 스텝마다 막대의 위치를 위로 올릴 것인지(UP), 아래로 내릴 것인지(DOWN)를 결정하여 짐 라이브러리에 전달합니다. 게임을 이길 수 있도록 막대의 위치를 제어하는 것이 우리가 풀어야 할 숙제입니다.