컨텐츠로 건너뛰기

RLMatrix 시작하기

소개

전통적인 프로그램을 작성할 때, 우리는 컴퓨터에게 모든 상황에서 정확히 무엇을 할지 알려줍니다. 예를 들어, 숫자가 일치하는지 확인하는 프로그램을 작성하려면 다음과 같이 작성할 수 있습니다:

if (input == pattern)
{
return "정답입니다!";
}
else
{
return "다시 시도하세요!";
}

하지만 프로그램이 스스로 학습하길 원한다면 어떨까요? 규칙이 너무 복잡해서 작성하기 어렵거나, 우리 자신도 규칙을 완전히 알지 못한다면 어떨까요? 이럴 때 강화학습이 필요합니다.

프로젝트 설정하기

GitHub 저장소를 클론하여 따라할 수 있습니다. 먼저 모든 것을 설치해 봅시다:

NuGet을 통해 RLMatrix 설치하기
dotnet add package RLMatrix
dotnet add package RLMatrix.Toolkit

첫 번째 학습 환경

간단하지만 의미 있는 환경을 만들어 봅시다 - AI가 패턴을 일치시키는 방법을 배울 수 있는 환경입니다. 이것은 기본적으로 보이지만(직접 프로그래밍하기 쉬움), 필요한 모든 핵심 개념을 소개합니다.

다음은 완전한 환경 코드입니다:

PatternMatchingEnvironment.cs
using RLMatrix.Toolkit;
namespace PatternMatchingExample;
[RLMatrixEnvironment]
public partial class PatternMatchingEnvironment
{
private int pattern = 0;
private int aiChoice = 0;
private bool roundFinished = false;
// 마지막 50단계에 대한 간단한 카운터
private int correct = 0;
private int total = 0;
// 간단한 정확도 계산
public float RecentAccuracy => total > 0 ? (float)correct / total * 100 : 0;
[RLMatrixObservation]
public float SeePattern() => pattern;
[RLMatrixActionDiscrete(2)]
public void MakeChoice(int choice)
{
aiChoice = choice;
roundFinished = true;
// 카운터 업데이트
total++;
if (aiChoice == pattern) correct++;
}
[RLMatrixReward]
public float GiveReward() => aiChoice == pattern ? 1.0f : -1.0f;
[RLMatrixDone]
public bool IsRoundOver() => roundFinished;
[RLMatrixReset]
public void StartNewRound()
{
pattern = Random.Shared.Next(2);
aiChoice = 0;
roundFinished = false;
}
public void ResetStats()
{
correct = 0;
total = 0;
}
}

AI 훈련하기

이제 흥미로운 부분이 시작됩니다 - AI에게 패턴 일치를 가르치는 것입니다. 우리는 DQN(Deep Q-Network)이라는 알고리즘을 사용할 것입니다. 이름에 너무 신경 쓰지 마세요 - 이것은 AI에게 결정을 내리는 방법을 가르치는 한 가지 방법일 뿐입니다.

다음은 훈련을 설정하는 방법입니다:

Program.cs
using RLMatrix.Agents.Common;
using RLMatrix;
using PatternMatchingExample;
Console.WriteLine("패턴 일치 훈련을 시작합니다...\n");
// AI가 학습하는 방법 설정
var learningSetup = new DQNAgentOptions(
batchSize: 32, // 한 번에 32개의 경험으로부터 학습
memorySize: 1000, // 마지막 1000번의 시도를 기억
gamma: 0.99f, // 미래 보상을 많이 고려
epsStart: 1f, // 모든 것을 시도하며 시작
epsEnd: 0.05f, // 결국 잘 작동하는 것을 고수
epsDecay: 150f // 전환 속도
);
// 환경 생성
var environment = new PatternMatchingEnvironment().RLInit();
var env = new List<IEnvironmentAsync<float[]>> {
environment,
//new PatternMatchingEnvironment().RLInit() //병렬로 훈련할 환경을 더 추가할 수 있습니다
};
// 학습 에이전트 생성
var agent = new LocalDiscreteRolloutAgent<float[]>(learningSetup, env);
// 학습 시작!
for (int i = 0; i < 1000; i++)
{
await agent.Step();
if ((i + 1) % 50 == 0)
{
Console.WriteLine($"스텝 {i + 1}/1000 - 최근 50 스텝 정확도: {environment.RecentAccuracy:F1}%");
environment.ResetStats();
Console.WriteLine("\n계속하려면 Enter를 누르세요...");
Console.ReadLine();
}
}
Console.WriteLine("\n훈련 완료!");
Console.ReadLine();

이 코드를 실행하면 50단계마다 훈련 진행 상황이 표시됩니다:

훈련 진행 상황
패턴 일치 훈련을 시작합니다...
스텝 50/1000 - 최근 50 스텝 정확도: 48.0%
계속하려면 Enter를 누르세요...
스텝 100/1000 - 최근 50 스텝 정확도: 68.0%
계속하려면 Enter를 누르세요...
스텝 150/1000 - 최근 50 스텝 정확도: 86.0%
계속하려면 Enter를 누르세요...
스텝 200/1000 - 최근 50 스텝 정확도: 82.0%
계속하려면 Enter를 누르세요...

단순 일치를 넘어서

우리의 예제는 간단하지만, 동일한 원칙이 훨씬 더 복잡한 문제에도 적용됩니다:

이해도 테스트

강화학습 기초 이해하기

다음 단계

더 나아갈 준비가 되셨나요? 다음 단계로 갈 수 있습니다:

우리는 두 가지 주요 알고리즘을 사용할 수 있습니다:

  • DQN: 방금 사용한 것으로, 단순한 선택에 좋으며 큰 리플레이 메모리의 이점을 누립니다.
  • PPO: 더 고급으로, 연속적인 행동(속도나 방향 제어와 같은)을 처리합니다.