Unity_Lesson

3-5 学習設定ファイル

2の「学習と推論」での設定について

ここで紹介するもの以外に「セルフプレイ」「Curiosity」「模倣学習」「LSTM」専用のパラメータも存在しますが、そちらは別で言及します


学習設定ファイルとは

「学習設定ファイル」(*.yaml)は、学習に利用するハイパーパラメータを設定するファイルです。
機械学習のパラメータの中で、人間が調整する必要があるパラメータのことを「ハイパーパラメータ」と呼びます。
学習設定ファイルは1環境につき1つ用意する必要があります。


学習について

強化学習においては、通常ステップごとにニューラルネットワークのパラメータを更新しています。

具体的には、エージェントは各ステップで行動を選択し、環境から観察と報酬を得ます。この過程で経験(観察、行動、報酬、次の観察)が蓄積され、それに基づいてニューラルネットワークのパラメータが調整されます。

一方で、エピソードは、ある一連のステップ(例えば、ゲーム内で目的地に到達する、またはエージェントが失敗するまでの時間)を指します。エピソードが終わるたびに環境がリセットされますが、ニューラルネットワークのパラメータ更新自体はエピソードの終了を待たず、通常はステップごとに行われます。

ステップごとの学習プロセス

  1. エージェントがステップで行動を選択する。
  2. 環境から次の状態と報酬を得る。
  3. 得られた情報(観察、報酬、次の観察)を使用してネットワークを更新。

ただし、更新の方法や頻度はアルゴリズムによって異なります。例えば、PPO(Proximal Policy Optimization)のようなアルゴリズムでは、一定数のステップの経験がバッファに蓄積された後、その経験に基づいてパラメータがバッチ処理されます。

エピソードと学習

エピソードごとに学習するわけではないものの、エピソード全体を通じた経験はエージェントの学習に影響します。エピソード終了後に報酬の合計や成功・失敗の情報に基づいた学習も、強化学習において重要な要素です。

したがって、ステップごとに学習しつつも、エピソードごとの結果が長期的な学習に影響を与える、と考えることができます。



PPOとSAC

「Unity ML-Agents」で標準で使える強化学習アルゴリズムは「PPO」と「SAC」になります。 ハイパーパラメーターの設定項目は、「PPO」と「SAC」どちらのアルゴリズムを使うかで異なります。 慣れないうちはPPOを使うことで問題ありません。

PPOとSACの違いは別の章で解説します

・PPO(Proximal Policy Optimization)
・SAC(Soft Actor-Critic)


PPOの学習設定ファイルの例

「PPO」の学習設定ファイルの例は、次の通りです。
最上位セクション「behaviors:」の下にセクション「:」を配置し、さらにその下に各種ハイパーパラメーターを設定します。「Behavior Name」は、「Behavior Parameters」で設定するポリシー毎の識別子になります。

behaviors:
  RollerBall:
    #トレーナー識別
    trainer_type: ppo 
    
    #基本
    max_steps: 500000
    time_horizon: 64
    summary_freq: 1000
    keep_checkpoints: 5

    #学習アルゴリズム
    hyperparameters:
      #PPOとSAC共通
      batch_size: 10
      buffer_size: 100
      learning_rate: 0.0003
      learning_rate_schedule: linear

      #PPO用
      beta: 0.005
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
    
    #ニューラルネットワーク
    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2

    #報酬
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0


SACの学習設定ファイルの例

「SAC」の学習設定ファイルの例は、次のとおりです。「トレーナー種別」と「ハイパーパラメーター SAC用」以外の設定は、「PPO」と同じ設定項目になります。

behaviors:
  #トレーナー識別  
  RollerBall:
    trainer_type: sac

    max_steps: 500000
    time_horizon: 64
    summary_freq: 1000
    keep_checkpoints: 5

    hyperparameters:
      batch_size: 64
      buffer_size: 12000
      learning_rate: 0.0003
      learning_rate_schedule: constant

      #SAC専用
      buffer_init_steps: 0
      tau: 0.005
      steps_per_update: 10.0
      save_replay_buffer: false
      init_entcoef: 0.01
      reward_signal_steps_per_update: 10.0

    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2

    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0



behaviors セクション


トレーナーの種別

trainer_type

学習アルゴリズム(デフォルト:ppo)


基本のハイパーパラメーター

基本のパラメーターは次の通りです。

max_steps

time_horizon

PPOでは、エピソード内で頻繁に報酬が与えられる場合は小さな値。そうでない場合は大きい値が良いです。エージェントの行動シーケンス内の重要な動作をキャプチャするのに十分な大きさでなければなりません。
SACでは、このパラメータはさほど重要ではなく、通常はおおよそのエピソード長を設定すれば問題ありません。

(エージェントが経験を蓄積するためにどのくらいの時間を考慮するか。これを小さくすると短期的な動作に対する反応が強化され、大きくすると長期的な報酬に対する考慮が強化されます。)


summary_freq


checkpoint_interval


keep_checkpoints


threaded


init_path


学習アルゴリズム

「hyperparameters」下に、学習アルゴリズムのパラメータを設定します。
学習アルゴリズムのパラメータは「PPOとSAC共通」「PPO用」「SAC用」の3種類に分けられます。

勾配降下について

PPOとSAC共通

典型的な範囲


通常、大きいほどより安定した学習に繋がりますが、ポリシー更新サイクルは遅くなります。SACではエピソード長の数千倍、「batch_size」よりもはるかに大きな値にする必要があります。これにより、SACは古い経験からも新しい経験からも学習できるようになります。


学習率の確率で「探索」、「1 - 学習率」の確立で「活用」を行います。報酬が継続的に増加しない場合は、通常この値を減らす必要があります。



PPO用

・典型的な範囲:1e-4 ~ 1e-2

報酬の増加とともに、少しずつ減少するように調整する必要があります。エントロピーが急激に減少する場合は「beta」を増やし、エントロピーの低下が遅すぎる場合は「beta」を減らす必要があります。


・典型的な範囲:0.1 ~ 0.3

この値を小さく設定すると、学習がより安定しますが、学習速度が遅くなります。


・典型的な範囲:0.9 ~ 0.95


・典型的な範囲:3 ~ 10

「batch_size」が大きいほど、これを大きくすることができます。これを増やすとより安定した学習になりますが、学習速度が遅くなります。



SAC用

buffer_init_steps

学習開始前に何ステップのランダム行動を経験バッファに埋めるか(デフォルト:0)。エージェントが最初に十分な経験を積む前に、学習を開始しないようにします。学習の初期段階での安定性を改善したい場合に変更します。

・典型的な範囲:1000 ~ 10000

学習されていないポリシーはランダムであるため、ランダムな行動でバッファを事前に埋めておくことは探索に役立ちます。


tau

モデル更新中のターゲットの更新の大きさ(デフォルト:0.005)

・典型的な範囲:0.005 ~ 0.01

通常この値は0.005のままにしてください。単純な問題の場合、tauを0.001に増やすと安定性を犠牲にして学習速度を上げることができます


steps_per_update


save_replay_bufferf

リプレイバッファの保存(デフォルト:false) 学習を再開する時に、経験リプレイバッファとモデルを保存、およびロードできます。
これは、収集された経験が消去されないため、再開をよりスムーズにします。ただし、再生バッファは非常に大きくなる可能性があり、かなりのディスク容量を占有することに注意してください。


init_entcoef

学習開始時にエージェントがどの程度探索するか(デフォルトは、Continuois:0.5 ~ 1.0 / Discrete:0.05 ~ o.5)。
init_entcoefを増やすと、学習開始時により多くを探索し、減らすとより早く学習が収束します。報酬を見つけても、なかなかそれに収束しない場合は、減らすとよいです。


reward_signal_steps_per_update

ポリシー更新に対する報酬シグナルのステップ数の平均比率(デフォルト:steps_per_update)

報酬信号に関連するネットワーク(クリティックなど)の更新頻度を指定します。何ステップごとに報酬信号が更新されるかを決めます。

報酬設計が複雑な場合や報酬に関連する学習の微調整が必要な場合に調整されますが、一般的な環境では標準設定で十分な場合が多いです。



ニューラルネットワーク

network_settings(ネットワーク設定)下に、ニューラルネットワークのパラメータを設定します。

学習を安定させるためにtrueにするのが一般的です。


・典型的な範囲:32 ~ 512

単純な問題の場合、小さいほうがより高速に学習できます。複雑な問題の場合、より多くする必要があります。






環境報酬

reward_signals(報酬信号)下の extrinsic(外的報酬。環境から与えられる報酬の設定)下に、環境報酬のパラメータを設定します。







勾配降下

「勾配降下」は損失(最適解との差)を最小にするパラメータ(重みやバイアス)を見つけるためのアルゴリズムです。このアルゴリズムを使って、より多くの報酬がもらえる行動をとるように、ポリシーの更新を行います。
「勾配降下」の処理の流れは次のとおりです。

① パラメータを適当な位置で初期化

② 与えられたパラメータにおける損失(最適解との差)を表すグラフの傾きを計算

③ 最も傾きの大きい方向に、パラメータを少しずらす

④ ②と③を繰り返す

これによって、ボールが勾配(斜面)を転がっていくようにパラメータを最適解に近づけていきます。以下は、縦軸が損失、横軸がパラメータの値を示すグラフになります。

「勾配降下」に関するハイパーパラメータは、
「batch_size」
「num_epoch」(PPO)
「epsilon」(PPO)
の3つがあります。
「batch_size」は1回の勾配降下で利用する学習データ(経験)の数、
「num_epoch」(PPO)は1回のポリシー更新時で行う勾配降下の回数、
「epsilon」(PPO) は旧ポリシーと新ポリシーの更新比率に対する許容限界を指定します。





num_layers と hidden_units

「num_layers」はニューラルネットワークの隠れ層の数、「hidden_units」は隠れ層のニューロン(ユニット)の数です





time_horizon と buffer_size

「time_horizon」と「buffer_size」はエージェントの経験(観察、行動、報酬)の収集に関するハイパーパラメータです。
各エージェントは、経験を「time_horizon」分収集したら学習アルゴリズムの経験バッファに積み、経験バッファは経験を「buffer_size」分収集したら「ポリシー更新」を行います。





・ハイパーパラメーターの用途別まとめ

「学習設定ファイル」のたくさんのハイパーパラメータを紹介しましたが、

学習量が足りない
対処:学習ステップ数を増やす
パラメータ:max_steps

統計情報の保存頻度を更新したい
対処:統計情報の保存頻度の設定
パラメータ:summary_freq

行動種別(ContinuousとDiscrete)に応じて調整する
対処:バッチサイズの調整
パラメータ:batch_size、buffer_size、time_horizon
対処:正規化の調整
パラメータ:normalize

エージェントが問題を理解できていない
対処:ニューラルネットワークのサイズの調整
パラメータ:num_layers、hidden_units、vis_encode_type(Visual Observation)

エージェントが探索しすぎ、しなさすぎ
対処:エントロピー(行動のランダムさ)の調整
パラメータ:beta(PPO)、init_entcoef(SAC)
対処:学習率(探索と活用の割合)の調整
パラメータ:learning_rate、learning_rate_schedule



これらの設定を調整することで、エージェントの学習速度やパフォーマンスをコントロールできます。