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キーを押してください...
シンプルなマッチングを超えて
私たちの例はシンプルですが、同じ原則がはるかに複雑な問題にも適用されます:
理解度テスト
強化学習の基本を理解する
次のステップ
さらに進みたいですか?次のステップとして:
利用可能な2つの主要なアルゴリズムがあります:
- DQN:今使用したもので、シンプルな選択に適しており、大きなリプレイメモリから恩恵を受けます。
- PPO:より高度で、連続的なアクション(速度や方向の制御など)を扱えます。