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(深度 Q 網路)的演算法。不必太擔心這個名稱 —— 這只是教 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:更高級,處理連續動作(如控制速度或方向)