컨텐츠로 건너뛰기

연속적인 행동 다루기

이전 튜토리얼의 프로젝트로 시작하여 연속적인 행동을 추가해 봅시다. 시작 프로젝트를 따라하거나, 원하신다면 완성된 프로젝트를 확인하세요.

이산 vs. 연속 행동

이전 가이드에서는 이산적인 행동을 다루었습니다 - 우리의 에이전트는 패턴과 일치시키기 위해 유한한 옵션 세트(0 또는 1) 중에서 선택해야 했습니다. 실제 시나리오에서는 어떤 버튼을 누를지 결정하기 위해 다양한 센서 데이터와 시각적 입력을 받을 수 있습니다.

그러나 많은 실제 응용 프로그램에서 이것이 항상 가능한 것은 아닙니다. 다음과 같은 것들을 제어하기 위해:

  • 차량의 조향 각도
  • 로봇 팔의 관절 토크
  • 엔진의 전력 수준

우리의 에이전트는 범주형 선택이 아닌 정확한 부동 소수점 값인 연속적인 행동을 출력해야 합니다.

환경에 연속적인 행동 추가하기

우리의 환경을 수정하여 이산적 행동과 연속적 행동을 모두 포함하도록 합시다. 원래의 패턴 일치 작업을 유지하되, AI가 이 새로운 값의 제곱근을 출력하기를 기대하는 두 번째 패턴을 추가할 것입니다.

우리의 기대치 외에는 아무것도 변경하지 않는다는 점에 주목하세요—에이전트는 오직 보상 신호에 의해 안내되어 시행착오를 통해 우리가 원하는 것을 파악해야 합니다!

먼저, PatternMatchingEnvironment.cs에 두 번째 패턴과 연속적 행동을 추적하기 위한 새 필드를 추가합니다:

PatternMatchingEnvironment.cs
private int pattern = 0;
private int pattern2 = 0;
private int aiChoice = 0;
private float aicontinuousChoice = 0f;
private bool roundFinished = false;

다음으로, 두 번째 관찰 메서드와 연속적 행동 메서드를 추가합니다:

PatternMatchingEnvironment.cs
[RLMatrixObservation]
public float SeePattern() => pattern;
[RLMatrixObservation]
public float SeePattern2() => pattern2;
[RLMatrixActionContinuous]
public void MakeChoiceContinuous(float input)
{
aicontinuousChoice = input;
}

이제 보상 함수를 생성해 봅시다:

PatternMatchingEnvironment.cs
[RLMatrixReward]
public float GiveReward() => aiChoice == pattern ? 1.0f : -1.0f;
// AI의 연속적 출력이 두 번째 패턴의 제곱근에 가까울 때 +2 보상 추가
[RLMatrixReward]
public float ExtraRewards() => Math.Abs(aicontinuousChoice - Math.Sqrt(pattern2)) < 0.1f ? 2f : 0.0f;

마지막으로, 두 패턴을 모두 생성하도록 StartNewRound 메서드를 업데이트해야 합니다:

PatternMatchingEnvironment.cs
[RLMatrixReset]
public void StartNewRound()
{
pattern = Random.Shared.Next(2);
pattern2 = Random.Shared.Next(10);
aiChoice = 0;
roundFinished = false;
}

pattern2에 0-9 범위를 사용하고 있는데, 이는 에이전트에게 다양한 제곱근을 예측하는 더 흥미로운 도전을 제공합니다.

컴파일 오류 수정하기

솔루션을 빌드하려고 하면 일련의 오류가 발생합니다. 이는 실제로 도움이 됩니다—RLMatrix는 런타임 오류를 방지하고 연속적 행동에 대한 올바른 구현으로 안내하기 위해 강력한 타입 지정을 사용합니다.

오류 1: 환경 타입 불일치

Argument 1: cannot convert from 'PatternMatchingExample.PatternMatchingEnvironment' to 'RLMatrix.IEnvironmentAsync<float[]>'

이것은 RLMatrix가 타입 안전성을 보장하기 위해 연속적 환경과 이산적 환경에 대해 서로 다른 인터페이스를 가지기 때문에 발생합니다. Program.cs에서 코드를 업데이트합시다:

Program.cs - 환경 타입
var env = new List<IEnvironmentAsync<float[]>> {
var env = new List<IContinuousEnvironmentAsync<float[]>> {
environment,
//new PatternMatchingEnvironment().RLInit() //you can add more than one to train in parallel
};

오류 2: 에이전트 타입 불일치

이 변경 후, 두 번째 오류가 발생합니다:

Argument 2: cannot convert from 'System.Collections.Generic.List<RLMatrix.IContinuousEnvironmentAsync<float[]>>' to 'System.Collections.Generic.IEnumerable<RLMatrix.IEnvironmentAsync<float[]>>'

이는 연속적인 환경에서 이산적인 에이전트를 사용하려고 하기 때문입니다. 에이전트 타입을 변경해야 합니다:

Program.cs - 에이전트 타입
var agent = new LocalDiscreteRolloutAgent<float[]>(learningSetup, env);
var agent = new LocalContinuousRolloutAgent<float[]>(learningSetup, env);

오류 3: 알고리즘 옵션 불일치

이로 인해 세 번째 오류가 발생합니다:

Argument 1: cannot convert from 'RLMatrix.DQNAgentOptions' to 'RLMatrix.PPOAgentOptions'

이 마지막 오류는 DQN이 연속적인 행동과 호환되지 않음을 보여줍니다. 이산적 행동 공간과 연속적 행동 공간을 모두 처리할 수 있는 PPO(Proximal Policy Optimization)로 전환해야 합니다:

Program.cs - 알고리즘 옵션
var learningSetup = new DQNAgentOptions(
batchSize: 32,
memorySize: 1000,
gamma: 0.99f,
epsStart: 1f,
epsEnd: 0.05f,
epsDecay: 150f
);
var learningSetup = new PPOAgentOptions(
batchSize: 128,
memorySize: 1000,
gamma: 0.99f,
width: 128,
lr: 1E-03f
);

첫 번째 훈련 실행

이제 훈련을 실행하고 어떤 일이 발생하는지 봅시다:

훈련 출력
Step 800/1000 - Last 50 steps accuracy: 42.0%
Press Enter to continue...
Step 850/1000 - Last 50 steps accuracy: 38.0%
Press Enter to continue...
Step 900/1000 - Last 50 steps accuracy: 40.0%
Press Enter to continue...
Step 950/1000 - Last 50 steps accuracy: 38.0%
Press Enter to continue...
Step 1000/1000 - Last 50 steps accuracy: 37.0%
Press Enter to continue...

놀랍게도! AI는 거의 학습하지 못하고 있습니다. 정확도가 50%를 넘지 못하며, 대시보드를 확인해보면 이산적 행동(패턴 일치)에 대해 +1 보상을 정기적으로 수집하지만 연속적 행동(√pattern2 예측)에 대한 +2 보상은 거의 얻지 못하는 것을 볼 수 있습니다.

왜 이런 일이 발생하나요?

자문해 보세요: 왜 AI는 연속적인 행동보다 이산적인 행동을 훨씬 더 쉽게 배울까요?

첫 번째 직감은 학습률(lr)일 수 있습니다—너무 낮은 것일까요? 1E-02f로 변경하고 훈련을 다시 실행해 봅시다…

도움이 되었나요? 아마도 그렇지 않을 것입니다. 사실, 에이전트가 이산적 행동을 더 빨리 배우는 동안 연속적인 행동 공간을 거의 탐색하지 않으며, 훈련이 진행됨에 따라 정확도가 더 나빠지는 것을 알 수 있습니다.

그렇다면 실제로 무슨 일이 일어나고 있을까요?

안내 신호 추가하기

더 유용한 보상 신호를 제공하여 이 문제를 해결해 봅시다. 정확한 일치만 보상하는 대신, 에이전트가 올바른 제곱근에 가까워질수록 증가하는 보상을 추가할 것입니다:

PatternMatchingEnvironment.cs
[RLMatrixReward]
public float ExtraSupportingReward() => 0.5f / (1 + Math.Abs(aicontinuousChoice - (float)Math.Sqrt(pattern2)));
//학습률을 다시 1E-03f로 설정하는 것을 잊지 마세요!

이 보상 함수는 그라디언트를 생성합니다—에이전트가 올바른 값에 접근할수록 더 강해지는 연속적인 신호입니다. 정확히 맞지 않더라도, “더 따뜻해지고” 있는지 아니면 “더 차가워지고” 있는지에 대한 피드백을 얻습니다.

이 변경 사항으로 훈련을 다시 실행하고 어떤 일이 발생하는지 봅시다:

훈련 출력
Step 850/1000 - Last 50 steps accuracy: 35.0%
Press Enter to continue...
Step 900/1000 - Last 50 steps accuracy: 40.0%
Press Enter to continue...
Step 950/1000 - Last 50 steps accuracy: 47.0%
Press Enter to continue...
Step 1000/1000 - Last 50 steps accuracy: 36.0%
Press Enter to continue...

약간의 개선이 보이지만, 여전히 좋지 않습니다. 대시보드에는 학습이 진행되고 있다는 힌트가 표시될 수 있지만, 분명히 이 더 복잡한 작업에는 더 많은 훈련 시간이 필요합니다.

훈련 시간 연장하기

연속적인 행동 예측과 같은 더 복잡한 도전에는 종종 더 많은 훈련 단계가 필요합니다. 프로그램을 수정하여 1,000 단계 대신 10,000 단계 동안 훈련해 봅시다:

Program.cs
for (int i = 0; i < 10000; i++)
{
await agent.Step();
if ((i + 1) % 500 == 0)
{
Console.WriteLine($"Step {i + 1}/10000 - Last 500 steps accuracy: {environment.RecentAccuracy:F1}%");
environment.ResetStats();
Console.WriteLine("\nPress Enter to continue...");
Console.ReadLine();
}
}

실험: 학습률의 영향

더 긴 훈련 진행 상황을 지켜보면서, 다양한 학습률로 실험해 보세요. 더 낮추면 어떻게 될까요? 크게 올리면 어떻게 될까요?

제 실험에서는 학습률을 매우 높게 설정하면 모델이 이산적 행동에 대한 +1 보상만 수집하는 데 고착되고 연속적인 공간을 충분히 탐색하지 못하게 됩니다.

핵심 요점

이 연습을 통해 우리는 몇 가지 중요한 교훈을 배웠습니다:

  1. 연속적인 행동은 이산적인 행동보다 본질적으로 배우기 어렵습니다. 희소 보상 문제 때문입니다. 가능하다면 행동 공간을 이산화하세요!

  2. 보상 엔지니어링은 연속적인 제어 문제에서 엄청나게 중요합니다. “더 따뜻해지고 있다”는 신호를 제공하면 불가능한 학습 작업이 다룰 수 있는 것으로 변합니다.

  3. 복잡한 작업에는 더 많은 훈련 시간이 필요합니다. 행동 공간에 차원을 추가함에 따라 훈련 기간을 적절히 확장해야 합니다.

  4. 알고리즘 선택이 중요합니다. DQN은 연속적인 행동을 전혀 처리할 수 없는 반면, PPO는 이산적, 연속적 또는 혼합 행동 공간을 처리할 수 있습니다.

  5. 학습률 조정은 섬세합니다, 특히 PPO에서는. 더 높은 것이 항상 더 좋은 것은 아니며 때로는 탐색에 더 안 좋을 수 있습니다.

이러한 원칙들은 RLMatrix로 더 복잡한 강화학습 도전을 해결할 때 도움이 될 것입니다.

이해도 테스트

연속적인 행동 이해하기

다음 단계

이제 연속적인 행동 공간의 도전과 이를 해결하는 방법을 이해했으니, 더 복잡한 관찰이 있는 고전적인 강화학습 문제를 시도할 준비가 되었습니다.