見出し画像

Unityではじめる強化学習 / Soft Actor-Criticによる学習

以下、ML-Agentsのドキュメントより。

1. はじめに

ML-Agentsは強化学習の学習アルゴリズムとして、「PPO」(Proximal Policy Optimization)に加えて「SAC」(Soft Actor-Critic)も提供します。

「PPO」とは対照的に、「SAC」はOff-policyのため、過去の任意の時点で収集された経験から学習できます。経験が収集されると、経験リプレイバッファに配置され、訓練中にランダムに引き出されます。これにより、「SAC」のサンプル効率が大幅に向上し、「PPO」と同じタスクを学習するために必要なサンプルが5〜10倍少なくなります。

ただし、「SAC」はより多くのモデル更新を必要とする傾向があります。「SAC」は、より重いまたはより遅い環境(1ステップあたり約0.1秒以上)に適しています。

また、「SAC」は「最大エントロピー」アルゴリズムでもあり、本質的な方法で探索を可能にします。最大エントロピーRLの詳細については、こちらを参照してください。

エージェントを訓練するには、エージェントが最大化を試みる1つ以上の報酬シグナルをエージェントに提供する必要があります。利用可能な報酬シグナルと対応するハイパーパラメータについては、報酬シグナルを参照してください。

2. SACで訓練する際のベストプラクティス

強化学習モデルの訓練を成功させるには、多くの場合、ハイパーパラメータの調整が必要です。このガイドには、既定のパラメータでは目的のパフォーマンスレベルが得られない場合の訓練のベストプラクティスが含まれています。

3. ハイパーパラメータ

◎報酬シグナル
強化学習の目標は、報酬を最大化するポリシーを学習することです。最も基本的な場合、報酬は環境によって与えられます。ただし、さまざまな行動に対してエージェントに報酬を与えることを想像できます。

たとえば、明示的に定義された報酬シグナルではなく、新しい状態の探索に対してエージェントに報酬を与えることができます。さらに、報酬プロセスを組み合わせて学習プロセスを支援することもできます。

「reward_signals」は、報酬シグナルを定義するセクションを提供します。
ML-Agentsはデフォルトで「外部報酬」(Extrinsic reward)と「好奇心報酬」(Curiosity reward)の2つの報酬シグナルを提供します。

◎報酬シグナルの更新数 (オプション)
「reward_signal_num_update」は、各更新中に報酬シグナルを更新するためにサンプリングおよび使用されるミニバッチ数です。デフォルトでは、メインポリシーが更新されるたびに報酬シグナルが更新されます。

ただし、特定の模倣学習論文(Kostrikov et. al, Blondé et. alなど)の訓練手順を模倣するには、ポリシーをN回更新してから、報酬信号(GAIL)をM回更新することができます。これを実現するために、「SAC」の「train_intervalとnum_update」を「N」に、「reward_signals」の下の「reward_signal_num_update」を「M」に変更できます。

デフォルトでは、「reward_signal_num_update」は「num_update」に設定されています。

範囲 : num_update

◎Buffer Size
「buffer_size」は、経験リプレイバッファに保存できる経験 (エージェントの観察, 行動, 獲得した報酬) の最大数に対応します。この値は、エピソードの数千倍の長さである必要があります。これにより、SACは古い経験からも新しい経験からも学習できます。また、「batch_size」よりもはるかに大きくする必要があります。

範囲 : 50000 - 1000000

◎Buffer Init Steps
「buffer_init_steps」は、訓練を試みる前にバッファを事前に満たす経験数です。訓練されていないポリシーはかなりランダムであるため、ランダム行動でバッファを事前に入力することは探索に役立ちます。通常、経験の少なくともいくつかのエピソードを事前に入力する必要があります。

範囲 : 1000 - 10000

◎Batch Size
「batch_size」は、勾配降下更新の1回の反復に使用されるエクスペリエンスの数です。連続行動空間を使用している場合、この値は大きくする必要があります(1000のオーダー)。離散行動空間を使用している場合、この値は小さくする必要があります(10秒程度)。

範囲(Continuous) : 128 - 1024
範囲(Discrete) : 32 - 512

◎Initial Entropy Coefficient
「init_entcoef」は、訓練の開始時に設定された初期エントロピー係数を指します。SACでは、エージェントは、より良い探査を促進するために、行動をエントロピーにするように奨励されます。

エントロピー係数は、真の報酬とボーナスエントロピー報酬を比較します。エントロピー係数は事前設定された目標エントロピーに自動的に調整されるため、「init_entcoef」はエントロピーボーナスの開始値にのみ対応します。「init_entcoef」を増やすと、最初はより多くを探索し、減らすと、より速くソリューションに収束します。

範囲(Continuous) : 0.5 - 1.0
範囲(Discrete) : 0.05 - 0.5

◎Train Interval
「train_interval」は、各エージェンの訓練イベント間のステップ数です。通常、すべてのステップの後に訓練を行うことができますが、環境のステップが非常に小さく頻繁に行われる場合、ステップ間に新しい興味深い情報がない場合があり、「train_interval」を増やすことができます。

範囲 : 1 - 5

◎Number of Updates
「num_update」は、各訓練イベント中にサンプリングされ、訓練に使用されるミニバッチ数を示します。SACでは、単一の「更新」は、サイズが「batch_size」のバッチを経験リプレイバッファから取得し、このミニバッチを使用してモデルを更新します。通常、これは1のままにしておくことができます。

ただし、特定の論文(例:Kostrikov et. al, Blondé et. al)の訓練手順を模倣するために、追加のサンプルを取得する前に異なるミニバッチでN回更新することができます。これを実現するために「train_intervalとnum_update」をNに変更できます。

範囲 : 1

◎Tau
「tau」は、SACモデル更新中のターゲットQ更新の大きさに対応します。
SACには、ターゲットとポリシーの2つのニューラルネットワークがあります。ターゲットネットワークは、特定の状態における将来の報酬のポリシーの推定値をブートストラップするために使用され、ポリシーの更新中は修正されます。

このターゲットは、「tau」に従ってゆっくりと更新されます。通常、この値は0.005のままにしてください。単純な問題の場合、「tau」を0.01に増やすと、安定性を犠牲にして学習にかかる時間が短縮される場合があります。

範囲 : 0.005 - 0.01

◎Learning Rate
「learning_rate」は、各勾配降下更新ステップの強度に対応します。訓練が不安定で、報酬が一貫して増加しない場合は、通常これを減らす必要があります。

範囲 : 1e-5 - 1e-3

◎(オプション) Learning Rate Schedule
「earning_rate_schedule」は、学習率の経時変化に対応しています。SACについては、Q関数が自然に収束するまでエージェントが学習を続けることができるように、学習率を一定に保つことをお勧めします。

・linear : learning_rateは線形に減衰し、max_stepsで0に達します。
・constant(デフォルト) : トレーニング実行全体で学習率を一定に保ちます。

◎Time Horizon
「time_horizon」は、エージェント毎に経験バッファに追加する前に収集する経験のステップ数を示します。このパラメーターはPACよりもSACにとってそれほど重要ではなく、通常はおおよそのエピソードの長さに設定できます。

範囲 : 32 - 2048

◎Max Steps
「max_steps」は、訓練プロセス中に実行されるシミュレーションのステップ数(frame-skipで乗算)に対応します。より複雑な問題の場合は、この値を増やす必要があります。

範囲 : 5e5 - 1e7

◎Normalize
「normalize」は、ベクトル観測入力に正規化が適用されるかどうかに対応します。この正規化は、ベクトル観測の移動平均と分散に基づいています。正規化は、複雑な連続制御の問題がある場合には役立ちますが、より単純な離散制御の問題がある場合は有害です。

◎Number of Layers
「num_layers」は、観測入力後、または視覚観測のCNNエンコード後に存在する隠れ層の数に対応します。単純な問題の場合、より少ないレイヤーがより速く、より効率的にトレーニングする可能性があります。より複雑な制御問題には、より多くの層が必要になる場合があります。

範囲 : 1 - 3

◎Hidden Units
「hidden_units」は、ニューラルネットワークの完全に接続された各層にあるユニット数を示します。正しい行動が観測入力の単純な組み合わせである単純な問題の場合、これは小さいはずです。行動が観測変数間の非常に複雑な相互作用である問題の場合、これは大きくする必要があります。

範囲 : 32 - 512

◎(オプション) Visual Encoder Type
「vis_encode_type」は、目視観測をエンコードするためのエンコーダータイプに対応します。有効なオプションは次のとおりです。

・simple (デフォルト) : 2つの畳み込み層で構成される単純なエンコーダ
・nature_cnn : Mnih et al。(https://www.nature.com/articles/nature14236)によって提案された、3つの畳み込み層で構成されるCNN実装
・ resnet : IMPALA Resnet実装(https://arxiv.org/abs/1802.01561)。3つのスタック層で構成され、各層には2つの残差ブロックがあり、他の2つよりもはるかに大きなネットワークを作成。

4. (オプション) RNNのハイパーパラメータ

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

◎Sequence Length
「sequence_length」は、訓練中にネットワークを通過した一連の経験の長さに対応します。これは、エージェントが時間の経過とともに記憶する必要がある情報をキャプチャするのに十分な長さでなければなりません。
たとえば、エージェントがオブジェクトの速度を記憶する必要がある場合、これは小さな値になります。エージェントがエピソードの最初に一度だけ与えられた情報を記憶する必要がある場合、これはより大きな値になるはずです。

範囲 : 4 - 128

◎Memory Size
「memory_size」は、RNNの非表示状態を格納するために使用される浮動小数点数の配列のサイズに対応します。この値は4の倍数である必要があり、タスクを正常に完了するためにエージェントが記憶する必要があると予想される情報の量に応じてスケーリングする必要があります。

範囲 : 64 - 512

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

デフォルト : False

5. (オプション) デモンストレーションを使用した事前訓練

場合によっては、プレーヤーから記録された動作を使用してエージェントのポリシーをブートストラップすることができます。これは、エージェントを報酬に導くのに役立ちます。事前訓練は、報酬を最大化しようとするのではなく、デモンストレーションを模倣する訓練操作を追加します。これは、SACとインラインで動作クローンを実行することと本質的に同等です。

事前訓練を使用するには、事前訓練セクションを「trainer_config」に追加します。

pretraining:
       demo_path: ./demos/ExpertPyramid.demo
       strength: 0.5
       steps: 10000

以下は、事前訓練に使用可能なハイパーパラメーターです。

◎Strength
強度は、SACの学習率に対するイミテーションの学習率に対応し、行動クローンがポリシーに影響を与えることができる程度にほぼ対応します。

範囲 : 0.1 - 0.5

◎Demo Path
「demo_path」は、demoファイルまたはdemoファイルのディレクトリへのパスです。demoファイルの詳細については、模倣学習ガイドを参照してください。

◎Steps
事前訓練中、エージェントが「見た」報酬を受け取った後にデモの使用を停止し、利用可能なデモを過ぎて最適化したり、提供されたデモ以外で一般化することができます。ステップは、事前トレーニングがアクティブな訓練ステップに対応します。プリトレーナーの学習率は、各ステップでアニーリングします。訓練実行全体にわたって一定の模倣を行うには、ステップを0に設定します。

◎(オプション) Batch Size
「batch_size」は、勾配降下更新の1回の反復に使用されるデモの経験数です。指定しない場合、SACに定義された「batch_size」がデフォルトになります。

範囲(Continuous) : 512 - 5120
範囲(Discrete) : 32 - 512

6. 訓練統計

訓練統計を表示するには、TensorBoardを使用します。TensorBoardの起動と使用については、こちらを参照してください。

◎Cumulative Reward (累積報酬)
報酬の一般的な傾向は、時間の経過とともに一貫して増加するはずです。
小さな浮き沈みが予想されます。タスクの複雑さにもよりますが、報酬プロセスの大幅な増加は、数百万ステップ後でなければ現れません。

◎Entropy Coefficient (エントロピー係数)
SACは「最大エントロピー」強化学習アルゴリズムであり、SACを使用して訓練されたエージェントは、問題を解決しながらランダムに動作することが推奨されます。エントロピー係数は、ランダムに振る舞うインセンティブと、報酬を最大化します。この値は、訓練中にエージェントがある程度のランダム性を保持するように自動的に調整されます。

訓練開始時に着実に減少し、一定の小さな値に達すると横ばいになります。
減少が早すぎるか、減少に時間がかかりすぎる場合は、「init_entcoef」を調整する必要があります。

◎Entropy
ブレインの決定がいかにランダムであるかを示します。これは、訓練中に最初に増加し、ピークに達し、エントロピー係数とともに減少するはずです。最初に、エージェントが高いエントロピー係数のために、探索に対してよりランダムになるように奨励されているためです。

減少が早すぎるか、減少に時間がかかりすぎる場合は、「init_entcoef」を調整する必要があります。

◎Learning Rate
「learning_rate_schedule」が「linear」に設定されていない限り、これはデフォルトで一定値のままです。

◎Policy Loss
これらの値は、エージェントが探索するにつれて増加する可能性がありますが、エージェントがタスクの解決方法を学習するにつれて長期的に減少するはずです。

◎Value Estimate
これらの値は、累積報酬が増加するにつれて増加するはずです。エージェントが任意の時点で受け取ることを予測する将来の報酬に相当します。また、エージェントがランダムであると報われるため、最初は増加する可能性があります。エントロピー係数が減少するにつれて減少するはずです。

◎Value Loss
これらの値は、報酬が増加するにつれて増加し、報酬が安定すると減少します。


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