RLMatrix 시작하기
소개
전통적인 프로그램을 작성할 때, 우리는 컴퓨터에게 모든 상황에서 정확히 무엇을 할지 알려줍니다. 예를 들어, 숫자가 일치하는지 확인하는 프로그램을 작성하려면 다음과 같이 작성할 수 있습니다:
if (input == pattern){ return "정답입니다!";}else{ return "다시 시도하세요!";}
하지만 프로그램이 스스로 학습하길 원한다면 어떨까요? 규칙이 너무 복잡해서 작성하기 어렵거나, 우리 자신도 규칙을 완전히 알지 못한다면 어떨까요? 이럴 때 강화학습이 필요합니다.
프로젝트 설정하기
이 GitHub 저장소를 클론하여 따라할 수 있습니다. 먼저 모든 것을 설치해 봅시다:
dotnet add package RLMatrixdotnet add package RLMatrix.Toolkit
첫 번째 학습 환경
간단하지만 의미 있는 환경을 만들어 봅시다 - AI가 패턴을 일치시키는 방법을 배울 수 있는 환경입니다. 이것은 기본적으로 보이지만(직접 프로그래밍하기 쉬움), 필요한 모든 핵심 개념을 소개합니다.
다음은 완전한 환경 코드입니다:
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에게 결정을 내리는 방법을 가르치는 한 가지 방법일 뿐입니다.
다음은 훈련을 설정하는 방법입니다:
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: 더 고급으로, 연속적인 행동(속도나 방향 제어와 같은)을 처리합니다.