跳到內容

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按 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:更高級,處理連續動作(如控制速度或方向)