コンテンツにスキップ

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(Deep Q-Network)と呼ばれるアルゴリズムを使用します。名前についてあまり心配する必要はありません - これは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キーを押してください...

シンプルなマッチングを超えて

私たちの例はシンプルですが、同じ原則がはるかに複雑な問題にも適用されます:

理解度テスト

強化学習の基本を理解する

次のステップ

さらに進みたいですか?次のステップとして:

利用可能な2つの主要なアルゴリズムがあります:

  • DQN:今使用したもので、シンプルな選択に適しており、大きなリプレイメモリから恩恵を受けます。
  • PPO:より高度で、連続的なアクション(速度や方向の制御など)を扱えます。