RL

[파이토치와 유니티 ML-Agents로 배우는 강화학습] 2장 정리

MINAIR 2025. 3. 16. 18:30

📌 본 포스팅은 <파이토치와 유니티 ML-Agents로 배우는 강화학습> 교재에 기반해 작성되었습니다. 

 

1. 유니티와 ML-Agents


1.1 유니티 (Unity)

유니티는 2D/3D 게임을 개발하기 위한 환경을 제공하는 게임 엔진이다. 유니티는 게임 개발을 위한 언어로 C#과 자바스크립트를 지원한다. (본 교재에서는 C#을 이용한다.)

유니티를 이용해 개발된 환경들

에셋스토어 (asset store)

에셋스토어는 다양한 개발자들이 제공하는 유료 및 무료 에셋들을 불러오고 사용할 수 있는 페이지다. 에셋이란, 어떤 물체의 텍스처, 게임을 구성하는 2D/3D 모델, 모델에게 움직임을 부여해주는 애니메이션 등이다. 처음부터 게임 환경을 구축하기란 어렵기 때문에 에셋스토어에서 이미 만들어진 에셋을 구매/내려받아 사용할 수 있다. (e.g., LLM을 처음부터 pre-train하기 어려우므로 이미 pre-train된 모델을 hugging face로부터 불러오는 개념이라고 이해할 수 있다.)

 

유니티 학습

유니티는 처음 유니티를 접하는 개발자들을 위해 자체적으로 학습 프로그램 (튜토리얼)을 제공한다. 

 

1.2 ML-Agents

ML-Agents는 유니티를 이용한 강화학습 에이전트 학습을 지원하는 다양한 기능을 제공한다. 

 

ML-Agents가 필요한 이유

왜 강화학습에 ML-Agents가 필요할까? 강화학습은 학습 특성 상 다양한 경험이 필요하다. 다양한 경험을 하려면 기본적으로 시간이 많이 드는데, 시뮬레이션을 이용하면 학습 시간을 크게 단축시킬 수 있다. 또한 에이전트에게는 좋은 경험뿐 아니라 나쁜 경험도 필요한데, 시뮬레이션을 이용하면 나쁜 경험을 해도 문제가 없다. 따라서 강화학습은 시뮬레이션을 이용해 학습 및 검증을 수행한다. 

 

강화학습을 진행하는 에이전트는 파이썬 언어로 구현하고 환경은 유니티에서 C# 언어로 구현된다. 따라서 강화학습 알고리즘과 환경은 서로 다른 프로그래밍 언어로 구현된 독립적인 프로그램이며, 이 둘 사이에 상태, 행동, 보상을 주고 받을 수 있는 통신이 필요하다. 이 통신을 지원하는 것이 바로 ML-Agents다. ML-Agents를 이용하면 프로그램 간 싱크도 잘 맞고, 안정적인 통신을 수행할 수 있으며, 몇 가지 간단한 설정만으로 유니티로 제작한 환경을 강화학습 환경으로 만들 수 있다. 

 

 

2. 유니티 설치 및 기초 조작법

 

  • 하이라키 창 (hierarchy window): 현재 씬 (scene)에 포함된 모든 게임 오브젝트들의 목록을 보여 준다. 게임 오브젝트란 게임을 구성하는 모델, 카메라, 빛과 같은 모든 요소를 의미한다. 
  • 씬 뷰 (scene view) & 게임 뷰 (game view): 현재 제작 중인 환경을 보여준다. 씬 뷰는 게임 오브젝트를 선택하고 배치할 수 있고 게임 뷰는 카메라를 통해 실제 게임 실행 화면을 볼 수 있다. 
  • 인스펙터 창 (inspector window): 현재 선택한 오브젝트와 관련된 모든 속성과 컴포넌트가 표시 & 편집 가능하다. 
  • 프로젝트 창 (project window): 프로젝트 창에 있는 요소 (폴더)들을 드래그 앤 드롭으로 하이라키 창과 씬 뷰에 손쉽게 옮겨올 수 있다.  
  • 콘솔 (console): 오류, 경고 메시지를 띄운다. 

  • 툴 바 (tool bar)
    • hand 툴: hand 툴을 클릭하고 움직이면 화면을 회전하며 움직일 수 있다. 
    • move 툴: 씬 뷰의 게임 오브젝트 선택 -> move 툴 클릭 -> 오브젝트의 축을 드래그하면 그 축의 방향대로 오브젝트를 이동시킬 수 있다. 
    • rotate 툴: 씬 뷰의 게임 오브젝트 선택 -> rotate 툴 클릭 -> 원하는 방향으로 오브젝트를 회전시킬 수 있다. 
    • scale 툴: 씬 뷰의 게임 오브젝트 선택 -> scale 툴 클릭 -> 원하는 방향으로 오브젝트의 크기를 조절할 수 있다. 
    • rect 툴: 씬 뷰의 게임 오브젝트 선택 -> rect 툴 클릭 -> 오브젝트의 크기 변경 & 오브젝트 이동
    • transform 툴: 씬 뷰의 게임 오브젝트 선택 -> transform 툴 클릭 -> move 툴과 rotate 툴이 나타남 & 가운데 회색 상자를 조절하여 scale 툴의 기능도 가능하다. 또한 가운데 삼색의 상자를 이용해 rect 툴처럼 오브젝트를 이동시킬 수도 있다.
    • 툴바의 가운데: 순서대로 play (환경을 실행해 제작한 게임을 직접 플레이해 볼 수 있다), pause (실행했던 게임을 잠시 중단시킨다), step (환경을 한 스텝씩 실행할 수 있다; 슬로우 모션처럼)
    • 툴바의 가장 오른쪽: layout은 창들의 배치를 조절하는 도구다. (지금은 default)

Mac에서 마우스 조작하는 법

  • 화면 확대, 축소: 원래 맥에서 하듯이 확대/축소 가능
  • 오브젝트 확대, 축소: 두 손가락을 동시에 이동
  • 화면 회전: 두 손가락으로 클릭한 후 이동

 

3. ML-Agents 설치

ML-Agents는 유니티와 파이썬에서 따로 설치해야 한다. 

  • ML-Agents는 유니티에 설치되어 유니티로 만든 환경에 다양한 강화학습과 관련된 설정을 수행할 수 있도록 한다. 
  • ML-Agents는 파이썬에 설치되어 ML-Agents에서 제공하는 다양한 강화학습 알고리즘을 사용할 수 있으며, 파이썬 코드를 통해 유니티 환경과 통신할 수 있도록 한다. 

4. 3D Ball 예시

3D ball은 파란 상자가 머리 위의 공을 떨어뜨리지 않도록 학습하고 이를 시뮬레이션하는 태스크다.

 

하이라키 창에서 3D ball -> Agent를 클릭하면 인스펙터 창에 3D ball 하나에 대한 정보가 뜬다.

  • behavior parameters
    • behavior name: behavior parameters의 이름
    • vector observation: space size (e.g., x, y, z축...의 개수) / stacked vector (e.g., 몇 개의 스텝 사이즈를 스택할 것인가?)
    • action: continuous branch / discrete action의 행동 수를 조절할 수 있다.
      • continuous action: 3D ball의 경우 2개의 축에 대한 회전을 제어하기 위해 continuous action = 2로 설정한다. 
      • discrete branch: branches는 행동에 대한 그룹을 의미
        • Branches = 1, Branch 0 size=4: 하나의 행동 그룹에 [왼쪽, 오른쪽, 위, 아래] 네 가지의 가능한 행동이 있다.
        • Branches = 2, Branch 0 size = 3, Branch 1 size = 3: 두 개의 행동 그룹에 각각 [정지, 위, 아래]와 [정지, 왼쪽, 오른쪽]의 가능한 행동이 있다. 그래서 두 개의 Branch가 합쳐져서 오브젝트가 행동하게 된다. 예를 들어 Branch 0에서 위, Branch 1에서 오른쪽으로 행동하면 오브젝트는 오른쪽 대각선으로 이동하게 된다. 
    • model: ML-agents에서 제공하는 알고리즘으로 학습하는 방식인 mlagents-learn을 이용해 학습된 에이전트의 모델을 사용할 수 있다. 
      • default: .nn 또는 .oxn 파일이 있다면, 그 파일의 모델 학습 결과대로 에이전트가 inference를 수행한다. 없다면 heuristic하게 사용자가 정한 규칙에 따라 inference를 수행한다. 
      • heuristic only: 만약 적용된 모델이 없다면 에이전트는 정해진 규칙에 따라 혹은 사람이 조절하는 대로 행동한다.
      • inference only: 적용된 모델의 학습 결과대로 에이전트가 inference를 수행한다. 

space size, stacked vector의 정의 / stacked vector를 사용하는 이유
agent의 action 수 조절 / Branches = 1, Branch 0 size=4 / Branches = 2, Branch 0 size = 3, Branch 1 size = 3

 

  • agent script
    • max step: 한 번의 에피소드의 최대 타임 스텝 횟수.