앎을 경계하기

Machine Learning/Unity ML-Agent

텐서플로와 유니티 ML-Agent로 배우는 강화학습(1-2) ML-Agents 개요

양갱맨 2019. 12. 28. 23:51

Brain

모든 에이전트에 할당해야하는 요소.

에이전트가 환경에서 어떠한 행동을 하기 위해서는 꼭 이 브레인이 필요하다.

  1. Player Brain
  2. Heuristic Brain
  3. Learning Brain

공통 요소

Copy Brain Parameters from

다른 브레인의 파라미터를 복사할 때 사용한다.

Vector Observation

Space SizeStacked Vectors를 설정할 수 있다.

  • space size : AddVectorObs로 추가했던 observation의 수와 동일하게 설정해줘야한다. 값이 동일하지 않으면 에러가 발생한다.
  • stacked size : observation을 설정한 stacked size 값만큼 이어붙여서 observation vector수가 늘어나게 되며 이를 최종 관찰로 사용한다. stacked size를 사용하면 일정 step의 관측이 한 번에 보이기 때문에 시간과 관련된 정보를 인지할 수 있게 된다.

Visual Observations

시각적 관측을 추가하고 해당 관측의 크기 또는 색상에 대한 설정을 수행할 수 있다.

에이전트 부분에서 설정한 카메라나 렌더텍스쳐 수에 맞게 Add New 버튼으로 visual observation을 추가한다.
Width, Height를 설정하면 기본적으로 RGB채널로 구성된다. Gray 체크하면 grayscale로 처리한다.

Vector Action

Space Type에서 Discrete와 Countinuous 중 하나를 선택하면 각 선택한 행동 타입에 따라 설정이 달라지게 된다.

  • Discrete : Branch Size에서 액션의 개수를 설정한다. Branch Size에 준 값만큼 Branch가 생성되고 각 브랜치에 액션의 개수를 입력하고 각 브랜치에 대한 설명은 Branch Descriptions에 적으면 된다.

  • Contiuous : Space Size에서 액션의 개수를 설정한다. Action Descriptions에서 행동에 대한 설명을 적는다.

Player Brain

각 액션에 대해 키보드의 키를 할당하고 해당 키를 누르면 에이전트는 해당 키에 할당된 액션을 한다.

Discrete 경우,

branch size = 2로 설정.

첫번째 브랜치는 3개의 행동, 두 번째 브랜치는 2개의 행동으로 구성된다.

branch 0에서 1번 행동(value=0)에 space bar로 설정, 2번 행동은 up arrow, 3번 행동은 down arrow로 설정.

branch 1에서 1번 행동 left arrow, 2번 행동 right arrow로 설정.

설정한 키들을 누르게되면 vectorAction[branch num]는 value값을 반환할 것이다.

AgentAction함수에 이 값들로부터 에이전트를 제어하기 위해 코드를 작성해야한다.

Continuous 경우,

space size = 2로 설정.

1번 행동(element 0)의 설명은 Up, Down으로 2번 행동의 설명은 Left, Right로 작성(description은 필수 항목이 아니다.)

Key Continuous Player Actions에서 size를 4로 설정하고 size만큼 생성된 element에 key, index, value를 설정한다.

Axis Continuous Player Actions 에서는 특정 key가 아니라 Axis를 사용한다.

Horizontal, Vertical로 수직 수평을 사용할 수 있다.(화살표 방향기와 wasd키가 button이 된다.)

Size를 2로 설정하면 Vertical, Horizontal 속성이 생기고, Axis, Index, Scale을 지정하면 positive value, negative value가 각 버튼입력에 따라 반환되게 된다.


Heuristic Brain

사람이 직접 코드를 작성한 대로 에이전트가 제어된다.

ML-Agents에서 제공하는 스크립트 중 Decision 스크립트를 사용한다.

using UnityEngine;
using MLAgents;

public class HeuristicLogic : Decision{
    public override float[] Decide(){}
    public override List<float> MakeMemory(){}
}

Decide()와 MakeMemory() 두 함수가 있다.

Decide()

Decide 함수는 현재 에이전트의 상태, 보상 등을 입력받아서 브레인에서 설정한 행동의 종류에 따라 알맞은 행동을 반환한다.

파일 이름 처럼 행동을 결정하는 코드를 작성하는 것.

연속적인 행동은 행동의 개수에 해당하는 실수 배열을 반환한다. 이산적 행동은 브랜치 수의 정수 배열을 반환한다.

MakeMemory()

현재 step에서 에이전트에 대한 상태, 보상 등을 memory라는 list 형태로 저장해서 next step의 decide, makememory함수에 전달한다.

Next step에서의 Decide 함수는 이전 step과 현 step의 에이전트 정보를 통해 행동을 선택할 수 있다.

이전 스텝의 정보가 필요없는 경우엔 list를 비워놓으면 된다.

example code // 에이전트가 랜덤 액션을 취하는 코드

public class RandomDecision : Decision{

    public override float[] Decide(
        List<float> vectorObs,
        List<Texture2D> visualObs,
        float reward,
        bool done,
        List<float> memory
    ){
        //action type이 continuous 라면
        if (brainParameters.vectorActionSpaceType == SpaceType.continuous){
            List<float> act = new List<float>();

            for(int i = 0; i < brainParameters.vectorActionSize[0]; i++){
                act.Add(2 * Random.value - 1);    //0부터 액션 수 -1 만큼 반복하여 act list에 랜덤 값(-1~1)이 추가된다.
            }
            return act.ToArray();
        }
        //action type이 discrete 라면
        else{
            float [] act = new float[brainParameters.vectorActionSize.length];
            for(int i = 0; i < brainParameters.vectorActionSize.Length; i++){
                act[i] = Random.Range(0, brainParameters.vectorActionSize[i]);    //0부터 액션 수 -1 만큼 반복하여 0 ~ 액션 수-1 중 랜덤으로 정수값 하나 추출
            }
            return act;
        }
    }

    public override List<float> MakeMemory(
    List<float> vectorObs,
    List<Texture2D> visualObs,
    float reward,
    bool done,
    List<float> memory
    ){
        return new List<float>();    // 이전 스텝의 메모리를 사용하지 않기 때문에 빈 리스트를 반환한다.
    }
}

Learning Brain

학습을 시키거나 학습된 모델을 가지고 테스트하는 브레인이다.

설정에 따라 달라진다.

학습을 위한 설정

파이썬 코드와 통신하고 정보를 주고 받을 때 아카데미를 통해 설정해야한다.

Academy 부분에서 Broadcast Hub에 브레인을 추가하여 learning brain을 할당하고 control 항목을 체크해서 환경을 빌드한다.

학습된 모델의 테스트를 위한 설정

외부 통신 가능한 유니티 환경을 빌드한다.

그리고 기존 유니티 ML-Agents에서 제공하는 ppo, bc 알고리즘으로 학습을 시킨다.

이 때 생성된 nn파일을 유니티 프로젝트에서 brain object의 Model부분에 추가한다.

이후 아카데미에서 Control 항목을 체크 해제하고 게임 play를 해보면 학습 모델에 따라 유니티 에이전트가 게임을 수행한다.