Unity ML-Agentsを活用してAIエージェントをトレーニングする際、ハイパーパラメータの設定はその成否を大きく左右します。本記事では、共通のハイパーパラメータから、PPOやSACといった特定のトレーナーに特化した設定まで、わかりやすく解説します。また、数式や具体例を交え、実際の調整に役立つ情報を提供します。

目次


1. 共通ハイパーパラメータ

これらのパラメータは、PPOやSACなど複数のトレーナーで共通して使用されます。

1.1 trainer_type

  • 使用するトレーナーの種類を指定します(例: ppo, sac, poca)。
  • デフォルト値: ppo
  • PPOは汎用性が高く、多くの場合に適しています。SACは連続アクション空間で高い性能を発揮します。

1.2 learning_rate

  • 学習率を設定します。この値が高すぎるとエージェントが不安定になりますが、低すぎると学習が遅くなります。
  • 学習率 \( \alpha \) は、以下の式でパラメータ更新のステップサイズを決定します。
    \[ \theta_{t+1} = \theta_t – \alpha \nabla J(\theta_t) \]
    ここで、\(\theta\) はモデルのパラメータ、\(J(\theta)\) は損失関数です。
  • デフォルト値: 3.0e-4
  • 推奨範囲: 1e-5 ~ 1e-3

具体例:

learning_rate = 1e-3 の場合、エージェントが急激にパフォーマンスを向上させるものの、途中で振動する可能性があります。一方、1e-5 ではパフォーマンスの向上が遅いですが、安定した学習が期待されます。学習が停滞している場合は、学習率を少しずつ上げてみましょう。逆に学習が不安定な場合は、学習率を下げることを検討してください。

1.3 batch_size

  • 1回の勾配降下で使用する経験の数。タスクやトレーナーによって最適な値が異なります。
  • バッチサイズ \( B \) は、勾配を計算する際に使用する経験のサンプル数を制御します。バッチサイズが大きいと勾配の推定が安定しますが、メモリ消費量が増加します。
  • 推奨範囲:
    • 連続アクション(PPO): 512 ~ 5120
    • 連続アクション(SAC): 128 ~ 1024
    • 離散アクション: 32 ~ 512

注意点:

batch_size が大きすぎると計算コストが増加し、メモリ不足のリスクが高まります。リソースを考慮しつつ設定してください。バッチサイズが小さすぎると、学習が不安定になることがあります。小さいバッチサイズで学習が進まない場合は、バッチサイズを大きくしてみましょう。

1.4 buffer_size

  • ポリシーモデルを更新する前に収集する経験の数。
  • バッファサイズは、過去の経験をどれだけ保持するかを決定します。PPOでは比較的少ない値で、SACではより多くの経験を保持します。
  • デフォルト値:
    • PPO: 10240
    • SAC: 100000
  • 推奨範囲:
    • PPO: 2048 ~ 409600
    • SAC: 100000 ~ 1000000
  • バッファサイズが小さいと、最新の経験に偏った学習になり、学習が不安定になる可能性があります。バッファサイズを大きくすることで、過去の多様な経験を考慮した学習が可能です。

1.5 time_horizon

  • エージェントが経験を収集するステップ数。
  • タイムホライズン \( T \) は、エピソードをどの程度の長さで区切るかを決定します。
  • デフォルト値: 64
  • 推奨範囲: 32 ~ 2048

具体例:

迷路探索タスクで time_horizon を32に設定すると、エージェントが短期的な行動に集中します。一方、2048に設定すると、エージェントが長期的な報酬を考慮できるようになりますが、分散が増加する可能性があります。タスクの複雑さに応じて、適切なタイムホライズンを設定する必要があります。短いタイムホライズンは、短期間のタスクに適しており、長いタイムホライズンは、長期的な報酬を考慮する必要があるタスクに適しています。


2. PPO専用ハイパーパラメータ

PPOは、汎用性が高く、多くのシナリオで利用されるトレーナーです。

2.1 beta

  • エントロピー正則化の強度を調整し、ポリシーのランダム性を制御します。
  • エントロピーボーナス \( H(P) \) を用いて探索を促進します。エントロピー正則化は、以下の損失関数に追加されます。
    \[ L_{PPO} = L_{CLIP} – \beta H(P) \]
    ここで、\( L_{CLIP} \) はクリッピングされた損失関数です。
  • デフォルト値: 5e-3
  • 推奨範囲: 1e-4 ~ 1e-3

beta が小さいと、探索が不十分になるため、局所最適解に陥りやすくなります。逆に、beta が大きいと、探索が過剰になり、学習が不安定になることがあります。適切な beta の値はタスクによって異なります。エージェントが十分に探索できていない場合は、beta を少しずつ大きくしてみましょう。

2.2 epsilon

  • 古いポリシーと新しいポリシーの許容差を設定します。小さい値は安定性を向上させますが、学習速度が低下します。
  • クリッピングパラメータ \( \epsilon \) は、ポリシーの更新幅を制限します。この値が小さいほど、ポリシーの更新が保守的になります。
  • デフォルト値: 0.2
  • 推奨範囲: 0.1 ~ 0.3

epsilon を小さくすると学習が安定しますが、学習速度が遅くなります。逆に、epsilon を大きくすると、学習速度は速くなりますが、学習が不安定になる可能性があります。安定した学習を優先する場合は小さめの値を、学習速度を優先する場合は大きめの値を試すと良いでしょう。

2.3 lambd

  • 一般化アドバンテージ推定(GAE)の正則化パラメータ。
  • GAEのパラメータ \( \lambda \) は、アドバンテージ関数の推定におけるバイアスと分散のトレードオフを制御します。
  • デフォルト値: 0.95
  • 推奨範囲: 0.9 ~ 0.95

lambd を1に近づけると、バイアスは小さくなりますが分散が大きくなります。逆に、0に近づけると、分散は小さくなりますがバイアスが大きくなります。通常、0.9から0.99の間で調整されます。


3. SAC専用ハイパーパラメータ

SACは連続アクションに特化したトレーナーで、高いサンプル効率を誇ります。

3.1 buffer_init_steps

  • 学習開始前に経験バッファを埋めるステップ数。
  • 学習開始前にランダムな行動で経験を収集することで、初期探索を促進します。
  • デフォルト値: 0
  • 推奨範囲: 1000 ~ 10000

バッファ初期化ステップ数を増やすことで、初期の学習が安定することが期待できます。特に、複雑なタスクでは、ランダムな行動から学習を開始するよりも、ある程度の経験を蓄積してから学習を開始する方が効果的な場合があります。

3.2 tau

  • ターゲットネットワーク更新時の重み付け係数。
  • ターゲットネットワークの更新は、以下の式で行われます。
    \[ \theta_{target} \leftarrow \tau \theta + (1 – \tau) \theta_{target} \]
    ここで、\(\theta\) は現在のネットワークのパラメータ、\(\theta_{target}\) はターゲットネットワークのパラメータです。
  • デフォルト値: 0.005
  • 推奨範囲: 0.005 ~ 0.01

tau が小さいほどターゲットネットワークの更新が緩やかになり、学習が安定しやすくなります。逆に、tau を大きくすると、ターゲットネットワークが現在のネットワークに近づきやすくなり、学習が不安定になる可能性があります。通常、0.01よりも小さい値を使用します。

3.3 init_entcoef

  • 初期エントロピー係数。探索初期段階でのランダム性を制御します。
  • 初期エントロピー係数は、探索の初期段階におけるランダム性を制御します。SACは最大エントロピー強化学習に基づいており、探索と活用をバランスさせます。
  • 推奨範囲:
    • Continuous Actions: 0.5 ~ 1.0
    • Discrete Actions: 0.05 ~ 0.5

初期エントロピー係数が大きいほど、探索が活発になります。連続アクション空間ではより高い値、離散アクション空間ではより低い値が推奨されます。適切な値はタスクによって異なりますが、調整を行うことでパフォーマンスが改善する場合があります。


4. その他の重要な設定

4.1 ネットワーク構造 (network_settings)

  • hidden_units: 隠れ層内のユニット数(通常32~512)。
  • 隠れ層のユニット数が多いほど、モデルがより複雑な関数を近似できます。ただし、計算コストも増加します。
  • num_layers: 隠れ層の数(通常1~3)。
  • 隠れ層の数が多いほど、モデルがより複雑な表現を学習できます。ただし、過学習のリスクも高まります。

隠れ層のユニット数と層数は、タスクの複雑さに応じて調整する必要があります。シンプルなタスクでは少ないユニット数と層数で十分な場合がありますが、複雑なタスクではより多くのユニット数と層数が必要になります。

4.2 報酬信号 (reward_signals)

報酬信号には外部報酬と内部報酬が含まれます。それぞれ強度や割引率 \( \gamma \) を調整可能です。

報酬信号の割引率 \( \gamma \) は、将来の報酬をどれだけ重視するかを決定します。割引率が高いほど、エージェントは長期的な報酬を考慮するようになります。数式で表現すると以下のようになります。

\[ G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k+1} \]

ここで、\( G_t \) は時刻 \( t \) における割引報酬の合計、\( r_{t+k+1} \) は時刻 \( t+k+1 \) における報酬です。


5. モニタリングと調整の重要性

ハイパーパラメータの調整は試行錯誤が必要です。TensorBoardなどのツールを活用し、以下の指標を監視しましょう。

  • 学習曲線の収束状況: 学習曲線が安定して上昇しているかを確認します。
  • エージェントの行動の多様性: エージェントが探索を十分に行っているかを確認します。
  • 報酬の変動: 報酬が安定して上昇しているか、または変動が大きすぎないかを確認します。

6. ハイパーパラメータ設定例

以下は、Unity ML-Agents Toolkitでのハイパーパラメータ設定例です。PPOアルゴリズムを使用し3D Balance Ball環境をトレーニングする場合のものです。

behaviors:
  3DBall:
    trainer_type: ppo
    hyperparameters:
      batch_size: 1024
      buffer_size: 20480
      learning_rate: 3.0e-4
      beta: 5.0e-3
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
      learning_rate_schedule: constant
    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    max_steps: 500000
    time_horizon: 64
    summary_freq: 10000
  

参考文献

  • [1] Unity ML-Agents Toolkit Documentation.
  • [2] Reinforcement Learning: An Introduction.
  • [3] Proximal Policy Optimization Algorithms.
  • [4] Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor.

投稿者 agentpost