見出し画像

Unity ML-Agents 0.14.0 のセルフプレイ

1. セルフプレイ

「セルフプレイ」は、「対戦型競技」でエージェント同士を競い合わせることにより上達させる学習方法です。「対戦型競技」とは、2人のプレイヤーまたは2つのチームが対戦して勝敗を決める競技で、一方の利益が一方の損失になるゲームです。「セルフプレイ」は、エージェントの対戦相手として、現在または過去の「自分」を使用します。

これは、「OpenAI Five」や「AlphaStar」などでも使われている学習方法で、完全に訓練されたエージェントは、人間のトッププレーヤーをも上回ります。

「Unity ML-Agents」で「セルフプレイ」を行うには、
(1)  対戦型競技の環境の準備。
(2) エージェントのチームIDの設定。
(3) 最終的な報酬を「+1」「0」「-1」に設定。
(4) セルフプレイの訓練設定パラメータの設定。
が必要になります。

画像2

2. エージェントのチームIDの設定

「セルフプレイ」を行うには、2人または2チームのエージェントをチームIDで区別します。「Behavior Parameters」の「Team ID」にチームIDを設定してください。サンプル学習環境「Tennis」では、片方を「0」、片方を「1」に設定しています。

画像1

3. 最終的な報酬を「+1」「0」「-1」に設定

「セルフプレイ」では、最終的な報酬を次のように設定します。

・勝ち : +1
・負け : -1
・引き分け : 0

後ほど紹介するセルフプレイの訓練指標である「ELO」の計算は、最終的な報酬が「+1」「0」「-1」のいずれかであることに依存しています。

4. セルフプレイの訓練設定パラメータの設定

「セルフプレイ」を行うには、「訓練設定ファイル」に「self_play」を追加します。

Tennis:
    normalize: true
    max_steps: 5.0e7
    learning_rate_schedule: constant
    batch_size: 1024
    buffer_size: 10240
    hidden_units: 256
    time_horizon: 1000
    self_play:
        window: 10
        play_against_current_self_ratio: 0.5
        save_steps: 50000
        swap_steps: 50000

◎ window
エージェントの対戦相手として保持するポリシー数を指定します。この値が大きいと、対戦相手が多様であることを意味します。
・典型的な範囲:5-30

◎ play_against_current_self_ratio
エージェントが現在の自分と対戦する確率を指定します。現在の自分はポリシーを更新しているため、反復ごとに異なる対戦相手と戦うことになります。学習が不安定になる可能性がありますが、より良い結果に繋がる可能性もあります。
・典型的な範囲 : 0.0〜1.0

◎ save_steps
ポリシーを何ステップ毎に保存するかを指定します。
・典型的な範囲:10000〜100000

◎ swap_steps
敵のポリシーを何ステップ毎に交換するかを指定します。
・典型的な範囲:10000〜100000

4. ELO

「セルフプレイ」では、累積報酬は学習の進捗を示す正しい指標にはなりません。自分が強くなることで、対戦相手(現在または過去の自分)も強くなるからです。

そこで、「Unity ML-Agents」では「ELO」と呼ばれる指標を提供します。「ELO」は、対戦型競技において、相対評価で実力を表すために使われる指標の一つです。適切な訓練を行うことで、「ELO」は着実に増加します。また、「ELO」で重要なのは「変化量」です。「絶対値」ではありません。「ELO」は「TensorBoard」を使って、監視することができます。


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