これまで解説した強化学習のアルゴリズムや学習方法ではなく、学習環境で設定するパラメータについて取り上げます。
同じ環境でエージェントを学習し続けると、エージェントが環境に過剰適合してしまうことがあります。
過剰適合してしまうと、エージェントは環境に少し変更があっただけで適応できなくなってしまいます。
これは「教師あり学習」で同一のデータセットで学習しすぎて「過学習」しているのと同じになります。環境の変化に対応させるには、環境にバリエーションを持たせて、エージェントが将来の環境の変化に適応できるように学習させる必要があります。
これを「環境パラメータのランダム化」と呼びます。
「環境パラメータのランダム化」の実装手順は、次の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