コンテンツにスキップ

カートポールの例

強化学習を実際に見てみる準備はできましたか?このチュートリアルでは、AIが動くカート上で棒を直立させる方法を学習する様子を観察できる古典的なバランス課題に挑戦します。

カートポールの課題は、シンプルさと視覚的なフィードバックを組み合わせており、強化学習に最適です。カートを左右に押すと、物理法則によって取り付けられた棒がバランスを保つか倒れるかが決まります。各タイムステップでエージェントは決断を下し、アルゴリズムが徐々にタスクをマスターしていく様子を観察する満足感を得られます。

プロジェクトのセットアップ

シミュレートされた物理環境を提供するためにSciSharp/Gym.NETを使用します。

順を追って進めるか、お好みであれば完全なプロジェクトをダウンロードしてください。

必要なパッケージをインストールしましょう:

必要なパッケージのインストール
dotnet add package RLMatrix
dotnet add package RLMatrix.Toolkit
dotnet add package Gym.NET
dotnet add package Gym.NET.Environments
dotnet add package Gym.NET.Rendering.WinForm

環境の構築

こちらがカートポール環境の実装です:

CartPoleEnvironment.cs
using System;
using System.Threading.Tasks;
using Gym.Environments.Envs.Classic;
using Gym.Rendering.WinForm;
using RLMatrix.Toolkit;
using NumSharp;
namespace MyEnv
{
[RLMatrixEnvironment]
public partial class CartPoleEnvironment
{
private CartPoleEnv myEnv;
private float[] myState;
private int stepCounter;
private const int MaxSteps = 100000;
private bool isDone;
public CartPoleEnvironment()
{
InitialiseAsync();
}
private void InitialiseAsync()
{
myEnv = new CartPoleEnv(WinFormEnvViewer.Factory);
ResetEnvironment();
}
[RLMatrixObservation]
public float GetCartPosition() => myState[0];
[RLMatrixObservation]
public float GetCartVelocity() => myState[1];
[RLMatrixObservation]
public float GetPoleAngle() => myState[2];
[RLMatrixObservation]
public float GetPoleAngularVelocity() => myState[3];
[RLMatrixActionDiscrete(2)]
public void ApplyForce(int action)
{
if (isDone)
ResetEnvironment();
var (observation, reward, done, _) = myEnv.Step(action);
myEnv.Render();
myState = ToFloatArray(observation);
isDone = done;
stepCounter++;
if (stepCounter > MaxSteps)
isDone = true;
}
private float[] ToFloatArray(NDArray npArray)
{
double[] doubleArray = npArray.ToArray<double>();
return Array.ConvertAll(doubleArray, item => (float)item);
}
[RLMatrixReward]
public float CalculateReward()
{
return isDone ? 0 : 1;
}
[RLMatrixDone]
public bool IsEpisodeFinished()
{
return isDone;
}
[RLMatrixReset]
public void ResetEnvironment()
{
myEnv.Reset();
myState = new float[4] { 0, 0, 0, 0 };
isDone = false;
stepCounter = 0;
}
}
}

トレーニングのセットアップ

エージェントにバランスを教えるトレーニングコードです:

Program.cs
using RLMatrix.Agents.Common;
using RLMatrix;
using MyEnv;
Console.WriteLine("Starting cart-pole training...\n");
// 学習パラメータの設定
var learningSetup = new PPOAgentOptions(
batchSize: 8,
ppoEpochs: 8,
memorySize: 1000,
gamma: 0.99f,
width: 128,
entropyCoefficient: 0.01f,
lr: 1E-02f
);
// 環境を作成してエージェントに接続
var environment = new CartPoleEnvironment().RLInit(maxStepsSoft: 1200, maxStepsHard: 1200);
var env = new List<IEnvironmentAsync<float[]>> {
environment,
//new CartPoleEnvironment().RLInit() //複数環境でトレーニングする場合はコメントを外す
};
// エージェントの初期化
var agent = new LocalDiscreteRolloutAgent<float[]>(learningSetup, env);
// 収束するまでトレーニング
for (int i = 0; i < 100000; i++)
{
await agent.Step();
}
Console.WriteLine("\nTraining complete!");
Console.ReadLine();

タイムステップごとに+1という単純な報酬は驚くほど強力です。深層強化学習アルゴリズムは自然と長期的な目標を最適化し、微妙な予防的調整がより長いバランス時間と高い累積報酬につながることを発見します。

RLMatrixにおけるPPO:何が違うのか

初期のチュートリアルで見たDQNは単純なタスクにおいてサンプル効率が高い場合がありますが、PPOは一般的に広範なハイパーパラメータチューニングを必要とせず、より安定したトレーニングを提供します。これにより、特に難しい制御問題に適しています。

知っておくべきメモリ節約のテクニック

トレーニングコードのこの行に注目してください:

var environment = new CartPoleEnvironment().RLInit(maxStepsSoft: 1200, maxStepsHard: 1200);

この一見何気ないパラメータ設定は、GPUメモリを圧迫することなく非常に長いエピソードでトレーニングするための鍵を握っています。説明しましょう:

これらの値を変更するとどうなるでしょうか?

var environment = new CartPoleEnvironment().RLInit(maxStepsSoft: 200, maxStepsHard: 1200);

ここで魔法が起こります:

  1. 最初の200ステップだけ報酬を集め、勾配を計算します
  2. シミュレーションは自然に1200ステップまで、または失敗するまで継続します
  3. GPUメモリ使用量が大幅に減少します

この設定を実行するとき、報酬グラフを確認してみてください - カートポールの物理シミュレーションがそのポイントを超えて継続しているにもかかわらず、報酬が200(ソフト制限)を超えないことに気付くでしょう。タスクマネージャーを開いてリアルタイムでメモリ節約を観察してください。

このテクニックは、エピソードが無限に続く可能性のある複雑な環境では不可欠です。メモリ不足エラーでクラッシュする代わりに、自然な環境ダイナミクスを維持しながら、どれだけの計算労力を投入するかを正確に制御できます。

学習過程を観察する

このトレーニングを実行すると、カートポール環境を表示するウィンドウが表示されます。最初は棒がすぐに倒れるでしょう - エージェントは何をすべきか全く分かっていません。しかし数分以内に、驚くべき変化を目撃することになります:

  1. 最初はエージェントは戦略なしにランダムな動きをします
  2. 次に棒が既に倒れているときに反応し始めます(遅すぎる!)
  3. 徐々に修正動作をより早く行うようになります
  4. 最終的には微妙な予防的調整を行い、棒を完璧にバランスさせます

この目に見える進歩がカートポールを学習例として非常に満足のいくものにしています。グラフで数字が改善されるのを見るだけでなく、AIがあなたの目の前でスキルを発達させるのを観察しているのです。

理解度をテストする

カートポール強化学習の理解

次のステップ

このチュートリアルでは:

  • 強化学習のためのリアルタイム物理シミュレーションをセットアップしました
  • 古典的な制御問題を習得するための完全なエージェントを実装しました
  • ソフト/ハード終了のテクニックでメモリを効率的に管理する方法を学びました
  • RLMatrixのPPO実装が標準と異なる点を理解しました

次に、ツールキットを使用せずに同じ環境を実装して、これまで使用した整理されたアトリビュートの裏で何が起こっているかを理解します。