카트폴 예제
강화학습을 실제로 볼 준비가 되셨나요? 이 튜토리얼에서는 AI가 움직이는 카트 위에서 막대를 수직으로 유지하는 방법을 배우는 것을 지켜볼 수 있는 고전적인 균형 유지 과제에 도전해 보겠습니다.
카트폴 과제는 단순함과 시각적 피드백을 결합하여 강화학습에 완벽한 환경을 제공합니다. 카트를 좌우로 밀면 물리 법칙에 따라 부착된 막대가 균형을 유지하거나 넘어집니다. 매 시간 단계마다 에이전트가 결정을 내리고, 알고리즘이 점차적으로 과제를 마스터해 나가는 모습을 지켜보는 만족감을 얻을 수 있습니다.
프로젝트 설정하기
시뮬레이션된 물리 환경을 제공하기 위해 SciSharp/Gym.NET을 사용할 것입니다.
따라하거나 원하는 경우 완성된 프로젝트를 다운로드할 수 있습니다.
필요한 패키지를 설치해 봅시다:
dotnet add package RLMatrixdotnet add package RLMatrix.Toolkitdotnet add package Gym.NETdotnet add package Gym.NET.Environmentsdotnet add package Gym.NET.Rendering.WinForm
환경 구축하기
다음은 카트폴 환경 구현입니다:
using System;using System.Threading.Tasks;using Gym.Environments.Envs.Classic;using Gym.Rendering.WinForm;using RLMatrix.Toolkit;using NumSharp;
namespace MyEnv{ [RLMatrixEnvironment] public partial class CartPoleEnvironment { private CartPoleEnv myEnv; private float[] myState; private int stepCounter; private const int MaxSteps = 100000; private bool isDone;
public CartPoleEnvironment() { InitialiseAsync(); }
private void InitialiseAsync() { myEnv = new CartPoleEnv(WinFormEnvViewer.Factory); ResetEnvironment(); }
[RLMatrixObservation] public float GetCartPosition() => myState[0];
[RLMatrixObservation] public float GetCartVelocity() => myState[1];
[RLMatrixObservation] public float GetPoleAngle() => myState[2];
[RLMatrixObservation] public float GetPoleAngularVelocity() => myState[3];
[RLMatrixActionDiscrete(2)] public void ApplyForce(int action) { if (isDone) ResetEnvironment();
var (observation, reward, done, _) = myEnv.Step(action); myEnv.Render(); myState = ToFloatArray(observation); isDone = done; stepCounter++;
if (stepCounter > MaxSteps) isDone = true; }
private float[] ToFloatArray(NDArray npArray) { double[] doubleArray = npArray.ToArray<double>(); return Array.ConvertAll(doubleArray, item => (float)item); }
[RLMatrixReward] public float CalculateReward() { return isDone ? 0 : 1; }
[RLMatrixDone] public bool IsEpisodeFinished() { return isDone; }
[RLMatrixReset] public void ResetEnvironment() { myEnv.Reset(); myState = new float[4] { 0, 0, 0, 0 }; isDone = false; stepCounter = 0; } }}
훈련 설정하기
이제 에이전트에게 균형을 가르칠 훈련 코드를 살펴보겠습니다:
using RLMatrix.Agents.Common;using RLMatrix;using MyEnv;
Console.WriteLine("Starting cart-pole training...\n");
// 학습 매개변수 구성var learningSetup = new PPOAgentOptions( batchSize: 8, ppoEpochs: 8, memorySize: 1000, gamma: 0.99f, width: 128, entropyCoefficient: 0.01f, lr: 1E-02f);
// 환경 생성 및 에이전트에 연결var environment = new CartPoleEnvironment().RLInit(maxStepsSoft: 1200, maxStepsHard: 1200);var env = new List<IEnvironmentAsync<float[]>> { environment, //new CartPoleEnvironment().RLInit() //여러 환경으로 훈련하려면 주석 해제};
// 에이전트 초기화var agent = new LocalDiscreteRolloutAgent<float[]>(learningSetup, env);
// 수렴할 때까지 훈련for (int i = 0; i < 100000; i++){ await agent.Step();}
Console.WriteLine("\nTraining complete!");Console.ReadLine();
시간 단계당 +1이라는 단순한 보상은 놀라울 정도로 강력합니다. 딥 강화학습 알고리즘은 자연스럽게 장기적인 목표를 최적화하여 미묘하고 선제적인 조정이 더 오래 균형을 유지하고 더 높은 누적 보상으로 이어진다는 것을 알아냅니다.
RLMatrix의 PPO: 무엇이 다른가요?
초기 튜토리얼에서 다룬 DQN은 간단한 작업에서 더 샘플 효율적일 수 있지만, PPO는 일반적으로 광범위한 하이퍼파라미터 튜닝 없이도 더 안정적인 훈련을 제공합니다. 이것이 특히 도전적인 제어 문제에 적합한 이유입니다.
알아야 할 메모리 절약 기법
훈련 코드의 다음 줄을 살펴보세요:
var environment = new CartPoleEnvironment().RLInit(maxStepsSoft: 1200, maxStepsHard: 1200);
이 얼핏 보기에는 평범한 매개변수 구성이 GPU 메모리를 압도하지 않고 매우 긴 에피소드로 훈련할 수 있는 비결을 담고 있습니다. 설명해 드리겠습니다:
이 값을 수정하면 어떻게 되나요?
var environment = new CartPoleEnvironment().RLInit(maxStepsSoft: 200, maxStepsHard: 1200);
이제 마법이 일어납니다:
- 처음 200단계에 대해서만 보상을 누적하고 그래디언트를 계산합니다
- 시뮬레이션은 1200단계까지 또는 실패할 때까지 자연스럽게 계속됩니다
- GPU 메모리 사용량이 크게 감소합니다
이 구성을 실행할 때 보상 그래프를 확인해 보세요 - 카트폴 물리 시뮬레이션이 그 지점 이후에도 계속되지만, 보상이 200(소프트 제한)을 초과하지 않는 것을 알 수 있습니다. 작업 관리자를 열고 실시간으로 메모리 절약을 확인해 보세요.
이 기술은 에피소드가 무기한 실행될 수 있는 복잡한 환경에서 필수적입니다. 메모리 부족 오류로 충돌하는 대신, 자연스러운 환경 역학을 유지하면서 얼마나 많은 계산 노력을 투자할지 정확하게 제어할 수 있습니다.
학습 과정 관찰하기
이 훈련을 실행하면 카트폴 환경을 보여주는 창이 나타납니다. 처음에는 막대가 빠르게 넘어질 것입니다 - 에이전트는 무엇을 해야 할지 전혀 모릅니다. 그러나 몇 분 내에 놀라운 변화를 목격하게 될 것입니다:
- 처음에는 에이전트가 전략 없이 무작위 움직임을 보입니다
- 그 다음 막대가 이미 떨어지고 있을 때 반응하기 시작합니다(너무 늦음!)
- 점차적으로 수정 동작을 더 일찍, 더 일찍 수행하는 법을 배웁니다
- 마지막으로, 미묘하고 선제적인 조정을 통해 막대를 완벽하게 균형 있게 유지합니다
이러한 눈에 보이는 진전이 카트폴을 학습 예제로서 만족스럽게 만듭니다. 그래프에서 숫자가 개선되는 것을 보는 것이 아니라, AI가 당신의 눈앞에서 기술을 발전시키는 것을 지켜보고 있는 것입니다.
이해도 테스트하기
카트폴 강화학습 이해하기
다음 단계
이 튜토리얼에서 당신은:
- 강화학습을 위한 실시간 물리 시뮬레이션을 설정했습니다
- 고전적인 제어 문제를 마스터하기 위한 완전한 에이전트를 구현했습니다
- 소프트/하드 종료 기법으로 메모리를 효율적으로 관리하는 방법을 배웠습니다
- RLMatrix의 PPO 구현이 표준과 어떻게 다른지 이해했습니다
다음으로, 툴킷을 사용하지 않고 동일한 환경을 구현하여 우리가 사용한 깔끔한 속성 뒤에서 무슨 일이 일어나고 있는지에 대한 통찰력을 얻을 것입니다.