見出し画像

Unity ML-Agents 0.14.0 の訓練パラメータ

1. mlagents-learn

「Unity ML-Agents」では、「mlagents-learn」コマンドを利用して、エージェントを訓練します。「コマンドライン引数」と「訓練設定ファイル」によって、訓練パラメータを指定します。

mlagents-learn <訓練設定ファイルのパス> --env=<環境の実行ファイルのパス> --run-id=<実行ID> --train

2. コマンドライン引数

◎ 基本
・-h, --help : ヘルプの表示。
・--env=<env> : 訓練対象となるUnity環境の実行ファイルのパス。省略時の訓練対象はUnity Editorになる。
・--run-id=<path> : 訓練結果を識別するためのID。モデル名や統計情報の名前を付けるために利用。デフォルトのIDは「ppo」。
・--train : 訓練する場合は付加、推論する場合は付加しない。
・--load : モデルを読み込む。
・--save-freq=<n> : TensorBoard形式の統計情報の保存頻度(ステップ)。デフォルトは50000。
・--keep-checkpoints=<n> : 保持するモデルチェックポイントの最大数。最大数に達すると、古いチェックポイントが削除される。デフォルトは5。
・--seed=<n> : 乱数シード。
・--env-args=<string> : Unity環境に渡す引数。「mlagents-learn config/trainer_config.yaml --env-args --num-orcs 42」と指定した場合、
「--num-orcs 42」がUnity環境に渡される。
・--base-port : 開始ポート。マルチプロセッシングでUnity環境のインスタンスを複数起動する場合、開始ポートから順番にポートが割り当てられる。デフォルトは5005。
・--debug : デバッグレベルのログの有効化

◎ カリキュラム学習
・--curriculum=<file> : カリキュラム学習を定義するJSONファイルのパス。
・--lesson=<n> : カリキュラム学習の訓練開始時のレッスン番号。デフォルトは0。

◎ 汎化トレーニング
・--sampler=<file> : 般化トレーニングを定義するYAMLファイル。

◎ マルチプロセッシング
・--num-envs=<n> : 訓練時に同時に経験を収集するUnity環境のインスタンスの数。デフォルトは1。

◎ マルチGPU
・--multi-gpu : 訓練中に複数のGPUを使用(使用可能な場合)。
・--cpu : CPUのみを使用した訓練を強制。

◎ 環境の画面表示
・--no-graphics : 環境の画面を非表示。訓練が高速になるが、Visual Observationの場合は使用不可。
・--width : 環境の画面の幅(デフォルトは84ピクセル)。Unity Editor実行時は無処理。
・--height : 環境の画面の高さ(デフォルトは84ピクセル)。Unity Editor実行時は無処理。
・--quality-level : 環境の画質レベル(低0~5高, デフォルト5)。
・--time-scale : 環境のタイムスケール(1~100倍, デフォルト20)。
・--target-frame-rate : 環境のフレームレート(-1:最大)。

3. 訓練設定ファイル

「訓練設定ファイル」は訓練方法やハイパーパラメータを設定します。あらかじめ、以下の3つのファイルが用意されています。

・config/trainer_config.yaml : PPOの訓練設定ファイル
・config/sac_trainer_config.yaml : SACの訓練設定ファイル
・config/gail_config.yaml : GAILの訓練設定ファイル

訓練設定ファイルはセクションで分かれています。「default」セクションでは、利用可能なすべての訓練のデフォルト値を定義します。特定の動作を訓練するためにこれらのデフォルトをオーバーライドする新しいセクションを追加します。サンプル環境のセクションは、提供されているファイルに含まれています。

default:
    trainer: ppo
    batch_size: 1024
    beta: 5.0e-3
    buffer_size: 10240
    epsilon: 0.2
    hidden_units: 128
    lambd: 0.95
    learning_rate: 3.0e-4
    learning_rate_schedule: linear
    max_steps: 5.0e4
    memory_size: 256
    normalize: false
    num_epoch: 3
    num_layers: 2
    time_horizon: 64
    sequence_length: 64
    summary_freq: 1000
    use_recurrent: false
    vis_encode_type: simple
    reward_signals:
      extrinsic:
          strength: 1.0
          gamma: 0.99
FoodCollector:
    normalize: false
    beta: 5.0e-3
    batch_size: 1024
    buffer_size: 10240
    max_steps: 1.0e5
      :

強化学習アルゴリズムを「PPO」と「SAC」のどちらにするかで、設定可能なハイパーパラメータが変わります。

4. PPOのハイパーパラメータ - 基本

PPOの基本的なハイパーパラメータは、次のとおりです。

◎ trainer
利用する強化学習アルゴリズムの種類を指定します。
・ppo : PPO(Proximal Policy Optimization)
・sac : SAC(Soft Actor-Critic)

◎ summary_freq
訓練統計を保存する頻度を指定します。TensorBoardで表示されるデータポイントの数に影響します。

◎ max_steps
学習するステップ数を指定します。複雑な問題の場合、この値を増やす必要があります。
・典型的な範囲 : 5e5〜1e7

◎ learning_rate
各勾配降下更新ステップの強度を指定します。報酬が継続的に増加しないような場合は値を小さくすると良いです。
・典型的な範囲 : 1e-5〜1e-3

◎ learning_rate_schedule(オプション)
学習率が時間とともにどのように変化するかを指定します。PPOでは、学習が安定して収束するように、「linear」をお勧めします。
・linear(デフォルト): 線形減衰させ、max_stepsで0に達する。
・constant : 学習率を一定に保つ。

◎ batch_size
勾配降下の更新1回に使用される経験(観察, 行動, 報酬)の数を指定します。「Continuous」の場合は大きな値、「Discrete」の場合は小さな値が良いです。
・典型的な範囲(Continuous) : 512〜5120
・典型的な範囲(Discrete) : 32〜512

◎ buffer_size
モデルの学習・更新を行う前に収集する必要がある経験(観察, 行動, 報酬)の数を指定します。これはbatch_sizeの倍数である必要があります。
通常、大きいほどより安定した訓練更新に繋がります。
・典型的な範囲 : 2048〜409600

◎ time_horizon
経験バッファに追加する前にエージェント毎に収集する経験(観察, 行動, 報酬)の数を指定します。エピソード内で頻繁に報酬が与えられる場合は小さな値、そうでない場合は大きな値が良いです。エージェントの行動シーケンス内の重要な動作をキャプチャするのに十分な大きさでなければなりません。
・典型的な範囲:32〜2048

◎ num_layers
隠れ層の数を指定します。単純な問題の場合、小さい方がより高速に学習できます。複雑な問題の場合、より多くの層が必要になります。
・典型的な範囲 : 1〜3

◎ hidden_units
隠れ層のユニット数を指定します。単純な問題の場合、小さい方がより高速に学習できます。複雑な問題の場合、より多くのユニットが必要になります。
・典型的な範囲 : 32〜512

◎ vis_encode_type(オプション)
「Visual Observation」のエンコーダー種別を指定します。
・simple(デフォルト) :  2つの畳み込み層で構成される単純なエンコーダ。
・nature_cnn : Mnih等によって提案された3つの畳み込み層で構成されるCNN実装。
・resnet : IMPALA Resnetの実装。3つのスタックされたレイヤーで構成され、各レイヤーには2つの残余ブロックがあり、他の2つよりもはるかに大きなネットワークを作成。

◎ normalize
「Vector Observation」の入力を「正規化」(-1〜1の範囲に補正)することで、学習効率を上げます。「Continuous」で複雑な問題では特に効果を発揮しますが、「Discrete」で単純な問題では有害になる場合もあります。
・初期値:False

◎ reward_signals
強化学習には、「環境報酬」「Curiosity」「GAIL」の3つの報酬シグナルがあります。reward_signalsによって、これら報酬シグナルの優先割合を指定できます。詳しくは「報酬シグナルのハイパーパラメータ」参照。

◎ beta
エントロピー(行動の決定)のランダムさ指定します。エントロピーは報酬の増加とともにゆっくり減少するように調整する必要があります。エントロピーが急激に低下する場合は、betaを増やします。エントロピーの低下が遅すぎる場合は、betaを減らします。
・典型的な範囲 : 1e-4〜1e-2

◎ epsilon
勾配降下更新中の旧ポリシーと新ポリシーの比率に対する許容限界を指定します。この値を小さく設定すると、学習がより安定しますが、訓練速度がより遅くなります。
・典型的な範囲 : 0.1〜0.3

◎ lambd
「Generalized Advantage Estimate」(GAE)の計算時に使用されるlambdaパラメータを指定します。これは、更新された値の推定値を計算するときに、エージェントが現在の値の推定値にどれだけ依存しているかを示します。低い値は、現在の値の推定値に依存する(高いバイアスになる可能性があります)ことに対応し、高い値は、環境で受け取った実際の報酬に依存する(高い分散になる可能性があります)ことに対応します。パラメータは2つの間のトレードオフを提供し、適切な値はより安定したトレーニングプロセスにつながる可能性があります。
・典型的な範囲 : 0.9〜0.95

◎ num_epoch
勾配降下に経験バッファを学習させる回数を指定します。「batch_size」が大きいほどこれを大きくすることが許容されます。これを減らすと学習速度が遅くなりますが、より安定した更新が保証されます。
・典型的な範囲 : 3〜10

5.  SACのハイパーパラメータ - 基本

SACの基本的なハイパーパラメータは、次のとおりです。

◎ trainer
利用する強化学習アルゴリズムの種類を指定します。
・ppo : PPO(Proximal Policy Optimization)
・sac : SAC(Soft Actor-Critic)

◎ summary_freq
訓練統計を保存する頻度を指定します。TensorBoardで表示されるデータポイントの数に影響します。

◎ max_steps
学習するステップ数を指定します。複雑な問題の場合、この値を増やす必要があります。
・典型的な範囲 : 5e5〜1e7

◎ learning_rate
「学習率」の初期値を指定します。「learning_rate」の確率で「探索」、「1-learning_rate」の確率で「活用」を行います。報酬が継続的に増加しない場合は、通常この値を減らす必要があります。
・典型的な範囲 : 1e-5〜1e-3

◎ learning_rate_schedule(オプション)
学習率が時間とともにどのように変化するかを指定します。SACでは、「constant」を指定し、自然に収束するまで学習し続けることをお勧めします。
・linear(デフォルト): 線形減衰させ、max_stepsで0に達する。
・constant : 学習率を一定に保つ。

◎ batch_size
勾配降下の更新1回に使用される経験(観察, 行動, 報酬)の数を指定します。「Continuous」の場合は大きな値、「Discrete」の場合は小さな値が良いです。
・典型的な範囲(Continuous) : 128〜1024
・典型的な範囲(Discrete) : 32〜512

◎ buffer_size
モデルの更新を行う前に収集する必要がある経験(観察, 行動, 報酬)の最大数を指定します。この値は、エピソード長の数千倍、「batch_size」よりもはるかに大きな値である必要があります。これにより、SACは古い経験からも新しい経験からも学習できます。
・典型的な範囲 : 50000〜1000000

◎ time_horizon
経験バッファに追加する前にエージェント毎に収集する経験(観察, 行動, 報酬)の数を指定します。SACにとって、このパラメータはさほど重要ではなく、通常はおおよそのエピソード長を設定すれば問題ありません。
・典型的な範囲 : 32〜2048

◎ num_layers
隠れ層の数を指定します。単純な問題の場合、小さい方がより高速に学習できます。複雑な問題の場合、より多くの層が必要になります。
・典型的な範囲 : 1〜3

◎ hidden_units
隠れ層のユニット数を指定します。単純な問題の場合、小さい方がより高速に学習できます。複雑な問題の場合、より多くのユニットが必要になります。
・典型的な範囲 : 32〜512

◎ vis_encode_type(オプション)
Visual Observationのエンコーダー種別を指定します。
・simple(デフォルト) :  2つの畳み込み層で構成される単純なエンコーダ。
・nature_cnn : Mnih等によって提案された3つの畳み込み層で構成されるCNN実装。
・resnet : IMPALA Resnetの実装。3つのスタックされたレイヤーで構成され、各レイヤーには2つの残余ブロックがあり、他の2つよりもはるかに大きなネットワークを作成する。

◎ normalize
「Vector Observation」の入力を「正規化」(-1〜1の範囲に補正)することで、学習効率を上げます。「Continuous」で複雑な問題では特に効果を発揮しますが、「Discrete」で単純な問題では有害になる場合もあります。
・初期値:False

◎ reward_signals
強化学習には、「環境報酬」「Curiosity」「GAIL」の3つの報酬シグナルがあります。reward_signalsによって、これら報酬シグナルの優先割合を指定できます。詳しくは「報酬シグナルのハイパーパラメータ」参照。

◎ reward_signal_num_update(オプション)
各更新中に報酬シグナルを更新するために使用されるミニバッチの数を指定します。特定の模倣学習論文(例:Kostrikov、Blondéなど)の訓練手順を模倣するために利用できます。
・典型的な範囲:num_update

◎ init_entcoef
訓練開始時にエージェントがどの程度探索するかを指定します。init_entcoefを増やすと、訓練開始時により多くを探索し、減らすと、より速く学習が収束します。報酬を見つけても、なかなかそれに収束しない場合は、減らすと良いです。
・典型的な範囲(Continuous) : 0.5〜1.0
・典型的な範囲(Discrete) : 0.05〜0.5

◎ train_interval
各エージェントの訓練間隔(ステップ数)を指定します。通常、ステップ毎に訓練を行いますが、頻繁に訓練して役立つ経験を取得できない場合は、間隔をあけて訓練することができます。
・典型的な範囲 : 1〜5

◎ num_update
各訓練イベント中に使用されるミニバッチの数を指定します。SACでは、1つの「更新」は、サイズがbatch_sizeのバッチを経験リプレイバッファから取得し、このミニバッチを使用してモデルを更新します。特定の論文(例:Kostrikov、Blondéなど)の訓練手順を模倣するために利用できます。
・典型的な範囲 : 1

◎ tau
SACモデル更新中のターゲットの更新の大きさを指定します。通常、この値は0.005のままにしてください。単純な問題の場合、tauを0.01に増やすと、安定性を犠牲にして訓練速度を上げることができます。
・典型的な範囲 : 0.005〜0.01

6. RNNのハイパーパラメータ

以下のハイパーパラメータは、「use_recurrentがtrue」に設定されている場合にのみ使用されます。

◎ sequence_length
訓練中にネットワークを通過する一連の経験の長さを指定します。
エージェントが時間と共に必要がある情報をキャプチャするのに十分な長さである必要があります。たとえば、エージェントがオブジェクトの速度を記憶する場合は小さな値ですみ、エージェントがエピソードの最初に一度だけ与えられた情報を記憶する場合は大きな値が必要になります。
・典型的な範囲 : 4〜128

◎ memory_size
LSTMの「hidden state」を格納するために使用される浮動小数の配列のサイズを指定します。この値は4の倍数である必要があり、エージェントが記憶する必要があると予想される情報量に応じて、サイズ調整する必要があります。
・典型的な範囲 : 64〜512

◎ save_replay_buffer(SAC専用のオプション)
訓練を終了して再開するときに、経験リプレイバッファとモデルを保存およびロードできます。これは、収集された経験が消去されないため、再開がよりスムーズに進むのに役立ちます。再生バッファは非常に大きくなる可能性があり、かなりのディスク容量を占有することに注意してください。そのため、デフォルトではこの機能を無効にします。
・デフォルト: False

7. BCのハイパーパラメータ

「BC」を使用するには、「behinavial_cloning」セクションを「trainer_config」に追加します。

    behavioral_cloning:
        demo_path: ./Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
        strength: 0.5
        steps: 10000

「BC」のハイパーパラメータは、次のとおりです。

◎ strength
学習率に対する模倣学習の学習率に対応し、「BC」がポリシーに影響を与えることができる程度を指定します。
・典型的な範囲 : 0.1〜0.5

◎ demo_path
.demoファイルまたは.demoファイルを含むフォルダのパスを指定します。

◎ steps
「BC」による訓練が有効なステップ数を指定します。「BC」では、エージェントが報酬を発見した後、デモの使用を停止することが望ましい場合がよくあります。停止した後、強化学習で最適化したり汎化トレーニングしたりできます。訓練全体にわたって模倣学習を行うには、ステップを0に設定します。

◎ batch_size(オプション)
勾配降下更新の1回の反復に使用される経験の数を指定します。指定しない場合、「PPO」「SAC」に定義された「batch_size」がデフォルトになります。「Continuous」の場合は大きい値、「Discrete」の場合は小さな値が良いです。
・典型的な範囲(Continuous) : 512〜5120
・典型的な範囲(Discrete) : 32〜512

◎ num_epoch(PPO専用のオプション)
勾配降下に経験バッファを学習させる回数を指定します。指定しない場合、デフォルトで「PPO」に設定されたエポックの数になります。
・典型的な範囲:3〜10

◎ samples_per_update(PPO専用のオプション)
モデルの更新に使用するサンプルの最大数を指定します。デモのデータセットが非常に大きい場合は、ポリシーの過剰適合を避けるために、これを下げることができます。0に設定すると、各更新ステップですべてのデモを利用します。
・デフォルト値 : 0(all)
・典型的な範囲 : PPOのbuffer_sizeと同じ

8. 報酬シグナルのハイパーパラメータ -  Extrinsic

「Extrinsic」は、環境によって与えられる報酬を制御するパラメータです。

◎ strength
環境によって与えられる報酬に乗算する値を指定します。
・典型的な範囲: 1.0

◎ gamma
将来の報酬割引係数を指定します。将来の報酬を重視する場合は大きな値、即時報酬を重視する場合は小さな値にします。
・典型的な範囲 : 0.8〜0.995

9. 報酬シグナルのハイパーパラメータ -  Curiosity

「Curiosity」は、はじめての状態に訪れたことに対して報酬を与えるパラメータです。

◎ strength
Curiosityの報酬の大きさを指定します。環境によって与えられる報酬に圧倒されない、または圧倒しすぎないように、調整する必要があります。
・典型的な範囲 : 0.001〜0.1

◎ gamma
将来の報酬割引係数を指定します。将来の報酬を重視する場合は大きな値、即時報酬を重視する場合は小さな値にします。
・典型的な範囲 : 0.8〜0.995

◎ encoding_size(オプション)
Curiosityモデルで使用されるエンコードのサイズを指定します。この値は、Curiosityが元の観察を圧縮するのに十分なほど小さくする必要がありますが、実証された動作と実際の動作を区別することを学習するのを妨げるほど小さくしないようにしてください。
・初期値 : 64
・典型的な範囲 : 64〜256

◎ learning_rate(オプション)
Curiosityモデルを更新するために使用する学習率を指定します。訓練が不安定で、Curiosityの損失が不安定な場合は、これを減らす必要があります。
・初期値 : 3e-4
・典型的な範囲 : 1e-5-1e-3

10. 報酬シグナルのハイパーパラメータ -  GAIL

GAN(Generative Adversarial Networks)と同様の方法で、敵対的アプローチを使用する模倣学習アルゴリズムによる報酬を制御するパラメータです。

◎ strength
模倣学習の報酬に乗算する値を指定します。デモが最適ではない場合は、この値を低く指定します。デモをコピーしたい場合は大きな値を指定します。
・典型的な範囲 : 0.01〜1.0

◎ gamma
将来の報酬割引係数を指定します。将来の報酬を重視する場合は大きな値、即時報酬を重視する場合は小さな値にします。
・典型的な範囲 : 0.8 〜0.9

◎ demo_path
.demoファイル、または.demoファイルを含むフォルダのパスを指定します。

◎ encoding_size(オプション)
Discriminatorが使用する隠れ層のサイズを指定します。この値は、Discriminatorが元の観察結果を圧縮するのに十分なほど小さくする必要がありますが、実証された動作と実際の動作を区別する学習を妨げるほど小さくてはなりません。このサイズを劇的に増やすと、訓練時間にも悪影響を及ぼします。
・初期値 : 64
・典型的な範囲 : 64〜256

◎ learning_rate(オプション)
Discriminatorの更新に利用される学習率を指定します。訓練が不安定で、GAILの損失が不安定な場合、これを減らす必要があります。
・初期値 : 3e-4
・典型的な範囲 : 1e-5-1e-3

◎ use_actions(オプション)
Discriminatorが、観察と行動の両方に基づいて、または単に観察に基づいて区別する必要があるかどうかを決定します。エージェントにデモの行動を模倣させたい場合はTrueに設定します。Falseに設定すると、特にデモが不完全な場合に安定する可能性が高くなりますが、学習速度が遅くなる可能性があります。
・初期値 : false

◎ use_vail(オプション)
Discriminator内の変動ボトルネックを有効にします。これにより、Discriminatorはより一般的な表現を学習するようになり、識別が「あまりにも良い」傾向が減り、学習がより安定します。ただし、訓練時間は長くなります。模倣学習が不安定であるか、手元の課題を学習できない場合は、これを有効にします。
・初期値 : false


この記事が気に入ったらサポートをしてみませんか?