brunch

You can make anything
by writing

C.S.Lewis

by Chris송호연 Aug 29. 2017

스타2 강화학습 튜토리얼 - 2편

StarCraft II의 환경 - Observations

안녕하세요- 강화학습에 미쳐있는 크리스입니다 :)


오늘 배워볼 내용은 딥마인드에서 공개한 스타크래프트 2 API의 환경에 대해서 설명드리도록 하겠습니다.

이 튜토리얼은 영문으로도 없는 희소성 있는 자료입니다. 널리널리 퍼뜨려주세요 ;)


Prerequisites

- IntelliJ ( or PyCharm)

- Python3

- 스타크래프트2 정식버전 구입! 혹은 체험판도 가능하다고 합니다.

- 끈기와 오기

- 강철 멘탈

- GIT

- 튜토리얼 진행은 Mac 환경 기준으로 하겠습니다.


Tutorial Outline

- 스타2 Observation 소개

- pysc2-examples Star & Fork

- pysc2-examples git clone 받기

- Debug 모드로 pysc2 Observation 값 살펴보기 


이번 포스팅에서는 딱 한 가지 주제를 설명드리도록 하겠습니다. 스타크래프트2 환경은 크게 Observation과 Action으로 나눌 수 있습니다. Observation은 스타2 의 현재 게임 상태를 나타내는 여러 변수들입니다. Action은 스타2에 명령을 내릴 수 있는 명령어들입니다. 


이번 포스팅에서는 지면 상, Observation만 다루도록 하겠습니다.


Observation

Observation space는 게임 상의 여러 환경 정보를 담고 있습니다. 예를 들어, 현재 화면에 어느 위치에 어떤 유닛이 있는지, 유닛의 체력은 몇인지, 미네랄은 어느 위치에 있는지 이런 정보들을 갖고 있습니다.


Atari 게임들에서도 Observation Space가 있었지요- Atari 게임들의 주요 Observation Space는 화면의 RGB 픽셀들입니다. RGB 픽셀들이라고 해도 Tensor로 표현하면 상당히 복잡한 수치들이 들어있을 것입니다. 하지만, 스타크래프트2 게임은 Atari 게임과는 비교도 안되게 많은 환경 정보들을 제공합니다. 


시각적 / 공간적 정보 (Spatial/Visual)


RGB 픽셀 (RGB Pixels)


현재 pysc2에서는 지원되지 않고 있습니다.


피쳐 레이어 (Feature Layers)


스타크래프트2 pysc2 학습환경에서는 RGB 픽셀을 그대로 전달하지 않고, 게임 상의 정보를 high level의 feature로 전처리하여 줍니다. 강화학습을 시키는 입장에서는 이렇게 잘 정리된 피쳐 레이어가 있는 것이 상당히 큰 도움이 됩니다. CNN(Convolution Neural Network)으로 이미지를 인식하는 과정을 스킵할 수 있으니 에이전트를 학습시키는 데 드는 계산량과 노력을 크게 줄일 수 있기 때문이죠.


현재 화면 상에 나타나는 여러 정보들을 약 20개의 피쳐 레이어로 분리하여 제공하고 있습니다.


미니맵 (minimap)


미니맵 상의 정보를 여러 개의 피쳐 레이어로 분리해놨습니다.


height_map : 지형의 높낮이를 나타냅니다.

visibility : 지도의 어느 영역이 가려져 있고, 보이는 지 나타냅니다.

creep : 지도의 어느 영역에 저그 creep이 깔려있는지 나타냅니다.

camera : 맵의 어느 영역이 스크린 레이어에서 보이는 지 나타냅니다.

player_id : 화면에 보이는 유닛들이 각각 어느 플레이어의 소유인지를 플레이어 아이디로 나타냅니다.

player_relative : 화면 상에 어느 유닛이 동맹군이고, 어느 유닛이 적군이고, 그리고 중립 유닛인지 나타냅니다. 0은 배경, 1은 자기자신, 2는 동맹군, 3은 중립 유닛, 4는 적군 입니다. 

selected : 현재 선택된 유닛을 나타냅니다.


스크린 (screen)


현재 게임 화면에 보이는 지도 일부 정보를 피쳐 레이어로 제공하고 있습니다.


height_map: 지형의 높낮이를 나타냅니다.

visibility: 지도의 어느 영역이 가려져 있고, 보이는 지 나타냅니다.

creep: 지도의 어느 영역에 저그 creep이 깔려있는지 나타냅니다.

power: 지도의 어느 영역에 프로토스 파일런 전력이 공급되고 있는지 나타냅니다.

player_id: 화면에 보이는 유닛들이 각각 어느 플레이어의 소유인지를 플레이어 아이디로 나타냅니다.

player_relative: 화면 상에 어느 유닛이 동맹군이고, 어느 유닛이 적군이고, 그리고 중립 유닛인지 나타냅니다. 0은 배경, 1은 자기자신, 2는 동맹군, 3은 중립 유닛, 4는 적군 입니다. 

unit_type: 유닛의 유형 아이디를 나타냅니다. 참고로 마린은 48입니다.

selected: 현재 선택된 유닛을 나타냅니다.

hit_points: 유닛의 체력이 몇인지를 나타냅니다.

energy: 유닛의 에너지가 몇인지 나타냅니다.

shields: 프로토스 유닛에만 해당합니다. 유닛의 실드가 몇인지 나타냅니다.

unit_density: 픽셀 안에 얼마나 많은 유닛들이 있는지 나타냅니다.

unit_density_aa: anti-aliased version 버전으로 픽셀 안에 얼마나 많은 유닛이 있는지 나타냅니다.


이렇게 나열하니까 무슨 뜻인지 아직은 크게 와닿지 않으실 것 같아서, 실습을 준비해보았습니다.


pysc2-examples Star & Fork

가장 먼저, pysc2-examples GIT 저장소에 접속합니다.

https://github.com/chris-chris/pysc2-examples

그리고 우측 상단의 Star 버튼을 누릅니다!

 우측 상단의 Star 버튼을 누릅니다!

그 다음, Fork 버튼도 눌러주세요 :)

Fork 도 눌러주세요 ! :)


pysc2-examples git clone 혹은 git pull


pysc2-examples 최신 버전을 clone 혹은 git pull 해주시기 바랍니다 :)


git clone https://github.com/chris-chris/pysc2-examples


혹은 이미 받으신 분이시라면, 최신 버전으로 업데이트 하기 위해 git pull 명령어를 실행해주세요


git pull


Debug 모드로 pysc2 Observation 값 살펴보기 


우선, 1편에서 알려드렸 듯이 우리는 IntelliJ ( 혹은 PyCharm) 로 디버깅을 해보면서 각 단계에 어떤 값들이 들어있는지 확인해보도록 하겠습니다.


IntelliJ로 프로젝트를 연 후에, tests/scripted_test.py 파일을 열어보겠습니다.


scripted_test.py 파일을 연 후, 제가 38라인에 # Break Point!!라고 표시한 코드 바로 밑 39 라인 숫자 오른쪽의 빈 공간을 마우스로 클릭해보겠습니다.



39라인 왼쪽 빈 공간을 클릭해주세요. 그러면 빨간색 원이 생깁니다.



자, 이제 Debug 모드로 안에 들어있는 값을 볼 준비가 되었습니다.


scripted_test.py 파일을 마우스 오른쪽 클릭을 한 후에 [Debug 'Unittests in scripte...']  메뉴를 클릭합니다.



자! 그럼 드디어 스타크래프트2가 실행됩니다. 


조금만 기달려보시면 아시겠지만, 스타크래프트2는 시작과 동시에 멈춥니다. 바로 우리가 걸어놓은 Break Point 때문이죠.



그럼 이제 우리는 스타크래프트2 pysc2 메모리 속을 마음대로 확인해볼 수 있게 되었습니다 :) 바로 밑에 디버깅 콘솔에서 각 변수에 어떤 값이 들어있는지 하나하나 확인을 할 수 있습니다.


가장 먼저, Observation의  feature layer 중 screen, 화면에 어떤 유닛이 있는지 정리해 놓은 변수에 접근해보도록 하겠습니다.



Break Point에 걸리면 디버깅 콘솔에서 obs 변수 왼쪽에 있는 삼각형을 클릭해서 펼쳐주세요.



그리고 펼쳐진 obs 변수 안에 0 왼쪽에 있는 삼각형을 클릭해서 펼친 후 observation 왼쪽에 있는 삼각형을 클릭해주세요. 그럼 여기까지 왔습니다.

obs[0].observation

그리고 'screen' 왼쪽에 있는 삼격형을 클릭한 후에 [0:13] 왼쪽에 있는 삼각형을 클릭해서 내용을 펼쳐줍니다. 그럼, 우리는 드디어 화면의 정보를 담고 있는 screen feature layer까지 들어왔습니다.

obs[0].observation["screen"]


그 다음 13개의 screen feature 중에서 6번째인 05 왼쪽의 삼격형을 눌러서 펼친 후 [0:64] 왼쪽의 삼각형을 클릭하겠습니다. 6번째 screen feature layer는 바로 앞서 설명드린 player_relative 레이어입니다.


player_relative: 화면 상에 어느 유닛이 동맹군이고, 어느 유닛이 적군이고, 그리고 중립 유닛인지 나타냅니다. 0은 배경, 1은 자기자신, 2는 동맹군, 3은 중립 유닛, 4는 적군 입니다. 


obs[0].observation["screen"][5]



자 드디어 제가 보여드리고 싶었던 feature layer에 도달했습니다. 64 x 64 레이어 안에 내 유닛인 마린이 1로 표시된 상태로 배열에 들어있는 것을 확인할 수 있지요.


그리고 적군인 저글링과 자폭유닛이 4444 로 우측에 표시된 것을 확인할 수 있습니다.


사실 오늘 알려드리고자했던 내용의 핵심은 바로 이것입니다.


pysc2 환경을 이해하기 위해 Debug 모드를 활용해라! 

이번 아티클에서도 따라하시느라 고생 많으셨어요 :) 다음에는 Action space에 대해서 설명드리도록 하겠습니다.




스타크래프트2 강화학습 스터디그룹을 모집 중입니다.

#실용주의머신러닝 시즌2 공지

안녕하세요! 다들 여름 휴가는 다녀오셨나요? 2주간의 휴가를 지나 더욱 강화되어 돌아온 스터디 공지입니다. 


[시즌2 주제]
스타크래프트2 강화학습 올인  


[시즌2 스터디 목표]
딥마인드랑 대결할 수 있는 강화학습 에이전트 개발


[시즌2 운영 방식]
첫 모임에서 팀을 선정하겠습니다.
매주 에이전트를 만들어서 최고 리워드 시합을 합니다.

그 주의 숙제를 안하면 그 주의 스터디 참석을 못합니다.
발표하시는 분은 숙제 면제.


>>> 시즌2 1회차 스터디 시간&장소 : 8월 31일 목요일 19:30, 판교


>>> 숙제(택1)
숙제1 : OpenAI gym에서 DQN으로 학습시킨 후 Tensorboard에 트레이닝 결과 출력
숙제2 : DQN, A3C 등 원하는 강화학습 알고리즘을 공부한 후 블로그 글을 작성


>>> 발표 (발표3 자원하실 분 웰컴!)
발표1 : 딥마인드 스타크래프트2 논문 리뷰
https://arxiv.org/abs/1708.04782
-강형석

발표2 : 스타크래프트1 Script 기반 인공지능 알고리즘 리뷰
http://www.entropyzero.org/broodwar_scripting_index.html

- 발표자를 기다리고 있습니다.

발표3 : 스타2 강화학습 DQN 구현체 리뷰 
-송호연 (Chris)

발표4 : A3C 강화학습 알고리즘 논문 발표
-김일두 (Curtis)


# 숙제는 다음주 화요일(29일) 자정까지 아래 링크에 제출해주시면 오프라인모임 단톡방에 초대해드립니다


https://goo.gl/forms/Y3BiKP2MSIQxsQX73

매거진의 이전글 스타2 강화학습 튜토리얼 - 1편

작품 선택

키워드 선택 0 / 3 0

댓글여부

afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari