Unity_Lesson

4-10 環境パラメータのランダム化

これまで解説した強化学習のアルゴリズムや学習方法ではなく、学習環境で設定するパラメータについて取り上げます。


環境パラメータのランダム化とは

同じ環境でエージェントを学習し続けると、エージェントが環境に過剰適合してしまうことがあります。
過剰適合してしまうと、エージェントは環境に少し変更があっただけで適応できなくなってしまいます。
これは「教師あり学習」で同一のデータセットで学習しすぎて「過学習」しているのと同じになります。環境の変化に対応させるには、環境にバリエーションを持たせて、エージェントが将来の環境の変化に適応できるように学習させる必要があります。 これを「環境パラメータのランダム化」と呼びます。


環境パラメータのランダム化の実装手順

「環境パラメータのランダム化」の実装手順は、次の2つです。

①バリエーションを持たせるパラメータを環境パラメータで実装

②学習設定ファイルへの環境パラメータのランダム化の設定の追加


環境パラメータのランダム化の学習環境の準備

2で作成した学習環境「RollerBall」をカスタマイズして「環境パラメータのランダム化」を行います。環境内のバリエーションを持たせるパラメータを「環境パラメータ」で実装します。「環境パラメータ」の実装方法は、前回の「4-9 カリキュラム学習」と同じです。

今回は、以下の2つの変数を「環境パラメータ」として定義します。

・mass:ボールの重さ
・scale:ボールの大きさ

環境パラメータがランダムに変化するように、OnEpisodeBegin()で環境パラメータの値を設定します。環境パラメータは、カリキュラム学習と同様に「Academy.Instance.EnviromentParameters」のGetWithDefault()で取得します。

RollerAgent.cs

// 環境パラメータの設定
EnvironmentParameters envParams = Academy.Instance.EnvironmentParameters;
rBody.mass = envParams.GetWithDefault("mass", 1.0f);
var scale = envParams.GetWithDefault("scale", 1.0f);
rBody.gameObject.transform.localScale = new Vector3(scale, scale, scale);


環境パラメータのランダム化の学習設定ファイルの設定

今回は「PPO」で学習します。以下のように、ハイパーパラメータを設定してください。

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

# 環境パラメータ
environment_parameters:
  # ボールの重さ
  mass:
    sampler_type: uniform
    sampler_parameters:
      min_value: 0.5
      max_value: 10

  # ボールの大きさ
  scale:
    sampler_type: uniform
    sampler_parameters:
      min_value: 0.75
      max_value: 3


環境パラメータのランダム化のハイパーパラメータ

「environment_parameters:」の直下に「環境パラメータ名」を並べ、「sampler_type:」にサンプラー種別、「sampler_parameters:」にサンプラーのパラメータを記述します。

# 環境パラメータ
environment_parameters:
  # ボールの重さ
  mass:
    sampler_type: <サンプラー種別>
    sampler_parameters:
      <サンプラーパラメータ>

  # ボールの大きさ
  scale:
    sampler_type: <サンプラー種別>
    sampler_parameters:
      <サンプラーパラメータ>

「sampler_type」のサンプラー種別は、「uniform」「gaussian」「multirangenuform」の3つが存在します。

uniform 「uniform」は、「最小値」(min_value)と「最大値」(max_value)の間で浮動小数値を均一に適用するサンプラー種別です。0.5 ~ 10.0 の値を均一に適用する例は、次のとおりです。

  mass:
    sampler_type: uniform
    sampler_parameters:
      min_value: 0.5
      max_value: 10


gaussian 「gaussian」は、「平均」(mean)と「標準偏差」(st_dev)のガウス分布で浮動小数値を適用するサンプラー種別です。平均2、標準偏差0.3のガウス分布を適用する例は、次のとおりです。

  scale:
    sampler_type: gaussian
    sampler_parameters:
      mean:2
      st_dev:0.3

multirangeuniform 「multirangeuniform」は、指定された間隔(interval)で浮動小数値を均一に適用するサンプラー種別です。間隔(interval)を指定する書式は、次のとおりです。

[[間隔1の最小値,間隔1の最大値],[間隔2の最小値,間隔2の最大値], . . .]

「7~10」または「15~20」の値を均一に適用する例は、次のとおりです。

  length:
    sampler_type: multirangeuniform
    sampler_parameters:
      interval:[[7,10],[15,20]]


環境パラメータのランダム化を使った学習の実行

mlagents-learn ./config/sample/RandomizeEx.yaml --run-id=RandomizeEx-1