brunch

You can make anything
by writing

C.S.Lewis

by Chris송호연 Apr 17. 2018

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

Action Space에 대한 이해

안녕하세요- 강화학습 남친 송호연입니다. 

3편에서는 Action space에 대해 설명드리기로 했는데요-


Atari 게임에서 유저에게 입력받는 명령들은 아주 단순합니다.

아주 단순한 Pong 같은 게임에서는 위 아래 방향키 두 개만으로 게임을 할 수가 있죠.



Action Space란 우리가 게임을 플레이할 때 게임 환경에 입력하는 입력값이라고 이해하시면 됩니다. 



Deepmind가 DQN알고리즘을 발표하면서 활용했던 게임이 atari였던 이유 중 하나는 비교적 게임의 input과 output이 단순한 점이었을 거라고 생각합니다.


하지만 우리가 배워볼 스타크래프트2의 강화학습 환경은 정말 복잡합니다. 스타크래프트2의 강화학습 Action Space가 어떻게 구성되어있는지 확인해보겠습니다.



StarCraft II 의 Action Space는 여러 명령의 조합으로 이루어져있습니다. 스타크래프트2 학습환경은 기존의 아타리 게임과 크게 다른 점이 있는데, 바로 마우스카메라입니다. 


예를 들어서, 사람은 SCV를 선택할때 SCV근처에 마우스 클릭으로 영역을 만들어서 선택합니다. 스타크래프트2 강화학습에서도 사람과 동일한 과정을 거쳐서 SCV를 선택하게 됩니다. 


SCV를 사람이 선택할 때는 이렇게 3단계를 거쳐서 명령을 전달하게 됩니다.


- SCV 좌측 상단에서 마우스 왼쪽 버튼을 누른다.

- 마우스를 누른 상태로 SCV 우측 하단까지 움직인다.

- 마우스 버튼에서 손을 땐다


스타크래프트2에서는 위와 같은 명령을 할 때 이런 명령어들을 조합합니다. 이런 명령어들의 조합은 Base Action의 종류에 따라 결정됩니다. 


Base Action: select_rect (3)

Sub Action: (false)

Point1: (10, 12)

Point2: (20, 19)


1) Base Action: select_rect 


우선 사각형의 선택영역을 지정해서 유닛을 선택하는 Base Action의 명령번호를 알아야 합니다.

pysc2 안에 해당 명령어를 확인할 수 있는 소스코드가 존재하는데요, 링크를 공유해드리겠습니다.


https://github.com/deepmind/pysc2/blob/master/pysc2/lib/actions.py#L351

select_rect 명령은 3번입니다. 


select_rect 명령을 수행하기 위해선 3가지 파라미터가 더 필요합니다. sub_action과 point1, point2입니다. 3가지 파라미터에 대해서 설명드리겠습니다 pysc2/lib/actions.py 파일의 242라인을 보시면, select_rect 명령을 수행하기 위해 필요한 3가지 파라미터를 확인할 수 있습니다. 


https://github.com/deepmind/pysc2/blob/master/pysc2/lib/actions.py#L242


우리가 select_rect라는 명령을 수행하기 위해 필요한 파라미터는 3가지입니다. select_add, screen, screen2 입니다. 


2) Sub Action: select_add


먼저, select_add를 알아볼게요- False와 True로 이루어져있는데요. 간단합니다. 우리가 SCV를 선택할 때 [Shift] 키를 누른 상태로 유닛을 선택하면 기존 유닛에서 더 추가가 되죠? 바로 그 역할을 합니다. 유닛을 선택하되 기존에 선택된 유닛에 추가로 더 선택을 하고자 하는 것인지 선택합니다. 


https://github.com/deepmind/pysc2/blob/master/pysc2/lib/actions.py#L242


3) Screen1: Point() x,y 좌표


마우스를 누르는 순간의 x,y좌표를 입력하는 파라미터입니다.

https://github.com/deepmind/pysc2/blob/master/pysc2/lib/actions.py#L201


4) Screen2: Point() x,y 좌표

마우스를 떼는 순간의 x,y 좌표를 입력하는 파라미터입니다.

종합을 해보겠습니다. 우리가 환경에 보내게 되는 명령어는 이렇게 구성되어있습니다.


action:

[3, 0, [[10,12], [20,19]]]


스타크래프트2 환경에 명령을 보낼 때 실제 명령 데이터는 이렇게 숫자 배열로 이루어져있습니다. 

다시 한번 저 명령어를 해석해보자면 이렇습니다.


3 : Base Action 명령어, select_rect

0 : Sub Action 파라미터, select_add [True, False]

[10,12] : Point1 파라미터, screen [[0~63, 0~63]]

[20,19] : Point2 파라미터, screen2 [[0~63, 0~63]]


스타크래프트2의 명령어 구조는 이런식으로 명령어들의 조합으로 이루어지게 됩니다. 그래서 계산을 한번 해볼 수 있는데요- 제가 계산을 해봤을 때는 약 1억 가지 이상의 조합이 가능하기 때문에, 스타크래프트2가 정말 어려운 강화학습 문제라는 것을 실감할 수 있죠.


5) available_actions: 현재 수행 가능한 Base Action의 종류


한 가지 더, 스타크래프트2에는 available_actions라는 개념이 있습니다. 만약에 여러분이 마린을 선택하지 않으셨다면, 여러분은 스팀팩 스킬을 사용할 수 없습니다. 그리고 SCV를 선택한 상태가 아니라면, 빌딩을 건설할 수가 없겠죠.


그래서 스타크래프트2 환경에서는 available_actions 라는 파라미터를 전달해줍니다. 그래서, 저 같은 경우엔 매번 스타크래프트2 환경에서 available_actions 파라미터를 받아서 현재 불가능한 명령어들을 제거해줍니다. 


오랜만에 스타크래프트2 강화학습 튜토리얼을 작성했습니다. 앞으로 좀 더 꾸준히 업데이트 해서 많은 분들이 스타크래프트2 강화학습에 참여하실 수 있도록 해보겠습니다!!



저와 함께 Clova AI Research에서 강화학습을 활용한 연구를 하실 분을 찾습니다!! 


  소개

  - 회사의 핵심역량에 기여할 수 있는 AI 에이전트를 개발합니다


  주요업무

  - 회사의 핵심역량에 기여할 수 잇는 인공지능 엔진 및 서비스 개발

  - 인공지능 응용 제품의 프로토타입 개발


  지원자격

  - 프로그램 개발 경력 2년 이상 (석/박사 과정 기간 포함)


  우대

  - 머신러닝/딥러닝에 대한 개념적인 이해가 있으신 분

  - 텐서플로나 파이토치 등을 이용해 간단한 딥러닝 모델 및 응용 프로그램을 구현해보신 분

  - 대용량 데이터 처리 경험이 있으신 분

 - 빠른 개발 속도
 - Javascript 및 Python 프로그래밍 능력
 - 적극적인 문제 해결능력
 - 빠른 학습 속도
 - 비즈니스 인사이트

관심 있으신 서버 개발자, 데이터 엔지니어, 풀스택 엔지니어, 머신러닝 엔지니어 분들!
chris.ai@navercorp.com 으로 이력서를 보내주세요! :)


채용 항목 중 10) 클로바 인공지능 엔진 및 서비스 개발, 여기로 지원해주시면 됩니다 :)

http://recruit.navercorp.com/naver/job/detail/developer/?annoId=20000597



매거진의 이전글 정보 이론 2편: KL-Divergence
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari