跳转到内容

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(深度 Q 网络)的算法。不必太担心这个名称——这只是教 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按回车键继续...");
Console.ReadLine();
}
}
Console.WriteLine("\n训练完成!");
Console.ReadLine();

当您运行此代码时,您将看到每 50 步显示的训练进度:

训练进度
开始模式匹配训练...
步骤 50/1000 - 最近 50 步准确率: 48.0%
按回车键继续...
步骤 100/1000 - 最近 50 步准确率: 68.0%
按回车键继续...
步骤 150/1000 - 最近 50 步准确率: 86.0%
按回车键继续...
步骤 200/1000 - 最近 50 步准确率: 82.0%
按回车键继续...

超越简单匹配

虽然我们的例子很直接,但相同的原则适用于更复杂的问题:

测试您的理解

理解强化学习基础

后续步骤

准备更进一步?您的下一步可以是:

我们有两种主要算法可用:

  • DQN:我们刚刚使用的,适合简单选择,受益于大型重放内存。
  • PPO:更高级,处理连续动作(如控制速度或方向)